/* ═══════════════════════════════════════════════
   NAV.CSS — Barra de navegación unificada
   Todas las navs de la app usan estas clases.
   ═══════════════════════════════════════════════ */

/* ── Base compartida ─────────────────────────── */
.app-nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  /* Aire vertical real (ver "Cambios recientes" -- antes `height:76px` fijo
     con el contenido centrado por flex, sin padding propio: ~16px de
     "aire" implícito arriba/abajo, se sentía pegado). `padding` reemplaza
     al `height` fijo -- el alto real ahora sigue al contenido + este
     padding, no un número mágico; los spacers que compensan cada nav fija
     ya se miden en JS con `offsetHeight` (`_initHomeNav()`, ver otros
     `*-nav-spacer`), así que se adaptan solos. */
  padding: 22px 16px;
  min-height: 56px;
  background: var(--bg);
  width: 100%;
  box-sizing: border-box;
  flex-shrink: 0;
}

/* ── Nav fija (home) ─────────────────────────── */
.app-nav-fixed {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 900;
  transition: all 0.3s ease;
}

/* ── Nav sticky (pantallas internas) ─────────── */
@keyframes smoothSlideDown {
  from { opacity: 0; transform: translateY(-10px); }
  to   { opacity: 1; transform: translateY(0); }
}
.app-nav-sticky {
  position: sticky;
  top: 0;
  z-index: 100;
  margin: 0px -16px 16px -16px;
  width: calc(100% + 32px);
  animation: smoothSlideDown 0.4s var(--ease-sheet);
}

/* ── Botón atrás ─────────────────────────────── */
.app-nav-back {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  min-width: 44px;
  border-radius: 12px;
  background: var(--brand-light);
  border: none;
  cursor: pointer;
  color: var(--brand);
  transition: background 0.2s;
  flex-shrink: 0;
  -webkit-tap-highlight-color: transparent;
}
.app-nav-back:hover { background: var(--brand-20); }
.app-nav-back:active { transform: scale(0.95); }
.app-nav-back .material-symbols-outlined { font-size: 1.4rem; display: block; }

/* ── Variante decorativa (pantallas raíz sin "volver") ─
   Mismo tamaño/forma/color que .app-nav-back (ocupa exactamente el mismo
   lugar que la flecha atrás) pero sin ningún feedback interactivo -- no hay
   onclick que disparar, así que hover/active tampoco deben sugerir que se
   puede tocar. Usada en #top-bar (s-datos, ver _iconoRaizDeNav()/ir() en
   js/ui.js) y como ícono estático en #home-nav (s-home) -- mismo ícono que
   ya usa esa pantalla en .app-bottom-nav-item, ver "Cambios recientes". */
.app-nav-back--decorativo { cursor: default; }
.app-nav-back--decorativo:hover { background: var(--brand-light); }
.app-nav-back--decorativo:active { transform: none; }

/* ── Título alineado a la izquierda ──────────── */
.app-nav-title {
  position: absolute;
  left: 0;
  right: 0;
  text-align: left;
  font-size: 0.86rem;
  font-weight: 800;
  color: var(--brand);
  text-transform: uppercase;
  letter-spacing: 1.2px;
  pointer-events: none;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  padding-left: 80px;
  padding-right: 64px;
}

/* ── Buscador de Ajustes (ver "Cambios recientes") ───────
   Estilo "buscador de Ajustes de Android": lupa + input, sin botón de
   búsqueda aparte. Hijo flex real (no absolute como .app-nav-title) --
   `flex:1`/`width:100%` ocupan TODO el espacio disponible del nav (el slot
   de la flecha/tuerca decorativa se quita del todo en `s-datos`, y el
   spacer derecho de 40px que balanceaba esa flecha en otras pantallas
   también se oculta acá -- ver `ir()`/js/ui.js, `#top-bar-spacer` -- sin
   ese spacer compitiendo por ancho, el pill llega hasta el padding real de
   `.app-nav`, mismo margen lateral que el resto de la nav). Fondo propio +
   padding alto (ver "Cambios recientes" -- pill notablemente más alto que
   el resto de buscadores de bottom sheet de la app, a propósito, pedido
   explícito calcado del mockup) sobre `--surface-2` -- antes sin caja
   propia, quedaba apretado contra los bordes de la nav. */
.app-nav-search {
  /* `width:99%` (antes 100%, ver MANIFEST.md "Cambios recientes") -- clase
     global, el pill se cortaba levemente contra el borde de su contenedor
     en algunos anchos; 1% de margen de sobra lo resuelve en toda la app
     sin tocar `box-sizing`/padding. */
  display: flex; align-items: center; gap: 8px; flex: 1; width: 99%; min-width: 0; color: var(--muted);
  background: var(--surface-2); border-radius: 999px; padding: 16px 16px;
  border: 1.5px solid transparent; box-sizing: border-box;
  transition: border-color 0.15s, box-shadow 0.15s;
}
/* Foco en TODO el pill (ícono+input), no solo en el `<input>` -- `:focus-within`
   en el contenedor en vez de `:focus` en el input (que dejaría el outline
   nativo del navegador ciñendo solo el input, descentrado del ícono de la
   lupa a su izquierda). `outline:none` en el input de abajo apaga ESE
   default nativo -- el stroke real vive acá, NUNCA visible en reposo
   (`border`/`box-shadow` arriba quedan en transparente/none por default). */
.app-nav-search:focus-within { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-light); }
.app-nav-search .material-symbols-outlined { font-size: 1.2rem; flex-shrink: 0; }
/* Bug real encontrado con Playwright (ver "Cambios recientes"): el `<input>`
   dibujaba su PROPIO stroke encima del texto tipeado, sin que ninguna regla
   de acá lo pidiera -- viene de la regla GENÉRICA `select:focus, input:focus,
   textarea:focus { box-shadow: 0 0 0 4px var(--brand-focus); ... }`
   (css/ui.css) que aplica a CUALQUIER input:focus de la app, este incluido
   (nada en css/nav.css tocaba `box-shadow` en el input, así que esa regla
   quedaba sin competencia). `border`/`background` de esa misma regla genérica
   ya quedaban anulados porque `.app-nav-search input` (acá) los fija sin
   condición de `:focus` con la MISMA especificidad y css/nav.css carga
   después de css/ui.css en index.html -- pero `box-shadow` no estaba entre
   las propiedades que esta regla pisaba, por eso se colaba. `box-shadow:none`
   explícito cierra ese hueco -- el único stroke visible en cualquier estado
   es el de `.app-nav-search:focus-within` de arriba, sobre el pill entero. */
.app-nav-search input {
  flex: 1; width: 100%; min-width: 0; border: none; outline: none; background: transparent;
  box-shadow: none; font-family: inherit; font-size: 0.9rem; font-weight: 600; color: var(--text);
  padding: 0; box-sizing: border-box;
}
/* Autofill de Chrome (`:-webkit-autofill`) trae su propio fondo/borde por
   default del navegador si no se resetea explícitamente (mismo problema ya
   resuelto para `#input-pin`, ver css/login.css) -- acá el fondo debe seguir
   transparente (lo pinta el wrapper `.app-nav-search`, no el input) y el
   texto en `--text`, mismo color que sin autofill. */
.app-nav-search input:-webkit-autofill,
.app-nav-search input:-webkit-autofill:hover,
.app-nav-search input:-webkit-autofill:focus {
  -webkit-box-shadow: 0 0 0 1000px transparent inset;
  -webkit-text-fill-color: var(--text);
  transition: background-color 5000s ease-in-out 0s;
}
/* Placeholder en tono apagado FIJO (ver "Cambios recientes" -- corrección:
   una instrucción anterior lo había puesto invisible en reposo + rojo/negrita
   recién al enfocar, mal leído del mockup -- el mockup real (Page 8/Page 9)
   muestra el mismo tono apagado en los 2 estados, SOLO el borde del pill
   cambia con el foco, ver la regla `:focus-within` de arriba). Color/peso
   siguen sin cambiar al enfocar -- lo único que cambia con el foco es la
   opacidad (ver "Cambios recientes" -- fade-out en vez de un corte seco al
   empezar a tipear, `transition` sí funciona sobre `::placeholder` en los
   navegadores modernos, no hace falta un `<span>` propio superpuesto). */
.app-nav-search input::placeholder { color: var(--muted); font-weight: 500; opacity: 1; transition: opacity 0.2s ease; }
.app-nav-search:focus-within input::placeholder { opacity: 0; }
/* `caret-color:transparent` de este input -- antes fijado acá mismo, scoped
   solo a #aj-search-input -- ahora lo cubre la regla global por atributo
   `input[placeholder*="uscar" i]` (css/ui.css), que alcanza a TODO buscador
   de la app, no solo a este. Ver MANIFEST.md "Cambios recientes". */

/* ── Acciones derecha ────────────────────────── */
.app-nav-actions {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-shrink: 0;
}

/* ── Botón icono (nav home) ──────────────────── */
.app-nav-icon-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 12px;
  background: var(--brand-light);
  border: none;
  cursor: pointer;
  color: var(--brand);
  transition: background 0.15s;
  flex-shrink: 0;
  -webkit-tap-highlight-color: transparent;
}
/* `@media (hover: hover)` (ver "Cambios recientes" -- causa real del
   "borde/card visible junto al ícono hoy", confirmada con Playwright
   simulando un tap táctil real: en touch, `:hover` queda PEGADO tras tocar
   -- `btn.matches(':hover')` da `true` después del tap, sin que el dedo
   siga encima -- mismo quirk clásico de Safari/WebKit en iOS, reproducible
   también en Chromium con touch emulado. El ícono recién tocado (ej. "hoy")
   queda con el fondo de `:hover` (`--brand-lightest`, MÁS tenue que el
   fondo normal `--brand-light`) pegado hasta el próximo toque en otro
   lugar -- se ve más desteñido/apagado que sus vecinos, la inconsistencia
   visual reportada. Sin este media query, el `:hover` aplica en CUALQUIER
   dispositivo, incluidos los que nunca pueden "hoverear" de verdad
   (touch-only) -- con él, la regla solo corre en dispositivos con
   puntero real (mouse/trackpad), donde el hover se limpia solo al mover el
   puntero afuera, sin quedar pegado. */
@media (hover: hover) {
  .app-nav-icon-btn:hover { background: var(--brand-lightest); }
  .app-nav-icon-btn-brand:hover { background: var(--brand-dk); }
}
.app-nav-icon-btn .material-symbols-outlined { font-size: 18px; }

/* ── Variante naranja de marca (ej. ícono "Asistencia anticipada" de
   Eventos) -- mismo componente (.app-nav-icon-btn), no una clase de nav
   paralela: solo cambia color. Forma cuadrada con esquinas redondeadas,
   heredada de `.app-nav-icon-btn` (border-radius:12px) sin override propio
   -- antes esta variante SÍ lo pisaba a `50%` (circular), inconsistente con
   los otros 2 botones de la misma fila (búsqueda/hoy, sin esta clase, que
   ya usaban el radius cuadrado de base). */
.app-nav-icon-btn-brand { background: var(--brand); color: var(--white); }

/* ── Variante roja destructiva (ej. ícono "Cancelar evento" del detalle de
   Eventos) -- mismo componente/criterio que `.app-nav-icon-btn-brand`
   arriba: solo cambia el color, `.app-nav-icon-btn` sigue aportando
   tamaño/radio/layout. */
.app-nav-icon-btn-danger { background: var(--danger-bg); color: var(--danger); }
@media (hover: hover) {
  .app-nav-icon-btn-danger:hover { background: var(--danger-bg); filter: brightness(0.95); }
}

/* ── Botón "Cambiar mi equipamiento" (nav home) ──────────────────
   Variante de ancho variable de `.app-nav-icon-btn` (mismo alto/radio/tinte
   -- fondo `--brand-light`, ícono `--brand`) en vez de un cuadrado fijo de
   44px: muestra inline qué necesita la cuenta (patín+talla y/o
   protección+"Sí"), no solo un ícono genérico -- contenido poblado por
   _renderHomeEquipBtn() (js/home.js) según los 4 estados posibles
   (ambos/solo patines/solo protecciones/ninguno). */
.home-equip-btn {
  display: flex;
  align-items: center;
  gap: 6px;
  height: 44px;
  padding: 0 12px;
  border-radius: 12px;
  background: var(--brand-light);
  border: none;
  cursor: pointer;
  color: var(--brand);
  transition: background 0.15s;
  flex-shrink: 0;
  -webkit-tap-highlight-color: transparent;
  font-family: inherit;
}
@media (hover: hover) {
  .home-equip-btn:hover { background: var(--brand-lightest); }
}
.home-equip-btn .material-symbols-outlined { font-size: 18px; }
.home-equip-btn-txt { font-size: 0.78rem; font-weight: 700; }
/* Divisor vertical fino entre el par patín y el par protección -- solo
   presente cuando los 2 pares conviven (estado "ambos"), `currentColor`
   para heredar el mismo `--brand` sin variable propia. */
.home-equip-btn-divider { width: 1.5px; height: 18px; background: currentColor; opacity: 0.4; }

/* ── Botón CTA nav (Nueva reserva) ──────────── */
.app-nav-cta {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 14px 14px;
  background: var(--brand);
  color: var(--white);
  border: none;
  border-radius: 12px;
  font-size: 0.82rem;
  font-weight: 700;
  cursor: pointer;
  font-family: inherit;
  box-shadow: none;
  transition: all 0.2s ease;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
}
.app-nav-cta:hover { background: var(--brand-dk); transform: translateY(-1px); }
.app-nav-cta:active { transform: scale(0.97); }
.app-nav-cta .material-symbols-outlined { font-size: 1rem; }
.app-nav-cta-label { display: inline; }

/* ── Sección label (compacto al scrollear) ───── */
.app-nav-section {
  font-size: 0.72rem;
  font-weight: 800;
  color: var(--brand);
  text-transform: uppercase;
  letter-spacing: 1.5px;
  opacity: 0;
  max-width: 0;
  overflow: hidden;
  transition: all 0.3s ease;
  white-space: nowrap;
}

/* ── Compacto (home al scrollear) ───────────── */
.app-nav-fixed.compacto .app-nav-cta-label { display: none; }
.app-nav-fixed.compacto .app-nav-cta { padding: 14px 12px; }
.app-nav-fixed.compacto .app-nav-section { opacity: 1; max-width: 200px; }

@media (max-width: 360px) {
  .app-nav-cta-label { display: none; }
  .app-nav-cta { padding: 14px 12px; }
}

#eventos-nav .app-nav-section,
#s4-nav .app-nav-section {
  opacity: 1 !important;
  max-width: none !important;
  overflow: visible !important;
  flex: 1;
  font-size: 0.86rem;
  font-weight: 800;
  text-align: left;
  letter-spacing: 1.2px;
  color: var(--brand);
  text-transform: uppercase;
  white-space: nowrap;
}

/* ── CTA de "Nueva reserva" en #home-nav: ocupa el slot izquierdo que dejó
   libre "MIS RESERVAS" (ver MANIFEST.md "Cambios recientes") -- ancho
   automático (solo lo que ocupan ícono+texto), alineado a la izquierda por
   el `justify-content:space-between` de `.app-nav` (ya no `flex:1`, que lo
   ensanchaba a todo el espacio disponible y lo centraba). El texto queda
   SIEMPRE visible (nunca ícono-solo, ni en `.compacto` al scrollear ni en
   pantallas angostas) para que quede claro que ahí se toca para reservar.
   Doble selector por ID a propósito: gana por especificidad sobre
   `.app-nav-fixed.compacto .app-nav-cta-label` y el `@media (max-width:360px)`
   de arriba, ambos genéricos para cualquier nav con CTA. */
#home-nav #home-nav-cta-label { display: inline; }

/* ── Nav inferior (bottom tab bar) ─────────────
   Persistente en toda pantalla raíz de la app autenticada (hoy 's-home' y
   's-datos' -- ver APP_BOTTOM_NAV_ITEMS en js/ui.js, base extensible para
   secciones futuras como Tareas/Asistencias/Equipo: sumar un ítem al array
   alcanza, sin tocar este CSS). Mismo criterio visual que .app-nav-fixed --
   fondo sólido var(--bg), sin blur/transparencia. display:none por default
   en el <div> de index.html (mismo patrón que #home-nav); _actualizarBottomNav()
   (js/ui.js) togglea 'flex'/'none' y reconstruye los tabs visibles en cada
   ir(). */
.app-bottom-nav {
  display: flex;
  position: fixed;
  bottom: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 100%;
  max-width: 523px;
  /* Bug real corregido (ver "Cambios recientes"): en `900`, `.aj-sub`
     (css/perfil.css, z-index:950, el overlay de las sub-pantallas de
     Ajustes -- Salud/Perfil/Contacto/etc.) queda por ENCIMA de esta nav en
     el stacking -- ambas comparten el mismo `background:var(--bg)` y
     `.aj-sub` termina justo en el borde superior real de la nav
     (`bottom:calc(var(--bottom-nav-h) + safe-area)`, sin overlap de
     posición) pero el `box-shadow` de más abajo se pinta HACIA ARRIBA desde
     ese borde -- dentro del área que le pertenece a `.aj-sub`, con mayor
     z-index, así que su fondo opaco lo tapa por completo (confirmado con
     Playwright: gap real de 0px entre ambos rects, mismo color de fondo en
     los 2). `960` -- mismo valor ya usado por `#cta-footer-salud`
     (index.html) para superar este mismo `.aj-sub`, no un número nuevo --
     supera cualquier aj-sub-* por igual, no solo Salud, así que corrige el
     mismo problema en el resto de las sub-pantallas de Ajustes de una. */
  z-index: 960;
  background: var(--bg);
  /* box-shadow en vez de border-top: mismo hairline visual (0.5px, var(--border-light))
     pero sin sumar al alto real de la caja -- un border sí lo hace (incluso con
     box-sizing:border-box, porque acá no hay un `height` explícito del que descontar,
     el alto lo define el contenido), y ese medio píxel de más rompía por poco el calc()
     de #cta-footer-s-home/los spacers de scroll (css/estilos.css, index.html), todos
     calculados contra var(--bottom-nav-h) a secas. */
  box-shadow: 0 -0.5px 0 var(--border-light);
  box-sizing: border-box;
  padding-bottom: env(safe-area-inset-bottom, 0px);
}
.app-bottom-nav-item {
  flex: 1;
  height: var(--bottom-nav-h);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 2px;
  background: none;
  border: none;
  cursor: pointer;
  color: var(--muted);
  font-family: inherit;
  font-size: 0.68rem;
  font-weight: 700;
  -webkit-tap-highlight-color: transparent;
  transition: color 0.2s ease;
}
.app-bottom-nav-item .material-symbols-outlined { font-size: 1.4rem; }
/* Tab de la pantalla activa, resaltado con el color de énfasis -- el resto
   queda en var(--muted) por la regla base de arriba, sin clase extra. */
.app-bottom-nav-item.activo { color: var(--brand); }
