/* ============================================================
   SPORTS TRAVEL COLOMBIA — páginas por deporte

   Cada página declara su acento en el <body>, y son CUATRO variables, no una.
   Suena a exceso hasta que se mira lo que hace cada trabajo:

   | Token     | Para qué                          | Contra qué se mide  |
   |-----------|-----------------------------------|---------------------|
   | --sp      | superficie: rellenos, filetes,    | nada, es el brillo  |
   |           | brillos, bordes, sombras          |                     |
   | --sp-t    | TINTA sobre el papel crema        | ≥4,5:1 vs. el crema |
   | --sp-f    | relleno de botón cuando --sp no   | ≥4,5:1 vs. --sp-ink |
   |           | aguanta la tinta (sólo F1)        |                     |
   | --sp-ink  | tinta que va ENCIMA del relleno   | ≥4,5:1 vs. --sp/-f  |

   El porqué de --sp-t está contado largo en stc.css, junto a los seis tokens
   --c-*-t. En corto: el acento de marca brilla —para eso se eligió— y por eso
   mismo no sirve como tinta sobre crema. Cinco de los seis daban entre 2,2 y
   3,4 donde hacen falta 4,5.

   La regla al escribir una regla nueva es de una línea:
   **acento SOBRE el crema → --sp-t · acento DEBAJO de algo → --sp.**

   ⚠️ --sp-f lleva respaldo (`var(--sp-f, var(--sp))`) a propósito: cinco de las
   seis páginas no lo declaran y heredan su acento sin enterarse. Sólo F1 lo
   necesita, porque su rojo con blanco encima da 4,49 — 4,5 pelado.
   ============================================================ */

/* Nav sobre fondo claro: en estas páginas el hero ya es crema,
   así que los enlaces van en tinta oscura desde arriba (no sólo al hacer scroll).
   Mayor especificidad (body …) para ganar sin depender del orden de carga.

   La barra va crema desde arriba, no sólo al hacer scroll. Antes podía ser
   transparente porque el degradado del hero desteñía la foto hasta casi crema
   justo debajo del nav; al cambiarlo por un corte duro (ver hero-diagonal.css)
   la foto llega entera hasta el borde superior y los enlaces que caen sobre ella
   —«Moto GP», «Tenis», «Otros» según el ancho— se quedaban en tinta oscura sobre
   foto oscura. Con la barra opaca el contraste no depende de qué foto tenga cada
   página, y de paso el nav deja de cambiar de aspecto al empezar a bajar. */
body .stc-nav {
  background: rgba(245, 236, 214, 0.9);
  backdrop-filter: blur(18px);
  -webkit-backdrop-filter: blur(18px);
  border-bottom-color: var(--line);
}
body .stc-nav .nav-links a { color: var(--text-2); }
body .stc-nav .nav-links a:hover,
body .stc-nav .nav-links a.active { color: var(--cream); }
/* El desplegable «Otros» es un <button>, no un <a>: la regla de arriba no lo
   alcanzaba y se quedaba con el crema que stc.css usa sobre heros oscuros, o
   sea crema sobre crema. Invisible hasta que hacías scroll. */
body .stc-nav .nav-drop-btn { color: var(--text-2); }
body .stc-nav .nav-drop-btn:hover,
body .stc-nav .nav-drop-btn.is-active { color: var(--cream); }
/* mismo caso para el botón del menú móvil: su trazo es currentColor y sin
   esto saldría crema sobre la barra crema */
body .stc-nav .nav-burger { color: var(--text-2); }

/* ---------- Hero ---------- */
.sp-hero {
  position: relative;
  min-height: 92svh;
  display: flex;
  align-items: flex-end;
  padding: calc(var(--nav-h) + 30px) var(--pad) clamp(44px, 6vh, 80px);
  overflow: hidden;
}
.sp-hero .sp-bg { position: absolute; inset: 0; z-index: 0; }
.sp-hero .sp-bg img {
  width: 100%; height: 100%;
  object-fit: cover;
  animation: kenburns-sp 16s var(--ease-out) infinite alternate;
  filter: saturate(0.95);
}
@keyframes kenburns-sp {
  from { transform: scale(1); }
  to { transform: scale(1.12) translateY(-1.5%); }
}
.sp-hero .sp-bg::after {
  content: "";
  position: absolute; inset: 0;
  background:
    linear-gradient(180deg, rgba(7,7,11,0.6), rgba(7,7,11,0.25) 45%, rgba(7,7,11,0.94)),
    radial-gradient(80% 50% at 50% 115%, color-mix(in srgb, var(--sp) 30%, transparent), transparent 70%);
}
.sp-hero .sp-content { position: relative; z-index: 3; width: 100%; }
.sp-hero .crumb {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-size: 12px;
  font-weight: 800;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-2);
  margin-bottom: 18px;
}
/* ⚠️ `.sp-hero` es el hero VIEJO y no existe en ninguna de las 7 páginas
   (grep, 2026-08-23: 0 apariciones). Lo sustituyó `.dhero` de
   hero-diagonal.css. Se deja porque el borrado de CSS muerto es una decisión
   pendiente de Juan y aquí no hay repositorio, pero **no busques estas reglas
   en el navegador: no pintan nada**. Van con --sp-t igual que sus equivalentes
   vivos, para que el día que alguien reviva la clase no reviva el fallo. */
.sp-hero .crumb a { color: var(--sp-t, var(--sp)); }
.sp-hero .crumb a:hover { text-decoration: underline; }
.sp-hero .sp-title { color: var(--cream); }
.sp-hero .sp-title .accent { color: var(--sp-t, var(--sp)); }
.sp-hero .sp-sub { margin-top: 22px; }
.sp-hero .sp-ctas { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 30px; }
/* Relleno: aquí el acento es SUPERFICIE, así que va --sp (o --sp-f donde el
   acento no aguante la tinta de encima — hoy sólo F1). El brillo del hover se
   queda en --sp siempre: es una sombra de color, no tiene nada que leer. */
.btn-sp { background: var(--sp-f, var(--sp)); color: var(--sp-ink, #fff); }
.btn-sp:hover { box-shadow: 0 8px 40px color-mix(in srgb, var(--sp) 40%, transparent); }

/* texto gigante de fondo */
.sp-watermark {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  font-family: var(--font-display);
  font-size: clamp(90px, 16vw, 260px);
  text-transform: uppercase;
  color: transparent;
  -webkit-text-stroke: 1px color-mix(in srgb, var(--sp) 22%, transparent);
  white-space: nowrap;
  z-index: 1;
  pointer-events: none;
  line-height: 1;
}

/* ---------- Datos rápidos ---------- */
.sp-stats {
  display: flex;
  gap: clamp(20px, 4vw, 60px);
  flex-wrap: wrap;
  padding: clamp(28px, 4vw, 48px) var(--pad);
  border-bottom: 1px solid var(--line);
  background: var(--bg-2);
}
/* ⚠️ Esta banda va sobre --bg-2 (#ecdfc1), el crema MÁS OSCURO de los tres del
   sitio, así que es el peor sitio posible para el acento como tinta: el de
   fútbol daba 2,47:1 aquí. Con --sp-t da 4,74. Las cifras son grandes (24-40px),
   o sea que el umbral legal serían 3:1, pero es el dato duro de la página —los
   km del circuito, el aforo, el año— y leerse a medias no es una opción. */
.sp-stats .st .v {
  font-family: var(--font-display);
  font-size: clamp(24px, 2.8vw, 40px);
  color: var(--sp-t, var(--sp));
  line-height: 1;
}
.sp-stats .st .k {
  font-size: 11.5px;
  font-weight: 800;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-2);
  margin-top: 8px;
}

/* ---------- Programas alternados ---------- */
.sp-prog { display: grid; gap: clamp(48px, 7vw, 110px); }
.sp-item {
  display: grid;
  grid-template-columns: minmax(0, 400px) 1fr;
  gap: clamp(28px, 5vw, 80px);
  align-items: center;
}
.sp-item:nth-child(even) .sp-item-img { order: 2; }
@media (max-width: 900px) {
  .sp-item { grid-template-columns: 1fr; }
  .sp-item:nth-child(even) .sp-item-img { order: 0; }
}
.sp-item-img {
  position: relative;
  height: clamp(220px, 24vw, 320px);
  border-radius: 24px;
  overflow: hidden;
  box-shadow: 0 26px 70px rgba(40,30,12,0.22);
}
.sp-item-img img {
  width: 100%; height: 100%;
  object-fit: cover;
  /* --fit-y ajusta el recorte vertical por foto desde el HTML
     (style="--fit-y:25%") sin inventar una clase nueva cada vez. Sin declarar,
     se comporta como siempre: centrado.

     ⚠️ ESTA CAJA NO TIENE UNA SOLA PROPORCIÓN EN ESCRITORIO: ALTERNA, y por eso
     --fit-y a veces parece no hacer nada. El `order: 2` de :nth-child(even) de
     arriba invierte el reparto de la rejilla, así que a 1440px la caja mide
     400×320 = 1,25 en las tarjetas IMPARES y 809×320 = 2,53 en las PARES
     (medido tarjeta por tarjeta en futbol.html el 2026-08-22). A 390px todas
     valen 350×220 = 1,59.

     Con una foto de programa (1150×944 = 1,22) eso decide cuánta foto sobrevive:
       · impar (1,25) → se ve el 97,5 % del alto. --fit-y sólo mueve ~24px: es
         casi decorativo, la foto se ve entera de todas formas.
       · par (2,53)   → se ve el 48,7 %. Ahí hay 484px de recorrido y ES la caja
         contra la que hay que calcular el valor.
       · 390px (1,59) → se ve el 76,5 %.
     Con el contenido útil entre a% y b% del alto, el valor válido va de
     (b − 48,7)/51,3 a a/51,3, y lo bonito suele ser el centro del rango.

     ⚠️ Las tarjetas van ordenadas POR FECHA (regla del CLAUDE.md), así que al
     insertar o reordenar un programa una tarjeta puede saltar de par a impar y
     su --fit-y deja de significar lo que significaba. No rompe nada a la vista
     —en 1,25 se ve casi toda la foto igual— pero explica por qué a veces mueves
     el número y no pasa nada. Mira en qué posición quedó la tarjeta ANTES de
     calcular.

     Aquí estuvo escrito "~2.5:1 en escritorio" a secas y era falso para la mitad
     de las tarjetas. */
  object-position: 50% var(--fit-y, 50%);
  transition: transform 0.8s var(--ease-out);
}
.sp-item:hover .sp-item-img img { transform: scale(1.06); }
/* La píldora de ciudad · año. Aquí el acento es SUPERFICIE y se queda vivo:
   va sobre la foto, es lo que da color a la tarjeta y no compite con nada.
   Lo que sí cambió es lo de encima — ver --sp-ink en el <body> de cada página. */
.sp-item-img .tag {
  position: absolute;
  top: 16px; left: 16px;
  background: var(--sp-f, var(--sp));
  color: var(--sp-ink, #fff);
  font-weight: 800;
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  padding: 8px 14px;
  border-radius: 999px;
  z-index: 2;
}
.sp-item-body .num {
  font-family: var(--font-display);
  font-size: 18px;
  color: var(--sp-t, var(--sp));
  letter-spacing: 0.1em;
}
.sp-item-body h3 {
  font-family: var(--font-display);
  font-size: clamp(26px, 3.2vw, 48px);
  text-transform: uppercase;
  line-height: 0.95;
  margin: 12px 0 16px;
  font-weight: 400;
}
.sp-item-body p { color: var(--text-2); font-size: clamp(16px, 1.5vw, 19px); max-width: 52ch; }
.sp-item-body .link-sp {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: 22px;
  font-weight: 800;
  font-size: 14px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  /* ⚠️ Éste es el hallazgo gordo de la auditoría del 2026-08-23. "VER PROGRAMA →"
     es el enlace principal de cada tarjeta —lo que hay que pulsar— y a 14px con
     el acento de marca era **lo más flojo de su propio bloque**: 2,68:1 en
     fútbol contra los 6,6 del párrafo gris de al lado. O sea que el texto de
     relleno se leía mejor que el CTA. Con --sp-t sube a 5,25. */
  color: var(--sp-t, var(--sp));
}
/* Mismo recurso que los puntos del carrusel: el enlace se ve de 22px de alto
   —lo que pide la tipografía— pero el área que responde al dedo es de 38px.
   Es el CTA principal de cada tarjeta y en el móvil se pulsa con el pulgar; a
   22px se falla. Arriba sólo hay un párrafo y abajo la tarjeta siguiente, así
   que el área ampliada no toca ningún otro destino. */
.sp-item-body .link-sp::after {
  content: "";
  position: absolute;
  inset: -8px -6px;
}
.sp-item-body .link-sp .arr { transition: transform 0.25s var(--ease-out); }
.sp-item-body .link-sp:hover .arr { transform: translateX(6px); }

/* ---------- A la medida ---------- */
.sp-fit {
  border-top: 1px solid var(--line);
  background: var(--bg-2);
  text-align: center;
}
.sp-fit .fit-items {
  display: flex;
  justify-content: center;
  gap: 12px;
  flex-wrap: wrap;
  margin-top: 34px;
}
.sp-fit .fit-chip {
  border: 1px solid var(--line-2);
  border-radius: 999px;
  padding: 14px 26px;
  font-weight: 700;
  font-size: 15px;
  color: var(--text-2);
  transition: all 0.3s var(--ease-out);
}
.sp-fit .fit-chip:hover {
  background: var(--sp-f, var(--sp));
  border-color: var(--sp-f, var(--sp));
  color: var(--sp-ink, #fff);
  transform: translateY(-5px) rotate(-1.5deg);
}

/* ---------- CTA final ---------- */
/* Sin degradado de color. Llevaba un radial del acento del deporte saliendo por
   el borde inferior; sobre el papel crema no se leía como un brillo sino como
   una mancha justo encima del footer, y cambiaba de color en cada página.
   Juan lo mandó quitar el 2026-08-22. El acento sigue vivo en el título y el
   botón, que es donde tiene que estar (un solo acento por página). */
.sp-cta {
  text-align: center;
  position: relative;
  overflow: hidden;
  background: var(--bg);
}
/* Las dos o tres palabras acentuadas del titular de cierre ("...o vas a
   ESTAR AHÍ?"). Van a 60-90px, o sea texto grande de sobra, pero con el acento
   de marca se leían **más claras que el resto del titular** en vez de más
   fuertes: el azul de fútbol daba 2,68 contra los 13,8 de la tinta de al lado,
   así que la palabra que se quería subrayar era la que se hundía. Con --sp-t
   sube a 5,25 y por fin pesa como un énfasis. */
.sp-cta .d-big .accent { color: var(--sp-t, var(--sp)); }
.sp-cta .lead { margin: 20px auto 32px; }

/* ---------- Objetos animados ---------- */
/* Balón rebotando (fútbol) */
.bounce-ball {
  position: absolute;
  z-index: 2;
  width: clamp(70px, 9vw, 130px);
  height: clamp(70px, 9vw, 130px);
  pointer-events: none;
  animation: ball-bounce 2.6s cubic-bezier(0.36, 0, 0.66, 1) infinite alternate;
}
.bounce-ball svg { width: 100%; height: 100%; animation: ball-spin 5s linear infinite; }
@keyframes ball-bounce {
  0% { transform: translateY(-46vh); }
  100% { transform: translateY(0); }
}
@keyframes ball-spin { to { transform: rotate(360deg); } }
.ball-shadow {
  position: absolute;
  z-index: 1;
  width: clamp(70px, 9vw, 130px);
  height: 16px;
  border-radius: 50%;
  background: rgba(40,30,12,0.35);
  filter: blur(6px);
  animation: shadow-pulse 2.6s cubic-bezier(0.36, 0, 0.66, 1) infinite alternate;
}
@keyframes shadow-pulse {
  0% { transform: scale(0.45); opacity: 0.25; }
  100% { transform: scale(1.05); opacity: 0.8; }
}

/* Pelota de tenis cruzando */
.tennis-ball {
  position: absolute;
  z-index: 2;
  width: clamp(50px, 6vw, 90px);
  height: clamp(50px, 6vw, 90px);
  pointer-events: none;
  left: -10%;
  top: 30%;
  animation: tennis-fly 7s linear infinite;
}
.tennis-ball svg { width: 100%; height: 100%; animation: ball-spin 1.6s linear infinite; }
@keyframes tennis-fly {
  0%   { left: -10%; top: 26%; }
  25%  { left: 22%; top: 58%; animation-timing-function: ease-out; }
  50%  { left: 50%; top: 22%; animation-timing-function: ease-in; }
  75%  { left: 78%; top: 58%; animation-timing-function: ease-out; }
  100% { left: 110%; top: 26%; }
}

/* Luces de festival */
.beams { position: absolute; inset: 0; z-index: 1; pointer-events: none; overflow: hidden; }
.beams .beam {
  position: absolute;
  top: -20%;
  width: 14vw;
  height: 140%;
  background: linear-gradient(180deg, color-mix(in srgb, var(--sp) 38%, transparent), transparent 75%);
  clip-path: polygon(45% 0, 55% 0, 100% 100%, 0 100%);
  transform-origin: top center;
  animation: beam-sway 5.5s ease-in-out infinite alternate;
  mix-blend-mode: screen;
}
@keyframes beam-sway {
  from { transform: rotate(-18deg); }
  to { transform: rotate(18deg); }
}

/* Velocímetro (motogp / f1) */
.gauge-wrap { display: flex; align-items: center; gap: 20px; margin-top: 30px; }
.gauge { width: clamp(130px, 14vw, 190px); }
.gauge .needle { transform-origin: 100px 100px; transition: transform 0.2s; }
.gauge-label {
  font-family: var(--font-display);
  font-size: clamp(22px, 2.4vw, 34px);
  color: var(--sp-t, var(--sp));
}
.gauge-label small {
  display: block;
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 800;
  letter-spacing: 0.24em;
  color: var(--text-3);
  margin-top: 4px;
}
