/* =========================================================
   BIOPHILIC — Landing Page
   Dirección gráfica: editorial oscura. Fotografía B&N con
   grano, imágenes recortadas que sangran al borde del viewport,
   esquinas rectas (solo las pills son cápsulas), y Montserrat
   en mayúsculas con tracking amplio para labels técnicos.
   ========================================================= */

:root {
  /* Paleta muestreada de las piezas del equipo de diseño.
     Verde tomado del SVG oficial de marca (#A3BF86). */
  --color-bg: #1D1E1D;        /* near-black de los posts */
  --color-bg-alt: #383838;    /* gris medio del board */
  --color-surface: #2B2C2B;
  --color-line: #555852;

  --color-accent: #A3BF86;
  --color-accent-soft: #B8D19E;
  /* Mismo verde, pero como color de superficie (no de acento) */
  --color-green: #A3BF86;

  --color-text: #EDEFE9;
  --color-text-muted: #A8ADA2;
  --color-text-dim: #82877D;

  --font: 'Montserrat', system-ui, sans-serif;

  --container-w: 1240px;
  --gutter: 24px;

  --track-wide: 0.22em;
  --track-mid: 0.14em;


  /* Intensidad del grano global. Rango práctico:
       0.03  apenas perceptible
       0.06  textura sutil (valor anterior)
       0.12  grano evidente
       0.18  marcado, empieza a restar nitidez al texto chico
       0.25  límite recomendado
       0.75  muy marcado, efecto de textura fuerte  ← actual
     Técnicamente admite 0–1. */
  --grain-opacity: 0.75;
}

/* ============ RESET ============ */
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
html, body { overflow-x: hidden; }
body, h1, h2, h3, h4, p, ul, li, figure { margin: 0; padding: 0; }
ul { list-style: none; }
img { max-width: 100%; display: block; }
a { text-decoration: none; color: inherit; }
button { font: inherit; cursor: pointer; background: none; border: none; }

body {
  font-family: var(--font);
  font-weight: 400;
  color: var(--color-text);
  background: var(--color-bg);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4 { font-weight: 600; line-height: 1.1; }

.container {
  width: 100%;
  max-width: var(--container-w);
  margin: 0 auto;
  padding: 0 var(--gutter);
}

.section { padding: 80px 0; }

/* ============ GRAIN ============ */
/* Textura sobre el color de fondo únicamente.
   z-index:-1 es la clave: en el orden de pintado, un hijo con z-index
   negativo se dibuja DESPUÉS del fondo del padre pero ANTES de su contenido.
   Así el ruido cubre el color de fondo y el texto, las fotos y los botones
   quedan por encima, sin granular. */
body::before {
  content: "";
  position: fixed;
  top: 0; right: 0; bottom: 0; left: 0;
  z-index: -1;
  pointer-events: none;
  opacity: var(--grain-opacity);
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 200px 200px;
}

/* La sección verde pinta su propio fondo, que taparía el ruido de body.
   Necesita su propia capa. */
.cta-section { position: relative; }
.cta-section::before {
  content: "";
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
  z-index: 0;
  pointer-events: none;
  opacity: var(--grain-opacity);
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 200px 200px;
}
.cta-section > .container { position: relative; z-index: 1; }

/* feTurbulence tileado — textura de película sin cargar un bitmap. */
.grain {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 3;
  opacity: 0.4;
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.55'/%3E%3C/svg%3E");
  background-size: 160px 160px;
}

/* Las fotos van sin filtro: se muestran a color y con su exposición original. */

/* ============ TIPOGRAFÍA ============ */
.eyebrow {
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: var(--track-wide);
  text-transform: uppercase;
  color: var(--color-text-muted);
  margin-bottom: 14px;
}

.h-accent {
  font-size: clamp(26px, 4.6vw, 52px);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--color-accent);
  line-height: 1.06;
}

.lead {
  font-size: 15px;
  font-weight: 400;
  color: var(--color-text-muted);
  max-width: 54ch;
  line-height: 1.8;
}

.asterisk { color: var(--color-accent); }

/* Encabezado de sección con nota alineada a la derecha.
   Sin regla propia: la línea la aporta el borde superior de la grilla
   que sigue, para no duplicar el trazo debajo del título. */
.head-row {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 20px;
  margin-bottom: 36px;
}
/* Dato suelto alineado a la derecha del título de sección (matrícula) */
.head-aside {
  display: flex;
  align-items: baseline;
  gap: 10px;
  font-size: 11px;
  letter-spacing: var(--track-mid);
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.head-aside-label {
  font-weight: 600;
  color: var(--color-text);
}
.head-aside-value { font-weight: 400; }
.head-aside .amount {
  font-size: 13px;
  font-weight: 500;
  color: var(--color-accent);
  letter-spacing: 0.04em;
}

/* ============ PILLS (único elemento con radio) ============ */
/* Lockup del hero (SVG inline) */
.tagline-svg {
  display: block;
  width: 100%;
  max-width: clamp(230px, 30vw, 440px);
  height: auto;
}
.tagline-svg-text text {
  fill: var(--color-text);
  font-family: var(--font);
  font-weight: 500;          /* el archivo pedía 460 de una fuente variable */
  font-size: 57.06px;        /* en unidades del viewBox; escala con el SVG */
  letter-spacing: 0.14em;
}

/* Solo para lectores de pantalla */
.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}
/* ============ BOTONES ============ */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 15px 32px;
  border-radius: 999px;
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: var(--track-mid);
  text-transform: uppercase;
  transition: background 0.25s ease, color 0.25s ease;
  white-space: nowrap;
}
.btn-accent { background: var(--color-accent); color: #1D1E1D; }
.btn-accent:hover { background: var(--color-accent-soft); }
.btn-lg { padding: 17px 36px; }

/* ============ HEADER ============ */
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  transition: background 0.3s ease;
}
.site-header.is-scrolled {
  background: rgba(29, 30, 29, 0.86);
  backdrop-filter: blur(12px);
}

.header-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 74px;
  /* Mismo ancho y padding que .container para que el logo quede alineado
     con el contenido de las secciones. */
  max-width: var(--container-w);
  margin: 0 auto;
  padding: 0 var(--gutter);
}

.logo { display: flex; align-items: center; gap: 10px; }
/* El isotipo es más alto que ancho (182×205): fijamos alto y dejamos el
   ancho automático para no deformarlo. */
.logo-mark { height: 26px; width: auto; }
.logo-word {
  font-size: 13px;
  font-weight: 600;
  letter-spacing: var(--track-wide);
}

.main-nav { display: none; align-items: center; gap: 34px; }
.main-nav ul { display: flex; gap: 26px; }
.main-nav a:not(.btn) {
  font-size: 10.5px;
  letter-spacing: var(--track-mid);
  text-transform: uppercase;
  color: var(--color-text-muted);
  padding: 4px 0;
  transition: color 0.2s ease;
}
.main-nav a:not(.btn):hover { color: var(--color-accent); }

.nav-toggle {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 40px;
  height: 40px;
}
.nav-toggle span {
  display: block;
  height: 1.5px;
  width: 22px;
  background: var(--color-text);
  transition: transform 0.25s ease, opacity 0.25s ease;
}
.nav-toggle.is-open span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
.nav-toggle.is-open span:nth-child(2) { opacity: 0; }
.nav-toggle.is-open span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }

@media (max-width: 899px) {
  .main-nav {
    display: flex;
    position: fixed;
    top: 74px; right: 0; bottom: 0; left: 0;
    z-index: 90;
    background: var(--color-bg);
    flex-direction: column;
    align-items: flex-start;
    padding: 36px var(--gutter);
    gap: 30px;
    transform: translateX(100%);
    visibility: hidden;
    transition: transform 0.3s ease, visibility 0.3s ease;
    overflow-y: auto;
  }
  .main-nav.is-open { transform: translateX(0); visibility: visible; }
  .main-nav ul { flex-direction: column; gap: 22px; width: 100%; }
  .main-nav a:not(.btn) { font-size: 15px; letter-spacing: var(--track-wide); }
  .nav-cta { width: 100%; }
}
@media (min-width: 900px) {
  .main-nav { display: flex; }
  .nav-toggle { display: none; }

  /* En desktop el CTA del nav baja a secundario: solo contorno, para no
     competir con el botón principal del hero. En mobile sigue relleno,
     porque ahí es la única acción visible del menú. */
  .nav-cta {
    background: transparent;
    color: var(--color-text);
    /* Más claro que --color-line: como contorno de un control interactivo
       necesita 3:1 contra el fondo, y la línea de las secciones solo da 2.3:1 */
    border: 1px solid #73776E;
    padding: 14px 31px;  /* -1px para compensar el borde */
    transition: border-color 0.25s ease, color 0.25s ease;
  }
  .nav-cta:hover {
    background: transparent;
    border-color: var(--color-accent);
    color: var(--color-accent);
  }
}

/* ============ HERO ============ */
.hero { position: relative; padding-top: 20px; }

.hero-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 40px;
  align-items: center;
}

.hero-copy { padding: 0 var(--gutter); }

.hero-lockup {
  display: flex;
  align-items: center;
  gap: 13px;
  margin-bottom: 28px;
}
.hero-lockup-mark { height: clamp(36px, 5vw, 54px); width: auto; }
.hero-lockup-word {
  font-size: clamp(20px, 3.1vw, 31px);
  font-weight: 600;
  letter-spacing: var(--track-wide);
}

/* El escalonado de "SMALL" sobre "GROUP TRAINING" ya viene resuelto
   dentro del SVG, así que acá solo hace falta el espaciado externo. */
.tagline { margin-bottom: 34px; }

.hero-note {
  font-size: clamp(13.5px, 1.35vw, 16px);
  font-weight: 400;
  line-height: 1.8;
  color: var(--color-text-muted);
  max-width: 40ch;
  margin-bottom: 34px;
}

.hero-actions { display: flex; flex-wrap: wrap; gap: 14px; }

/* Imagen recortada, sin radio, sangrando al borde */
.hero-media {
  position: relative;
  overflow: hidden;
}
.hero-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Velo para asegurar legibilidad del texto sobre la foto (solo mobile).
   Al quitarse el filtro que oscurecía la imagen, el velo pasa a ser lo único
   que garantiza el contraste: con 0.62 el texto caía a 4.07:1 sobre un
   píxel claro; a 0.78 queda en 7:1. */
.hero-media::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
  background: linear-gradient(180deg, rgba(29,30,29,0.86) 0%, rgba(29,30,29,0.78) 50%, rgba(29,30,29,0.92) 100%);
}

/* Label vertical sobre el borde de la imagen */
.edge-label {
  position: absolute;
  z-index: 4;
  right: 14px;
  bottom: 20px;
  writing-mode: vertical-rl;
  font-size: 9px;
  font-weight: 500;
  letter-spacing: var(--track-wide);
  text-transform: uppercase;
  color: var(--color-text);
  opacity: 0.75;
}

/* ---- Invitación a hacer scroll (solo mobile) ----
   Se muestra a partir de 640px de alto de pantalla. Por debajo de eso
   (iPhone SE y similares) el hero no tiene espacio suficiente: el
   indicador caería encima del botón, así que se omite. */
.scroll-cue { display: none; }

@media (max-width: 899px) and (min-height: 640px) {
  /* Reserva inferior para que el texto centrado no invada la zona del
     indicador. Va en svh, no en %, porque los porcentajes de padding se
     calculan sobre el ANCHO del contenedor, no sobre el alto. */
  .hero-grid { padding-bottom: 14svh; }

  .scroll-cue {
    /* A 20% del borde inferior del hero */
    position: absolute;
    bottom: 20%;
    left: 50%;
    transform: translateX(-50%);
    z-index: 6;

    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 10px;

    font-size: 9.5px;
    font-weight: 500;
    letter-spacing: var(--track-wide);
    text-transform: uppercase;
    color: var(--color-text);
    white-space: nowrap;
  }
  .scroll-cue-arrow {
    width: 13px;
    height: auto;
    color: var(--color-accent);
    /* La animación va en la flecha y no en todo el bloque: así el texto
       queda quieto y legible mientras solo se mueve el indicador. */
    animation: cueBob 2.4s ease-in-out infinite;
  }
}

@keyframes cueBob {
  0%, 100% { transform: translateY(0);   opacity: 0.55; }
  50%      { transform: translateY(5px); opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
  .scroll-cue-arrow { animation: none; opacity: 0.8; }
}

/* Cinta de datos tipo ficha técnica */
.ticker {
  margin-top: 40px;
  border-top: 1px solid var(--color-line);
  border-bottom: 1px solid var(--color-line);
  overflow: hidden;
}
.ticker-inner {
  display: flex;
  flex-wrap: wrap;
  gap: 0 14px;
  /* Las líneas de la cinta sangran a todo el ancho, pero el texto se alinea
     con el contenido del resto del sitio. */
  max-width: var(--container-w);
  margin: 0 auto;
  padding: 14px var(--gutter);
  font-size: 9px;
  font-weight: 500;
  letter-spacing: var(--track-wide);
  text-transform: uppercase;
  color: var(--color-text-dim);
}
.ticker .dot { color: var(--color-accent); opacity: 0.7; }

/* --- Mobile: la foto pasa a ser fondo del hero, muy apagada --- */
@media (max-width: 899px) {
  /* El hero ocupa algo menos de una pantalla: así la cinta de datos entra
     completa y además asoma el inicio de Objetivo, que indica que hay más
     contenido. Se usa svh y no vh: en móviles, 100vh mide el viewport SIN
     la barra de direcciones, así que la cinta quedaría tapada por ella.
     svh usa el alto con la barra visible, que es el peor caso. */
  .hero {
    padding-top: 14px;
    padding-bottom: 0;
    min-height: 90vh;   /* fallback */
    min-height: 90svh;
    display: flex;
    flex-direction: column;
  }
  /* Crece para llenar lo que sobra: la imagen se estira con él */
  .hero-grid {
    position: relative;
    display: flex;
    align-items: center;
    flex: 1 1 auto;
    min-height: 0;
    gap: 0;
  }
  .hero-media {
    position: absolute;
    inset: 0;
    z-index: 0;
  }
  .hero-copy {
    position: relative;
    z-index: 5;
    width: 100%;
    /* Más ajustado que 40px: en pantallas chicas ese aire extra empujaba
       la cinta fuera del viewport. */
    padding-top: 24px;
    padding-bottom: 24px;
  }
  /* Los elementos ocupan todo el ancho disponible, no un bloque angosto */
  .tagline-svg { max-width: 100%; }
  .hero-note {
    max-width: none;
    font-size: 15.5px;
    line-height: 1.7;
  }
  /* CTA a todo el ancho */
  .hero-actions { width: 100%; }
  .hero-actions .btn { width: 100%; }
  .edge-label { display: none; }
  /* Sin separación: la imagen del hero llega hasta la línea superior
     de la cinta de datos. */
  .ticker { margin-top: 0; }
}

/* --- Desktop: split, foto sangrando a la derecha --- */
@media (min-width: 900px) {
  /* Aire entre la barra de navegación y el bloque del hero.
     El padding-bottom iguala el gap con Objetivo al del resto (80+80). */
  .hero {
    padding-top: clamp(16px, 2.5vh, 36px);
    padding-bottom: 80px;
  }
  .hero-grid {
    max-width: var(--container-w);
    margin: 0 auto;
    grid-template-columns: 1fr 1fr;
    gap: 0;
    align-items: stretch;
    min-height: 0;
    /* +30% respecto a la versión anterior (440/58vh/600) */
    height: clamp(572px, 75vh, 780px);
  }
  .hero-copy {
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 56px 56px 56px var(--gutter);
  }
  .hero-media {
    /* Sangra hasta el borde derecho del viewport. Relativo al padre, así
       que no se desalinea por el ancho de la barra de scroll. */
    margin-right: calc(50% - 50vw);
  }
  /* En desktop la foto se ve limpia; el velo es solo para mobile */
  .hero-media::after { display: none; }
}

/* ============ OBJETIVO ============ */

.objetivo-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 44px;
  align-items: start;
}

/* Imagen recortada que sangra al borde izquierdo del viewport */
.objetivo-media {
  position: relative;
  overflow: hidden;
  height: 320px;
}
.objetivo-media img { width: 100%; height: 100%; object-fit: cover; }

.objetivo-copy { padding: 0 var(--gutter); }
.objetivo-copy .lead { margin-top: 20px; }

.dash-list { margin-top: 34px; }
.dash-list li {
  position: relative;
  padding: 0 0 14px 26px;
  font-size: 13.5px;
  font-weight: 400;
  line-height: 1.7;
  color: var(--color-text-muted);
}
.dash-list li::before {
  content: "—";
  position: absolute;
  left: 0;
  top: 0;
  color: var(--color-accent);
}

/* Mobile: la imagen va debajo del contenido, a todo el ancho del viewport */
@media (max-width: 899px) {
  .objetivo-grid { display: flex; flex-direction: column; }
  .objetivo-copy { order: 1; }
  .objetivo-media {
    order: 2;
    /* Rompe el ancho del container para llegar a ambos bordes.
       Mismos márgenes y alto que la foto de Horarios. */
    margin: 36px calc(50% - 50vw) 0;
    width: 100vw;
    height: 320px;
  }
  /* Al recortar una foto vertical a una franja apaisada, el encuadre por
     defecto toma el centro. Acá se ancla arriba. */
  .objetivo-media img { object-position: center top; }

  /* Gap uniforme entre todas las secciones: 40px arriba + 40px abajo = 80px,
     la mitad del valor de desktop. */
  /* Gap entre secciones: 20 + 20 = 40px (la mitad de los 80px previos) */
  .section { padding: 20px 0; }
  /* El hero no lleva padding inferior (su cinta va pegada al borde del
     viewport), así que Objetivo aporta los 40px completos del gap. */
  .objetivo { padding-top: 40px; padding-bottom: 20px; }
}

@media (min-width: 900px) {
  /* Esta sección rompe el ancho del container a propósito: ocupa el viewport
     completo para dar más recorrido a la cascada. El borde derecho conserva
     el mismo margen lateral que el resto del sitio. */
  .objetivo-grid {
    max-width: none;
    margin: 0;
    grid-template-columns: 30vw 1fr;
    gap: 0;
    /* La foto arranca en el borde superior de la sección, no centrada */
    align-items: start;
  }
  .objetivo-media { height: 546px; }

  /* Las dos columnas caen exactamente sobre la 2ª y 3ª de Programación:
     se replica acá su aritmética de grilla, igual que se hizo con la foto
     de Horarios. Si cambia el gap o el número de columnas de Programación,
     esta sección lo sigue sola. */
  .objetivo-copy {
    --gap-prog: clamp(28px, 3.4vw, 56px);
    --content-prog: calc(min(100vw, var(--container-w)) - var(--gutter) * 2);
    --col-prog: calc((var(--content-prog) - var(--gap-prog) * 2) / 3);
    --left-prog: max(var(--gutter), calc((100vw - var(--container-w)) / 2 + var(--gutter)));
    --col2-x: calc(var(--left-prog) + var(--col-prog) + var(--gap-prog));

    display: grid;
    grid-template-columns: var(--col-prog) var(--col-prog);
    column-gap: var(--gap-prog);
    align-items: start;
    /* Desplaza el bloque hasta el inicio de la 2ª columna de Programación */
    padding: 0 0 0 calc(var(--col2-x) - 30vw);
  }
  /* El límite va en el párrafo, no en el bloque: 'ch' se calcula con la
     fuente base, así que aplicado al contenedor estrangularía al h2 y
     desbordaría palabras largas. */
  /* El título ocupa el ancho completo, sobre las dos columnas */
  .objetivo-head {
    grid-column: 1 / -1;
    margin-bottom: 36px;   /* mismo valor que .head-row */
  }
  .objetivo-intro { max-width: none; }
  .objetivo-intro .lead { max-width: none; }
  /* Cascada: el mismo escalón que separa la 2ª de la 3ª columna en
     Programación, para que ambas secciones bajen con el mismo ritmo. */
  .objetivo-detail {
    margin-left: 0;
    max-width: none;
    margin-top: clamp(64px, 8vw, 132px);
  }

  /* Título algo más contenido que el del resto de secciones: acá vive en
     media columna y "SEGURIDAD" no puede partirse. */
  .objetivo .h-accent { font-size: clamp(24px, 3.2vw, 44px); }
}

/* ============ PROGRAMACIÓN ============ */
.program-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
  border-top: 1px solid var(--color-line);
}
.program-block {
  border-bottom: 1px solid var(--color-line);
  padding: 30px 0;
  position: relative;
}
.program-num {
  display: block;
  font-size: 10px;
  font-weight: 500;
  letter-spacing: var(--track-wide);
  color: var(--color-accent);
  margin-bottom: 12px;
}
.program-block h3 {
  font-size: 13px;
  font-weight: 600;
  letter-spacing: var(--track-wide);
  text-transform: uppercase;
  margin-bottom: 14px;
}
.program-block p {
  font-size: 13.5px;
  font-weight: 400;
  line-height: 1.85;
  color: var(--color-text-muted);
  max-width: 46ch;
}

@media (min-width: 900px) {
  /* Los tres programas en una sola fila, desfasados en altura */
  .program-grid {
    grid-template-columns: repeat(3, 1fr);
    column-gap: clamp(28px, 3.4vw, 56px);
    align-items: start;
    /* La línea pasa a cada columna, así se corta en los gaps */
    border-top: none;
  }
  .program-block {
    padding: 30px 0 0;
    border-top: 1px solid var(--color-line);
    border-bottom: none;
  }
  .program-block p { max-width: none; }

  /* Cascada vertical (+50% respecto a 48/6vw/100 y 96/12vw/200) */
  .program-block:nth-child(2) { margin-top: clamp(72px, 9vw, 150px); }
  .program-block:nth-child(3) { margin-top: clamp(144px, 18vw, 300px); }
}

/* ============ HORARIOS ============ */
.horarios-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
}
.horarios-copy { padding: 0 var(--gutter); }

/* Foto recortada sobre el borde derecho (espejo de Objetivo) */
.horarios-media {
  position: relative;
  overflow: hidden;
}
.horarios-media img { width: 100%; height: 100%; object-fit: cover; }

/* ---- Parallax ----
   Se desplaza el bloque de imagen entero (marco incluido) respecto al resto
   del contenido, no el encuadre dentro de un marco fijo. */
.objetivo-media,
.horarios-media {
  will-change: transform;
}

.schedule-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
}
.schedule-col {
  border-top: 1px solid var(--color-line);
  padding: 26px 0;
}
.schedule-col h3 {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: var(--track-wide);
  text-transform: uppercase;
  margin-bottom: 18px;
}
.schedule-col li {
  font-size: 13px;
  font-weight: 400;
  color: var(--color-accent);
  padding: 4px 0;
}
.schedule-note {
  font-size: 13px;
  font-weight: 400;
  line-height: 1.85;
  color: var(--color-text-muted);
}

/* Mobile: la foto va debajo, a todo el ancho del viewport */
@media (max-width: 899px) {
  .horarios-grid { display: flex; flex-direction: column; }
  .horarios-copy { order: 1; }

  /* Los horarios fluyen en horizontal en vez de una hora por renglón:
     de 8 líneas a 2, con el consiguiente ahorro de scroll. */
  .schedule-col ul {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 14px;
  }
  .schedule-col li { padding: 0; }
  .schedule-col { padding: 20px 0; }
  .schedule-col h3 { margin-bottom: 14px; }
  .horarios-media {
    order: 2;
    margin: 36px calc(50% - 50vw) 0;
    width: 100vw;
    height: 320px;
  }
}

@media (min-width: 780px) and (max-width: 899px) {
  .schedule-grid { grid-template-columns: repeat(3, 1fr); column-gap: 40px; }
  .schedule-col { padding: 26px 0 34px; }
}

@media (min-width: 900px) {
  /* Rompe el container: el texto arranca alineado con el resto de las
     secciones y la foto sangra hasta el borde derecho.
     El borde izquierdo de la foto se alinea con la 3ª columna de
     Programación, replicando acá su misma aritmética de grilla. */
  .horarios-grid {
    --gap-prog: clamp(28px, 3.4vw, 56px);
    --content-prog: calc(min(100vw, var(--container-w)) - var(--gutter) * 2);
    --col-prog: calc((var(--content-prog) - var(--gap-prog) * 2) / 3);
    --left-prog: max(var(--gutter), calc((100vw - var(--container-w)) / 2 + var(--gutter)));
    --img-x: calc(var(--left-prog) + (var(--col-prog) + var(--gap-prog)) * 2);

    grid-template-columns: 1fr calc(100vw - var(--img-x));
    align-items: stretch;
  }
  .horarios-copy {
    /* +gutter para que coincida con el borde interno de .container */
    padding-left: max(var(--gutter), calc((100vw - var(--container-w)) / 2 + var(--gutter)));
    /* Aire contra la foto, sin ahogar la fila de horarios */
    padding-right: clamp(56px, 7vw, 120px);
  }
  /* Sin alto propio: el grid está en align-items:stretch, así que la foto
     toma exactamente la altura del contenido de la sección. */
  .horarios-media {
    min-height: 0;
    height: auto;
    align-self: stretch;
  }

  /* Tres bloques apilados. Cada uno: título / línea / horarios.
     El grid usa fit-content, así que su ancho lo define la fila más larga
     (lunes a jueves) y todas las líneas quedan del mismo largo. */
  .schedule-grid {
    display: flex;
    flex-direction: column;
    gap: 34px;
    width: fit-content;
    max-width: 100%;
  }
  .schedule-col {
    display: block;
    padding: 0;
    border-top: none;
  }
  .schedule-col h3 {
    margin-bottom: 0;
    padding-bottom: 12px;
    border-bottom: 1px solid var(--color-line);
  }
  .schedule-col ul {
    display: flex;
    flex-wrap: wrap;
    gap: 4px clamp(12px, 1.5vw, 24px);
    margin-top: 14px;
  }
  .schedule-col li { padding: 0; }
  .schedule-note { margin-top: 14px; }
}

/* ============ INVERSIÓN ============ */

.invest-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
}
.invest-block {
  border-top: 1px solid var(--color-line);
  padding: 26px 0;
}
.invest-label {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: var(--track-wide);
  text-transform: uppercase;
  margin-bottom: 16px;
}
.invest-line {
  display: flex;
  align-items: baseline;
  gap: 10px;
  font-size: 13px;
  font-weight: 400;
  color: var(--color-text-muted);
  padding: 7px 0;
}
/* Permite que una etiqueta larga envuelva dentro de su columna
   en vez de desbordarla */
.invest-line > span:first-child { min-width: 0; }
.invest-line .dots {
  flex: 1 1 20px;
  min-width: 20px;
  border-bottom: 1px dotted var(--color-line);
  transform: translateY(-3px);
}
.invest-line .amount {
  font-weight: 500;
  color: var(--color-accent);
  letter-spacing: 0.04em;
  white-space: nowrap;
}
/* Precio anterior, tachado */
.amount-was {
  margin-right: 8px;
  font-weight: 400;
  color: var(--color-text-dim);
  text-decoration-thickness: 1px;
}

/* Detalle bajo una línea de precio (ej. el desglose mensual del paquete) */
.invest-detail {
  margin: -2px 0 12px;
  font-size: 10px;
  font-weight: 400;
  letter-spacing: 0.04em;
  color: var(--color-text-dim);
}

/* Línea sin precio ni guía de puntos (ej. métodos de pago) */
.invest-plain {
  font-size: 13px;
  font-weight: 400;
  color: var(--color-text-muted);
  padding: 7px 0;
}

/* Nota al pie dentro del bloque de Paquetes */
.invest-note {
  margin-top: 16px;
  font-size: 10.5px;
  font-weight: 400;
  line-height: 1.7;
  color: var(--color-text-dim);
}


/* En mobile, Horarios e Inversión van sin reglas horizontales: al estar los
   bloques apilados, el espaciado ya alcanza para separarlos y las líneas
   sumaban ruido visual. Va después de las reglas base para poder anularlas. */
@media (max-width: 899px) {
  .schedule-col,
  .invest-block {
    border-top: none;
    padding: 0 0 26px;
  }
}

@media (min-width: 900px) {
  /* Asimetría deliberada: Inversión se acerca a Horarios y se despega de la
     sección final, para que el bloque verde entre con más aire.
     Gap con Horarios = 40 + 20 = 60px (la mitad de los 120px previos). */
  .horarios { padding-bottom: 40px; }
  .inversion { padding-top: 20px; padding-bottom: 120px; }

  /* Los tres tipos en una fila */
  .invest-grid {
    grid-template-columns: repeat(3, 1fr);
    column-gap: clamp(28px, 3.4vw, 56px);
    align-items: start;
  }
  /* Acá la línea va arriba del título de cada columna (a diferencia de
     Horarios, donde va debajo). */
  .invest-block {
    border-top: 1px solid var(--color-line);
    padding: 18px 0 0;
  }
  .invest-label {
    border-bottom: none;
    padding-bottom: 0;
    margin-bottom: 16px;
  }
}

/* ============ CTA FINAL ============ */
/* Única sección sobre verde. Se invierte la escala tonal: al ser fondo claro,
   hasta el texto "tenue" tiene que oscurecerse bastante para seguir pasando
   AA, así que el rango se comprime respecto a las secciones oscuras. */
.cta-section {
  background: var(--color-green);
  --color-text: #16180F;        /* 8.8:1 */
  --color-text-muted: #2E3626;  /* 6.2:1 */
  --color-text-dim: #3A4430;    /* 5.1:1 */
  --color-line: rgba(22, 24, 15, 0.3);
  --color-accent: #16180F;      /* el título, en vez del verde */
}
/* El botón hereda --color-accent como fondo, así que ya queda oscuro;
   solo hay que invertirle el texto y el hover, que apuntaban a tonos claros. */
.cta-section .btn-accent { color: var(--color-green); }
.cta-section .btn-accent:hover { background: #2E3626; }

.cta {
  display: flex;
  flex-direction: column;
  gap: 28px;
}
.cta .lead { margin-top: 18px; }

/* Al tener fondo propio, su padding se lee como aire interno de la banda y
   no como separación. El gap con la sección anterior lo aporta el margin. */
@media (max-width: 899px) {
  .cta-section { padding: 44px 0; margin-top: 20px; }
}

@media (min-width: 900px) {
  .cta {
    display: grid;
    grid-template-columns: 60fr 40fr;
    align-items: center;
    gap: 40px;
  }
  .cta .lead { max-width: none; }
  .cta-action { display: flex; justify-content: flex-end; }
  .cta-action .btn { width: 100%; }
}

/* ============ FOOTER ============ */
/* Sin background propio: es el mismo color del body y taparía el grano. */
.site-footer {
  border-top: 1px solid var(--color-line);
  padding: 64px 0 26px;
}
.footer-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 36px;
  margin-bottom: 44px;
}
.footer-lockup { display: block; }
.powered-by { width: 100%; max-width: 250px; height: auto; }
.footer-tag {
  margin-bottom: 16px;
  font-size: 9.5px;
  font-weight: 500;
  letter-spacing: var(--track-wide);
  color: var(--color-accent);
}
.footer-col h4 {
  font-size: 9.5px;
  font-weight: 600;
  letter-spacing: var(--track-wide);
  text-transform: uppercase;
  margin-bottom: 14px;
}
.footer-col p {
  font-size: 12.5px;
  font-weight: 400;
  color: var(--color-text-muted);
  margin-bottom: 7px;
}
.footer-col a:hover { color: var(--color-accent); }

.footer-bottom {
  border-top: 1px solid var(--color-line);
  padding-top: 22px;
  font-size: 10px;
  font-weight: 400;
  letter-spacing: 0.06em;
  color: var(--color-text-dim);
}
.footer-bottom a {
  color: var(--color-text-dim);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.footer-bottom a:hover { color: var(--color-accent); }

@media (min-width: 720px) {
  .footer-grid { grid-template-columns: 1.3fr repeat(3, 1fr); }
}

/* ============ SCROLL REVEAL ============ */
.reveal {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 1.2s cubic-bezier(.22,.61,.36,1), transform 1.2s cubic-bezier(.22,.61,.36,1);
}
.reveal.is-visible { opacity: 1; transform: translateY(0); }

/* Las fotos con parallax quedan fuera del sistema de reveal: sin fade ni
   transición, para que el desplazamiento se lea desde el primer momento y
   no compita con una animación de entrada. */

/* ============ ENTRADA DEL HERO ============ */
/* Cascada al cargar. Es CSS puro: los delays escalonan los 4 bloques de la
   columna izquierda sin depender de JS. */
@keyframes heroIn {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: none; }
}
@keyframes heroMediaIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

.hero-copy > * {
  opacity: 0;
  animation: heroIn 1.1s cubic-bezier(.22,.61,.36,1) forwards;
}
.hero-copy > *:nth-child(1) { animation-delay: 0.15s; }  /* lockup    */
.hero-copy > *:nth-child(2) { animation-delay: 0.35s; }  /* tagline   */
.hero-copy > *:nth-child(3) { animation-delay: 0.55s; }  /* nota      */
.hero-copy > *:nth-child(4) { animation-delay: 0.75s; }  /* botón     */

.hero-media {
  opacity: 0;
  animation: heroMediaIn 1.4s ease forwards;
  animation-delay: 0.1s;
}

@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
  .hero-copy > *,
  .hero-media { opacity: 1; animation: none; }
}
