/* Celosía — puente con Bootstrap (Fase B, Tarea 2.3: solo la sección de foco).
   La sección de variables --bs-* := var(--ce-*) y los grupos de componentes
   con literales (botones, paginación, acordeón...) llegan en la Tarea 4b,
   que hace crecer este mismo fichero. No tocar ese orden: el <link> de este
   fichero debe ir después de celosia.css (necesita sus tokens --ce-*) y
   antes de site.css. Ver sdd/celosia-phase-b/design §0 y §2.

   Enumeración verificada contra el fichero vendored real
   public/assets/vendor/bootstrap/css/bootstrap.min.css (v5.3.8), no de
   memoria: hay exactamente 15 reglas que ponen outline:0 al recibir foco
   (button:focus:not(:focus-visible), .form-control:focus,
   .form-control-plaintext:focus, .form-select:focus, .form-check-input:focus,
   .form-range:focus, .btn:focus-visible, .btn-check:focus-visible+.btn,
   .nav-link:focus-visible, .navbar-toggler:focus, .accordion-button:focus,
   .page-link:focus, .btn-close:focus, .carousel-control-prev/next:focus,
   .focus-ring:focus), más seis reglas (0,3,0) que compiten solo por
   box-shadow sin tocar outline (.btn-check:checked+.btn:focus-visible,
   .btn.active:focus-visible, .btn.show:focus-visible,
   .btn:first-child:active:focus-visible,
   :not(.btn-check)+.btn:active:focus-visible,
   .btn-check:checked:focus-visible+.btn). Especificidad máxima a batir:
   (0,3,0). bootstrap.min.css no usa @layer ni @supports en ningún punto
   (verificado, 0 apariciones de ambos) y no tiene sustituto para navegadores
   sin :focus-visible, así que anular estas reglas no rompe ningún camino
   de compatibilidad. */

/* Repetir :focus-visible cuatro veces es CSS válido: cada aparición cuenta
   en la especificidad (Selectors L4 §17), así que esto es (0,4,0) — gana a
   cualquier regla de foco de Bootstrap sin necesidad de !important ni de
   @layer (bootstrap.min.css no está en capa, y una regla en capa perdería
   siempre contra una sin capa, sea cual sea su especificidad). Declara
   solo outline / outline-offset, así que color, background-color,
   border-color y border-radius de .btn:focus-visible (y equivalentes) se
   conservan intactos -- el outline ya sigue el radio propio del elemento sin
   necesidad de fijarlo aquí. Mismo anillo sencillo que celosia.css (decisión
   explícita del propietario, ver ese fichero) -- se repite aquí en vez de
   heredar por especificidad porque esta regla necesita ganar a Bootstrap. */
:focus-visible:focus-visible:focus-visible:focus-visible {
  outline: var(--ce-size-focus-ring) solid var(--ce-color-focus-ring);
  outline-offset: 2px;
}

/* Hueco de foco por ratón: estas reglas de Bootstrap usan :focus, no
   :focus-visible, así que un clic de ratón (no un Tab) no activa la regla
   de arriba y se sigue viendo el resplandor azul rgba(13,110,253,.25) de
   Bootstrap en <select>, checkbox/radio, el botón de menú y los controles
   del carrusel. No es un fallo WCAG (2.4.7/2.4.11 hablan de foco de
   teclado), pero es azul de Bootstrap de fábrica en un sitio verde, así
   que se cierra también. Los campos de texto siempre cumplen
   :focus-visible con clic de ratón, así que la regla de arriba ya los
   cubre; esta sección es solo para los elementos que no. */
.form-control:focus, .form-select:focus, .form-check-input:focus {
  border-color: var(--ce-color-semantic-action);
  box-shadow: 0 0 0 var(--ce-size-focus-ring) var(--ce-color-brand-100);
}
.nav-link:focus-visible { box-shadow: none; }
.navbar-toggler:focus { box-shadow: none; }
.carousel-control-prev:focus, .carousel-control-next:focus { box-shadow: none; }

/* Tarea 3 (spike R3): icono chevron del acordeón, re-autorado como
   mask-image + background-color en lugar del stroke hexadecimal fijo de
   Bootstrap (%23212529 cerrado, %23052c65 abierto — ninguno de los dos
   puede referenciar un token --ce-*). Verificado con Playwright/Edge real
   contra .claude/celosia — no solo en teoría: la forma exacta del chevron
   se conserva, la rotación heredada de --bs-accordion-btn-icon-transform
   sigue funcionando (mask-image no toca transform), y el color procede de
   background-color, que SÍ puede ser un var(--ce-*) por preset.
   Funciona aquí porque .accordion-button::after es un pseudo-elemento
   dedicado cuyo único contenido visual ES el icono (sin texto, sin fondo
   propio que proteger) — mask-image reduce su caja a la silueta con
   seguridad. Ver más abajo por qué esta misma técnica NO se extiende al
   icono de .form-select. */
.accordion-button::after {
  background-image: none;
  -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
  mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-size: var(--bs-accordion-btn-icon-width);
  mask-size: var(--bs-accordion-btn-icon-width);
  background-color: var(--ce-color-semantic-text-primary);
}
.accordion-button:not(.collapsed)::after {
  background-color: var(--ce-color-brand-800);
}
/* Tarea 3 (spike R3): fallback deliberado y documentado para
   --bs-form-select-bg-img (stroke fijo %23343a40, la variante
   [data-bs-theme=dark] con %23dee2e6 es inerte porque este sitio nunca
   pone data-bs-theme). Se probó activamente la misma técnica de máscara
   sobre .form-select y NO funciona: a diferencia del acordeón, el icono
   de <select> es una de las DOS capas de background-image del propio
   elemento (la otra es su superficie real, background-color: var(--bs-body-bg)
   más borde y texto de la opción). mask-image no puede aislar una sola
   capa de background — enmascara TODA la caja del elemento, así que el
   control entero (borde, fondo, texto de la opción) desaparece y solo
   queda visible el pequeño recorte del chevron. Confirmado visualmente
   con Playwright: con mask-image en .form-select, "Opción A" y el borde
   dejan de renderizarse por completo. Arreglarlo requeriría envolver el
   <select> en un contenedor con un pseudo-elemento propio — cambio de
   marcado explícitamente fuera de alcance en este cambio (no hay
   migración a componentes .ce-* en esta fase). Por eso el icono de
   .form-select se deja con el stroke literal de Bootstrap sin tocar; es
   una desviación deliberada de la regla dura 1 ("nada de valores
   literales"), documentada aquí y en apply-progress, no un hueco
   silencioso. */

/* ============================================================
   Tarea 4b — el puente: --bs-* := var(--ce-*)  (design §1a/§1b/§1c)
   Toda la tabla de abajo se verificó línea a línea contra el fichero
   vendored real public/assets/vendor/bootstrap/css/bootstrap.min.css
   (v5.3.8) en esta misma sesión, no de memoria ni del documento de
   diseño a ciegas. Debe ir DESPUÉS del <link> de bootstrap.min.css en
   el <head> (ver inc_menu.php) para ganar por orden de aparición con
   la misma especificidad (0,1,0) en :root, y por especificidad igual
   más orden posterior en las reglas de componente de abajo.
   ============================================================ */

/* ---------- 1a. Primitivos raíz ---------- */
:root {
  --bs-font-sans-serif: var(--ce-font-family-sans);
  --bs-font-monospace: var(--ce-font-family-mono);
  --bs-body-font-size: var(--ce-font-size-md);
  --bs-body-line-height: var(--ce-font-leading-normal);
  --bs-body-color: var(--ce-color-semantic-text-primary);
  --bs-body-color-rgb: var(--ce-color-neutral-900-rgb);
  --bs-body-bg: var(--ce-color-semantic-surface);
  --bs-emphasis-color: var(--ce-color-neutral-900);
  --bs-emphasis-color-rgb: var(--ce-color-neutral-900-rgb);
  --bs-secondary-color: var(--ce-color-semantic-text-secondary);
  --bs-secondary-bg: var(--ce-color-semantic-surface-sunken);
  --bs-tertiary-color: var(--ce-color-semantic-text-secondary);
  --bs-tertiary-bg: var(--ce-color-semantic-surface-sunken);
  /* Celosía no tiene un tercer nivel de gris; colapso deliberado sobre
     el mismo par que --bs-secondary-*, ver design §1a. */
  --bs-link-color: var(--ce-color-semantic-link);
  /* W10 fix (open item 1, apply-progress): antes apuntaba directo a
     var(--ce-color-brand-600-rgb), sin capa semántica -- por eso no se
     reapuntaba en oscuro como --bs-link-color de arriba sí hace. Ahora
     referencia el alias semántico --ce-color-semantic-link-rgb
     (celosia.css), que se reapunta a brand-300-rgb en el mismo bloque
     @media (prefers-color-scheme: dark) que ya reapunta
     --ce-color-semantic-link. Mismo patrón, capa semántica incluida. */
  --bs-link-color-rgb: var(--ce-color-semantic-link-rgb);
  --bs-link-hover-color: var(--ce-color-semantic-action-hover);
  --bs-link-hover-color-rgb: var(--ce-color-brand-700-rgb);
  /* --bs-link-decoration se deja sin tocar: el subrayado no se quita
     nunca (regla dura Celosía 1.4.1). */
  --bs-border-color: var(--ce-color-semantic-border);
  /* Arreglo real de conformidad: el --bs-border-color por defecto
     (#dee2e6) da 1.3:1 sobre blanco y no supera 1.4.11; neutral-400 da
     3.32:1. Ver design §1a. */
  --bs-border-color-translucent: var(--ce-color-semantic-border-subtle);
  --bs-border-width: var(--ce-size-border-width);
  --bs-border-radius: var(--ce-size-radius-md);
  --bs-border-radius-sm: var(--ce-size-radius-sm);
  --bs-border-radius-lg: var(--ce-size-radius-md);
  /* Celosía no tiene radio "grande"; colapsa deliberadamente sobre md. */
  --bs-focus-ring-width: var(--ce-size-focus-ring);
  --bs-focus-ring-opacity: 1;
  /* Mata el halo con alfa de Bootstrap — el anillo de Celosía (Tarea 2.3,
     arriba en este mismo fichero) ya cubre el foco visible; esta variable
     solo alimenta la utilidad .focus-ring de Bootstrap si algo la usa. */
  --bs-focus-ring-color: var(--ce-color-focus-outer);
  --bs-primary: var(--ce-color-semantic-action);
  --bs-primary-rgb: var(--ce-color-brand-600-rgb);
  /* Con carga: .focus-ring-primary, .text-bg-primary, .bg-primary-subtle */
  --bs-code-color: var(--ce-color-state-danger);
  --bs-highlight-bg: var(--ce-color-focus-inner);
}

/* ---------- 1b. Grupos de componentes con literales fijos ---------- */
/* .accordion/.form-select ya tienen reglas en este fichero desde la
   Tarea 3 (chevron, arriba) — estas se AÑADEN, no las duplican. */

.btn-primary {
  --bs-btn-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-bg: var(--ce-color-semantic-action);
  --bs-btn-border-color: var(--ce-color-semantic-action);
  --bs-btn-hover-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-hover-bg: var(--ce-color-semantic-action-hover);
  --bs-btn-hover-border-color: var(--ce-color-semantic-action-hover);
  --bs-btn-focus-shadow-rgb: var(--ce-color-brand-600-rgb);
  --bs-btn-active-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-active-bg: var(--ce-color-brand-800);
  --bs-btn-active-border-color: var(--ce-color-brand-800);
  --bs-btn-disabled-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-disabled-bg: var(--ce-color-semantic-action);
  --bs-btn-disabled-border-color: var(--ce-color-semantic-action);
}
.btn-outline-primary {
  --bs-btn-color: var(--ce-color-semantic-action);
  --bs-btn-border-color: var(--ce-color-semantic-action);
  --bs-btn-hover-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-hover-bg: var(--ce-color-semantic-action);
  --bs-btn-hover-border-color: var(--ce-color-semantic-action);
  --bs-btn-focus-shadow-rgb: var(--ce-color-brand-600-rgb);
  --bs-btn-active-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-active-bg: var(--ce-color-semantic-action);
  --bs-btn-active-border-color: var(--ce-color-semantic-action);
  --bs-btn-disabled-color: var(--ce-color-semantic-action);
}
.btn-secondary {
  --bs-btn-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-bg: var(--ce-color-neutral-700);
  --bs-btn-border-color: var(--ce-color-neutral-700);
  --bs-btn-hover-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-hover-bg: var(--ce-color-neutral-800);
  --bs-btn-hover-border-color: var(--ce-color-neutral-800);
  --bs-btn-active-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-active-bg: var(--ce-color-neutral-800);
  --bs-btn-active-border-color: var(--ce-color-neutral-800);
  --bs-btn-disabled-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-disabled-bg: var(--ce-color-neutral-700);
  --bs-btn-disabled-border-color: var(--ce-color-neutral-700);
}
.btn-danger {
  /* Celosía solo tiene un paso state.danger (sin escala 50-900 propia),
     así que hover/active reutilizan el mismo valor — deviation menor y
     documentada, no hay un tono más oscuro disponible sin inventar uno.

     Usa el alias semántico --ce-color-semantic-action-danger, NO
     --ce-color-state-danger directamente (corregido en la Tarea 7 -- ver
     celosia.css). En claro ambos valen lo mismo (action-danger :=
     {state.danger} en tokens.json), cero cambio visual. En oscuro
     divergen a propósito: state-danger se aclara para ser legible COMO
     TEXTO sobre la superficie oscura (design §4c), mientras que
     action-danger se mantiene desacoplado en el mismo rojo saturado de
     claro porque este botón necesita seguir leyéndose como "peligro" con
     texto claro encima -- si este selector siguiera apuntando a
     state-danger a secas, el fondo del botón heredaría el rojo aclarado
     (pensado para texto, no para fondo) y el texto blanco de abajo caería
     a 2.99:1, por debajo del mínimo. Ver discovery/design §4c D3. */
  --bs-btn-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-bg: var(--ce-color-semantic-action-danger);
  --bs-btn-border-color: var(--ce-color-semantic-action-danger);
  --bs-btn-hover-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-hover-bg: var(--ce-color-semantic-action-danger);
  --bs-btn-hover-border-color: var(--ce-color-semantic-action-danger);
  --bs-btn-active-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-active-bg: var(--ce-color-semantic-action-danger);
  --bs-btn-active-border-color: var(--ce-color-semantic-action-danger);
  --bs-btn-disabled-color: var(--ce-color-semantic-text-on-brand);
  --bs-btn-disabled-bg: var(--ce-color-semantic-action-danger);
  --bs-btn-disabled-border-color: var(--ce-color-semantic-action-danger);
}
.btn-link {
  --bs-btn-color: var(--ce-color-semantic-link);
  --bs-btn-hover-color: var(--ce-color-semantic-action-hover);
  --bs-btn-active-color: var(--ce-color-semantic-action-hover);
}
.pagination {
  --bs-pagination-active-bg: var(--ce-color-semantic-action);
  --bs-pagination-active-border-color: var(--ce-color-semantic-action);
  --bs-pagination-focus-box-shadow: 0 0 0 var(--ce-size-focus-ring) var(--ce-color-focus-outer);
}
.accordion {
  /* Los iconos de chevron (::after) ya se re-autorearon en la Tarea 3,
     arriba en este fichero — esto solo añade el resto del grupo de
     variables (foco, color/fondo del header activo). */
  --bs-accordion-btn-focus-box-shadow: 0 0 0 var(--ce-size-focus-ring) var(--ce-color-focus-outer);
  --bs-accordion-active-color: var(--ce-color-brand-800);
  --bs-accordion-active-bg: var(--ce-color-brand-50);
}
.dropdown-menu {
  --bs-dropdown-link-active-bg: var(--ce-color-semantic-action);
}
.list-group {
  --bs-list-group-active-bg: var(--ce-color-semantic-action);
  --bs-list-group-active-border-color: var(--ce-color-semantic-action);
}
.nav-pills {
  --bs-nav-pills-link-active-bg: var(--ce-color-semantic-action);
}
.progress {
  --bs-progress-bar-bg: var(--ce-color-semantic-action);
}
.form-check-input:checked {
  background-color: var(--ce-color-semantic-action);
  border-color: var(--ce-color-semantic-action);
}
/* .form-select: el icono de chevron intencionadamente NO se toca aquí
   (fallback documentado en la Tarea 3, arriba); el color de borde/fondo
   ya llega a través de --bs-border-color/--bs-body-bg (§1a). */

/* ---------- 1c. Objetivos táctiles (2.5.8) ---------- */
.btn, .page-link, .form-control, .form-select {
  min-height: var(--ce-size-touch-comfortable);
}

/* R1 (design §8): esta tabla cubre los grupos de componentes que design
   enumeró contra el fichero vendored — botones, paginación, acordeón,
   dropdown, list-group, nav-pills, progress, checkbox/radio marcados.
   NO cubre utilidades de Bootstrap (.text-primary, .bg-primary-subtle,
   .link-primary, .border-primary) ni las variantes contextuales
   .alert-*, .badge-*, .table-*. Ninguna de esas utilidades está en uso hoy
   en public/ (mismo hallazgo que Task 3 sobre .accordion/.form-select
   antes de esta tarea), pero si se usan en el futuro seguirán en azul de
   Bootstrap hasta un pase de seguimiento explícito. No se reclama
   cobertura completa. */

/* ============================================================
   Tarea 7 — modo oscuro: los dos únicos ajustes de ESTE fichero que no
   pueden resolverse solo redefiniendo --ce-* en celosia.css (design §4c).
   Todo lo demás de este fichero (el anillo (0,4,0), el puente --bs-*, los
   grupos de componentes de 1b) ya se adapta solo: referencian var(--ce-*)
   y esas variables cambian de valor bajo prefers-color-scheme:dark sin
   tocar una sola línea aquí.
   ============================================================ */
@media (prefers-color-scheme: dark) {
  /* Halo de foco por ratón (§2c): en claro usa var(--ce-color-brand-100),
     un tinte muy claro pensado como halo suave sobre una superficie
     clara. Sobre una superficie oscura ese mismo tinte sería casi
     invisible (mismo problema que el anillo exterior primario, resuelto
     arriba vía --ce-color-focus-outer). Este halo es cosmético/secundario
     -- el anillo (0,4,0) de arriba, que SÍ está gateado por
     verify_presets.py --dark, ya cumple 2.4.11 por sí solo -- así que
     basta con un tono visiblemente distinto de la superficie, sin
     necesitar su propia fila en la matriz de contraste. brand-700 es el
     paso más oscuro de la mitad "clara" de reasignación de la Tarea 7 y
     se lee bien como halo sutil en las 7 paletas. */
  .form-control:focus, .form-select:focus, .form-check-input:focus {
    box-shadow: 0 0 0 var(--ce-size-focus-ring) var(--ce-color-brand-700);
  }

  /* .btn-danger — fix concreto de design §4c D3. En claro, --bs-btn-color
     usa var(--ce-color-semantic-text-on-brand) (neutral-0, blanco) sobre
     --ce-color-state-danger (#C0392F) = 5.43:1 ✓. En oscuro,
     text-on-brand se invierte a neutral-900 (casi negro) porque la MARCA
     ya es clara ahí -- pero action-danger (celosia.css, desacoplado a
     propósito de state-danger) sigue siendo el mismo rojo saturado de
     claro, así que negro-sobre-rojo cae a 3.28:1 ✗. Este único botón no
     puede usar el alias genérico text-on-brand en oscuro: necesita texto
     blanco explícito, verificado aparte en verify_presets.py --dark
     (fila "neutral-0 sobre action-danger"). */
  .btn-danger {
    --bs-btn-color: var(--ce-color-neutral-0);
    --bs-btn-hover-color: var(--ce-color-neutral-0);
    --bs-btn-active-color: var(--ce-color-neutral-0);
    --bs-btn-disabled-color: var(--ce-color-neutral-0);
  }

  /* W10 fix (open item 2, apply-progress): --ce-color-brand-tint es un
     token de PREAJUSTE (definido sin condición en cada preset-*.css, no
     un alias --ce-color-semantic-* de celosia.css), por eso el hueco de
     modo oscuro NO podía cerrarse redefiniendo --ce-* en celosia.css --
     igual que la nota de arriba explica para .btn-danger/el halo de foco:
     celosia.css carga ANTES que preset-*.css en la cascada (inc_menu.php),
     así que cualquier redirección puesta allí perdería contra el valor
     fijo del preajuste, sea cual sea el esquema de color. Tiene que vivir
     aquí, que carga DESPUÉS del preajuste.
     Confirmado en vivo en cita-previa .cp-card.is-seleccionada (site.css):
     brand-tint se quedaba fijo en su hex claro (p.ej. #eef4fb en azul) en
     los 7 preajustes, con el texto heredado ya corregido a
     --ce-color-semantic-text-primary -- que en oscuro es neutral-50, casi
     blanco -- casi blanco sobre casi blanco. Mismo defecto ya documentado
     sin arreglar en site.css junto a .cp-card.is-seleccionada.
     Arreglo: se reapunta al mismo patrón que --ce-color-semantic-surface-
     sunken en celosia.css (línea ~224) -- "hundida es MÁS OSCURA en
     oscuro, al revés que en claro" -- reutilizando un paso YA EXISTENTE
     de la propia escala de marca del preajuste, brand-900 (el más
     oscuro), en vez de inventar un hex nuevo. Contraste verificado con
     neutral-50 (texto heredado) en las 7 paletas: 15.4:1–16.4:1, muy por
     encima del 4.5:1 mínimo (ver apply-progress para el cálculo completo
     por preajuste). */
  :root {
    --ce-color-brand-tint: var(--ce-color-brand-900);
  }
}
