/* ============================================================
   SPORTS TRAVEL COLOMBIA — base compartida
   Marca: negro profundo + rojo/amarillo/azul del logo
   Tipo: Saira (display + cuerpo) — prueba tipográfica
   ============================================================ */

:root {
  /* Fondo claro vintage (crema / papel) */
  --bg: #f3e8cf;
  --bg-2: #ecdfc1;
  --surface: #f9f2df;
  --surface-2: #ecdfbf;
  --line: rgba(33, 27, 18, 0.15);
  --line-2: rgba(33, 27, 18, 0.30);
  /* Texto tinta (token --cream = color de texto principal, ahora oscuro) */
  --cream: #211b12;
  --text: #211b12;
  --text-2: rgba(33, 27, 18, 0.76);
  /* ⚠️ --text-3 estaba en .50 y daba 3,13:1 sobre el papel. Se usa a 11–11.5px
     con peso 800 (eyebrows, códigos STC, notas al pie del popup), y 11.5px
     negrita NO es "texto grande" —el umbral son 18.66px—, así que esos ~12
     sitios fallaban el 4.5:1. No subirlo más: a .70 el gris deja de leerse
     como secundario.
     ⚠️ De .62 a .64 el 2026-08-23, y el motivo es que el .62 se midió contra
     el crema del PIE (#f6efda, donde daba 4,57) y hay 12 de los 28 usos que
     viven sobre el crema de la PÁGINA (#f3e8cf, más oscuro): los `01…06` y el
     `USA · MEX · CAN` de "Elige tu pasión" daban 4,467 — fallaban por tres
     centésimas. Con .64 dan 4,75 sobre el papel de página, 4,86 sobre el del
     pie y 4,92 sobre el de los álbumes. Comprobado que los 28 usos están sobre
     crema claro: subir el alfa sólo puede mejorarlos. */
  --text-3: rgba(33, 27, 18, 0.64);

  /* Colores del logo */
  --red: #e8202e;
  /* Mismo rojo, 3% más oscuro, SOLO para fondos que llevan texto blanco encima.
     El --red de marca da 4,48:1 con #fff y se queda a una centésima del 4.5:1;
     éste da 4,89:1. A ojo son indistinguibles, y así el rojo de marca sigue
     intacto en todo lo demás (puntos, filetes, acentos). */
  --red-cta: #dd1e2b;
  /* El rojo de marca en versión TINTA, para cuando el rojo es texto sobre el
     crema y no relleno. Sobre #f3e8cf el --red da 3,69:1 y falla; éste da 4,97.
     ⚠️ --red-cta NO sirve para esto: está pensado al revés (fondo rojo con
     blanco encima) y como tinta sobre crema se queda en 4,02.
     Es el mismo hex que --c-f1-t a propósito: el acento de F1 ES el rojo de
     marca, así que su versión tinta tiene que ser la misma o el sitio tendría
     dos rojos oscuros distintos. Medido: 4,97 sobre #f3e8cf (papel de página),
     5,27 sobre #f6efda (pie) y 4,58 sobre --bg-2 (#ecdfc1, banda de cifras). */
  --red-t: #c41421;
  --yellow: #ffc400;
  --blue: #1e8fff;
  --blue-deep: #0a4fa8;

  /* Acentos por deporte */
  --c-futbol: #1e8fff;
  --c-f1: #e8202e;
  --c-motogp: #ff6b1a;
  --c-tenis: #3fae4f;
  --c-festival: #e63da8;
  --c-expediciones: #8140b5;

  /* ---------- Los mismos acentos, en versión TINTA ----------
     Cada acento hace dos trabajos distintos y sólo sirve bien para uno.

     Como SUPERFICIE (el relleno de un botón, la píldora de una tarjeta, el
     filete del hero, un brillo) el acento es perfecto: brilla, es la marca del
     deporte y no tiene que competir con nada.

     Como TINTA sobre el crema del papel es otra cosa. Medido el 2026-08-23
     contra el crema más oscuro de los tres (--bg-2, la banda de cifras), el
     acento de marca daba: fútbol 2,5 · Moto GP 2,2 · tenis 2,2 · festivales
     2,8 · F1 3,4. Hacen falta 4,5 para texto normal y 3 para texto grande, así
     que cinco de los seis fallaban, y tres fallaban INCLUSO en texto grande.
     No era sutileza de auditoría: el "VER PROGRAMA" de cada tarjeta —el enlace
     principal, el que hay que pulsar— era lo más flojo de su bloque, más flojo
     que el párrafo gris de al lado.

     Estos seis son el mismo color con la luz bajada y nada más: el matiz y la
     saturación quedan intactos, así que siguen siendo reconociblemente el azul
     del fútbol o el naranja de Moto GP. Todos dan ≥4,5 sobre los tres cremas
     del sitio (#f3e8cf, #ecdfc1, #fbf6ea) y ≥5,9 con blanco encima.

     Es la misma jugada que --red-cta unas líneas más arriba, sólo que en la
     otra dirección: allí el rojo se hunde para poder llevar blanco encima, aquí
     el acento se hunde para poder ser él mismo la tinta.

     ⚠️ NO uses estos en superficies. Si pintas un botón con --sp-t el sitio
     pierde el brillo, que es justo lo que lo hace suyo. La regla es corta:
     acento sobre crema → tinta; acento debajo de algo → marca. */
  --c-futbol-t: #0061c2;
  --c-f1-t: #c41421;
  --c-motogp-t: #ae3e00;
  --c-tenis-t: #297133;
  --c-festival-t: #ba187e;
  --c-expediciones-t: #8140b5; /* el morado ya daba 4,8: se queda igual */

  --font-display: "Anton", "Saira Condensed", "Arial Narrow", sans-serif;
  --font-body: "Saira", "Helvetica Neue", sans-serif;

  /* La franja tricolor del tope, y el aire que Juan pidió entre ella y el logo.
     --nav-h SUMA los dos, así que la banda donde vive el contenido de la barra
     sigue midiendo 72px exactos y el logo no se descentra. Todo lo que se apoya
     en --nav-h (el padding del hero, el top del menú móvil y el de su velo) baja
     solo; no hay ningún 72 escrito a mano en el resto del sitio.
     ⚠️ La franja es TAMBIÉN la barra de progreso de lectura; el porqué y el cómo
     están en la sección "FRANJA TRICOLOR" al final de este archivo.
     ⚠️ 2026-08-24: se sumó env(safe-area-inset-top) — el hueco de la isla
     dinámica/notch en iPhone. Sin esto, con viewport-fit=cover puesto, el nav
     fijo (y su franja) arrancaban en el y=0 de verdad, justo detrás de la isla:
     al hacer scroll el fondo borroso del nav no llegaba a cubrirla y se veía la
     foto del hero (o la propia franja) pegada al notch. Con la variable en
     :root, TODO lo que se apoya en --nav-h baja solo, igual que con la franja. */
  --franja-h: 6px;
  --franja-aire: 10px;
  --nav-h: calc(72px + var(--franja-h) + var(--franja-aire) + env(safe-area-inset-top, 0px));

  --pad: clamp(20px, 5vw, 72px);
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-back: cubic-bezier(0.34, 1.56, 0.64, 1);
}

* { margin: 0; padding: 0; box-sizing: border-box; }

/* ⚠️ 2026-08-24: overflow-x:hidden va en <html> Y en <body>, no sólo en uno.
   En iOS Safari el elemento que arrastra el "pan"/rebote horizontal con el
   dedo es <html> (documentElement), no <body>: el overflow-x:hidden del body
   (abajo) recorta lo que se PINTA, pero no bloquea el gesto de arrastre, así
   que en iPhone la página igual se dejaba correr hacia los lados y quedaban a
   la vista fragmentos de la bufanda / el carrusel que están fuera del
   viewport a propósito (ver la nota de `.bufanda` sobre por qué se sale del
   viewport). Con el mismo overflow-x:hidden también en <html> el gesto queda
   fijo en escritorio y en iOS por igual. */
html { scroll-behavior: smooth; overflow-x: hidden; }

/* Scrollbar a juego con el papel de la página, no el blanco de fábrica del
   navegador. Pista = --bg (el mismo crema del body), pulgar = tinta a baja
   opacidad —no --cream sólido, que se vería como una barra negra pesada—.
   Firefox usa scrollbar-color; WebKit/Chromium/Safari usa los pseudo-elementos
   ::-webkit-scrollbar*. El pulgar lleva un borde del color de la pista
   (background-clip: padding-box) para que quede angosto y separado del canto,
   en vez de pegado a los dos bordes. */
html {
  scrollbar-color: rgba(33, 27, 18, 0.35) var(--bg);
}
::-webkit-scrollbar {
  width: 14px;
  height: 14px;
}
::-webkit-scrollbar-track {
  background: var(--bg);
}
::-webkit-scrollbar-thumb {
  background-color: rgba(33, 27, 18, 0.35);
  border: 3px solid var(--bg);
  border-radius: 9px;
  background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover {
  background-color: rgba(33, 27, 18, 0.5);
  background-clip: padding-box;
}

body {
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 16.5px;
  font-weight: 460;
  line-height: 1.55;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
}

/* Grano de textura global.
   ⚠️ Estaba a z-index 990, por ENCIMA del popup de programa (960): el grano se
   multiplicaba sobre el texto del programa y le bajaba el contraste real. El
   grano es del papel de la página, no de la hoja del programa, que ya trae el
   suyo. A 940 queda debajo del popup y del velo de progreso (950) y encima de
   todo lo demás. */
body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 940;
  pointer-events: none;
  opacity: 0.5;
  mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23n)' opacity='0.9'/%3E%3C/svg%3E");
}

img { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button { font-family: inherit; }

/* Salto al contenido: primer elemento enfocable de cada página. Sólo aparece
   al llegar con el tabulador, para que quien navegue con teclado no tenga que
   recorrer el nav entero en cada página. */
.skip-link {
  position: fixed;
  top: 0; left: 50%;
  /* -120% (de la propia altura del enlace) NO alcanza a esconderlo del todo en
     iPhone con isla dinámica: sin viewport-fit=cover Safari confinaba los
     `fixed` a la zona "segura" bajo el notch, así que el -120% se calculaba
     corto y el enlace se veía flotando ahí en cuanto la barra de Safari se
     recogía al hacer scroll (2026-08-24). -200px es una distancia fija que
     limpia cualquier isla dinámica real (≤59px) de sobra, y no depende de la
     altura del propio enlace ni de si el navegador ya soporta el notch. */
  transform: translate(-50%, -200px);
  z-index: 1000;
  background: var(--cream);
  color: var(--bg);
  font-family: var(--font-body);
  font-size: 15px;
  font-weight: 700;
  padding: 12px 22px;
  border-radius: 0 0 12px 12px;
  transition: transform 0.18s var(--ease-out);
}
/* Va con `:focus` a secas y NO con `:focus-visible`, que es lo que se usa en el
   resto del sitio. `:focus-visible` es una heurística del navegador: con el foco
   puesto por JS (volver de un popup, un `#contenido` en la URL, la restauración
   de foco al recargar) puede no cumplirse, y entonces el enlace se queda fuera de
   pantalla ENFOCADO — el teclado está en un elemento que no se ve. Aquí no hay
   contrapartida: el enlace vive en `translate(-50%,-120%)`, así que con el ratón
   es inalcanzable y `:focus` sólo lo puede disparar el teclado. */
.skip-link:focus {
  transform: translate(-50%, 0);
  outline: 3px solid var(--yellow);
  outline-offset: -6px;
}

::selection { background: var(--red); color: #fff; }

/* ---------- Tipografía display ---------- */
.d-giant, .d-big, .d-mid {
  font-family: var(--font-display);
  text-transform: uppercase;
  line-height: 0.96;
  letter-spacing: 0.01em;
  font-weight: 400;
}
.d-giant { font-size: clamp(46px, 8vw, 140px); }
.d-big   { font-size: clamp(34px, 5.2vw, 92px); }
.d-mid   { font-size: clamp(26px, 3.4vw, 52px); }

.d-outline {
  color: transparent;
  -webkit-text-stroke: 2px rgba(33, 27, 18, 0.38);
}
.d-outline-accent {
  color: transparent;
  -webkit-text-stroke: 2px var(--accent, var(--red));
}

/* El eyebrow hace las dos cosas a la vez: el filete de 34×3px es SUPERFICIE y
   las letras son TINTA, así que no pueden compartir color. A 14,5px el texto es
   "texto normal" para la norma (el umbral de texto grande son 18,66px en
   negrita) y el rojo de marca sobre el crema da 3,69:1 — falla. El filete, en
   cambio, es un adorno de 3px que sólo necesita brillar.
   Por eso hay dos variables: --accent para el filete y --accent-t para la
   tinta. Si sólo se define --accent, la tinta lo hereda —así siguen andando los
   sitios que ya lo usaban— y si no hay ninguna, el respaldo es --red-t (4,97),
   no --red. */
.eyebrow {
  font-family: var(--font-body);
  font-weight: 800;
  font-size: 14.5px;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: var(--accent-t, var(--accent, var(--red-t)));
  display: inline-flex;
  align-items: center;
  gap: 14px;
}
.eyebrow::before {
  content: "";
  width: 34px;
  height: 3px;
  background: var(--accent, var(--red));
  display: inline-block;
}

.lead {
  font-size: clamp(16px, 1.5vw, 20px);
  color: var(--text-2);
  max-width: 58ch;
  text-wrap: pretty;
}

/* Tapa de la isla dinámica / notch: opaca SIEMPRE, sin depender del scroll.
   ⚠️ 2026-08-24, segunda vuelta sobre el fix de --nav-h de hoy mismo: ese fix
   bajó el nav y su franja para que no arrancaran detrás del notch, pero el
   propio <nav> sólo pinta fondo cuando trae la clase `.scrolled` (motion.js,
   se agrega pasados 40px de scroll) — mientras tanto es transparente, así
   que en esos primeros 40px (o en cualquier hero sin scroll) lo que hay
   detrás (foto del hero, chips, texto) se alcanzaba a ver justo por encima
   del notch. Esta franja es angosta (el alto exacto de la isla:
   env(safe-area-inset-top)), fija, del crema de fondo del sitio, y no se
   apaga nunca: nada queda nunca a la vista ahí, esté el nav transparente o
   no. Va encima del nav (900) y de la franja/pista de progreso (950) porque
   ambas arrancan justo debajo de ella, nunca la tapan. */
body::before {
  content: "";
  position: fixed;
  top: 0; left: 0; right: 0;
  height: env(safe-area-inset-top, 0px);
  background: var(--bg);
  z-index: 970;
  pointer-events: none;
}

/* ---------- Nav ---------- */
.stc-nav {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: 900;
  height: var(--nav-h);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  /* El padding-top deja pasar primero la isla dinámica (si la hay), luego la
     franja y su aire; el contenido de la barra se centra en los 72px que
     quedan debajo. */
  padding: calc(env(safe-area-inset-top, 0px) + var(--franja-h) + var(--franja-aire)) var(--pad) 0;
  transition: background-color 0.35s, backdrop-filter 0.35s, border-color 0.35s;
  border-bottom: 1px solid transparent;
}
.stc-nav.scrolled {
  background: rgba(245, 236, 214, 0.82);
  backdrop-filter: blur(18px);
  -webkit-backdrop-filter: blur(18px);
  border-bottom-color: var(--line);
}
.stc-nav .nav-logo { flex-shrink: 0; display: flex; align-items: center; }
.stc-nav .nav-logo img {
  height: 52px;
  width: auto;
  max-width: none;
  object-fit: contain;
  filter: drop-shadow(0 3px 10px rgba(40, 30, 12, 0.28));
  transition: transform 0.3s var(--ease-back);
}
.stc-nav .nav-logo:hover img { transform: scale(1.06) rotate(-2deg); }
.stc-nav .nav-links {
  display: flex;
  align-items: center;
  gap: clamp(8px, 1.7vw, 28px);
  list-style: none;
}
.stc-nav .nav-links a {
  font-weight: 700;
  font-size: clamp(12.5px, 1.15vw, 15px);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: rgba(246, 239, 221, 0.86);
  position: relative;
  padding: 6px 2px;
  transition: color 0.2s;
  white-space: nowrap;
}
.stc-nav .nav-links a::after {
  content: "";
  position: absolute;
  left: 0; bottom: 0;
  width: 100%; height: 2px;
  background: var(--nav-accent, var(--red));
  transform: scaleX(0);
  transform-origin: right;
  transition: transform 0.3s var(--ease-out);
}
.stc-nav .nav-links a:hover { color: #fff; }
.stc-nav .nav-links a:hover::after { transform: scaleX(1); transform-origin: left; }
.stc-nav .nav-links a.active { color: #fff; }
.stc-nav .nav-links a.active::after { transform: scaleX(1); }
/* Al hacer scroll la barra es crema → texto en tinta */
.stc-nav.scrolled .nav-links a { color: var(--text-2); }
.stc-nav.scrolled .nav-links a:hover,
.stc-nav.scrolled .nav-links a.active { color: var(--cream); }
/* subrayado del nav en el color de cada sección.
   Van con ">" a propósito: el último <li> es un desplegable y dentro lleva
   más <a>; con el descendiente suelto heredarían el acento del padre. */
.stc-nav .nav-links > li:nth-child(2) > a { --nav-accent: var(--c-futbol); }
.stc-nav .nav-links > li:nth-child(3) > a { --nav-accent: var(--c-f1); }
.stc-nav .nav-links > li:nth-child(4) > a { --nav-accent: var(--c-motogp); }
.stc-nav .nav-links > li:nth-child(5) > a { --nav-accent: var(--c-tenis); }

/* ---------- Nav · desplegable "Otros" ----------
   Festivales y Expediciones se agruparon aquí: son las dos secciones que no
   son un deporte, y sueltas alargaban la barra hasta empujar el CTA.
   El panel es un <ul> en position:absolute dentro del <li>; el nav no tiene
   overflow, así que no se recorta. Abre con el mouse (CSS), con clic y con
   teclado (JS en motion.js). */
.stc-nav .nav-drop { position: relative; }
.stc-nav .nav-drop-btn {
  font-family: inherit;
  font-weight: 700;
  font-size: clamp(12.5px, 1.15vw, 15px);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: rgba(246, 239, 221, 0.86);
  background: none;
  border: 0;
  cursor: pointer;
  position: relative;
  padding: 6px 2px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  white-space: nowrap;
  transition: color 0.2s;
}
.stc-nav .nav-drop-btn::after {
  content: "";
  position: absolute;
  left: 0; bottom: 0;
  width: 100%; height: 2px;
  /* mismo `--nav-accent` que los demás enlaces: en Festivales el subrayado
     tiene que ser magenta y en Expediciones morado, no rojo. Si fuera rojo
     fijo, la página tendría dos acentos vivos a la vez. */
  background: var(--nav-accent, var(--red));
  transform: scaleX(0);
  transform-origin: right;
  transition: transform 0.3s var(--ease-out);
}
.stc-nav .nav-drop-btn:hover,
.stc-nav .nav-drop-btn.is-active { color: #fff; }
.stc-nav .nav-drop-btn:hover::after,
.stc-nav .nav-drop-btn.is-active::after { transform: scaleX(1); transform-origin: left; }
.stc-nav.scrolled .nav-drop-btn { color: var(--text-2); }
.stc-nav.scrolled .nav-drop-btn:hover,
.stc-nav.scrolled .nav-drop-btn.is-active { color: var(--cream); }

.stc-nav .nav-drop-caret { transition: transform 0.3s var(--ease-out); }
.stc-nav .nav-drop:hover .nav-drop-caret,
.stc-nav .nav-drop:focus-within .nav-drop-caret,
.stc-nav .nav-drop.open .nav-drop-caret { transform: rotate(180deg); }

.stc-nav .nav-drop-menu {
  position: absolute;
  top: calc(100% + 16px);
  right: 0;
  min-width: 208px;
  list-style: none;
  padding: 8px;
  border-radius: 14px;
  background: rgba(245, 236, 214, 0.97);
  backdrop-filter: blur(18px);
  -webkit-backdrop-filter: blur(18px);
  border: 1px solid var(--line);
  box-shadow: 0 6px 14px rgba(40, 30, 12, 0.2);
  opacity: 0;
  visibility: hidden;
  /* Cinturón y tirantes. `visibility` ya saca el panel del árbol de foco, pero
     si un navegador congela el reloj de transiciones el `visibility 0s linear
     .2s` puede quedarse a medias y dejar el panel invisible pero "vivo",
     interceptando clics sobre el hero. `pointer-events` no se interpola ni
     depende del reloj. */
  pointer-events: none;
  transform: translateY(-7px);
  /* `visibility` NO se interpola: se le da 0s y se retrasa al cierre. Metida en
     la lista con duración, el panel se queda en el valor inicial mientras dura
     la transición, y si el navegador congela el reloj de animaciones (pestaña
     en segundo plano, render sin ventana) no llega a abrirse nunca. */
  transition: opacity 0.2s var(--ease-out), transform 0.2s var(--ease-out), visibility 0s linear 0.2s;
}
/* puente invisible: sin él, el mouse cruza el hueco de 16px y el panel se cierra */
.stc-nav .nav-drop-menu::before {
  content: "";
  position: absolute;
  left: 0; right: 0;
  top: -17px; height: 17px;
}
.stc-nav .nav-drop:hover .nav-drop-menu,
.stc-nav .nav-drop:focus-within .nav-drop-menu,
.stc-nav .nav-drop.open .nav-drop-menu {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: none;
  transition: opacity 0.2s var(--ease-out), transform 0.2s var(--ease-out), visibility 0s;
}
.stc-nav .nav-drop-menu a {
  display: flex;
  align-items: center;
  gap: 11px;
  padding: 11px 13px;
  border-radius: 9px;
  font-size: 13.5px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-2);
  transition: background-color 0.2s, color 0.2s;
}
/* el punto de color es el mismo acento que ya tenía cada sección en la barra */
.stc-nav .nav-drop-menu a::before {
  content: "";
  width: 8px; height: 8px;
  flex: none;
  border-radius: 50%;
  background: var(--dot, var(--red));
}
.stc-nav .nav-drop-menu a::after { display: none; }
/* ⚠️ Aquí decía var(--ink), que NO existe en el ámbito del nav: sólo se declara
   dentro de .stc-footer y de .prog-sheet. La declaración era inválida al
   computar, así que el color heredaba y ni el hover, ni el foco, ni el estado
   activo del desplegable "Otros" cambiaban de color. El token de tinta global
   es --cream (ver el bloque de color, arriba). */
.stc-nav .nav-drop-menu a:hover,
.stc-nav .nav-drop-menu a:focus-visible { background: rgba(33, 27, 18, 0.07); color: var(--cream); }
.stc-nav .nav-drop-menu a.active { color: var(--cream); background: rgba(33, 27, 18, 0.07); }

/* ⚠️ VA DESPUÉS de las reglas de apertura a propósito: tiene la misma
   especificidad que `.nav-drop:focus-within .nav-drop-menu`, así que gana por
   orden de fuente. Si alguien la sube de sitio, deja de cerrar nada.
   Por qué existe: al pulsar Escape el foco vuelve al botón, `:focus-within`
   se cumple otra vez y el panel se reabre solo. Para quien navega con teclado,
   Escape no cerraba nada. El JS pone esta clase y la quita en cuanto el foco
   o el mouse salen del desplegable. */
.stc-nav .nav-drop.force-closed .nav-drop-menu {
  opacity: 0;
  visibility: hidden;
  transform: translateY(-7px);
  transition: opacity 0.16s var(--ease-out), transform 0.16s var(--ease-out), visibility 0s linear 0.16s;
}
.stc-nav .nav-drop.force-closed .nav-drop-caret { transform: none; }

@media (prefers-reduced-motion: reduce) {
  /* misma trampa de arriba: `visibility` con duración se queda en el valor
     inicial mientras dura la transición. Va a 0s con retardo solo al cerrar. */
  .stc-nav .nav-drop-menu { transition: opacity 0.12s linear, visibility 0s linear 0.12s; transform: none; }
  .stc-nav .nav-drop:hover .nav-drop-menu,
  .stc-nav .nav-drop:focus-within .nav-drop-menu,
  .stc-nav .nav-drop.open .nav-drop-menu { transition: opacity 0.12s linear, visibility 0s; }
  .stc-nav .nav-drop.force-closed .nav-drop-menu {
    transform: none;
    transition: opacity 0.12s linear, visibility 0s linear 0.12s;
  }
  .stc-nav .nav-drop-caret { transition: none; }
}

.stc-nav .nav-cta { flex-shrink: 0; }

@media (max-width: 1100px) {
  .stc-nav .nav-logo img { height: 42px; }
  .stc-nav .nav-cta { padding: 12px 18px; font-size: 12.5px; }
}
/* ============================================================
   Nav · MENÚ MÓVIL
   Por debajo de 700px la barra escondía .nav-links y no ponía nada en su
   lugar: desde un teléfono no había manera de llegar a ninguna subpágina.
   Se llegaba al sitio por el home o por un enlace directo y ahí se acababa
   la navegación. Juan lo pidió el 2026-08-22.

   El botón y el panel NO están en el HTML: los fabrica motion.js clonando
   los enlaces que ya existen en .nav-links (ver initNavMobile). Así el menú
   no puede desincronizarse de la barra —son literalmente los mismos enlaces,
   con su .active y su color de acento— y no hay que repetir el mismo bloque
   en siete archivos con el riesgo de que a uno se le olvide.

   El CTA "Cotiza tu viaje" SALE de la barra en móvil y baja al panel. Las
   cuentas a 375px: 20+20 de padding, 99 del logo, 165 del CTA, 44 del botón
   y 32 de gaps = 340 sobre 335 disponibles; a 320px el desbordamiento es de
   60px. Encogerlo todo lo dejaba apretado y feo. No se pierde vía de
   contacto: el botón flotante de WhatsApp está fijo en las siete páginas y
   es el que cumple ese papel en un teléfono.
   ============================================================ */
.stc-nav .nav-burger {
  display: none; /* sólo existe por debajo de 700px */
  align-items: center;
  justify-content: center;
  width: 44px;   /* objetivo táctil mínimo; el trazo mide 22 */
  height: 44px;
  margin-right: -11px; /* el aire del botón compensa el --pad de la barra */
  padding: 0;
  background: none;
  border: 0;
  cursor: pointer;
  color: rgba(246, 239, 221, 0.86);
  transition: color 0.2s, transform 0.16s var(--ease-out);
}
.stc-nav .nav-burger:active { transform: scale(0.94); }
.stc-nav.scrolled .nav-burger { color: var(--text-2); }

.nav-burger-box { position: relative; width: 22px; height: 14px; }
.nav-burger-box i {
  position: absolute;
  left: 0;
  width: 100%;
  height: 2px;
  border-radius: 2px;
  background: currentColor;
  transition: transform 0.26s var(--ease-out), opacity 0.14s linear;
}
.nav-burger-box i:nth-child(1) { top: 0; }
.nav-burger-box i:nth-child(2) { top: 6px; }
.nav-burger-box i:nth-child(3) { top: 12px; }
/* El estado lo lleva aria-expanded, no una clase paralela: un solo atributo
   que ya hace falta para el lector de pantalla mueve también el dibujo, así
   que no pueden quedar en desacuerdo. */
.stc-nav .nav-burger[aria-expanded="true"] .nav-burger-box i:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.stc-nav .nav-burger[aria-expanded="true"] .nav-burger-box i:nth-child(2) { opacity: 0; transform: scaleX(0.3); }
.stc-nav .nav-burger[aria-expanded="true"] .nav-burger-box i:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

/* ---- Panel ---- */
.nav-sheet {
  display: none; /* sólo existe por debajo de 700px */
  position: fixed;
  top: var(--nav-h);
  left: 0; right: 0;
  z-index: 890; /* bajo la barra (900), sobre el WhatsApp flotante (800) */
  padding: 10px 10px calc(14px + env(safe-area-inset-bottom, 0px));
  background: rgba(245, 236, 214, 0.97);
  backdrop-filter: blur(18px);
  -webkit-backdrop-filter: blur(18px);
  border-bottom: 1px solid var(--line);
  box-shadow: 0 14px 30px rgba(40, 30, 12, 0.16);
  opacity: 0;
  visibility: hidden;
  /* Baja 10px, no crece desde scale(0): nada en el mundo real aparece de la
     nada, y un panel anclado a la barra tiene que salir DE la barra.
     Misma trampa de `visibility` que el desplegable "Otros": no se interpola,
     así que va a 0s y sólo se retrasa al cerrar. */
  transform: translateY(-10px);
  transition: opacity 0.24s var(--ease-out), transform 0.24s var(--ease-out), visibility 0s linear 0.24s;
}
.nav-sheet.open {
  opacity: 1;
  visibility: visible;
  transform: none;
  transition: opacity 0.24s var(--ease-out), transform 0.24s var(--ease-out), visibility 0s;
}
.nav-sheet ul { list-style: none; }
.nav-sheet a {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 13px 14px; /* 43px de alto: objetivo táctil cómodo */
  border-radius: 11px;
  font-size: 14.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-2);
  transition: background-color 0.2s, color 0.2s;
}
/* mismo punto de color que el desplegable "Otros"; el valor lo pone el JS
   leyendo el --nav-accent que cada enlace ya tenía en la barra */
.nav-sheet a::before {
  content: "";
  width: 9px; height: 9px;
  flex: none;
  border-radius: 50%;
  background: var(--dot, var(--cream));
}
.nav-sheet a::after { display: none; } /* mata el subrayado heredado de .nav-links a */
.nav-sheet a:active,
.nav-sheet a:focus-visible { background: rgba(33, 27, 18, 0.07); color: var(--cream); }
.nav-sheet a.active { color: var(--cream); background: rgba(33, 27, 18, 0.07); }
.nav-sheet .nav-sheet-cta {
  justify-content: center;
  margin-top: 9px;
  padding: 16px 14px;
  border-radius: 999px;
  background: var(--red);
  color: #fff;
  font-weight: 800;
  letter-spacing: 0.08em;
}
.nav-sheet .nav-sheet-cta::before { display: none; }
.nav-sheet .nav-sheet-cta:active { background: var(--red); transform: scale(0.98); }

/* ---- Velo ----
   Empieza bajo la barra, no en el borde de la pantalla: la barra sigue
   legible y se ve que el menú cuelga de ella. */
.nav-scrim {
  display: none;
  position: fixed;
  top: var(--nav-h);
  left: 0; right: 0; bottom: 0;
  z-index: 880;
  /* .55 y no menos: sobre crema un velo flojo deja el texto de detrás casi
     igual de legible y compite con el menú en vez de apartarse. */
  background: rgba(33, 27, 18, 0.55);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.24s var(--ease-out), visibility 0s linear 0.24s;
}
.nav-scrim.open { opacity: 1; visibility: visible; transition: opacity 0.24s var(--ease-out), visibility 0s; }

/* bloquea el scroll de detrás mientras el menú está abierto */
html.nav-abierto, html.nav-abierto body { overflow: hidden; }

@media (max-width: 700px) {
  .stc-nav .nav-links { display: none; }
  .stc-nav .nav-cta { display: none; }
  .stc-nav .nav-burger { display: inline-flex; }
  .nav-sheet, .nav-scrim { display: block; }
}

@media (prefers-reduced-motion: reduce) {
  .stc-nav .nav-burger, .nav-burger-box i { transition: none; }
  .nav-sheet {
    transform: none;
    transition: opacity 0.12s linear, visibility 0s linear 0.12s;
  }
  .nav-sheet.open { transition: opacity 0.12s linear, visibility 0s; }
  .nav-scrim { transition: opacity 0.12s linear, visibility 0s linear 0.12s; }
  .nav-scrim.open { transition: opacity 0.12s linear, visibility 0s; }
}

/* ---------- Botones ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-weight: 800;
  font-size: 15.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 18px 34px;
  border-radius: 999px;
  border: none;
  cursor: pointer;
  position: relative;
  overflow: hidden;
  transition: transform 0.2s var(--ease-out), box-shadow 0.3s;
  will-change: transform;
}
.btn-primary {
  background: var(--red-cta);
  color: #fff;
}
.btn-primary:hover { box-shadow: 0 8px 40px rgba(232, 32, 46, 0.45); }
.btn-ghost {
  background: transparent;
  color: var(--cream);
  /* .30 daba 1,89:1 contra el crema: por debajo del 3:1 que pide 1.4.11 para
     el límite de un control. .52 da 3,2:1. */
  border: 1.5px solid rgba(33, 27, 18, 0.52);
}
.btn-ghost:hover { border-color: var(--cream); }
/* El hundido al pulsar va TAMBIÉN por variable, no sólo por `transform`: en
   escritorio initMagnetic (motion.js) escribe un transform EN LÍNEA para el imán
   del ratón, y el estilo en línea gana siempre a la hoja. Resultado: con mouse,
   el botón no acusaba el clic. Ahora el imán compone
   `translate(...) scale(var(--btn-press))` y las dos cosas conviven. */
.btn:active { transform: scale(0.97); --btn-press: 0.97; }
.btn .arr { transition: transform 0.25s var(--ease-out); display: inline-block; }
.btn:hover .arr { transform: translateX(5px); }

/* ---------- Marquee ---------- */
.marquee {
  overflow: hidden;
  white-space: nowrap;
  user-select: none;
  display: flex;
}
.marquee-track {
  display: inline-flex;
  align-items: center;
  flex-shrink: 0;
  gap: 0;
  will-change: transform;
}
.marquee-band {
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  padding: 18px 0;
  background: var(--bg-2);
}
.marquee-band .mq-item {
  font-family: var(--font-display);
  font-size: clamp(22px, 2.8vw, 44px);
  text-transform: uppercase;
  letter-spacing: 0.02em;
  padding: 0 30px;
  display: inline-flex;
  align-items: center;
  gap: 30px;
}
.marquee-band .mq-item .star {
  color: var(--accent, var(--red));
  font-size: 0.7em;
}
.marquee-band .mq-item.ghost {
  color: transparent;
  -webkit-text-stroke: 1.5px rgba(33, 27, 18, 0.32);
}

/* Cinta inclinada en rojo */
.marquee-band.band-red {
  background: var(--red);
  border: none;
  transform: rotate(-2deg) scale(1.06);
  margin: 30px 0;
  box-shadow: 0 20px 60px rgba(232,32,46,0.25);
}
.marquee-band.band-red .mq-item { color: #fff; }
.marquee-band.band-red .mq-item.ghost {
  color: transparent;
  -webkit-text-stroke: 1.5px rgba(255,255,255,0.75);
}
.marquee-band.band-red .mq-item .star { color: #0d0d14; }

/* ---------- Reveals (JS añade .in) ---------- */
[data-reveal] { will-change: transform, opacity; }
[data-reveal="up"] { opacity: 0; transform: translateY(56px); }
[data-reveal="up"].in { opacity: 1; transform: none; transition: opacity 0.9s var(--ease-out), transform 0.9s var(--ease-out); }
[data-reveal="scale"] { opacity: 0; transform: scale(0.86); }
[data-reveal="scale"].in { opacity: 1; transform: none; transition: opacity 0.9s var(--ease-out), transform 0.9s var(--ease-back); }
[data-reveal="clip"] { clip-path: inset(0 0 100% 0); }
[data-reveal="clip"].in { clip-path: inset(0 0 0% 0); transition: clip-path 1s var(--ease-out); }
[data-reveal="wipe"] { clip-path: inset(0 100% 0 0); }
[data-reveal="wipe"].in { clip-path: inset(0 0% 0 0); transition: clip-path 1.1s var(--ease-out); }

/* split por letras */
[data-split] .ch {
  display: inline-block;
  transform: translateY(110%) rotate(6deg);
  opacity: 0;
}
[data-split].in .ch {
  transform: none;
  opacity: 1;
  transition: transform 0.7s var(--ease-out), opacity 0.4s;
  transition-delay: calc(var(--i) * 0.035s);
}
/* La máscara que esconde las letras antes de que suban.
   ⚠️ El `overflow: hidden` recorta a la altura de la caja de línea, y con
   `line-height: 0.96` esa caja deja solo 0.90em por encima de la línea base.
   En Anton una mayúscula normal mide 0.86em, pero una acentuada (Á É Í Ó Ú)
   mide 1.10em y la Ñ 1.07em: la tilde entera quedaba fuera y se cortaba.
   Medido a 74.88px: 67.5px de sitio contra 82.4px de tinta = 14.9px comidos.
   Por abajo pasaba lo mismo con la Q (6.8px de cola contra 4.4px de sitio).
   El padding abre la máscara y el margen negativo devuelve la caja a su
   tamaño original, así que el texto no se mueve ni un pixel.
   Como las letras entran desde ABAJO (translateY 110%), abrir el techo no
   deja escapar nada; el borde que hace el trabajo es el de abajo. */
[data-split] .word {
  display: inline-block;
  overflow: hidden;
  vertical-align: bottom;
  padding-top: 0.28em;
  margin-top: -0.28em;
  padding-bottom: 0.09em;
  margin-bottom: -0.09em;
}

/* ---------- Salida de emergencia de los reveals ----------
   La pone motion.js (initReveals → destaparTodo) cuando el sondeo por rAF deja
   de latir: pestaña en segundo plano, render sin ventana, o al imprimir. El
   porqué está contado largo allí.

   No basta con añadir .in: si el compositor está congelado, la TRANSICIÓN
   tampoco avanza y las letras se quedan a medio subir con opacity 0. Medido el
   2026-08-23: con .in puesta, las 29 letras del cierre de futbol.html seguían
   en opacidad 0. Por eso esta clase mata la transición además de fijar el
   estado final — el salto es instantáneo, que es justo lo que se quiere cuando
   nadie está mirando la animación.

   Es el mismo juego de declaraciones que la media query de movimiento reducido
   de aquí abajo y que el <noscript> de cada página: tres puertas distintas al
   mismo sitio seguro. Si tocas una, mira las otras dos. */
html.sin-animacion [data-reveal],
html.sin-animacion [data-split] .ch {
  opacity: 1 !important;
  transform: none !important;
  clip-path: none !important;
  transition: none !important;
}
html.sin-animacion [data-split] .word { overflow: visible; }

@media (prefers-reduced-motion: reduce) {
  [data-reveal], [data-split] .ch { opacity: 1 !important; transform: none !important; clip-path: none !important; }
  .marquee-track { animation: none !important; }
  /* ⚠️ animation-duration a solas NO detiene una animación `infinite`: la
     acelera a ~100.000 ciclos por segundo, o sea estrobo, que para alguien con
     sensibilidad vestibular es peor que el movimiento original. Hay que forzar
     también el número de repeticiones. Las dos infinitas vivas hoy (.bf-track y
     .cl-track) traen su propio `animation: none`, pero esto cubre la siguiente
     que se añada sin acordarse. */
  * {
    transition-duration: 0.01ms !important;
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    scroll-behavior: auto !important;
  }
}

/* ---------- Foco visible ----------
   Antes sólo había dos reglas de :focus-visible en todo el sitio, las dos en el
   nav. Todo lo demás dependía del anillo por defecto del navegador, que sobre
   foto oscura (heros, carrusel) y sobre el crema apenas se distingue. Esto pone
   un anillo propio, de la marca, para cualquier cosa enfocable con teclado.
   Va con :focus-visible, no con :focus, para que el clic de ratón no lo dispare. */
:where(a, button, input, textarea, select, summary, [tabindex]):focus-visible {
  outline: 3px solid var(--blue-deep);
  outline-offset: 3px;
  border-radius: 4px;
}
/* Sobre fotografía y sobre los fondos oscuros el azul profundo se pierde: ahí
   el anillo va en papel crema, que contrasta contra cualquier imagen. */
.dhero :where(a, button):focus-visible,
.hero-carrusel :where(a, button):focus-visible,
.wa-fab:focus-visible {
  outline-color: var(--bg);
  outline-offset: 3px;
}

/* ---------- Secciones ---------- */
.section {
  position: relative;
  padding: clamp(80px, 11vw, 160px) var(--pad);
}
.section-head { margin-bottom: clamp(36px, 5vw, 72px); }
.section-head .d-big { margin-top: 14px; }

/* ---------- Cards ---------- */
.card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 24px;
  overflow: hidden;
  position: relative;
  transition: transform 0.35s var(--ease-out), border-color 0.3s;
}
.card:hover { border-color: var(--line-2); }

/* ---------- Footer "Pasaporte" — rediseño 2026-08-22 ----------
   Reemplaza al `.footer-pasaporte` anterior (mismas piezas, otra composición).
   Viene del paquete "Rediseño pie de página sports". Lo que se cambió al
   integrarlo, y por qué:

   1. LOS TOKENS VAN AQUÍ, NO EN `:root`. El paquete traía un bloque
      `:root{--stc-paper:…}` con una paleta paralela que nadie más usa. Se bajó
      al propio `.stc-footer`, que es la convención que ya seguía el pie viejo
      (`.footer-pasaporte{--paper:…}`). Así el pie sigue siendo el único sitio
      del CSS donde vive esa paleta de papel y no hay dos verdades en `:root`.
   2. EL LOGO ES `assets/logo-stc-400.png`, NO EL JPG DEL PAQUETE. El paquete
      pedía `mix-blend-mode: multiply` porque su logo era un JPG sin
      transparencia (237 KB) y había que "quemar" el fondo blanco contra el
      papel. El sitio ya tiene EL MISMO arte en PNG con alfa real (2,349 vs
      2,346 de proporción), y ese PNG ya está cacheado porque lo usa la barra de
      navegación en las 7 páginas. Así que se usa ese y se cae el blend: un
      asset menos y el logo se pinta con sus colores reales en vez de
      multiplicados contra el crema.
      ⚠️ El archivo cambió el 2026-08-23, antes de publicar. Era `logo-stc.png`,
      1600×681 RGBA y **1.299 KB** — el archivo más pesado del sitio con
      diferencia—, y se dibujaba a 122×52 en la barra y a 150×64 en el pie, o
      sea que ni a DPR 2 se aprovechaba una décima parte. El relevo es el mismo
      arte a 400×170 en paleta de 256 colores con alfa: **19,9 KB, un 98,5 %
      menos**, con un error medio de 2,03/255 al tamaño en que se ve (o sea,
      invisible). El máster de 1600px sigue en `assets/logo-stc.png` y ya no lo
      referencia nadie: **no lo subas al servidor, pero tampoco lo borres del
      disco** — es el original del que se regenera el derivado.
      ⚠️ Se probó WebP y salió PEOR: en arte de bordes duros como un logotipo, el
      WebP con pérdida ensucia los filos (error medio 12,69 a q88) y pesa más que
      una paleta de 256. Para logos, PNG-256; para fotos, WebP.
   3. EL GRANO PROPIO SE QUEDA, aunque `body::after` ya pinte uno global. No es
      un descuido heredado: el global va `position: fixed` y por tanto es
      uniforme en toda la pantalla; el de aquí va `absolute` sobre el pie y
      SUMA densidad sólo ahí. Esa diferencia de densidad es lo que hace que el
      pie se lea como otro papel —la página de datos del pasaporte— y no como
      más página. Era el comportamiento del pie anterior; quitarlo cambia el
      look que Juan ya aprobó.
   4. LOS ENLACES SON REALES. El paquete traía `href="#"` en Destinos, Instagram
      y Facebook, y convertía "Santorini Group" en enlace. Aquí Destinos y las
      redes apuntan a las URL de verdad, y Santorini Group vuelve a ser un
      `<span class="sg">` porque NO HAY URL de Santorini Group: un `#` en
      producción es un enlace que no lleva a ninguna parte. */
.stc-footer {
  --paper: #f6efda;
  --ink: #211b12;
  --ink-2: rgba(33, 27, 18, .76);
  /* Estaba en .50 = 3,2:1 sobre el papel del pie. Lo usan los rótulos
     ("TITULAR", "GRUPO", "DESTINOS", "CONTACTO"), el "Tipo P · Cód. COL", la
     MRZ y el copyright: todos entre 10 y 12,5 px. Ir en versalitas y en peso
     800 no los convierte en texto grande —el umbral es 18,66 px en negrita—,
     así que fallaban los seis. .62 da 4,6:1 y a ojo el pie no cambia: son
     rótulos que ya eran discretos y lo siguen siendo, sólo dejan de lavarse.
     Es el mismo arreglo, con el mismo valor, que ya llevaban --ink-3 en
     programa-popup.css y --text-3 aquí mismo. */
  --ink-3: rgba(33, 27, 18, .62);
  --pp-line: rgba(33, 27, 18, .15);
  --pp-line-2: rgba(33, 27, 18, .30);
  /* Dos rojos, misma razón que arriba: --pp-red es el de SUPERFICIE (el marco
     del sello, los filetes) y --pp-red-t el de TINTA. Sobre el papel del pie
     (#f6efda) el de marca da 3,91:1 y el de tinta 5,27. */
  --pp-red: var(--red);
  --pp-red-t: var(--red-t);
  --azul: #0a4fa8;
  --olive: #6b7a2a;
  --mono: ui-monospace, "SFMono-Regular", Menlo, monospace;
  --ease: var(--ease-out);
  position: relative;
  background: var(--paper); color: var(--ink);
  font-family: var(--font-body);
  overflow: hidden;
  border-top: 1px solid rgba(33, 27, 18, .16);
}
/* grano de papel — ver nota 3 de la cabecera */
.stc-footer::before {
  content: ""; position: absolute; inset: 0; pointer-events: none; opacity: .45; mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='ppg'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23ppg)' opacity='.34'/%3E%3C/svg%3E");
}
.stc-footer__inner { position: relative; z-index: 1; padding: 0 var(--pad); }
/* OJO CON LA ESPECIFICIDAD DE ESTAS DOS REGLAS. `.stc-footer a` pesa (0,1,1) y
   `.stc-footer a:hover` pesa (0,2,1): las dos le ganan a `.stc-btn-wa` (0,1,0)
   y a `.stc-chip:hover` (0,2,0), que están más abajo en el archivo pero pesan
   menos. El resultado, medido el 2026-08-23, era que el botón de WhatsApp
   salía con tinta en vez del blanco que declara —3,8:1 sobre el rojo— y que
   AL PASAR EL CURSOR desaparecían del todo tanto su texto como el de los chips
   de Instagram y Facebook: rojo sobre rojo. Se veía en las 7 páginas.
   Por eso las reglas del botón y del chip van calificadas con `.stc-footer`
   delante; no las descalifiques "para limpiar", vuelven a romperse. */
.stc-footer a { color: inherit; text-decoration: none; }
.stc-footer a:hover { color: var(--pp-red-t); }

/* ---- barra superior de pasaporte ---- */
.stc-footer__top { display: flex; flex-wrap: wrap; gap: 12px; justify-content: space-between; align-items: center;
  padding: 18px 0 12px; border-bottom: 3px solid var(--ink);
  font-size: 12px; font-weight: 800; letter-spacing: .24em; text-transform: uppercase; }
.stc-footer__top b { color: var(--azul); font-weight: 800; }
.stc-footer__top span:last-child { color: var(--ink-3); }

/* ---- rejilla principal ---- */
.stc-footer__grid { display: grid; grid-template-columns: minmax(300px, 1.15fr) 1fr 1fr;
  gap: clamp(26px, 4.5vw, 72px); padding: clamp(30px, 3.4vw, 46px) 0 clamp(24px, 2.8vw, 36px); }
/* Cada columna es su propio contenedor de consulta, para que Destinos pueda
   partirse en dos (ver `.stc-list`). Su ancho lo fija el reparto de la rejilla,
   no el viewport: una media query sobre el ancho de ventana no puede saber si la
   lista cabe en dos columnas, y la @container sí. El reparto de arriba no se
   tocó — es el que se aprobó el 2026-08-22. */
.stc-footer__grid > * { container-type: inline-size; }

/* columna de marca: la página de datos del pasaporte */
.stc-brand { display: flex; flex-direction: column; gap: 18px; }
.stc-brand__id { display: flex; gap: 18px; align-items: flex-start; }
.stc-brand__photo { flex: 0 0 auto; width: 118px; height: 118px; border: 1px solid var(--pp-line-2); border-radius: 4px;
  background: var(--surface-2); display: grid; place-items: center; padding: 9px; }
.stc-brand__photo img { width: 100%; height: auto; }
.stc-brand__fields { display: grid; gap: 12px; padding-top: 2px; }
.stc-field__label { font-size: 10px; font-weight: 800; letter-spacing: .22em; text-transform: uppercase; color: var(--ink-3); }
.stc-field__value { font-family: var(--font-display); font-size: 24px; line-height: .95; text-transform: uppercase; margin-top: 4px; }
.stc-field__value--sm { font-size: 17px; line-height: 1; }
.stc-brand__blurb { margin: 0; max-width: 40ch; color: var(--ink-2); font-size: 15.5px; line-height: 1.55; }

/* columnas de enlaces */
.stc-col__title { margin: 0 0 14px; font-size: 11.5px; font-weight: 800; letter-spacing: .22em; text-transform: uppercase; color: var(--ink-3); }
.stc-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 0; }
.stc-list li { border-top: 1px solid var(--pp-line); }
.stc-list li:last-child { border-bottom: 1px solid var(--pp-line); }
.stc-list a { display: flex; justify-content: space-between; align-items: center; gap: 14px; padding: 9px 0; font-weight: 600; font-size: 16px; }
/* Destinos en dos columnas. Era LA razón de que el pie fuera tan alto: la fila
   de la rejilla mide lo que su columna más alta, y seis enlaces apilados daban
   296 px de contenido contra 184 de Marca y 176 de Contacto. Partida en tres
   filas baja a 164 y las tres columnas quedan parejas — el pie pasa de 669 a
   557 px, 112 menos, sin quitar nada.
   El umbral son 300 px porque la fila más ancha, “Expediciones”, mide 98 de
   texto + 14 de hueco + 16 de flecha = 128, y en 300 caben dos de 141 con el
   hueco de 18 en medio: 13 px de holgura por lado, que aguantan la variación de
   la fuente de respaldo. Se mide contra la columna, no contra la ventana: la
   @container: la lista también se parte en móvil, que es donde más se agradece.
   El orden es por filas (Fútbol · Fórmula 1 / Moto GP · Tenis / Festivales ·
   Expediciones), que es el del DOM: el orden visual y el del lector de pantalla
   no se separan. Las tres filas miden lo mismo, así que las rayas cuadran de
   columna a columna y sigue leyéndose como el manifiesto rayado de un pasaporte
   y no como dos listas sueltas. La raya de cierre pasa del último <li> a los dos
   últimos, que son la fila de abajo; en una sola columna `li:last-child` sigue
   haciendo su trabajo. */
@container (min-width: 300px) {
  .stc-list { grid-template-columns: 1fr 1fr; column-gap: clamp(18px, 6cqw, 34px); }
  .stc-list li:nth-last-child(-n+2) { border-bottom: 1px solid var(--pp-line); }
}
/* La flecha estaba en .35 = 2,14:1 sobre el papel del pie. No es texto —es el
   único indicio de que las seis líneas de Destinos son enlaces—, así que la
   norma que le aplica es la de elementos gráficos: 3:1. Con .50 da 3,19 y sigue
   siendo claramente más tenue que el nombre del destino, que es lo que se
   busca: la flecha acompaña, no compite. */
.stc-list a .arr { color: rgba(33, 27, 18, .50); transition: transform .3s var(--ease); }
.stc-list a:hover .arr { transform: translateX(5px); }

/* contacto */
.stc-contact { display: grid; gap: 16px; justify-items: start; }
/* Fondo en --red-cta y no en --pp-red: es una píldora roja con texto blanco, y
   el rojo de marca da 4,48:1 con #fff. Mismo criterio que el botón de enviar
   del formulario y que el panel rojo de contacto. */
.stc-footer .stc-btn-wa { display: inline-flex; align-items: center; gap: 10px; padding: 12px 22px; border-radius: 999px;
  background: var(--red-cta); color: #fff; font-weight: 700; font-size: 15px; white-space: nowrap;
  transition: box-shadow .3s var(--ease), transform .12s var(--ease); }
.stc-footer .stc-btn-wa:hover { color: #fff; box-shadow: 0 12px 34px rgba(232, 32, 46, .4); }
.stc-btn-wa:active { transform: scale(.97); }
/* La flecha del botón se desplaza en hover como en TODOS los demás botones del
   sitio (.btn .arr, .dhero-btn .arr, .link-sp .arr). El paquete no lo traía y
   éste habría sido el único botón del sitio con la flecha quieta. */
.stc-btn-wa .arr { display: inline-block; transition: transform .25s var(--ease); }
.stc-btn-wa:hover .arr { transform: translateX(4px); }
.stc-mail { font-weight: 600; font-size: 16px; }
.stc-social { display: flex; gap: 10px; flex-wrap: wrap; }
.stc-chip { padding: 8px 16px; border: 1px solid var(--pp-line-2); border-radius: 999px; font-weight: 600; font-size: 14px;
  transition: background .3s, color .3s, border-color .3s, transform .3s var(--ease); }
.stc-footer .stc-chip:hover { background: var(--red-cta); color: #fff; border-color: var(--red-cta); transform: translateY(-3px); }

/* ---- wordmark en contorno + sellos ----
   Los tres sellos ya NO van en `position: absolute` encima del texto como en el
   pie anterior (donde el sello redondo caía sobre el párrafo de marca): van en
   fila, alineados al canto inferior del wordmark. */
.stc-wordmark-row { display: flex; align-items: flex-end; justify-content: space-between; gap: clamp(20px, 3vw, 48px);
  border-top: 1px solid var(--pp-line); padding-top: clamp(16px, 2vw, 26px); }
.stc-wordmark { font-family: var(--font-display); text-transform: uppercase; line-height: .82;
  font-size: clamp(44px, 9.6vw, 150px); letter-spacing: -.01em;
  color: transparent; -webkit-text-stroke: 2px rgba(33, 27, 18, .42); white-space: nowrap; }
.stc-seals { flex: 0 0 auto; display: flex; align-items: center; gap: 12px; opacity: .42; margin-bottom: clamp(10px, 1.6vw, 22px); }
.stc-seal { font-size: 9px; font-weight: 800; letter-spacing: .16em; text-transform: uppercase; text-align: center;
  line-height: 1.3; padding: 7px 11px; border-radius: 4px; }
.stc-seal--admitido { border: 2px solid var(--pp-red); color: var(--pp-red); transform: rotate(-8deg); }
.stc-seal--visa { border: 2px solid var(--azul); color: var(--azul); border-radius: 50%; width: 70px; height: 70px;
  padding: 0; display: grid; place-content: center; font-size: 8.5px; letter-spacing: .14em; line-height: 1.4; transform: rotate(7deg); }
.stc-seal--embarcado { border: 2px solid var(--olive); color: var(--olive); transform: rotate(5deg); }

/* ---- MRZ y línea legal ---- */
.stc-mrz { font-family: var(--mono); font-size: 12.5px; letter-spacing: .14em; color: var(--ink-3);
  padding: 10px 0 14px; white-space: nowrap; overflow: hidden; }
.stc-legal { display: flex; flex-wrap: wrap; gap: 12px; justify-content: space-between;
  border-top: 1px solid var(--pp-line); padding: 14px 0 22px;
  font-family: var(--mono); font-size: 11.5px; letter-spacing: .06em; color: var(--ink-3); }
.stc-legal .sg { color: var(--pp-red-t); }

/* ---- responsive ---- */
@media (max-width: 900px) {
  .stc-footer__grid { grid-template-columns: 1fr 1fr; }
  .stc-brand { grid-column: 1 / -1; }
  .stc-seals { display: none; }
}
@media (max-width: 560px) {
  .stc-footer__grid { grid-template-columns: 1fr; }
  .stc-brand__id { gap: 14px; }
  .stc-brand__photo { width: 92px; height: 92px; }
  .stc-wordmark { font-size: clamp(36px, 13vw, 64px); }
  .stc-mrz { font-size: 11px; }
}
@media (prefers-reduced-motion: reduce) { .stc-footer * { transition: none !important; } }

/* La barra de progreso ya no vive aquí: se fundió con la franja tricolor del
   tope. Ver la sección "FRANJA TRICOLOR" al final de este archivo. */

/* ---------- WhatsApp flotante ---------- */
.wa-fab {
  position: fixed;
  right: 22px; bottom: 22px;
  z-index: 800;
  width: 58px; height: 58px;
  border-radius: 50%;
  background: #22c55e;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 10px 30px rgba(34, 197, 94, 0.4);
  transition: transform 0.25s var(--ease-back);
}
.wa-fab:hover { transform: scale(1.1) rotate(8deg); }
.wa-fab svg { width: 28px; height: 28px; fill: #fff; }

/* ---------- Foto con parallax interno ---------- */
.ph {
  overflow: hidden;
  border-radius: 24px;
  position: relative;
  background: var(--surface-2);
}
.ph img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  will-change: transform;
}
.ph .credit {
  position: absolute;
  bottom: 10px; right: 14px;
  font-size: 10px;
  letter-spacing: 0.1em;
  color: rgba(255, 255, 255, 0.55);
  text-transform: uppercase;
  background: rgba(0, 0, 0, 0.45);
  padding: 3px 8px;
  border-radius: 999px;
}

/* ============================================================
   FRANJA TRICOLOR AL TOPE DE LA PÁGINA — y barra de progreso, que ahora son
   LA MISMA PIEZA.

   Historia, porque explica por qué está construida en dos capas:
     · Nació el 2026-08-22 al PIE del hero, para coser el corte a filo contra el
       crema. Juan la movió al tope el mismo día: *"la línea esa que hicimos para
       la transición la pongas en el tope superior de la página, es decir que
       empiece con eso"*.
     · Arriba se encontró con la barra de progreso de lectura, que ya estaba y
       ocupaba exactamente los mismos píxeles (`position: fixed; top: 0`). Dos
       barras de colores peleándose 6px. Juan: *"la línea de arriba me gusta pero
       choca con la barra que va apareciendo a medida que uno scrollea que también
       me gusta entonces unamos las ideas, que la barra que pusimos ahorita sea la
       que vaya apareciendo a medida que se scrollea"*.

   La fusión: la franja tricolor ES el progreso. No se encoge ni se estira — se
   DESTAPA de izquierda a derecha. Eso es lo que la vuelve legible además de
   bonita: los tres colores quedan clavados a la página, así que el color que
   estás viendo dice en qué tercio vas. Rojo = primer tercio, amarillo = mitad,
   azul = el final. Si en vez de destapar se escalara (que es lo que hacía la
   barra vieja con `scaleX`), al 10% se vería una banderita completa en miniatura
   y el color dejaría de significar nada.

   DOS CAPAS, y cada una está donde está por un motivo:
   · La PISTA es `.stc-nav::before`. Va colgada del nav —que ya es `fixed` y va a
     `z-index: 900`— y no del <body>, porque así el alto del nav puede reservarle
     sitio con `padding-top`, que es de donde sale el aire que Juan pidió entre la
     franja y el logo. Es el mismo tricolor a poca opacidad: al cargar la página
     la franja ya está ahí (apagada), no es un hueco vacío sobre el logo.
   · El RELLENO es `.scroll-progress`, un <div> que ya existía en las 7 páginas y
     que se reaprovecha tal cual (cero cambios de HTML). Es `fixed` y va por
     encima del nav para que caiga justo sobre la pista.

   ⚠️ Es RELLENO EN UN <div> Y NO EN OTRO `::after` DEL NAV a propósito, y no por
   comodidad: el JS tiene que reescribir el recorte en cada frame, y a un
   pseudo-elemento sólo se le llega por variable CSS. Poner una custom property
   en `.stc-nav` obligaría al navegador a recalcular estilo de TODOS los hijos del
   nav (logo, 6 enlaces, el desplegable entero) 60 veces por segundo. Escribiendo
   `clipPath` directo sobre un <div> sin hijos, el recálculo es de un solo nodo.

   ⚠️ `clip-path: inset()` y no `width`: el ancho es propiedad de layout y
   dispararía reflow en cada frame. El recorte se compone en GPU.

   ⚠️ Las dos capas TIENEN que compartir geometría (top: env(safe-area-inset-top,
   0px) desde 2026-08-24 —antes era top 0 a secas, ver la nota de --nav-h en
   :root—, de lado a lado, alto
   --franja-h) o el relleno no encaja con la pista. Si tocas una, toca la otra.

   ⚠️ El alto vive en `--franja-h` (:root) porque `--nav-h` lo suma. Si cambias
   uno sin el otro, el logo se descentra.

   Los tres colores son los del logo y ya estaban en :root (--red, --yellow,
   --blue). No se inventa ninguno. Sí es la única pieza del sitio con tres
   acentos vivos a la vez —contra la regla de "un solo acento por página"—, y es
   a propósito: aquí el acento no es el del deporte, es el de la marca. Por eso
   va idéntica en las 7 páginas y no hereda --sp.

   Paradas duras (0 33.333% / 33.333% 66.667% / …): sin el segundo valor el
   degradado interpola y salen dos franjas de transición naranja y verde.
   ============================================================ */
.stc-nav::before,
.scroll-progress {
  content: "";
  height: var(--franja-h);
  background: linear-gradient(90deg,
    var(--red)    0 33.333%,
    var(--yellow) 33.333% 66.667%,
    var(--blue)   66.667% 100%);
}
/* Pista: el mismo tricolor apagado, dentro del nav.
   El .35 está medido contra el papel, no elegido a ojo. Con .2 el tercio
   amarillo (#ffc400 sobre #f3e8cf) se funde con el fondo y la pista se lee
   "rojo · nada · azul", que parece un fallo de carga. Con .5 la pista pesa casi
   igual que el relleno y se pierde de un vistazo por dónde va el avance. El .35
   es la ventana donde los tres tercios se despegan del papel y aun así el salto
   de saturación marca con claridad la cabeza del relleno. */
.stc-nav::before {
  position: absolute;
  top: env(safe-area-inset-top, 0px); left: 0; right: 0;
  opacity: .35;
}
/* relleno: a todo color, por encima del nav (900) y por debajo del popup de
   programa (960), que sí debe taparlo. Arranca en cero.
   `top` comparte el env(safe-area-inset-top) de la pista de arriba a propósito
   (ver la advertencia de "DOS CAPAS" más abajo): si sólo se mueve una, el
   relleno deja de encajar sobre la pista en iPhone con isla dinámica. */
.scroll-progress {
  position: fixed;
  top: env(safe-area-inset-top, 0px); left: 0; right: 0;
  z-index: 950;
  pointer-events: none;
  clip-path: inset(0 100% 0 0);
}
/* En móvil 6px pesan más de lo que parecen: el ancho baja a un cuarto y la
   franja empieza a leerse como una barra, no como una costura. */
@media (max-width: 700px) {
  :root { --franja-h: 4px; }
}

/* Aquí vivían los BANDERINES al pie del hero: una guirnalda tricolor colgada del
   canto de la foto. Tercer intento de coser esa costura y tercer rechazo — Juan,
   2026-08-22: *"quita los banderines, no dejemos nada"*.

   ⚠️ NO VUELVAS A PONER NADA AHÍ sin que lo pida. El historial completo es: línea
   tricolor a ras (*"no me convence"*), troquel de estampilla (*"no me gustó nada,
   no sé ni qué es eso"*) y banderines (*"no dejemos nada"*). Tres piezas muy
   distintas —un filo, una mordida y un objeto— y las tres sobraban. La lectura
   correcta no es "hay que encontrar la pieza buena" sino que ese canto NO PIDE
   PIEZA: la foto termina en un corte limpio contra el crema y con eso basta. El
   tricolor, que era lo que se quería ver ahí, quedó arriba y ahora además mide el
   avance de la lectura (ver la sección anterior). */


/* ============================================================
   SEPARADOR "BUFANDA DE HINCHA"
   Cinta tejida estilo bufanda de estadio entre secciones.
   Tipografía del sitio: Anton (--disp) y Saira (--type).
   Anima con CSS puro (no requiere JS).
   ============================================================ */

/* DÓNDE VA, Y POR QUÉ NO HAY UNA CLASE "BUFANDA DE HERO"
   ------------------------------------------------------
   Desde el 2026-08-22 la bufanda es también el remate del hero en las SEIS
   subpáginas: va inmediatamente después de `</header>`, antes de #programas.
   Juan la pidió señalando una captura de expediciones.html, donde ya caía ahí
   por accidente (esa página tiene #programas oculta). En futbol / formula-1 /
   moto-gp / tenis la cinta que estaba entre #programas y el CTA final NO se
   duplicó: se MOVIÓ. Dos marquesinas idénticas en una subpágina de una o dos
   tarjetas quedaban a menos de una pantalla y sonaba a tartamudeo.

   ⚠️ EN EL HOME NO VA BAJO EL HERO. Se puso el mismo día y Juan la rechazó en
   caliente: *"quita la cinta de inicio, esa no me gustó, las otras sí"*. Es la
   CUARTA pieza que se cae en ese canto (ver la lápida de los banderines, arriba).
   La lápida con el razonamiento está en index.html, en el sitio exacto donde no
   va. En el home la bufanda sí sigue viva entre #clientes y #programas, que es
   donde estaba desde siempre.

   ⚠️ NO HACE FALTA CLASE NUEVA, y esa es la parte que hay que entender antes de
   tocar nada de aquí abajo: la cinta ya trae su propio aire y el `transform` se
   come casi todo. `margin: 44px 0` reserva 44px, pero `rotate(-2deg) scale(1.06)`
   ensancha la caja pintada y se traga la mayor parte, así que contra el canto de
   la foto del hero quedan **14px reales a 1440px** (34px a 390px, donde la cinta
   es más baja y el rotado escala menos alto). Ese 14 es justo lo que hace que la
   cinta se lea COSIDA al hero y no flotando debajo — y es un número EMERGENTE,
   no elegido.
   Consecuencia: si alguna vez cambias el `margin`, el `rotate` o el `scale` de
   aquí abajo, ese aire se mueve solo y la costura del hero se despega en las seis
   subpáginas a la vez. Vuelve a medir `bufanda.getBoundingClientRect().top`
   contra `header.getBoundingClientRect().bottom` antes de darlo por bueno.

   ⚠️ La cinta SE SALE del viewport a propósito (a 1440 va de -44 a 1469). Lo
   recorta el `overflow-x: hidden` del `<body>`, así que `scrollWidth > innerWidth`
   en el home es esto y no un desbordamiento. Ver la trampa 7 del CLAUDE.md. */
.bufanda {
  --cream: #f2e8cf;
  --bf-ink: #211b12;
  --rojo: #c8372b;   /* base de la bufanda */
  --gold: #f0c032;   /* franja pequeña amarilla + estrellas */
  --azul: #2f6b9e;   /* franja pequeña azul + escudo */
  --disp: var(--font-display);   /* nuestra letra: Anton */
  --type: var(--font-body);      /* nuestra letra: Saira */
  position: relative;
  margin: 44px 0;
  user-select: none;
  /* ligeramente diagonal, como la cinta anterior */
  transform: rotate(-2deg) scale(1.06);
  box-shadow: 0 16px 44px rgba(40, 30, 12, .26);
}

/* flecos de hilo (arriba y abajo) — ocultos por pedido */
.bufanda .bf-fringe { display: none; }

/* pinstripes: crema (grueso) + franja pequeña de color */
.bufanda .bf-pin { height: 5px; }
.bufanda .bf-pin.sm { height: 3px; }
.bufanda .bf-pin.cream { background: var(--cream); }
.bufanda .bf-pin.azul { background: var(--azul); }
.bufanda .bf-pin.gold { background: var(--gold); }

/* tejido de punto (base roja) */
.bufanda .bf-mq {
  overflow: hidden; white-space: nowrap; display: flex; width: 100%; padding: 16px 0;
  background-color: var(--rojo);
  background-image:
    repeating-linear-gradient(90deg, rgba(255,255,255,.07) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(0,0,0,.10) 2px, transparent 3px 4px),
    repeating-linear-gradient(0deg, rgba(0,0,0,.08) 0 2px, rgba(255,255,255,.04) 2px 5px);
}
.bufanda .bf-track {
  display: inline-flex; align-items: center; flex-shrink: 0; will-change: transform;
  animation: bf-scroll 32s linear infinite;
}
@keyframes bf-scroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) { .bufanda .bf-track { animation: none; } }

/* texto tejido */
.bufanda .bf-word {
  font-family: var(--disp); text-transform: uppercase; color: var(--cream); font-size: 46px; padding: 0 26px;
  display: inline-flex; align-items: center; gap: 22px; text-shadow: 0 1px 0 rgba(0,0,0,.3);
}
.bufanda .bf-est { font-family: var(--type); font-weight: 600; font-size: 14px; letter-spacing: .1em; color: var(--gold); }
.bufanda .bf-star { flex-shrink: 0; color: var(--gold); font-size: .7em; }

/* escudo bordado */
.bufanda .bf-crest {
  width: 60px; height: 60px; border-radius: 50%; flex-shrink: 0; background: var(--cream); color: var(--azul);
  display: flex; flex-direction: column; align-items: center; justify-content: center; line-height: 1;
  border: 3px solid var(--bf-ink); box-shadow: 0 0 0 3px var(--cream); font-family: var(--disp);
}
.bufanda .bf-crest .st { font-size: 18px; color: var(--rojo); }
.bufanda .bf-crest .tx { font-size: 12px; font-family: var(--type); font-weight: 700; letter-spacing: .05em; }

/* responsive: texto algo menor en móvil */
@media (max-width: 600px) {
  .bufanda .bf-word { font-size: 34px; gap: 16px; padding: 0 18px; }
  .bufanda .bf-crest { width: 46px; height: 46px; }
}
