/* ─────── base.css ─────── */
/* ============================================================================
   EL RETO — Sistema de estilos de la web pública (estilfitness.es/el-reto)
   ----------------------------------------------------------------------------
   DOCUMENTO CENTRAL DE ESTILOS. Todo el aspecto de la landing se decide aquí:
   color, tipografía, ritmo de espacios, tarjetas, botones, imágenes, campos.
   El HTML solo coloca clases; no lleva medidas ni colores sueltos.

   Replica el lenguaje visual de la app El Reto v2 (app/globals.css y
   app/landing/page.tsx): negro, verde #92bc1f y tarjetas muy redondeadas
   sobre zinc-950. Tipografía: Inter para TODO, siempre en caja normal —
   nada de versalitas, mayúsculas sostenidas ni letra espaciada.

   Índice
     1. Tokens (color, tipografía, espacio, forma)
     2. Base y reset
     3. Escala tipográfica
     4. Ritmo de secciones y contenedores
     5. Fondos: orbes y rejilla
     6. Componentes: botones, chips, tarjetas, listas, pasos, stats
     7. Imágenes y medios (ratios fijos, tratamiento, mockup de móvil)
     8. Precio, FAQ, formulario
     9. Navegación y CTA fijo
    10. Animación de entrada
   ========================================================================== */

/* ─── 1. TOKENS ──────────────────────────────────────────────────────────── */
:root {
  /* Marca */
  --primary: #92bc1f;
  --primary-bright: #a9d92a;
  --primary-soft: rgba(146, 188, 31, 0.12);
  --primary-line: rgba(146, 188, 31, 0.3);
  --primary-fg: #0b0f02;

  /* Superficies (escala zinc de la app) */
  --bg: #000000;
  --bg-raise: #09090b;
  --surface: rgba(9, 9, 11, 0.6);
  --surface-2: rgba(255, 255, 255, 0.03);
  --surface-3: rgba(255, 255, 255, 0.06);
  --border: rgba(255, 255, 255, 0.07);
  --border-strong: rgba(255, 255, 255, 0.14);

  /* Texto */
  --fg: #ffffff;
  --fg-soft: #d4d4d8;
  --fg-muted: #a1a1aa;
  --fg-faint: #71717a;
  --danger: #f87171;

  /* Tipografía */
  --font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
  --font-display: var(--font-sans);

  /* Ritmo de espacio (una sola escala; nada de márgenes a ojo) */
  --s-1: 0.25rem;
  --s-2: 0.5rem;
  --s-3: 0.75rem;
  --s-4: 1rem;
  --s-5: 1.5rem;
  --s-6: 2rem;
  --s-7: 3rem;
  --s-8: 4rem;
  --s-9: 6rem;
  --s-10: 8rem;

  /* Aire vertical de cada sección y separación cabecera→contenido.
     Estos dos números mandan sobre el ritmo de TODA la web: subirlos o
     bajarlos separa o junta las secciones de golpe. */
  --section-y: clamp(2.5rem, 5vw, 4.5rem);
  --section-gap: clamp(1.75rem, 3.5vw, 3rem);

  /* Forma */
  --radius-xl: 2.5rem;
  --radius-lg: 2rem;
  --radius: 1.225rem;
  --radius-sm: 0.85rem;
  --radius-pill: 999px;

  /* Sombra */
  --shadow-card: 0 24px 60px -32px rgba(0, 0, 0, 0.9);
  --shadow-cta: 0 12px 34px -10px rgba(146, 188, 31, 0.45);
  --shadow-media: 0 40px 80px -32px rgba(0, 0, 0, 0.95);

  /* Layout */
  --wrap: 74rem;
  --wrap-narrow: 44rem;
  --gutter: clamp(1.25rem, 4vw, 2.5rem);
}

/* ─── 2. BASE ────────────────────────────────────────────────────────────── */
*,
*::before,
*::after { box-sizing: border-box; }

html {
  scroll-behavior: smooth;
  scroll-padding-top: 6rem;
  -webkit-text-size-adjust: 100%;
  /* Controles nativos (barras de scroll, calendarios, listas) en oscuro. */
  color-scheme: dark;
  /* El negro base vive aquí para que la capa de profundidad (body::before)
     quede por encima y se vea. */
  background: var(--bg);
}

body {
  margin: 0;
  /* Ancla del fondo único: la capa de rejilla (body::before) se estira a toda
     la altura de la página, no solo a la pantalla visible. */
  position: relative;
  background: transparent;
  color: var(--fg);
  font-family: var(--font-sans);
  font-weight: 300;
  letter-spacing: -0.02em;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
p, figure, blockquote { margin: 0; }
ul { margin: 0; padding: 0; list-style: none; }
h1, h2, h3, h4 {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 700;
  line-height: 1.08;
  letter-spacing: -0.035em;
}
::selection { background: var(--primary); color: var(--primary-fg); }

/* Profundidad del fondo. El negro plano se ve opaco y muerto: esta capa fija
   pone dos focos muy suaves (uno verde arriba a la izquierda, uno frío a la
   derecha) y un degradado hacia el centro, para que la página tenga aire.
   Va detrás de todo y no se mueve con el scroll. */
body::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background:
    /* Cuadrícula finísima, como papel milimetrado, de arriba abajo de la web */
    linear-gradient(to right, rgba(255, 255, 255, 0.03) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(255, 255, 255, 0.03) 1px, transparent 1px),
    /* Manchas de verde difuminadas, repartidas a lo largo de la página */
    radial-gradient(66rem 46rem at 8% 2%, rgba(146, 188, 31, 0.2), transparent 64%),
    radial-gradient(60rem 44rem at 92% 15%, rgba(146, 188, 31, 0.15), transparent 64%),
    radial-gradient(58rem 42rem at 45% 28%, rgba(146, 188, 31, 0.1), transparent 64%),
    radial-gradient(64rem 46rem at 4% 41%, rgba(146, 188, 31, 0.15), transparent 64%),
    radial-gradient(60rem 44rem at 96% 54%, rgba(146, 188, 31, 0.14), transparent 64%),
    radial-gradient(58rem 42rem at 50% 68%, rgba(146, 188, 31, 0.1), transparent 64%),
    radial-gradient(66rem 46rem at 12% 80%, rgba(146, 188, 31, 0.15), transparent 64%),
    radial-gradient(60rem 44rem at 90% 94%, rgba(146, 188, 31, 0.13), transparent 64%),
    /* Un velo verde muy flojo por debajo de todo, para que el negro no se
       quede plano en las zonas donde no cae ninguna mancha. */
    linear-gradient(180deg, rgba(146, 188, 31, 0.045), rgba(146, 188, 31, 0.025)),
    #000;
  background-size:
    4rem 4rem, 4rem 4rem,
    auto, auto, auto, auto, auto, auto, auto, auto, auto, auto;
  /* Los laterales se apagan para que la rejilla no choque contra el borde. */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
}

/* Grano finísimo sobre toda la página. En negro puro la pantalla se ve muerta;
   el ruido le da cuerpo sin ensuciar el color. */
body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  opacity: 0.035;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='180' height='180'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
}

/* ─── 3. ESCALA TIPOGRÁFICA ──────────────────────────────────────────────── */

/* Rótulo de sección: "Tecnología" */
.txt-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  font-size: 0.875rem;
  font-weight: 600;
  letter-spacing: -0.015em;
  color: var(--primary);
}
.txt-eyebrow::before {
  content: "";
  width: 1.75rem;
  height: 1px;
  background: linear-gradient(90deg, transparent, currentColor);
  flex: 0 0 auto;
}
.section-head .txt-eyebrow::after {
  content: "";
  width: 1.75rem;
  height: 1px;
  background: linear-gradient(90deg, currentColor, transparent);
  flex: 0 0 auto;
}
.txt-eyebrow--muted { color: var(--fg-muted); }

.txt-display {
  font-size: clamp(2.75rem, 8.5vw, 6rem);
  line-height: 0.98;
  letter-spacing: -0.045em;
  /* Los titulares grandes van con un degradado muy leve: da profundidad y
     evita el blanco plano de plantilla. */
  background: linear-gradient(180deg, #ffffff 30%, #c9c9d1 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.txt-display .accent {
  background: linear-gradient(180deg, var(--primary-bright), var(--primary));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.txt-h2 { font-size: clamp(1.9rem, 4.4vw, 3.25rem); line-height: 1.05; }
.txt-h3 { font-size: clamp(1.15rem, 2.1vw, 1.5rem); line-height: 1.15; }
.txt-h4 {
  font-family: var(--font-sans);
  font-size: 0.9375rem;
  font-weight: 600;
  line-height: 1.35;
  letter-spacing: -0.015em;
  color: var(--fg);
}

/* Título de tarjeta */
.txt-cardtitle {
  font-size: 1.0625rem;
  font-weight: 600;
  letter-spacing: -0.025em;
  color: var(--fg);
}

.txt-lead {
  font-size: clamp(1rem, 1.5vw, 1.125rem);
  font-weight: 300;
  line-height: 1.65;
  color: var(--fg-muted);
}
.txt-body {
  font-size: 0.9375rem;
  font-weight: 300;
  line-height: 1.75;
  color: var(--fg-muted);
}
.txt-small {
  font-size: 0.8125rem;
  font-weight: 300;
  line-height: 1.65;
  color: var(--fg-muted);
}

.accent { color: var(--primary); }
.strong { color: var(--fg); font-weight: 600; }
.center { text-align: center; }
.balance { text-wrap: balance; }
.measure { max-width: 46ch; }
.measure-narrow { max-width: 34ch; }

/* ─── 4. RITMO DE SECCIONES ──────────────────────────────────────────────── */
.wrap {
  width: 100%;
  max-width: var(--wrap);
  margin-inline: auto;
  padding-inline: var(--gutter);
  position: relative;
  z-index: 1;
}
.wrap--narrow { max-width: var(--wrap-narrow); }
/* Un poco más ancho de lo normal: para la sección de la app, donde los tres
   móviles y las tarjetas necesitan sitio. */
.wrap--wide { max-width: 84rem; }

.section {
  position: relative;
  padding-block: var(--section-y);
  /* Solo se recorta a lo ancho (para que nada saque barra horizontal). A lo
     alto NO: si se recorta, los resplandores difuminados se cortan en seco
     justo en el borde y se ve una raya recta de sección a sección. */
  overflow-x: clip;
  overflow-y: visible;
}
.section--tight { padding-block: calc(var(--section-y) * 0.62); }

/* El fondo es UNO para toda la página (body::before). Aquí no se pinta nada:
   ninguna sección lleva color propio ni filete de separación, para que no se
   vea la web como una pila de bloques pegados. Lo que separa una sección de
   otra es el aire, no una línea. */

/* Cabecera de sección: rótulo + titular + entradilla, siempre igual */
.section-head {
  max-width: 46rem;
  margin-inline: auto;
  margin-bottom: var(--section-gap);
  text-align: center;
  display: grid;
  gap: var(--s-4);
  justify-items: center;
}

/* Cabecera metida dentro de una columna: ni centrada ni con margen propio,
   porque el hueco lo pone ya la pila que la contiene. */
.section-head--stack {
  max-width: none;
  margin: 0;
  text-align: left;
  justify-items: start;
  gap: var(--s-3);
}
/* Alineada a la izquierda, la rayita va delante, igual que en el rótulo de la
   foto de al lado. */
.section-head--stack .txt-eyebrow::after { display: none; }

/* Pilas y rejillas con ritmo constante */
.stack-2 > * + * { margin-top: var(--s-2); }
.stack-3 > * + * { margin-top: var(--s-3); }
.stack-4 > * + * { margin-top: var(--s-4); }
.stack-5 > * + * { margin-top: var(--s-5); }
.stack-6 > * + * { margin-top: var(--s-6); }

.grid { display: grid; gap: var(--s-4); }
.grid--lg { gap: var(--s-5); }
.row { display: flex; flex-wrap: wrap; gap: var(--s-3); }
.row--between { justify-content: space-between; align-items: center; }
.row--center { justify-content: center; }

@media (min-width: 640px) {
  .grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 960px) {
  .grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .grid-split {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    align-items: center;
    gap: clamp(2.5rem, 5vw, 5rem);
  }
  .grid-split--media {
    grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  }
  /* Las dos columnas empiezan arriba: cuando el texto lleva su propio título,
     centrarlo lo dejaba flotando a media altura de la foto. */
  .grid-split--top { align-items: start; }
  .grid-split--wide-left {
    grid-template-columns: minmax(0, 1.2fr) minmax(0, 0.8fr);
  }
  /* Un retrato vertical a todo el ancho de su columna se come la sección: con
     proporción 3/4, 690 px de ancho salen 920 de alto, contra 486 del texto de
     al lado, y queda un palmo de negro debajo del párrafo. Aquí la columna de
     la foto cede sitio y además la foto tiene tope de ancho, para que las dos
     columnas midan parecido. */
  .grid-split--retrato {
    grid-template-columns: minmax(0, 0.78fr) minmax(0, 1fr);
  }
  .grid-split--retrato .media { max-width: 26rem; }
  /* Pantallas de la app a la izquierda, lo que hace a la derecha. Los tres
     móviles necesitan sitio, así que su columna manda. */
  .grid-split--showcase {
    grid-template-columns: minmax(0, 1.5fr) minmax(0, 0.85fr);
    align-items: center;
    gap: clamp(2rem, 3.5vw, 3.5rem);
  }
  .order-first-lg { order: -1; }
}

.rule {
  height: 1px;
  width: 100%;
  border: 0;
  margin: 0;
  background: linear-gradient(90deg, transparent, var(--border-strong), transparent);
}

/* ─── 5. FONDOS ──────────────────────────────────────────────────────────── */
/* Ya no hay fondos por sección: todo el color y la rejilla salen de una sola
   capa (body::before, arriba del todo del fichero). Si quieres cambiar el
   fondo de la web, se toca AHÍ y en ningún otro sitio. */

/* ─── 6. COMPONENTES ─────────────────────────────────────────────────────── */

/* Iconos: SVG incrustados en el propio HTML (sprite <symbol>), sin CDN.
   Heredan el color del texto; el tamaño lo fija cada componente. */
.ico {
  width: 1.05em;
  height: 1.05em;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
  flex: 0 0 auto;
}

/* Chip */
.chip {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  padding: 0.45rem 0.9rem;
  border: 1px solid var(--border);
  background: var(--surface-2);
  border-radius: var(--radius-pill);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: -0.015em;
  color: var(--fg-muted);
  backdrop-filter: blur(10px);
}
.chip--primary { border-color: var(--primary-line); color: var(--primary); background: var(--primary-soft); }
.chip svg { width: 13px; height: 13px; }
.chip .dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--primary);
  box-shadow: 0 0 0 4px var(--primary-soft);
}

/* Botones: píldora con chip de icono, como en la app */
.btn {
  display: inline-flex;
  align-items: center;
  gap: var(--s-3);
  padding: 0.4rem 0.4rem 0.4rem 1.4rem;
  border-radius: var(--radius-pill);
  border: 1px solid transparent;
  font-size: 0.9375rem;
  font-weight: 600;
  letter-spacing: -0.02em;
  cursor: pointer;
  transition: transform 0.25s ease, filter 0.25s ease, background-color 0.25s ease, border-color 0.25s ease;
}
.btn__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.35rem;
  height: 2.35rem;
  border-radius: var(--radius-pill);
  flex: 0 0 auto;
}
.btn__icon svg { width: 15px; height: 15px; }
.btn:active { transform: scale(0.98); }

.btn--primary {
  background: linear-gradient(180deg, var(--primary-bright), var(--primary));
  color: var(--primary-fg);
  box-shadow: var(--shadow-cta), inset 0 1px 0 rgba(255, 255, 255, 0.45);
}
.btn--primary .btn__icon { background: var(--primary-fg); color: var(--primary); }
.btn--primary:hover { filter: brightness(1.07); transform: translateY(-2px); }

/* Botón secundario: blanco con letra negra. Mismo tamaño y forma que el
   verde, para que los dos pesen igual en la portada. */
.btn--ghost {
  background: #fff;
  border-color: #fff;
  color: #000;
}
.btn--ghost .btn__icon { background: #000; color: #fff; }
.btn--ghost:hover { background: #e9e9ec; border-color: #e9e9ec; }

.btn--block { width: 100%; justify-content: space-between; }

/* Tarjetas */
.card {
  position: relative;
  padding: clamp(1.5rem, 2.6vw, 2.25rem);
  border: 1px solid var(--border);
  /* Degradado sutil de arriba abajo: la tarjeta recibe luz cenital en vez de
     ser un bloque de color plano. */
  background:
    linear-gradient(180deg, rgba(255, 255, 255, 0.055), rgba(255, 255, 255, 0.012) 45%, rgba(255, 255, 255, 0.02)),
    var(--surface);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-card), inset 0 1px 0 rgba(255, 255, 255, 0.07);
  backdrop-filter: blur(14px);
  overflow: hidden;
}
/* Filo de luz superior: el detalle que separa una tarjeta "de plantilla" de
   una con acabado. Se intensifica al pasar por encima. */
.card::before {
  content: "";
  position: absolute;
  top: 0;
  left: 12%;
  right: 12%;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.35), transparent);
  opacity: 0.6;
  transition: opacity 0.4s ease, left 0.4s ease, right 0.4s ease;
  pointer-events: none;
}
.card--hover:hover::before { opacity: 1; left: 4%; right: 4%; }
.card > * + * { margin-top: var(--s-4); }
.card--flat { background: var(--surface-2); box-shadow: none; backdrop-filter: none; }
.card--pad-lg { padding: clamp(2rem, 4vw, 3.25rem); }
/* Tarjeta pequeña: para columnas estrechas, donde caben varias seguidas. */
.card--compact { padding: clamp(1.1rem, 1.8vw, 1.4rem); }
.card--compact .txt-cardtitle { font-size: 1.0625rem; }
.card--compact .txt-body { font-size: 0.9375rem; line-height: 1.6; }
.card--compact .icon-badge { width: 2.25rem; height: 2.25rem; border-radius: 0.75rem; }
.card--compact .icon-badge .ico { width: 1.05rem; height: 1.05rem; }
.card--bare { padding: 0; }
.card--hover { transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.4s ease; }
.card--hover:hover {
  transform: translateY(-5px);
  border-color: rgba(146, 188, 31, 0.35);
  box-shadow: var(--shadow-card), inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 0 40px -18px rgba(146, 188, 31, 0.55);
}
.card--feature::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: radial-gradient(120% 80% at 50% 0%, var(--primary-soft), transparent 60%);
  opacity: 0;
  transition: opacity 0.4s ease;
}
.card--feature:hover::after { opacity: 1; }

/* Icono en cuadro */
.icon-badge {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  border-radius: var(--radius);
  background:
    linear-gradient(180deg, rgba(146, 188, 31, 0.28), rgba(146, 188, 31, 0.06)),
    rgba(9, 9, 11, 0.9);
  border: 1px solid var(--primary-line);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.16), 0 8px 20px -12px rgba(146, 188, 31, 0.7);
  color: var(--primary-bright);
  flex: 0 0 auto;
}
.icon-badge svg { width: 21px; height: 21px; }
.icon-badge--lg { width: 3.75rem; height: 3.75rem; border-radius: var(--radius); }
.icon-badge--lg svg { width: 26px; height: 26px; }
.icon-badge--plain { background: var(--surface-3); border-color: var(--border); color: var(--fg-soft); }

/* Lista de checks */
.check-list { display: grid; gap: var(--s-3); }
.check-item {
  display: flex;
  align-items: flex-start;
  gap: var(--s-3);
  font-size: 0.875rem;
  font-weight: 300;
  line-height: 1.6;
  color: var(--fg-muted);
}
.check-item svg { width: 17px; height: 17px; color: var(--primary); flex: 0 0 auto; margin-top: 3px; }
.check-item b { color: var(--fg); font-weight: 600; }

/* Píldora de característica (mono, como los features de la app) */
.feature-pill {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: 0.7rem 0.9rem;
  border: 1px solid var(--border);
  background: var(--bg-raise);
  border-radius: var(--radius);
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: -0.015em;
  color: var(--fg-soft);
}
.feature-pill .tick {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.35rem;
  height: 1.35rem;
  border-radius: 50%;
  background: var(--primary-soft);
  color: var(--primary);
  flex: 0 0 auto;
}
.feature-pill .tick svg { width: 12px; height: 12px; }

/* Paso numerado */
.step { display: flex; gap: var(--s-4); align-items: flex-start; }
.step-num {
  font-size: 0.875rem;
  font-weight: 700;
  letter-spacing: 0;
  color: var(--primary);
  border: 1px solid var(--primary-line);
  background: var(--primary-soft);
  border-radius: var(--radius-pill);
  padding: 0.45rem 0.75rem;
  flex: 0 0 auto;
}

/* El número del paso, repetido en grande y muy tenue al fondo de la tarjeta:
   marca el orden de un vistazo sin robar protagonismo al texto. */
.card--step { overflow: hidden; }
.card--step::after {
  content: attr(data-step);
  position: absolute;
  right: -0.5rem;
  bottom: -2.5rem;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 8rem;
  line-height: 1;
  letter-spacing: -0.06em;
  color: rgba(255, 255, 255, 0.035);
  pointer-events: none;
}

/* Banda de métricas */
.stat-value {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2.75rem, 6.5vw, 4.5rem);
  line-height: 1;
  letter-spacing: -0.05em;
  background: linear-gradient(180deg, #ffffff, #9a9aa3);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.stat-value.accent {
  background: linear-gradient(180deg, var(--primary-bright), var(--primary));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

/* Cita */
.quote {
  border-left: 2px solid var(--primary);
  padding-left: var(--s-5);
  font-family: var(--font-display);
  font-size: clamp(1rem, 1.8vw, 1.25rem);
  font-weight: 600;
  font-style: italic;
  line-height: 1.5;
  letter-spacing: -0.02em;
  color: var(--fg-soft);
}

/* Aviso lateral */
.note {
  display: flex;
  gap: var(--s-3);
  align-items: flex-start;
  border: 1px solid var(--primary-line);
  background: var(--primary-soft);
  border-radius: var(--radius);
  padding: var(--s-4);
  font-size: 0.8125rem;
  font-weight: 300;
  line-height: 1.6;
  color: var(--fg-soft);
  text-align: left;
}
.note svg { width: 17px; height: 17px; color: var(--primary); flex: 0 0 auto; margin-top: 2px; }

/* Marquesina */

/* ─── 7. IMÁGENES Y MEDIOS ───────────────────────────────────────────────
   Toda imagen va dentro de un .media con proporción fija: nunca se deforma,
   nunca salta el layout al cargar y todas las tarjetas miden lo mismo. */

.media {
  position: relative;
  overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--bg-raise);
  border: 1px solid var(--border);
}
.media > img,
.media > video,
.media > iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border: 0;
}
.media--1x1 { aspect-ratio: 1 / 1; }
.media--4x3 { aspect-ratio: 4 / 3; }
.media--3x4 { aspect-ratio: 3 / 4; }
.media--4x5 { aspect-ratio: 4 / 5; }
.media--16x9 { aspect-ratio: 16 / 9; }
.media--9x16 { aspect-ratio: 9 / 16; }  /* vertical, como los reels */
.media--hero { aspect-ratio: 4 / 5; }
@media (min-width: 960px) { .media--hero { aspect-ratio: 3 / 4; } }

/* Tratamiento: las fotos de origen son heterogéneas (WhatsApp, gimnasio,
   años distintos). Un leve desaturado + contraste las unifica y el velo
   inferior deja legible cualquier texto encima. */
.media__img--treated { filter: grayscale(0.18) contrast(1.06) saturate(1.05); }
.media__veil {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.15) 45%, transparent 75%);
  pointer-events: none;
}
.media__veil--side {
  background: linear-gradient(90deg, rgba(0, 0, 0, 0.92) 0%, rgba(0, 0, 0, 0.45) 45%, transparent 100%);
}
.media__caption {
  position: absolute;
  left: var(--s-4);
  right: var(--s-4);
  bottom: var(--s-4);
  z-index: 2;
}
/* Para collages antes/después: la imagen se ve entera, sin recortar cabezas.
   El hueco lo rellena el fondo de la tarjeta, así todas siguen midiendo igual. */
.media--fit > img { object-fit: contain; background: var(--bg-raise); }

.media--zoom > img { transition: transform 0.8s cubic-bezier(0.16, 1, 0.3, 1); }
.media--zoom:hover > img { transform: scale(1.05); }
.media--glow { box-shadow: var(--shadow-media); }

/* Marco de móvil (mockup de la app, hecho solo con CSS) */
/* Marco del móvil. El borde no es gris plano: es un degradado tipo titanio,
   más claro donde le daría la luz, para que parezca un aparato y no un
   rectángulo redondeado. */
.phone {
  position: relative;
  width: min(24rem, 84vw);
  margin-inline: auto;
  border-radius: 3.25rem;
  border: 10px solid transparent;
  padding: 0;
  background:
    linear-gradient(#050505, #050505) padding-box,
    linear-gradient(155deg, #55555e 0%, #1b1b20 22%, #0e0e11 48%, #34343c 72%, #101014 100%) border-box;
  box-shadow:
    var(--shadow-media),
    0 2px 2px rgba(255, 255, 255, 0.06),
    0 0 0 1px rgba(0, 0, 0, 0.9),
    0 0 90px -30px rgba(146, 188, 31, 0.28);
}
/* Isla dinámica, con el punto de la cámara marcado a la derecha. */
.phone::before {
  content: "";
  position: absolute;
  top: 0.7rem;
  left: 50%;
  transform: translateX(-50%);
  width: 6.25rem;
  height: 1.6rem;
  border-radius: var(--radius-pill);
  background: #000;
  box-shadow:
    inset -1.35rem 0 0 -0.52rem #0e0e12,
    inset -1.35rem 0 0 -0.62rem rgba(80, 110, 160, 0.55);
  z-index: 8;
}
/* Barra inferior de gestos */
.phone::after {
  content: "";
  position: absolute;
  bottom: 0.6rem;
  left: 50%;
  transform: translateX(-50%);
  width: 36%;
  height: 0.3rem;
  border-radius: var(--radius-pill);
  background: rgba(255, 255, 255, 0.28);
  z-index: 8;
}
.phone__screen {
  position: relative;
  aspect-ratio: 9 / 19.5;
  border-radius: 2.6rem;
  background: #000;
  padding: 3.1rem 1.15rem 1.1rem;
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
  overflow: hidden;
}
/* Reflejo del cristal: una diagonal de luz muy floja sobre la pantalla.
   Es lo que separa "pantalla encendida" de "recuadro con dibujos". */
.phone__screen::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 7;
  pointer-events: none;
  border-radius: inherit;
  background: linear-gradient(150deg, rgba(255, 255, 255, 0.075) 0%, rgba(255, 255, 255, 0) 38%);
}

/* Hora y estado, como en un móvil de verdad */
.phone__status {
  position: absolute;
  top: 1rem;
  left: 1.5rem;
  right: 1.5rem;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--fg);
  z-index: 5;
}
.phone__status-icons { display: flex; gap: 0.35rem; align-items: center; }
.phone__status-icons .ico { width: 0.95rem; height: 0.95rem; }

/* Rótulo suelto: se usa también en las tarjetas flotantes del hero. */
.phone__kicker {
  font-size: 0.8125rem;
  font-weight: 400;
  color: var(--fg-muted);
}

/* Composición del hero: texto a la izquierda, móvil a la derecha con una
   tarjeta flotante encima (solo en pantallas grandes, donde hay sitio). */
.hero {
  padding-top: clamp(3rem, 7vw, 5.5rem);
  padding-bottom: clamp(3rem, 6vw, 5rem);
}
.hero__grid {
  display: grid;
  gap: clamp(3rem, 6vw, 5rem);
  align-items: center;
}
@media (min-width: 960px) {
  .hero__grid { grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); }
}
.hero__visual { position: relative; }
.hero__glow {
  position: absolute;
  inset: 6% -14% -10% -14%;
  background:
    radial-gradient(55% 50% at 50% 42%, rgba(146, 188, 31, 0.3), transparent 70%),
    radial-gradient(40% 35% at 70% 75%, rgba(255, 255, 255, 0.06), transparent 70%);
  filter: blur(55px);
  pointer-events: none;
}

/* El móvil y sus tarjetas flotantes comparten caja: así las tarjetas quedan
   FUERA del teléfono (a los lados) y nunca tapan la pantalla. */
.hero__device {
  position: relative;
  width: min(24rem, 84vw);
  margin-inline: auto;
  /* La mitad de abajo del móvil está desvanecida: sin este tirón hacia arriba
     quedaría un hueco muerto entre el hero y la sección siguiente. */
  margin-bottom: clamp(-8rem, -9vw, -3rem);
}
/* En el hero el móvil no se ve entero: se deshace hacia la mitad, como si la
   pantalla se disolviera en el fondo. Da sensación de que hay más app debajo y
   deja el peso visual en el texto. Solo aquí: los tres móviles de la sección de
   la app se ven completos. */
.hero__device .phone {
  -webkit-mask-image: linear-gradient(
    180deg,
    #000 44%,
    rgba(0, 0, 0, 0.82) 60%,
    rgba(0, 0, 0, 0.32) 78%,
    transparent 94%
  );
  mask-image: linear-gradient(
    180deg,
    #000 44%,
    rgba(0, 0, 0, 0.82) 60%,
    rgba(0, 0, 0, 0.32) 78%,
    transparent 94%
  );
}
.float-card {
  display: none;
  position: absolute;
  z-index: 3;
  width: 13.5rem;
  padding: var(--s-4);
  border: 1px solid var(--border);
  background: rgba(9, 9, 11, 0.94);
  border-radius: var(--radius);
  box-shadow: var(--shadow-media);
  backdrop-filter: blur(14px);
}
@media (min-width: 1100px) { .float-card { display: block; } }
/* Las dos tarjetas se quedan en la mitad de arriba: abajo el móvil ya se ha
   desvanecido y flotarían sobre el vacío. */
.float-card--left { right: calc(100% - 1.75rem); top: 42%; }
.float-card--right { left: calc(100% - 1.75rem); top: 12%; }
/* Las dos tarjetas son avisos de la app, como los que saltan de verdad: un
   icono, la buena noticia y el detalle debajo. */
.float-card__head {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.875rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--fg);
}
.float-card__icon {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 1.65rem;
  height: 1.65rem;
  border-radius: 50%;
  background: rgba(146, 188, 31, 0.14);
  color: var(--primary);
}
.float-card__icon .ico { width: 0.9rem; height: 0.9rem; }
.float-card__text {
  margin-top: 0.5rem;
  font-size: 0.75rem;
  font-weight: 300;
  line-height: 1.5;
  color: var(--fg-muted);
}
.float-card__text b { font-weight: 600; color: var(--fg); }

/* Baraja de páginas del informe */
.report-stack {
  position: relative;
  width: min(21rem, 80vw);
  aspect-ratio: 3 / 4;
  margin-inline: auto;
  cursor: pointer;
  perspective: 1200px;
}
.report-card {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: var(--radius);
  border: 1px solid var(--border);
  background: var(--bg-raise);
  box-shadow: var(--shadow-media);
  transition: transform 0.65s cubic-bezier(0.23, 1, 0.32, 1), opacity 0.35s ease;
  will-change: transform, opacity;
}
.report-card.is-out {
  transform: translateX(115%) rotate(16deg) scale(0.92) !important;
  opacity: 0;
  pointer-events: none;
}

/* Carrusel de casos: scroll horizontal nativo con anclaje (sin librerías, así
   la sección no depende de ningún CDN para verse bien). */
.rail {
  display: flex;
  gap: var(--s-4);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  padding-bottom: var(--s-3);
  -ms-overflow-style: none;
  scrollbar-width: none;
  mask-image: linear-gradient(90deg, transparent, #000 3%, #000 97%, transparent);
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 3%, #000 97%, transparent);
}
.rail::-webkit-scrollbar { display: none; }
.rail > * {
  flex: 0 0 min(78%, 20rem);
  scroll-snap-align: center;
}
@media (min-width: 768px) { .rail > * { flex-basis: min(42%, 22rem); } }
@media (min-width: 1180px) { .rail > * { flex-basis: 22rem; } }

.rail-nav { display: flex; gap: var(--s-2); justify-content: center; margin-top: var(--s-5); }
.rail-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 50%;
  border: 1px solid var(--border);
  background: var(--surface-2);
  color: var(--fg-soft);
  cursor: pointer;
  transition: border-color 0.25s ease, color 0.25s ease, background-color 0.25s ease;
}
.rail-btn:hover { border-color: var(--primary-line); color: var(--primary); background: var(--primary-soft); }
.rail-btn .ico { width: 1.1rem; height: 1.1rem; }
.rail-btn--prev .ico { transform: rotate(180deg); }
.rail-btn--next .ico { transform: none; }

/* ─── 8. PRECIO, FAQ, FORMULARIO ─────────────────────────────────────────── */

/* Interruptor mensual / anual */
.toggle {
  position: relative;
  display: inline-flex;
  padding: 0.3rem;
  border: 1px solid var(--border);
  /* Negro liso, no el gris translúcido: así la pastilla verde destaca y el
     conmutador no compite con la tarjeta de precio que hay debajo. */
  background: #000;
  border-radius: var(--radius-pill);
  gap: 0.25rem;
}
/* La pastilla verde se desplaza entre las dos opciones en vez de aparecer y
   desaparecer: el cambio de plan se sigue con la vista. */
.toggle__thumb {
  position: absolute;
  top: 0.3rem;
  bottom: 0.3rem;
  left: 0;
  width: 0;
  border-radius: var(--radius-pill);
  background: var(--primary);
  box-shadow: var(--shadow-cta);
  transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1), width 0.35s cubic-bezier(0.16, 1, 0.3, 1);
  pointer-events: none;
}
.toggle button {
  border: 0;
  cursor: pointer;
  background: transparent;
  color: var(--fg-muted);
  font-size: 0.875rem;
  font-weight: 600;
  letter-spacing: -0.015em;
  padding: 0.6rem 1.2rem;
  border-radius: var(--radius-pill);
  transition: background-color 0.25s ease, color 0.25s ease;
}
.toggle button { position: relative; z-index: 1; }
.toggle button[aria-selected="true"] { color: var(--primary-fg); }

/* Tarjeta de precio: borde y halo verdes para que sea el foco de la sección. */
.price-card {
  position: relative;
  isolation: isolate;
  border-color: var(--primary-line);
}
/* Borde degradado: se pinta un marco de 1px con máscara, no un borde plano. */
.price-card::before,
.versus__col--good::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(160deg, rgba(146, 188, 31, 0.85), rgba(146, 188, 31, 0.05) 45%, rgba(255, 255, 255, 0.12));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask-composite: exclude;
  opacity: 1;
  left: 0; right: 0; top: 0;
}
.price-card > *, .versus__col--good > * { position: relative; z-index: 1; }
/* De lado a lado no parecía una carta de precio, parecía una franja: el importe
   centrado a 1.300 px del borde y seis líneas sueltas debajo. Se le pone ancho
   de tarjeta y se centra. El halo ya es más estrecho que esto, así que sigue
   cuadrando detrás. */
@media (min-width: 700px) {
  .price-card { max-width: 34rem; margin-inline: auto; }
}
.price-halo {
  position: absolute;
  left: 50%;
  top: 0;
  transform: translate(-50%, -45%);
  width: min(38rem, 90%);
  height: 18rem;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(146, 188, 31, 0.22), transparent 65%);
  filter: blur(60px);
  pointer-events: none;
  z-index: 0;
}

.price-row {
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: var(--s-3);
}
.price-amount {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(3.25rem, 9vw, 4.75rem);
  line-height: 1;
  letter-spacing: -0.045em;
}
.price-period {
  font-size: 1.125rem;
  font-weight: 500;
  color: var(--fg-soft);
}
.price-note {
  font-size: 0.9375rem;
  font-weight: 400;
  color: var(--fg-muted);
}
.price-badge {
  position: absolute;
  top: var(--s-5);
  right: var(--s-5);
  z-index: 2;
}

/* FAQ */
/* Dudas frecuentes: sin caja ni fondo. Texto directo sobre la página,
   separado solo por un filete. Así no compite con las secciones de tarjetas
   que tiene encima y debajo. */
.faq-item {
  border: 0;
  border-bottom: 1px solid var(--border);
  border-radius: 0;
  background: none;
  padding: var(--s-5) 0;
}
.faq-item:first-of-type { border-top: 1px solid var(--border); }
.faq-item summary {
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-4);
  font-size: clamp(1.0625rem, 1.8vw, 1.25rem);
  font-weight: 600;
  letter-spacing: -0.03em;
  color: var(--fg);
  transition: color 0.2s ease;
}
.faq-item summary::-webkit-details-marker { display: none; }
@media (hover: hover) {
  .faq-item summary:hover { color: var(--primary); }
}
.faq-item summary::after {
  content: "+";
  font-size: 1.5rem;
  line-height: 1;
  color: var(--primary);
  flex: 0 0 auto;
  transition: transform 0.25s ease;
}
.faq-item[open] summary::after { content: "−"; }
.faq-item p {
  margin-top: var(--s-4);
  max-width: 44rem;
  font-size: 1rem;
  line-height: 1.7;
  color: var(--fg-muted);
}

/* ─── ACORDEÓN DE LA APP ─────────────────────────────────────────────────
   Tres bloques plegados, uno abierto cada vez. La cabecera siempre visible:
   se ve de un vistazo qué hace la app y el detalle solo si te interesa. */
.acc { display: grid; gap: var(--s-3); }

/* Fondo negro macizo, no translúcido: la tarjeta se recorta contra el fondo
   de la web en vez de dejarlo pasar. */
.acc-item {
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #000;
  padding: var(--s-4) var(--s-5);
  transition: border-color 0.3s ease, box-shadow 0.3s ease;
}
.acc-item[open] {
  border-color: var(--primary-line);
  box-shadow: 0 0 40px -20px rgba(146, 188, 31, 0.6);
}
@media (hover: hover) {
  .acc-item:not([open]):hover { border-color: var(--border-strong); }
}

.acc-item summary {
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  gap: var(--s-3);
}
.acc-item summary::-webkit-details-marker { display: none; }
.acc-item__title {
  flex: 1;
  font-size: 1.0625rem;
  font-weight: 600;
  letter-spacing: -0.025em;
  color: var(--fg);
}
/* Signo de abrir y cerrar, al final de la fila */
.acc-item summary::after {
  content: "+";
  font-size: 1.35rem;
  line-height: 1;
  color: var(--primary);
  flex: 0 0 auto;
}
.acc-item[open] summary::after { content: "−"; }

.acc-item .icon-badge { width: 2.25rem; height: 2.25rem; border-radius: 0.75rem; }
.acc-item .icon-badge .ico { width: 1.05rem; height: 1.05rem; }

.acc-item__text {
  margin-top: var(--s-3);
  padding-left: calc(2.25rem + var(--s-3));
  font-size: 0.9375rem;
  font-weight: 300;
  line-height: 1.65;
  color: var(--fg-muted);
}
.acc-item[open] .acc-item__text { animation: rv-acc 0.35s cubic-bezier(0.16, 1, 0.3, 1); }
@keyframes rv-acc {
  from { opacity: 0; transform: translateY(-6px); }
  to { opacity: 1; transform: none; }
}

/* ─── VENTANA DEL FORMULARIO ─────────────────────────────────────────────
   El formulario se abre encima de la página desde cualquier botón, en vez de
   ocupar una sección al final. Usa <dialog>, así el navegador ya se encarga
   del foco, de la tecla Esc y de bloquear lo de detrás. */
.modal {
  width: min(34rem, calc(100vw - 2rem));
  max-height: min(90vh, 52rem);
  padding: clamp(1.5rem, 4vw, 2.5rem);
  border: 1px solid var(--primary-line);
  border-radius: var(--radius-lg);
  background: #050506;
  color: var(--fg);
  box-shadow: 0 40px 90px -30px rgba(0, 0, 0, 0.95), 0 0 80px -40px rgba(146, 188, 31, 0.8);
  overflow-y: auto;
}
/* Sin JavaScript la ventana nunca se abriría y el formulario quedaría fuera de
   alcance. En ese caso se queda a la vista, como una sección más del final. */
html:not(.js) .modal {
  display: block;
  position: static;
  max-height: none;
  margin: var(--section-gap) auto;
}
html:not(.js) .modal__close { display: none; }
.modal::backdrop {
  background: rgba(0, 0, 0, 0.8);
  backdrop-filter: blur(6px);
}
.modal[open] { animation: rv-modal 0.3s cubic-bezier(0.16, 1, 0.3, 1); }
@keyframes rv-modal {
  from { opacity: 0; transform: translateY(14px) scale(0.98); }
  to { opacity: 1; transform: none; }
}

.modal__close {
  position: absolute;
  top: var(--s-4);
  right: var(--s-4);
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  border: 1px solid var(--border);
  background: rgba(255, 255, 255, 0.04);
  color: var(--fg-muted);
  cursor: pointer;
  display: grid;
  place-items: center;
  transition: color 0.2s ease, border-color 0.2s ease;
}
.modal__close:hover { color: var(--fg); border-color: var(--border-strong); }
.modal__close .ico { width: 1.2rem; height: 1.2rem; }

.modal__head {
  display: grid;
  gap: var(--s-3);
  margin-bottom: var(--s-5);
  padding-right: 2.5rem;
}

/* Formulario */
.field-group { display: grid; gap: var(--s-2); }
.field-label {
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: -0.015em;
  color: var(--fg-muted);
}
.field {
  width: 100%;
  padding: 0.95rem 1.1rem;
  background: rgba(255, 255, 255, 0.045);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--fg);
  font-family: var(--font-sans);
  font-size: 16px; /* 16px evita el zoom automático de iOS al enfocar */
  font-weight: 400;
  transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
}
.field:focus {
  outline: none;
  border-color: var(--primary);
  background: rgba(255, 255, 255, 0.06);
  box-shadow: 0 0 0 3px var(--primary-soft);
}
.field::placeholder { color: var(--fg-faint); }
/* Aclaración bajo un campo. Explica para qué se pide el dato, que es lo que
   hace que la gente lo rellene en vez de abandonar el formulario. */
.field-hint {
  margin: 0;
  font-size: 0.8125rem;
  line-height: 1.45;
  color: var(--fg-faint);
}
/* El desplegable nativo lo pinta el sistema: sin esto, Windows abre la lista
   en blanco con el texto casi ilegible sobre la página oscura. */
select.field { color-scheme: dark; }
select.field option {
  background: #0b0b0d;
  color: #ffffff;
}
select.field {
  appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1l5 5 5-5' stroke='%2392bc1f' stroke-width='2' fill='none'/></svg>");
  background-repeat: no-repeat;
  background-position: right 1.1rem center;
  padding-right: 2.75rem;
}
/* La lista que se abre al pulsar el desplegable la pinta el navegador, y sale
   blanca con la fila azul del sistema. Con `base-select` el navegador cede el
   control y se puede vestir como el resto de la página. Donde no exista, el
   desplegable sigue funcionando con el aspecto del sistema en modo oscuro. */
@supports (appearance: base-select) {
  select.field,
  select.field::picker(select) {
    appearance: base-select;
  }
  select.field {
    /* Con base-select el navegador pone su propia flecha: sobra la nuestra. */
    background-image: none;
    padding-right: 1.1rem;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--s-3);
  }
  select.field::picker-icon {
    color: var(--primary);
    transition: rotate 0.25s cubic-bezier(0.16, 1, 0.3, 1);
  }
  select.field:open::picker-icon { rotate: 180deg; }
  select.field::picker(select) {
    margin-top: 0.4rem;
    padding: 0.35rem;
    border: 1px solid var(--primary-line);
    border-radius: var(--radius);
    background: #0b0b0d;
    box-shadow: 0 30px 70px -25px rgba(0, 0, 0, 0.95), 0 0 60px -35px rgba(146, 188, 31, 0.8);
  }
  select.field option {
    padding: 0.7rem 0.85rem;
    border-radius: 0.65rem;
    background: transparent;
    color: var(--fg);
    font-size: 0.9375rem;
    font-weight: 400;
  }
  select.field option:hover,
  select.field option:focus {
    background: rgba(146, 188, 31, 0.14);
    color: #fff;
  }
  select.field option:checked { color: var(--primary); font-weight: 600; }
  select.field option::checkmark { color: var(--primary); }
  select.field option:disabled { color: var(--fg-faint); }
}

/* Cualquier `display` que pongamos nosotros gana al del navegador para
   `hidden`, así que se deja claro: si algo está oculto, no se pinta. */
[hidden] { display: none !important; }

/* Pantalla de gracias, dentro de la misma ventana del formulario. */
.gracias { display: grid; gap: var(--s-4); justify-items: center; text-align: center; }
.gracias__icon {
  display: grid;
  place-items: center;
  width: 3.5rem;
  height: 3.5rem;
  border-radius: 50%;
  border: 1px solid var(--primary-line);
  background: rgba(146, 188, 31, 0.12);
  color: var(--primary);
  box-shadow: 0 0 50px -18px rgba(146, 188, 31, 0.9);
}
.gracias__icon .ico { width: 1.6rem; height: 1.6rem; }
.gracias .txt-small { max-width: 26rem; }
.gracias__pasos {
  display: grid;
  gap: var(--s-3);
  width: 100%;
  margin: var(--s-2) 0 0;
  padding: var(--s-5);
  list-style: none;
  text-align: left;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #000;
}
.gracias__pasos li {
  display: flex;
  align-items: flex-start;
  gap: var(--s-3);
  font-size: 0.8125rem;
  font-weight: 300;
  line-height: 1.5;
  color: var(--fg-muted);
}
.gracias__num {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 1.4rem;
  height: 1.4rem;
  border-radius: 50%;
  background: rgba(146, 188, 31, 0.14);
  color: var(--primary);
  font-size: 0.6875rem;
  font-weight: 700;
}

.consent {
  display: flex;
  align-items: flex-start;
  gap: var(--s-3);
  font-size: 0.75rem;
  line-height: 1.6;
  color: var(--fg-muted);
}
.consent input { accent-color: var(--primary); margin-top: 3px; width: 1rem; height: 1rem; }
.form-msg { font-size: 0.8125rem; font-weight: 500; text-align: center; }
.form-msg--ok { color: var(--primary); }
.form-msg--error { color: var(--danger); }
.is-hidden { display: none !important; }

/* ─── 9. NAVEGACIÓN Y CTA FIJO ───────────────────────────────────────────── */
.nav {
  position: sticky;
  top: 0;
  z-index: 50;
  border-bottom: 1px solid transparent;
  transition: background-color 0.3s ease, border-color 0.3s ease, backdrop-filter 0.3s ease;
}
.nav.is-stuck {
  background: rgba(0, 0, 0, 0.72);
  border-bottom-color: var(--border);
  backdrop-filter: blur(14px);
}
.nav__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-5);
  padding-block: var(--s-4);
}
/* Marca: el logo manda, "EstilFitness" queda al lado como firma. */
.logo {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  color: var(--fg);
}
.logo img {
  width: auto;
  height: 3.4rem;
  flex: 0 0 auto;
}
/* En el pie el logo va más grande, que es donde se despide la marca. */
.footer .logo img { height: 4rem; }
.nav__links { display: none; gap: var(--s-5); }
@media (min-width: 900px) { .nav__links { display: flex; } }
.nav__links a {
  font-size: 0.9375rem;
  font-weight: 500;
  letter-spacing: -0.015em;
  color: var(--fg-muted);
  transition: color 0.2s ease;
}
.nav__links a:hover { color: var(--fg); }

/* En móvil los dos botones de la portada van a lo ancho, uno debajo del otro. */
@media (max-width: 640px) {
  .hero .row .btn,
  .hero .btn--ghost { width: 100%; justify-content: space-between; }
}

/* ─── MENÚ DE MÓVIL ──────────────────────────────────────────────────────
   Botón de tres rayas en la cabecera que abre una pantalla completa, opaca,
   con las secciones en grande. En escritorio no existe: ahí están los
   enlaces de siempre. */

.nav__burger {
  display: none;
  position: relative;
  z-index: 90;
  width: 2.85rem;
  height: 2.85rem;
  padding: 0;
  border-radius: 50%;
  border: 1px solid var(--border-strong);
  background: rgba(0, 0, 0, 0.6);
  cursor: pointer;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.28rem;
}
.nav__burger span {
  display: block;
  width: 1.1rem;
  height: 1.5px;
  border-radius: 2px;
  background: var(--fg);
  transition: transform 0.3s ease, opacity 0.2s ease;
}
/* Con el menú abierto, las rayas se cruzan en una equis. */
.nav__burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(0.46rem) rotate(45deg); }
.nav__burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav__burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-0.46rem) rotate(-45deg); }

.menu {
  position: fixed;
  inset: 0;
  z-index: 80;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  /* Opaco de verdad: no se ve nada de la página por debajo. */
  background: #000;
  padding-block: var(--s-4) calc(var(--s-6) + env(safe-area-inset-bottom));
  opacity: 0;
  transition: opacity 0.28s ease;
}
.menu.is-open { opacity: 1; }
.menu[hidden] { display: none; }

.menu__top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-4);
}
.menu__close {
  width: 2.85rem;
  height: 2.85rem;
  border-radius: 50%;
  border: 1px solid var(--border-strong);
  background: transparent;
  color: var(--fg);
  cursor: pointer;
  display: grid;
  place-items: center;
}
.menu__close .ico { width: 1.35rem; height: 1.35rem; }

.menu__links {
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: var(--s-2);
}
.menu__links a {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-4);
  padding: var(--s-4) 0;
  border-bottom: 1px solid var(--border);
  font-size: clamp(1.6rem, 7vw, 2.25rem);
  font-weight: 700;
  letter-spacing: -0.04em;
  color: var(--fg);
}
.menu__links a .ico { width: 1.35rem; height: 1.35rem; color: var(--primary); }
.menu__links a:active { color: var(--primary); }

.menu__foot { display: grid; gap: var(--s-3); }
.menu__note { text-align: center; font-size: 0.8125rem; color: var(--fg-faint); }

/* El botón de menú y su pantalla solo existen en móvil. */
@media (max-width: 899px) {
  .nav__burger { display: flex; }
  .nav__cta { display: none; }
}
@media (min-width: 900px) {
  .menu { display: none; }
}

/* Pie: negro liso, sin la cuadrícula ni el verde del fondo general, para que
   la página cierre en plano y el logo grande no compita con nada. */
.footer {
  position: relative;
  background: #000;
  border-top: 1px solid var(--border);
  padding-block: var(--s-6);
}

/* ─── 10. ENTRADA AL HACER SCROLL ──────────────────────────────────────────
   Todo lo que lleva .reveal aparece al entrar en pantalla. Las variantes
   cambian de dónde viene: de abajo (por defecto), de los lados o creciendo. */
.js .reveal {
  opacity: 0;
  transform: translateY(28px);
  transition:
    opacity 0.9s cubic-bezier(0.16, 1, 0.3, 1),
    transform 0.9s cubic-bezier(0.16, 1, 0.3, 1),
    filter 0.9s ease;
  filter: blur(6px);
}
.js .reveal.is-visible { opacity: 1; transform: none; filter: none; }

.js .reveal--left { transform: translateX(-40px); }
.js .reveal--right { transform: translateX(40px); }
.js .reveal--scale { transform: scale(0.94); }
.js .reveal--soft { transform: translateY(14px); filter: none; }
.reveal-d1 { transition-delay: 0.09s; }
.reveal-d2 { transition-delay: 0.18s; }
.reveal-d3 { transition-delay: 0.27s; }
.reveal-d4 { transition-delay: 0.36s; }
.reveal-d5 { transition-delay: 0.45s; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
  /* Todo visible de entrada: ni desplazado, ni desenfocado, ni transparente.
     Va con !important porque la regla que las esconde (`.js .reveal`) pesa más
     que esta, y sin ello la página entera se quedaría en blanco para quien
     tiene activado "reducir movimiento". */
  .reveal { opacity: 1 !important; transform: none !important; filter: none !important; }
  /* El hilo horizontal se dibuja con scaleX: sin esto se quedaría en cero. */
  .timeline::before { transform: none !important; }
  html { scroll-behavior: auto; }
}

/* ─── 11. SECCIONES AÑADIDAS ─────────────────────────────────────────────── */

/* Testimonios: la cita manda, el autor va debajo con su resultado. */
.quote-card {
  display: flex;
  flex-direction: column;
  gap: var(--s-5);
  height: 100%;
}
.quote-card__text {
  font-size: 1.0625rem;
  font-weight: 400;
  line-height: 1.6;
  letter-spacing: -0.02em;
  color: var(--fg-soft);
  flex: 1;
}
.quote-card__author {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  border-top: 1px solid var(--border);
  padding-top: var(--s-4);
}
.quote-card__avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 50%;
  background: var(--primary-soft);
  border: 1px solid var(--primary-line);
  color: var(--primary);
  font-weight: 600;
  font-size: 0.9375rem;
  flex: 0 0 auto;
}
.quote-card__name { font-size: 0.9375rem; font-weight: 600; color: var(--fg); }
.quote-card__result { font-size: 0.8125rem; color: var(--primary); }

/* ─── TESTIMONIOS EN VÍDEO ───────────────────────────────────────────────
   Tarjeta vertical con la portada del vídeo. El reproductor no se carga
   hasta que alguien pulsa: la página no arrastra su peso ni su rastreo. */
.vcard {
  position: relative;
  display: flex;
  flex-direction: column;
  margin: 0;
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.045), rgba(255, 255, 255, 0.012));
  border: 1px solid var(--border);
  box-shadow: var(--shadow-card);
  transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.4s, box-shadow 0.5s;
}
@media (hover: hover) {
  .vcard:hover {
    transform: translateY(-6px);
    border-color: var(--primary-line);
    box-shadow: var(--shadow-card), 0 0 50px -18px rgba(146, 188, 31, 0.4);
  }
  .vcard:hover .vcard__img { transform: scale(1.045); }
}

.vcard__media {
  position: relative;
  aspect-ratio: 9 / 14;
  overflow: hidden;
  background: #000;
  cursor: pointer;
}
.vcard__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
}
/* Oscurecido de abajo para que el texto del pie se lea siempre. */
.vcard__media::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0, 0, 0, 0.15) 0%, transparent 35%, rgba(0, 0, 0, 0.72) 100%);
  pointer-events: none;
}
.vcard__media iframe,
.vcard__media video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

/* Duración del vídeo, arriba a la derecha. */
.vcard__length {
  position: absolute;
  top: var(--s-3);
  right: var(--s-3);
  z-index: 3;
  padding: 0.2rem 0.55rem;
  border-radius: var(--radius-pill);
  background: rgba(0, 0, 0, 0.6);
  backdrop-filter: blur(6px);
  border: 1px solid var(--border);
  font-size: 0.75rem;
  font-weight: 500;
  color: var(--fg-soft);
}

.vcard__foot {
  position: relative;
  z-index: 3;
  padding: var(--s-4) var(--s-5) var(--s-5);
  display: flex;
  align-items: center;
  gap: var(--s-3);
}
.vcard__name { font-size: 0.9375rem; font-weight: 600; color: var(--fg); }
.vcard__result { font-size: 0.8125rem; color: var(--primary); }

/* Botón de play centrado, con anillo y latido muy suave. */
.vcard__play {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  z-index: 3;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 4.25rem;
  height: 4.25rem;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.25);
  background: rgba(0, 0, 0, 0.4);
  backdrop-filter: blur(10px);
  color: #fff;
  cursor: pointer;
  transition: background 0.35s, transform 0.35s, border-color 0.35s;
}
.vcard__play .ico { width: 1.5rem; height: 1.5rem; margin-left: 3px; }
.vcard__play::before {
  content: "";
  position: absolute;
  inset: -0.5rem;
  border-radius: 50%;
  border: 1px solid var(--primary-line);
  animation: rv-pulse 2.8s ease-out infinite;
}
@keyframes rv-pulse {
  0% { transform: scale(0.9); opacity: 0.9; }
  70% { transform: scale(1.25); opacity: 0; }
  100% { opacity: 0; }
}
@media (hover: hover) {
  .vcard:hover .vcard__play {
    background: var(--primary);
    border-color: var(--primary);
    color: var(--primary-fg);
    transform: translate(-50%, -50%) scale(1.06);
  }
}

/* Al reproducir se quitan portada, play y degradados. */
.vcard.is-playing .vcard__play,
.vcard.is-playing .vcard__length,
.vcard.is-playing .vcard__media::after { display: none; }

/* Remate de sección: una frase que recoge lo que se acaba de contar y el
   botón. Siempre el mismo botón, cambia solo la frase de encima. */
.cta-band {
  margin-top: var(--section-gap);
  display: grid;
  justify-items: center;
  gap: var(--s-4);
  text-align: center;
}
.cta-band__text {
  max-width: 34rem;
  font-size: 1.0625rem;
  font-weight: 300;
  line-height: 1.6;
  color: var(--fg-muted);
}

/* ─── LÍNEA DE TIEMPO ────────────────────────────────────────────────────
   La historia de por qué no se avanza, contada por semanas. Un hilo vertical
   que va del blanco apagado al verde: cuanto más abajo, más cerca de la
   solución. El último paso es el único encendido. */
.timeline {
  position: relative;
  max-width: 44rem;
  margin-inline: auto;
  display: grid;
  gap: var(--s-7);
  padding-left: 3.5rem;
}
.timeline::before {
  content: "";
  position: absolute;
  left: 1.22rem;
  top: 0.9rem;
  bottom: 2rem;
  width: 1px;
  background: linear-gradient(
    180deg,
    rgba(255, 255, 255, 0.16),
    rgba(255, 255, 255, 0.09) 45%,
    var(--primary-line) 88%,
    transparent
  );
}

/* Cada paso lleva su propio color, y van de más apagado a más encendido:
   gris al empezar, ámbar cuando aparecen las dudas, rojo cuando se abandona
   y verde al llegar a El Reto. El color hace la historia legible de un
   vistazo, sin leer una palabra. */
.tl-step {
  position: relative;
  --tl-color: var(--fg-muted);
  --tl-glow: rgba(255, 255, 255, 0.14);
  border-radius: var(--radius-lg);
  border: 1px solid var(--border);
  background: #000;
  padding: var(--s-5);
}
.tl-step--start { --tl-color: #d4d4d8; --tl-glow: rgba(255, 255, 255, 0.2); }
.tl-step--warn { --tl-color: #f59e0b; --tl-glow: rgba(245, 158, 11, 0.35); }
.tl-step--bad { --tl-color: #f87171; --tl-glow: rgba(248, 113, 113, 0.35); }
/* El último también en negro: se distingue por el borde y el halo, no por
   tener un fondo distinto al resto. */
.tl-step--now {
  --tl-color: var(--primary);
  --tl-glow: rgba(146, 188, 31, 0.55);
  border-color: var(--primary-line);
  background: #000;
  box-shadow: 0 0 60px -25px rgba(146, 188, 31, 0.7);
}

.tl-step__dot {
  position: absolute;
  left: -3.5rem;
  top: var(--s-5);
  width: 3rem;
  height: 3rem;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: #000;
  border: 1.5px solid var(--tl-color);
  color: var(--tl-color);
  box-shadow: 0 0 24px -6px var(--tl-glow), inset 0 0 18px -10px var(--tl-glow);
}
.tl-step__dot .ico { width: 1.3rem; height: 1.3rem; }
/* El último va relleno: es el único paso "encendido". */
.tl-step--now .tl-step__dot {
  background: var(--primary);
  border-color: transparent;
  color: var(--primary-fg);
  box-shadow: 0 0 0 7px rgba(146, 188, 31, 0.14), 0 12px 34px -8px rgba(146, 188, 31, 0.65);
}

.tl-step__when {
  font-size: 0.8125rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--tl-color);
}
.tl-step__title {
  margin-top: 0.5rem;
  font-size: clamp(1.35rem, 2.6vw, 1.6rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  color: var(--fg);
}
.tl-step__text {
  margin-top: var(--s-3);
  font-size: 1rem;
  font-weight: 300;
  line-height: 1.65;
  color: var(--fg-soft);
}
.tl-step__text--strong { color: var(--fg); font-weight: 400; }

@media (max-width: 640px) {
  .timeline { padding-left: 2.75rem; gap: var(--s-6); }
  .timeline::before { left: 0.97rem; }
  .tl-step__dot { left: -2.75rem; width: 2rem; height: 2rem; }
  .tl-step__dot .ico { width: 0.95rem; height: 0.95rem; }
  .tl-step--now { margin-left: -0.4rem; }
  .tl-step--now .tl-step__dot { left: -2.35rem; }
}

/* En escritorio la historia se lee en horizontal, de izquierda a derecha:
   cuatro columnas centradas, con el hilo cruzando por detrás de los iconos. */
@media (min-width: 1024px) {
  .timeline {
    max-width: none;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: clamp(1.25rem, 2.5vw, 2.5rem);
    padding-left: 0;
    padding-top: 5.25rem;
    /* Todas las tarjetas a la misma altura, se estiran a la más alta. */
    align-items: stretch;
    text-align: center;
  }
  .timeline::before {
    left: 12.5%;
    right: 12.5%;
    top: 1.75rem;
    bottom: auto;
    width: auto;
    height: 1px;
    /* El hilo va cambiando de color con la historia: gris, ámbar, rojo y
       verde, los mismos que llevan los iconos. */
    background: linear-gradient(
      90deg,
      rgba(212, 212, 216, 0.35) 0%,
      rgba(245, 158, 11, 0.5) 34%,
      rgba(248, 113, 113, 0.5) 62%,
      rgba(146, 188, 31, 0.75) 92%
    );
  }
  /* Se dibuja de izquierda a derecha cuando la sección entra en pantalla. Solo
     si hay JavaScript: sin él no habría nada que lo volviera a estirar. */
  .js .timeline::before {
    transform-origin: left center;
    transform: scaleX(0);
    transition: transform 1.4s cubic-bezier(0.16, 1, 0.3, 1) 0.15s;
  }
  .js .timeline.is-visible::before { transform: scaleX(1); }

  /* El icono, centrado sobre su columna y con el fondo tapando el hilo. */
  .tl-step__dot {
    left: 50%;
    top: -5.25rem;
    transform: translateX(-50%);
    width: 3.5rem;
    height: 3.5rem;
    background: #000;
    box-shadow: 0 0 0 8px #000;
  }
  .tl-step__dot .ico { width: 1.45rem; height: 1.45rem; }

  .tl-step__when { font-size: 0.8125rem; }
  .tl-step__title { font-size: 1.25rem; margin-top: 0.3rem; }
  .tl-step__text { font-size: 0.9375rem; margin-top: var(--s-3); }

  /* El último paso: misma caja y misma altura que el resto, se distingue
     solo por el color. */
  .tl-step--now {
    margin-left: 0;
    margin-top: 0;
    padding: var(--s-5);
  }
  .tl-step--now .tl-step__dot {
    left: 50%;
    top: -5.25rem;
    background: var(--primary);
    box-shadow: 0 0 0 8px #000, 0 10px 30px -8px rgba(146, 188, 31, 0.6);
  }
}

/* Galería de pantallas: tres móviles con perspectiva. El del centro va por
   delante y los laterales giran hacia dentro, como en un escaparate. */
.showcase {
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  gap: clamp(0.75rem, 2vw, 1.75rem);
  perspective: 1600px;
  padding-block: var(--s-6);
}
.showcase::before {
  content: "";
  position: absolute;
  inset: 8% 10% 12%;
  background: radial-gradient(50% 50% at 50% 50%, rgba(146, 188, 31, 0.22), transparent 70%);
  filter: blur(70px);
  pointer-events: none;
}
.showcase__item {
  position: relative;
  transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}
/* Dentro de las dos columnas los móviles se encogen para dejar sitio a las
   tarjetas de al lado. La interfaz de dentro escala sola con el tamaño de
   letra, así que no hay que retocar ni una medida más. */
@media (min-width: 960px) {
  .grid-split--showcase .showcase { gap: 0.6rem; padding-block: var(--s-4); }
  .grid-split--showcase .showcase__item .phone { width: 15.5rem; border-width: 7px; border-radius: 2.5rem; }
  .grid-split--showcase .showcase__item .phone__screen { border-radius: 2rem; font-size: 10.2px; }
  .grid-split--showcase .showcase__item .phone::before { width: 4.1rem; height: 1.05rem; }
  .grid-split--showcase .showcase__caption { font-size: 0.8125rem; margin-top: var(--s-3); }
}

.showcase__item .phone { width: min(16rem, 70vw); border-width: 7px; border-radius: 2.6rem; }
.showcase__item .phone__screen { border-radius: 2.1rem; padding: 2.5rem 0.8rem 0.8rem; }
.showcase__item .phone::before { width: 4.25rem; height: 1.1rem; top: 0.5rem; }
.showcase__item .phone::after { display: none; }

@media (min-width: 900px) {
  .showcase__item--left { transform: rotateY(16deg) translateZ(-60px) translateX(2.5rem) scale(0.94); z-index: 1; }
  .showcase__item--right { transform: rotateY(-16deg) translateZ(-60px) translateX(-2.5rem) scale(0.94); z-index: 1; }
  .showcase__item--center { z-index: 2; transform: translateZ(30px); }
  .showcase:hover .showcase__item--left { transform: rotateY(12deg) translateZ(-30px) translateX(1.5rem) scale(0.96); }
  .showcase:hover .showcase__item--right { transform: rotateY(-12deg) translateZ(-30px) translateX(-1.5rem) scale(0.96); }
}
/* En pantallas pequeñas se convierte en carrusel lateral. */
@media (max-width: 899px) {
  .showcase {
    justify-content: flex-start;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    -ms-overflow-style: none;
    scrollbar-width: none;
  }
  .showcase::-webkit-scrollbar { display: none; }
  .showcase__item { flex: 0 0 auto; scroll-snap-align: center; }
}
.showcase__caption {
  margin-top: var(--s-4);
  text-align: center;
  font-size: 0.875rem;
  color: var(--fg);
}

/* ─── LA APP, RECREADA DENTRO DEL MÓVIL ──────────────────────────────────
   Esto no es un dibujo libre: reproduce las pantallas reales de El Reto
   (colores zinc + verde de marca, tarjetas redondeadas, barra flotante).
   Todo va en `em` y cada móvil fija su propio tamaño de letra, así la misma
   pantalla vale para el móvil grande de la cabecera y para los pequeños de
   la galería sin tocar una sola medida. */

.phone__screen { font-size: 15px; }
.showcase__item .phone__screen { font-size: 10.5px; }

.ap {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: 0.9em;
  flex: 1;
  min-height: 0;
  text-align: left;
  letter-spacing: -0.01em;
  /* Hueco para la barra flotante y desvanecido al pie: si el contenido llega
     abajo, se apaga como en un móvil de verdad en lugar de cortarse a hachazo. */
  padding-bottom: 3.6em;
  -webkit-mask-image: linear-gradient(180deg, #000 82%, transparent 99%);
  mask-image: linear-gradient(180deg, #000 82%, transparent 99%);
}

/* Pantalla con mucha lista (la dieta): letra algo menor para que quepan más
   platos sin cambiar ninguna medida, porque todo va en em. */
.ap--denso { font-size: 0.88em; }

/* Cabecera de pantalla: título + subtítulo + avatar */
.ap-head { display: flex; align-items: center; justify-content: space-between; gap: 0.6em; }
.ap-head__title { font-size: 1.35em; font-weight: 700; color: #fff; letter-spacing: -0.03em; line-height: 1.15; }
.ap-head__sub { font-size: 0.72em; color: #a1a1aa; margin-top: 0.15em; }
.ap-avatar {
  width: 2em;
  height: 2em;
  border-radius: 50%;
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  background: var(--primary);
  color: #000;
  font-size: 0.8em;
  font-weight: 800;
}

/* Chapa "EL RETO - TU GRAN CAMBIO" con el punto que late */
.ap-live {
  display: inline-flex;
  align-items: center;
  gap: 0.45em;
  align-self: flex-start;
  padding: 0.3em 0.7em;
  border-radius: 999px;
  background: rgba(146, 188, 31, 0.1);
  border: 1px solid rgba(146, 188, 31, 0.3);
  font-size: 0.68em;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  color: var(--primary);
}
.ap-live__dot {
  position: relative;
  width: 0.5em;
  height: 0.5em;
  border-radius: 50%;
  background: var(--primary);
}
.ap-live__dot::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: var(--primary);
  animation: rv-ping 1.8s cubic-bezier(0, 0, 0.2, 1) infinite;
}
@keyframes rv-ping { 75%, 100% { transform: scale(2.2); opacity: 0; } }

/* Fila de la portada: saludo a la izquierda, contador de días a la derecha */
.ap-hero { display: grid; grid-template-columns: 70% 30%; align-items: center; gap: 0.5em; }
.ap-hero__hi { font-size: 1.45em; font-weight: 700; color: #fff; letter-spacing: -0.03em; margin-top: 0.35em; }
.ap-hero__note { font-size: 0.8em; color: #fff; opacity: 0.85; margin-top: 0.35em; }
.ap-hero__days { text-align: center; }
.ap-hero__num { font-size: 2.9em; font-weight: 600; color: #fff; line-height: 1; font-variant-numeric: tabular-nums; }
.ap-hero__unit {
  display: block;
  font-size: 0.7em;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: #fff;
  margin-top: 0.35em;
}

/* Tarjeta base de la app */
.ap-card {
  background: #09090b;
  border: 1px solid rgba(255, 255, 255, 0.09);
  border-radius: 1.6em;
  padding: 0.95em;
}
.ap-card--soft { background: rgba(255, 255, 255, 0.03); }

/* Racha + barra de avance */
.ap-streak { display: flex; align-items: center; gap: 0.6em; }
.ap-streak__pill {
  display: inline-flex;
  align-items: center;
  gap: 0.35em;
  padding: 0.25em 0.6em;
  border-radius: 999px;
  background: rgba(249, 115, 22, 0.1);
  border: 1px solid rgba(249, 115, 22, 0.2);
  font-size: 0.7em;
  font-weight: 700;
  color: #fb923c;
  white-space: nowrap;
}
.ap-streak__pill .ico { width: 0.9em; height: 0.9em; }
.ap-bar { flex: 1; height: 0.35em; border-radius: 999px; background: rgba(255, 255, 255, 0.06); overflow: hidden; }
.ap-bar > span {
  display: block;
  height: 100%;
  border-radius: 999px;
  background: var(--primary);
  box-shadow: 0 0 12px rgba(146, 188, 31, 0.5);
}

/* Calendario de actividad */
.ap-cal { display: grid; grid-template-columns: repeat(7, 1fr); gap: 0.3em; margin-top: 0.9em; }
.ap-cal span {
  aspect-ratio: 1;
  border-radius: 0.45em;
  background: rgba(255, 255, 255, 0.04);
  font-size: 0.6em;
  display: grid;
  place-items: center;
  color: #52525b;
}
.ap-cal span.is-on { background: rgba(146, 188, 31, 0.55); color: #0b0f02; font-weight: 700; }
.ap-cal span.is-today { border: 1px solid var(--primary); color: var(--primary); }

/* Frase motivadora que rota en la pantalla de inicio */
.ap-quote { display: grid; gap: 0.3em; }
.ap-quote .ico { width: 1em; height: 1em; color: var(--primary); }
.ap-quote__text { font-size: 0.72em; line-height: 1.45; color: #d4d4d8; }
.ap-quote__author { font-size: 0.62em; color: #71717a; }

/* Hábitos diarios */
.ap-habits { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.6em; }
.ap-habit {
  border-radius: 1em;
  background: #09090b;
  border: 1px solid rgba(255, 255, 255, 0.09);
  padding: 0.6em 0.3em;
  display: grid;
  justify-items: center;
  gap: 0.15em;
}
.ap-habit__emoji { font-size: 1.05em; line-height: 1; }
.ap-habit__label { font-size: 0.62em; text-transform: uppercase; letter-spacing: -0.02em; color: #fff; }
.ap-habit__value { font-size: 0.72em; font-weight: 600; color: #fff; }

/* Encabezado de bloque: icono + título */
.ap-section { display: flex; align-items: center; gap: 0.5em; }
.ap-section .ico { width: 1em; height: 1em; color: var(--primary); }
.ap-section__title { font-size: 0.9em; font-weight: 700; color: #fff; }

/* Accesos "Mi Dieta" / "Mi Entreno" */
.ap-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 0.6em; }
.ap-tile {
  border-radius: 1.2em;
  background: #09090b;
  border: 1px solid rgba(255, 255, 255, 0.09);
  padding: 1em 0.5em;
  display: grid;
  justify-items: center;
  gap: 0.6em;
}
.ap-tile__icon {
  width: 2.4em;
  height: 2.4em;
  border-radius: 0.8em;
  display: grid;
  place-items: center;
  background: rgba(39, 39, 42, 0.5);
  border: 1px solid rgba(63, 63, 70, 0.5);
  color: var(--primary);
}
.ap-tile__icon .ico { width: 1.2em; height: 1.2em; }
.ap-tile__name { font-size: 0.78em; font-weight: 700; color: #fff; }

/* ── Dieta ──────────────────────────────────────────────────────────────── */
.ap-total { display: flex; align-items: center; gap: 0.55em; }
.ap-total__icon {
  width: 1.7em;
  height: 1.7em;
  border-radius: 0.55em;
  display: grid;
  place-items: center;
  background: rgba(146, 188, 31, 0.15);
  border: 1px solid rgba(146, 188, 31, 0.3);
  color: var(--primary);
}
.ap-total__icon .ico { width: 0.85em; height: 0.85em; }
.ap-total__label {
  font-size: 0.62em;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: #fff;
}
.ap-total__label { display: block; }
.ap-total__value { display: block; font-size: 1.5em; font-weight: 900; color: #fff; font-variant-numeric: tabular-nums; line-height: 1.1; }
.ap-total__value small { font-size: 0.6em; font-weight: 700; color: var(--primary); text-transform: uppercase; letter-spacing: 0.08em; }
.ap-mode { margin-top: 0.75em; }
.ap-mode__title { font-size: 0.62em; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: #fff; }
.ap-mode__note { font-size: 0.62em; font-weight: 600; color: #a1a1aa; margin-top: 0.2em; }

/* Los tres macros, con los colores exactos de la app */
.ap-macros { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.5em; margin-top: 0.75em; }
.ap-macro { border-radius: 1em; padding: 0.6em; display: grid; gap: 0.15em; }
.ap-macro__top { display: flex; align-items: center; gap: 0.25em; }
.ap-macro__top .ico { width: 0.75em; height: 0.75em; }
.ap-macro__name {
  font-size: 0.58em;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: #fff;
}
.ap-macro__pct { font-size: 1.15em; font-weight: 900; font-variant-numeric: tabular-nums; }
.ap-macro__pct span { font-size: 0.55em; font-weight: 700; color: #fff; }
.ap-macro__g { font-size: 0.58em; color: #fff; font-variant-numeric: tabular-nums; }
.ap-macro--prot { background: rgba(59, 130, 246, 0.1); border: 1px solid rgba(59, 130, 246, 0.2); }
.ap-macro--prot .ico, .ap-macro--prot .ap-macro__pct { color: #3b82f6; }
.ap-macro--carb { background: rgba(245, 158, 11, 0.1); border: 1px solid rgba(245, 158, 11, 0.2); }
.ap-macro--carb .ico, .ap-macro--carb .ap-macro__pct { color: #f59e0b; }
.ap-macro--fat { background: rgba(34, 197, 94, 0.1); border: 1px solid rgba(34, 197, 94, 0.2); }
.ap-macro--fat .ico, .ap-macro--fat .ap-macro__pct { color: #22c55e; }

/* Bloque de ingesta (Desayunos, Comidas…): en la app es una tarjeta plegable
   con la cabecera arriba y los platos dentro. Aquí se dibuja siempre abierta. */
.ap-meal {
  /* La pantalla es un flex en columna: sin esto el bloque se encoge y se
     comería los platos de dentro en vez de desbordar por abajo. */
  flex: 0 0 auto;
  background: #09090b;
  border: 1px solid rgba(255, 255, 255, 0.09);
  border-radius: 1.6em;
  overflow: hidden;
}
.ap-meal__head { display: flex; align-items: center; gap: 0.6em; padding: 0.75em 0.85em; }
.ap-meal__icon {
  width: 1.85em;
  height: 1.85em;
  flex: 0 0 auto;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--primary);
  color: #000;
}
.ap-meal__icon .ico { width: 0.95em; height: 0.95em; }
.ap-meal__title {
  flex: 1;
  min-width: 0;
  font-size: 0.62em;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: #fff;
}
/* Girada 90°: en la app marca que la sección está desplegada */
.ap-meal__chev { width: 1em; height: 1em; flex: 0 0 auto; color: var(--primary); transform: rotate(90deg); }
.ap-meal__list { display: grid; gap: 0.5em; padding: 0 0.55em 0.6em; }

/* Tarjeta de plato: foto a la izquierda, macros y kcal abajo */
.ap-dish {
  display: flex;
  gap: 0.6em;
  border-radius: 0.85em;
  background: #18181b;
  border: 1px solid #27272a;
  padding: 0.45em;
}
.ap-dish__img {
  width: 4.6em;
  height: 4.6em;
  flex: 0 0 auto;
  border-radius: 0.6em;
  object-fit: cover;
  background: #09090b;
  border: 1px solid #27272a;
}
.ap-dish__body { display: flex; flex-direction: column; justify-content: space-between; gap: 0.35em; min-width: 0; flex: 1; }
.ap-dish__top { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.4em; min-width: 0; }
.ap-dish__txt { min-width: 0; }
/* Botón de cambiar plato: en la app cada plato se puede sustituir */
.ap-dish__swap {
  width: 1.45em;
  height: 1.45em;
  flex: 0 0 auto;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: #09090b;
  border: 1px solid rgba(146, 188, 31, 0.4);
  color: var(--primary);
}
.ap-dish__swap .ico { width: 0.8em; height: 0.8em; }
.ap-dish__name { font-size: 0.8em; font-weight: 700; color: #fff; line-height: 1.2; }
.ap-dish__ing {
  font-size: 0.62em;
  color: #a1a1aa;
  line-height: 1.35;
  margin-top: 0.15em;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.ap-dish__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.4em;
  padding-top: 0.3em;
  border-top: 1px solid rgba(255, 255, 255, 0.05);
}
.ap-dish__macros { display: flex; gap: 0.55em; }
.ap-dish__macro { display: flex; align-items: center; gap: 0.2em; font-size: 0.6em; font-weight: 600; color: #d4d4d8; }
.ap-dish__macro .ico { width: 0.75em; height: 0.75em; }
.ap-dish__macro--prot .ico { color: #3b82f6; }
.ap-dish__macro--carb .ico { color: #f59e0b; }
.ap-dish__macro--fat .ico { color: #22c55e; }
.ap-dish__kcal { display: flex; align-items: center; gap: 0.2em; color: var(--primary); }
.ap-dish__kcal .ico { width: 0.75em; height: 0.75em; }
.ap-dish__kcal b { font-size: 0.85em; font-weight: 800; font-variant-numeric: tabular-nums; }
.ap-dish__kcal span { font-size: 0.55em; text-transform: uppercase; opacity: 0.7; }

/* ── Entreno ────────────────────────────────────────────────────────────── */

/* Aviso de calentamiento hecho */
.ap-warm {
  display: flex;
  align-items: center;
  gap: 0.55em;
  border-radius: 1em;
  border: 1px solid rgba(146, 188, 31, 0.28);
  background: rgba(146, 188, 31, 0.08);
  padding: 0.6em 0.7em;
}
.ap-warm__check {
  width: 1.5em;
  height: 1.5em;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--primary);
  color: #000;
  flex: 0 0 auto;
}
.ap-warm__check .ico { width: 0.85em; height: 0.85em; }
.ap-warm__title { display: block; font-size: 0.72em; font-weight: 700; color: #fff; }
.ap-warm__note { display: block; font-size: 0.62em; color: #a1a1aa; margin-top: 0.1em; }

/* Vídeo de técnica del ejercicio */
.ap-gif {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  border-radius: 0.8em;
  background: #000;
  border: 1px solid rgba(255, 255, 255, 0.07);
  margin-bottom: 0.7em;
}

.ap-exercise__name {
  font-size: 0.85em;
  font-weight: 800;
  color: #fff;
  text-transform: uppercase;
  letter-spacing: -0.01em;
  line-height: 1.25;
}
.ap-exercise__meta { font-size: 0.65em; color: #a1a1aa; margin-top: 0.25em; }
.ap-serie {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5em;
  border-radius: 0.7em;
  border: 1px solid rgba(255, 255, 255, 0.09);
  background: rgba(255, 255, 255, 0.02);
  padding: 0.5em 0.65em;
  margin-top: 0.45em;
}
.ap-serie__label { font-size: 0.7em; font-weight: 700; color: #fff; }
.ap-serie__label em { font-style: normal; color: var(--primary); }
.ap-serie__weight { font-size: 0.68em; color: #a1a1aa; font-variant-numeric: tabular-nums; }
.ap-serie__check {
  width: 1.35em;
  height: 1.35em;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: #22c55e;
  color: #fff;
}
.ap-serie__check .ico { width: 0.8em; height: 0.8em; }
.ap-serie--now { border-color: rgba(146, 188, 31, 0.4); background: rgba(146, 188, 31, 0.06); }
.ap-serie--now .ap-serie__check { background: transparent; border: 1px solid rgba(255, 255, 255, 0.2); color: transparent; }
.ap-rest {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.4em;
  margin-top: 0.6em;
  font-size: 0.68em;
  color: #a1a1aa;
}
.ap-rest .ico { width: 0.85em; height: 0.85em; color: var(--primary); }

/* ── Progreso ───────────────────────────────────────────────────────────── */
.ap-weight { display: flex; align-items: flex-end; justify-content: space-between; gap: 0.5em; }
.ap-weight__value { font-size: 2em; font-weight: 900; color: #fff; line-height: 1; font-variant-numeric: tabular-nums; }
.ap-weight__unit { font-size: 0.5em; font-weight: 700; color: #a1a1aa; }
.ap-weight__delta {
  font-size: 0.7em;
  font-weight: 700;
  color: var(--primary);
  display: inline-flex;
  align-items: center;
  gap: 0.25em;
}
.ap-weight__delta .ico { width: 0.85em; height: 0.85em; }
.ap-chart { display: flex; align-items: flex-end; gap: 0.28em; height: 4.4em; margin-top: 0.9em; }
.ap-chart span {
  flex: 1;
  border-radius: 0.25em 0.25em 0 0;
  background: linear-gradient(180deg, rgba(146, 188, 31, 0.45), rgba(146, 188, 31, 0.12));
}
.ap-chart span.is-on { background: linear-gradient(180deg, var(--primary-bright), var(--primary)); }
.ap-chart__foot { font-size: 0.62em; color: #71717a; margin-top: 0.5em; }

/* Listas de "lo que queda" / "medidas": un rótulo y filas debajo */
.ap-next { display: grid; gap: 0.4em; }
.ap-next__title {
  font-size: 0.6em;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: #71717a;
}
.ap-measure {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5em;
  border-radius: 0.8em;
  border: 1px solid rgba(255, 255, 255, 0.09);
  background: rgba(255, 255, 255, 0.02);
  padding: 0.55em 0.7em;
}
.ap-measure__label { font-size: 0.7em; color: #d4d4d8; }
.ap-measure__value { font-size: 0.72em; font-weight: 700; color: #fff; font-variant-numeric: tabular-nums; }
.ap-measure__value--up { color: var(--primary); }

/* Fila que lleva a otra pantalla: icono, texto y flecha */
.ap-action {
  display: flex;
  align-items: center;
  gap: 0.55em;
  border-radius: 0.9em;
  border: 1px solid rgba(255, 255, 255, 0.09);
  background: rgba(255, 255, 255, 0.03);
  padding: 0.6em 0.7em;
}
.ap-action__icon {
  width: 1.6em;
  height: 1.6em;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--primary);
  color: #000;
  flex: 0 0 auto;
}
.ap-action__icon .ico { width: 0.85em; height: 0.85em; }
.ap-action__text { flex: 1; font-size: 0.72em; font-weight: 700; color: #fff; }
.ap-action__arrow { width: 0.9em; height: 0.9em; color: var(--primary); }

/* Fotos de progreso, antes y después */
/* La comparativa va entera, con su cabecera de ANTES / DESPUÉS: es la pieza tal
   como se comparte, no dos fotos sueltas. */
.ap-photos { display: grid; gap: 0.4em; }
.ap-photos img {
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  border-radius: 0.7em;
  border: 1px solid rgba(255, 255, 255, 0.09);
  background: #09090b;
}

/* ── Barra de navegación flotante (la de verdad: pastilla con la opción
      activa en verde y su nombre en mayúsculas) ───────────────────────── */
.ap-nav {
  position: absolute;
  left: 1em;
  right: 1em;
  bottom: 1.3em;
  z-index: 6;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.2em;
  padding: 0.3em 0.35em;
  border-radius: 999px;
  background: rgba(9, 9, 11, 0.75);
  backdrop-filter: blur(18px);
  border: 1px solid rgba(39, 39, 42, 0.8);
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.65);
}
.ap-nav__item {
  flex: 1;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.35em;
  height: 2.3em;
  border-radius: 999px;
  color: #fff;
}
.ap-nav__item .ico { width: 1.05em; height: 1.05em; }
.ap-nav__item--on {
  background: var(--primary);
  color: #000;
  box-shadow: 0 4px 16px rgba(146, 188, 31, 0.35);
  flex: 0 0 auto;
  padding-inline: 0.7em;
}
.ap-nav__item--on span {
  font-size: 0.62em;
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  white-space: nowrap;
}

/* Comparativa: dos columnas enfrentadas. */
.versus { display: grid; gap: var(--s-4); }
@media (min-width: 860px) { .versus { grid-template-columns: 1fr 1fr; gap: var(--s-5); } }
.versus__col { display: grid; gap: var(--s-4); align-content: start; }
.versus__head {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  font-size: 1.0625rem;
  font-weight: 600;
  letter-spacing: -0.025em;
  color: var(--fg);
}
.versus__item {
  display: flex;
  gap: var(--s-3);
  align-items: flex-start;
  font-size: 0.9375rem;
  font-weight: 300;
  line-height: 1.6;
  color: var(--fg-muted);
}
.versus__item .ico { width: 1.1rem; height: 1.1rem; margin-top: 3px; }
.versus__col--bad .versus__item .ico { color: var(--fg-faint); }
.versus__col--good .versus__item .ico { color: var(--primary); }
.versus__col--good { border-color: var(--primary-line); }

/* Pie completo */
.footer__grid {
  display: grid;
  gap: var(--s-7);
  padding-block: var(--s-7);
}
@media (min-width: 860px) {
  .footer__grid { grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: var(--s-6); }
}
.footer__title {
  font-size: 0.9375rem;
  font-weight: 600;
  color: var(--fg);
  margin-bottom: var(--s-4);
}
.footer__list { display: grid; gap: var(--s-3); }
.footer__list a {
  font-size: 0.9375rem;
  font-weight: 300;
  color: var(--fg-muted);
  transition: color 0.2s ease;
}
.footer__list a:hover { color: var(--fg); }
.footer__bottom {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-4);
  justify-content: space-between;
  align-items: center;
  border-top: 1px solid var(--border);
  padding-block: var(--s-5);
  font-size: 0.8125rem;
  color: var(--fg-faint);
}
.social { display: flex; gap: var(--s-3); }
.social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  border: 1px solid var(--border);
  background: var(--surface-2);
  color: var(--fg-muted);
  transition: color 0.2s ease, border-color 0.2s ease;
}
.social a:hover { color: var(--primary); border-color: var(--primary-line); }
.social .ico { width: 1.1rem; height: 1.1rem; }


/* ─────── estilfitness.css ─────── */
/* ════════════════════════════════════════════════════════════════════════════
   ESTILFITNESS · CAPA PROPIA DE LA WEB DEL GIMNASIO

   base.css trae el sistema de la landing de El Reto (tokens, tipografía,
   secciones, tarjetas, botones, formulario, navegación, animación de entrada).
   Aquí solo va lo que esa landing no tenía y esta web sí necesita:

     1. Enlace activo del menú
     2. Tarifas (tres planes en fila)
     3. Datos de contacto, horario y mapa
     4. Galería con visor a pantalla completa
     5. Calculadora de peso orientativo
     6. Testimonios con estrellas
     7. Texto largo de las páginas legales
     8. Asistente (chat)

   Regla: nada de mayúsculas sostenidas ni letra espaciada; Inter para todo,
   igual que en base.css.
   ════════════════════════════════════════════════════════════════════════════ */

/* ──────────────── 0. Anchura y remiendos del sistema heredado ──────────── */

/* La landing de El Reto estaba pensada como una columna estrecha y centrada
   (74rem). Aquí la web ocupa la pantalla: el contenedor crece hasta 110rem y
   los márgenes laterales se abren con el ancho de la ventana. En móvil no
   cambia nada, porque el límite nunca llega a tocarse. */
:root {
  --wrap: 110rem;          /* 1760 px */
  --wrap-narrow: 56rem;    /* texto largo: se mantiene legible */
  --gutter: clamp(1.25rem, 3.5vw, 4rem);
  --section-y: clamp(2.75rem, 5vw, 5.5rem);

  /* Legibilidad: los grises heredados de la landing eran demasiado apagados
     sobre negro. Se suben todos un escalón para que el texto se lea sin
     esfuerzo; la jerarquía se mantiene, solo que más clara. */
  --fg-soft: #f1f1f3;
  --fg-muted: #cfcfd6;
  --fg-faint: #9b9ba4;
}

/* Un solo color de fondo para TODAS las tarjetas de la web. Antes cada bloque
   tenía el suyo (translúcido, negro puro, degradado) y el conjunto se veía
   descosido. La excepción es .card--claro, blanca, para contrastar en algún
   punto suelto. */
:root { --card-bg: #0a0a0c; }

.card,
.card--flat,
.extra,
.incluido__item,
.calc,
.plan,
.plan--featured { background: var(--card-bg); }

/* La excepción: tarjeta blanca. Se usa con cuentagotas, para que un bloque
   concreto se lleve la mirada. Todo lo de dentro se recolorea. */
.card--claro {
  background: #fff;
  border-color: #fff;
  color: #0a0a0c;
}
.card--claro .plan__name,
.card--claro .plan__amount,
.card--claro .txt-cardtitle,
.card--claro .check-item span { color: #0a0a0c; }
.card--claro .plan__amount {
  background: none;
  -webkit-background-clip: border-box;
  background-clip: border-box;
}
.card--claro .plan__sub,
.card--claro .plan__note,
.card--claro .plan__period { color: #52525b; }
.card--claro .check-item svg { color: #4d6a10; }
.card--claro .h-linea,
.card--claro .plan__list { border-color: rgba(0, 0, 0, 0.1); }
/* El botón se invierte: negro sobre blanco. */
.card--claro .btn--primary {
  background: #0a0a0c;
  color: #fff;
  box-shadow: 0 12px 30px -12px rgba(0, 0, 0, 0.6);
}
.card--claro .btn--primary .btn__icon { background: var(--primary); color: #0a0a0c; }

/* El cuerpo iba en peso 300, que sobre negro se ve tirando a fino. */
body { font-weight: 400; }
.txt-body, .txt-small, .txt-lead { color: var(--fg-soft); }
.txt-lead { font-weight: 400; }

/* Todas las páginas ocupan lo mismo: el contenedor "estrecho" deja de serlo y
   quien limita la longitud de línea es el propio texto, no la caja. Así FAQ,
   legales y contacto no se ven más angostas que el resto. */
.wrap--narrow { max-width: var(--wrap); }
.wrap--narrow .prose,
.wrap--narrow > .section-head { margin-inline: auto; }
/* Las cajas ocupan todo el ancho como en el resto de la web; quien se frena es
   el texto de dentro, que es lo que hay que poder leer de un vistazo. */
.prose { max-width: 78ch; }
.faq-item p,
.acc-item__text { max-width: 90ch; }

/* Las preguntas van dentro de una pila que les añadía hueco por arriba, encima
   del relleno que ya tienen. Entre pregunta y pregunta se veía un vacío enorme:
   se separan con su propio relleno y la línea de abajo, y basta. */
.faq-item + .faq-item { margin-top: 0; }
.faq-item { padding: var(--s-4) 0; }

/* Con tanto ancho, tres tarjetas se quedaban cortas y cuatro entran de sobra en
   pantallas grandes. */
@media (min-width: 1500px) {
  .gallery { grid-template-columns: repeat(6, 1fr); }
}

/* Los bloques de texto no crecen con el contenedor: una línea de 1700 px no hay
   quien la lea. El límite lo pone la propia tipografía. */
.txt-lead { max-width: 68ch; }
.section-head .txt-lead { margin-inline: auto; }
.section-head--stack .txt-lead { margin-inline: 0; }

/* En pantallas muy anchas, la cabecera de sección centrada se queda perdida si
   se estira; se mantiene contenida. */
.section-head { max-width: 52rem; }

/* ──────────────── Remiendos del sistema heredado ───────────────────────── */

/* En la landing de El Reto, .grid-split se escribía siempre junto a .grid, que
   es quien pone el display. Aquí se usa suelto en muchos sitios, así que se le
   da el display por su cuenta: si no, las dos columnas se quedan apiladas. */
.grid-split { display: grid; gap: var(--s-5); }

/* Todos los botones miden lo mismo lleven icono o no. El relleno original
   contaba con que a la derecha hubiera siempre un icono redondo: los que no lo
   tienen salían más bajos y con un hueco raro. Ahora la altura la fija el
   propio botón y el icono se acerca al borde con un margen negativo. */
.btn {
  min-height: 3.15rem;
  padding: 0.4rem 1.4rem;
  justify-content: center;
  text-align: center;
}
.btn .btn__icon { margin-right: -1rem; }
/* Los de bloque siguen con el texto a la izquierda y el icono a la derecha. */
.btn--block { justify-content: space-between; text-align: left; }

/* En móvil todos los botones van a lo ancho, con el texto a la izquierda y el
   icono a la derecha. Uno debajo de otro y del mismo tamaño: el pulgar no tiene
   que apuntar. El de la cabecera se queda fuera, que ahí manda el menú. */
@media (max-width: 640px) {
  .btn:not(.nav__cta) {
    width: 100%;
    justify-content: space-between;
    text-align: left;
  }
}

/* ───────────────────────────── 0 bis. Hero ─────────────────────────────── */

/* El titular manda: con el párrafo largo fuera, se le da todo el tamaño que
   admite la caja. */
.hero .txt-display { font-size: clamp(2.75rem, 7.5vw, 5rem); line-height: 0.98; font-weight: 600; letter-spacing: -0.045em; }

/* La foto del hero se funde por abajo con el fondo en vez de acabar en un
   rectángulo con borde. Sin marco ni sombra: lo que se ve es la imagen
   deshaciéndose, no una tarjeta. */
.hero .media--hero {
  border: 0;
  box-shadow: none;
  -webkit-mask-image: linear-gradient(180deg, #000 55%, rgba(0, 0, 0, 0.55) 80%, transparent 100%);
  mask-image: linear-gradient(180deg, #000 55%, rgba(0, 0, 0, 0.55) 80%, transparent 100%);
}
/* En escritorio ocupaba media pantalla de alto: se acorta y se limita. */
@media (min-width: 960px) {
  .hero .media--hero { aspect-ratio: 1 / 1; max-height: min(32rem, 58vh); }
  .hero__glow { inset: 10% -10% 4% -10%; }
}

/* ── Collage de la portada ────────────────────────────────────────────────
   En vez de una foto sola, tres: una grande que se lee primero y dos que la
   respaldan. Ocupa exactamente el mismo hueco que ocupaba la foto unica y
   hereda su desvanecido de abajo, porque las piezas llegan al borde y el corte
   no se nota. Cada foto se puede abrir grande en el visor de la web. */
.collage {
  position: relative;
  display: grid;
  gap: var(--s-2);
  aspect-ratio: 4 / 5;
  -webkit-mask-image: linear-gradient(180deg, #000 80%, rgba(0, 0, 0, 0.5) 93%, transparent 100%);
  mask-image: linear-gradient(180deg, #000 80%, rgba(0, 0, 0, 0.5) 93%, transparent 100%);
}
@media (min-width: 960px) {
  .collage { aspect-ratio: 1 / 1; max-height: min(32rem, 58vh); margin-inline: auto; }
}
.collage .media {
  border: 0;
  border-radius: var(--radius);
  background: var(--bg-raise);
  cursor: zoom-in;
}
.collage .media:focus-visible { outline: 2px solid var(--primary); outline-offset: 5px; }
.collage img { transition: transform 0.9s cubic-bezier(0.16, 1, 0.3, 1); }
@media (hover: hover) { .collage .media:hover img { transform: scale(1.06); } }
@media (prefers-reduced-motion: reduce) { .collage img { transition: none; } }

/* La grande manda: ocupa la columna izquierda entera. */
.collage--principal { grid-template-columns: 1.3fr 1fr; grid-template-rows: 1fr 1fr; }
.collage--principal > :first-child { grid-row: span 2; }

/* El horario se pone arriba a la izquierda, dentro de la foto vertical. Esa
   foto empieza justo en la esquina del hueco, asi que basta con cambiarle el
   lado. Y va por encima de las fotos: si no, se lo comen. */
.collage .hero__flota { z-index: 12; }
.collage--principal .hero__flota--horario { left: var(--s-4); right: auto; }
.hero .txt-lead { font-size: clamp(1.0625rem, 1.6vw, 1.25rem); color: var(--fg); }

/* La palabra verde del titular se releva sola. La que se va sale hacia arriba
   y a la derecha, creciendo y desenfocándose; la que entra se monta letra a
   letra, cada una un pelín después que la anterior. */
.rota {
  position: relative;
  display: inline-block;
  vertical-align: top;
  /* El titular va con interlineado 0.98: sin este respiro, la caja de la
     palabra corta las colas de la "y" y de la "p". */
  line-height: 1;
  padding-bottom: 0.12em;
}
.rota__letra { line-height: 1.05; }
/* El titular pinta el texto con un degradado recortado (background-clip: text).
   Eso no sobrevive a las letras sueltas con desenfoque: se veían blancas y
   montadas sobre la línea de arriba. La palabra que rota va con color plano. */
.txt-display .accent.rota,
.txt-display .accent.rota * {
  background: none;
  -webkit-background-clip: border-box;
  background-clip: border-box;
  color: var(--primary);
  -webkit-text-fill-color: var(--primary);
}
/* La frase entera: se desvanece la que había y aparece la siguiente. Sin letras
   sueltas ni capas superpuestas, que era lo que dejaba fantasmas al cargar. */
.rota__palabra {
  display: inline-block;
  white-space: nowrap;
  opacity: 0;
  /* Entra desde la izquierda y sale por la derecha: el movimiento siempre va
     en el mismo sentido, como si la frase pasara de largo. */
  transform: translateX(-0.5em);
  transition:
    opacity 0.6s ease,
    transform 0.7s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.rota__palabra.is-in { opacity: 1; transform: none; }
.rota__palabra.is-out { opacity: 0; transform: translateX(0.5em); }

/* Barra de prueba social: nota de Google y condiciones, todo en una línea.
   Es un enlace a las reseñas reales, no un adorno. */
.prueba {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
  width: fit-content;
  margin-inline: auto;
  padding: 0.6rem 1.15rem;
  border-radius: var(--radius-pill);
  border: 1px solid var(--primary-line);
  background:
    linear-gradient(90deg, rgba(146, 188, 31, 0.16), rgba(146, 188, 31, 0.04) 55%, rgba(255, 255, 255, 0.03));
  box-shadow: 0 18px 40px -26px rgba(146, 188, 31, 0.8);
  font-size: 0.8125rem;
  color: var(--fg-soft);
  text-decoration: none;
  white-space: nowrap;
  overflow: hidden;
  position: relative;
  transition: border-color 0.3s ease, transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.3s ease;
}
.prueba:hover {
  transform: translateY(-2px);
  border-color: var(--primary);
  box-shadow: 0 22px 45px -24px rgba(146, 188, 31, 0.95);
}
/* Un brillo cruza la barra al pasar por encima, como en el botón principal. */
.prueba::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: -60%;
  width: 40%;
  background: linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.22), transparent);
  transform: skewX(-18deg);
  opacity: 0;
  pointer-events: none;
}
.prueba:hover::after { opacity: 1; animation: ef-brillo 0.8s ease-out; }
.prueba > * { position: relative; z-index: 1; }

.prueba__estrellas { color: var(--primary); letter-spacing: 0.1em; font-size: 0.875rem; }
.prueba__nota {
  font-size: 1.0625rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--fg);
}
.prueba__larga { color: var(--fg-muted); }
.prueba__item { color: var(--fg-soft); }
.prueba__sep {
  width: 1px;
  height: 1.1rem;
  margin-inline: 0.25rem;
  background: rgba(255, 255, 255, 0.16);
}

/* En escritorio la columna del hero va alineada a la izquierda: centrada, la
   barra quedaba descolgada de los botones. */
@media (min-width: 960px) {
  .prueba { margin-inline: 0; }
}

/* En pantallas estrechas se cae lo prescindible antes que partir la línea. */
@media (max-width: 560px) {
  .prueba { font-size: 0.75rem; padding: 0.55rem 0.85rem; gap: 0.45rem; }
  .prueba__larga { display: none; }
  .prueba__sep { margin-inline: 0.1rem; }
}

/* Etiquetas flotantes sobre la foto. */
.hero__flota {
  position: absolute;
  z-index: 2;
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.6rem 0.9rem;
  border-radius: var(--radius-pill);
  border: 1px solid rgba(255, 255, 255, 0.14);
  background: rgba(10, 10, 12, 0.82);
  backdrop-filter: blur(10px);
  box-shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.9);
  font-size: 0.8125rem;
  color: var(--fg-soft);
  white-space: nowrap;
  animation: ef-flota 5s ease-in-out infinite;
}
.hero__flota b { color: var(--fg); font-weight: 700; }
.hero__flota--nota { left: -0.75rem; bottom: 12%; }
/* Dentro de la foto, arriba a la derecha. */
.hero__flota--horario { right: var(--s-4); top: var(--s-4); animation: none; }
.hero__estrellas { color: var(--primary); letter-spacing: 0.05em; }
.hero__punto {
  width: 0.5rem;
  height: 0.5rem;
  border-radius: 50%;
  background: var(--primary);
  box-shadow: 0 0 0 3px rgba(146, 188, 31, 0.22);
}
.hero__flota.is-cerrado .hero__punto { background: var(--fg-faint); box-shadow: none; }

/* Suben y bajan despacio: lo justo para que la foto no parezca un cartel. */
@keyframes ef-flota {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-7px); }
}
@media (prefers-reduced-motion: reduce) {
  .hero__flota { animation: none; }
}

/* En pantallas pequeñas las etiquetas se meten dentro de la foto: fuera se
   salían del ancho de la pantalla. */
@media (max-width: 700px) {
  .hero__flota--horario { right: 0.75rem; top: 0.75rem; font-size: 0.75rem; }
}

/* ─────────────────────── 1. Enlace activo del menú ─────────────────────── */

.nav__links a[aria-current="page"] {
  color: var(--fg);
}
.nav__links a[aria-current="page"]::after {
  content: "";
  display: block;
  height: 2px;
  margin-top: 0.35rem;
  border-radius: 2px;
  background: var(--primary);
}
.menu__links a[aria-current="page"] span {
  color: var(--primary);
}

/* ────────────────────────────── 2. Tarifas ─────────────────────────────── */

.plans {
  display: grid;
  gap: var(--s-5);
  align-items: stretch;
}
@media (min-width: 960px) {
  .plans {
    grid-template-columns: repeat(3, 1fr);
    /* Cuatro filas comunes: nombre, precio, ventajas y botón. Cada tarjeta se
       acopla a ellas con subgrid, así los precios quedan a la misma altura en
       las tres aunque una tenga una línea más de texto. */
    grid-template-rows: auto auto 1fr auto;
  }
  .plan {
    display: grid;
    grid-row: span 4;
    grid-template-rows: subgrid;
    gap: var(--s-5);
  }
}

/* El plan recomendado se levanta un poco y se queda con el borde verde. */
.plan {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--s-5);
  /* La tarjeta base recorta lo que se sale; aquí no, porque la insignia del
     plan destacado va montada sobre el borde superior. */
  overflow: visible;
}
.plan__head { display: flex; flex-direction: column; gap: var(--s-2); }
.plan__name { font-size: 1.0625rem; font-weight: 600; color: var(--fg); }
.plan__sub { font-size: 0.8125rem; color: var(--fg-muted); line-height: 1.6; }

.plan__price { display: flex; align-items: baseline; gap: 0.4rem; }
.plan__amount {
  font-size: clamp(2.5rem, 6vw, 3.25rem);
  font-weight: 700;
  letter-spacing: -0.04em;
  line-height: 1;
  background: linear-gradient(180deg, #fff 25%, #a8a8ae 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.plan--featured .plan__amount {
  background: linear-gradient(180deg, var(--primary-bright) 20%, var(--primary) 100%);
  -webkit-background-clip: text;
  background-clip: text;
}
.plan__period { font-size: 0.875rem; color: var(--fg-muted); font-weight: 500; }
.plan__note { font-size: 0.8125rem; color: var(--fg-faint); }

.plan__list { display: flex; flex-direction: column; gap: var(--s-3); }
.plan__list .check-item { align-items: flex-start; }

.plan .btn { margin-top: auto; }

.plan--featured { border-color: transparent; }
/* Mismo borde degradado que la tarjeta de precio de El Reto. */
.plan--featured::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(160deg, var(--primary), rgba(146,188,31,0.12) 45%, transparent 75%);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  pointer-events: none;
}
/* ── Aspecto de las tarjetas de plan ──
   Luz verde entrando por una esquina, línea fina de remate arriba y la tarjeta
   se levanta al pasar por encima. La destacada va un punto más grande y con
   halo propio, para que se vea cuál es la que recomendamos. */
.plan {
  background:
    radial-gradient(130% 85% at 100% 0%, rgba(146, 188, 31, 0.1), transparent 62%),
    var(--card-bg);
  transition:
    transform 0.4s cubic-bezier(0.16, 1, 0.3, 1),
    border-color 0.4s ease,
    box-shadow 0.4s ease;
}
.plan::before {
  content: "";
  position: absolute;
  top: 0;
  left: 18%;
  right: 18%;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(146, 188, 31, 0.55), transparent);
  pointer-events: none;
}
.plan:hover {
  transform: translateY(-6px);
  border-color: var(--primary-line);
  box-shadow: 0 34px 64px -34px rgba(0, 0, 0, 0.95);
}

.plan--featured {
  background:
    radial-gradient(130% 95% at 50% 0%, rgba(146, 188, 31, 0.2), transparent 64%),
    var(--card-bg);
  box-shadow: 0 34px 74px -38px rgba(146, 188, 31, 0.6);
}
.plan--featured::before { left: 12%; right: 12%; background: linear-gradient(90deg, transparent, var(--primary), transparent); }
/* Solo cuando las tres van en fila: apiladas, agrandarla descuadra el ancho. */
@media (min-width: 960px) {
  .plan--featured { transform: scale(1.035); z-index: 1; }
  .plan--featured:hover { transform: scale(1.035) translateY(-6px); }
}

/* Apiladas en móvil van por interés: primero la trimestral, luego la mensual y
   al final la de un día por semana. En escritorio manda el orden del HTML. */
@media (max-width: 959px) {
  .plan--featured { order: -1; }
  .plans > .plan:first-child { order: 1; }
}

.plan__name { font-size: 1.1875rem; font-weight: 700; letter-spacing: -0.02em; }
/* Franja de "esto entra en las tres cuotas": una fila de marcas verdes, para
   que se vea sin leer. */
.incluye {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--s-5);
  width: fit-content;
  max-width: 100%;
  margin: 0 auto var(--s-7, 4rem);
}
.incluye__label {
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--primary);
}
/* En móvil, una debajo de otra. En escritorio, en tres columnas: en columna
   única se hacía una tira larguísima antes de llegar a los precios. */
.incluye__items {
  display: grid;
  gap: var(--s-3);
  margin: 0;
  padding: 0;
  list-style: none;
}
@media (min-width: 760px) {
  .incluye__items {
    grid-template-columns: repeat(3, auto);
    gap: var(--s-4) var(--s-7, 3rem);
  }
  /* Sin renglones aquí: en rejilla las rayas se leen como una tabla. */
  .incluye__items li { padding-bottom: 0; border-bottom: 0; }
}
/* Renglones: cada línea con su raya de puntos debajo, como una libreta. */
.incluye__items li {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding-bottom: var(--s-3);
  border-bottom: 1px dashed rgba(255, 255, 255, 0.1);
  font-size: clamp(1rem, 1.7vw, 1.25rem);
  font-weight: 500;
  color: var(--fg);
}
.incluye__items li:last-child { border-bottom: 0; padding-bottom: 0; }

/* La marca: casilla cuadrada de lista de tareas. Primero se ve la casilla vacía
   y después se dibuja el palito dentro, como si alguien fuera repasando la
   lista a mano. */
.tick {
  display: grid;
  place-items: center;
  width: 1.9rem;
  height: 1.9rem;
  flex: 0 0 auto;
  border-radius: 0.5rem;
  border: 1.5px solid var(--primary-line);
  background: transparent;
  color: var(--primary);
  transition:
    background-color 0.4s ease,
    border-color 0.4s ease;
}
.reveal.is-visible .tick { background: var(--primary-soft); border-color: var(--primary); }
.tick .ico {
  width: 1.05rem;
  height: 1.05rem;
  /* El palito mide unas 23 unidades: se esconde y se va soltando. */
  stroke-dasharray: 24;
  stroke-dashoffset: 24;
  transition: stroke-dashoffset 0.45s ease;
}
.reveal.is-visible .tick .ico { stroke-dashoffset: 0; }
/* Cada línea entra un poco después que la anterior. */
.incluye__items li:nth-child(1) .tick { transition-delay: 0.05s; }
.incluye__items li:nth-child(1) .tick .ico { transition-delay: 0.25s; }
.incluye__items li:nth-child(2) .tick { transition-delay: 0.15s; }
.incluye__items li:nth-child(2) .tick .ico { transition-delay: 0.35s; }
.incluye__items li:nth-child(3) .tick { transition-delay: 0.25s; }
.incluye__items li:nth-child(3) .tick .ico { transition-delay: 0.45s; }
.incluye__items li:nth-child(4) .tick { transition-delay: 0.35s; }
.incluye__items li:nth-child(4) .tick .ico { transition-delay: 0.55s; }
.incluye__items li:nth-child(5) .tick { transition-delay: 0.45s; }
.incluye__items li:nth-child(5) .tick .ico { transition-delay: 0.65s; }
.incluye__items li:nth-child(6) .tick { transition-delay: 0.55s; }
.incluye__items li:nth-child(6) .tick .ico { transition-delay: 0.75s; }

@media (prefers-reduced-motion: reduce) {
  .tick,
  .tick .ico { transition: none; stroke-dashoffset: 0; }
}

@media (max-width: 560px) {
  .incluye { width: 100%; align-items: flex-start; gap: var(--s-4); }
  .tick { width: 1.75rem; height: 1.75rem; }
  .tick .ico { width: 0.95rem; height: 0.95rem; }
}

/* Recordatorio de que lo demás ya está contado arriba, sin repetir la lista. */
.plan__todo {
  margin-top: var(--s-2);
  font-size: 0.8125rem;
  color: var(--fg-faint);
}
.plan--featured .plan__todo { color: var(--fg-muted); }
/* Raya fina entre el precio y las ventajas: separa lo que cuesta de lo que
   llevas. */
.plan__list { padding-top: var(--s-5); border-top: 1px solid var(--border); }

/* La insignia se monta sobre el borde superior. Va centrada: pegada a la
   derecha se comía la esquina redondeada de la tarjeta. */
.plan__badge {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 2;
  white-space: nowrap;
  padding: 0.35rem 0.9rem;
  border-radius: var(--radius-pill);
  background: var(--primary);
  color: var(--primary-fg);
  font-size: 0.6875rem;
  font-weight: 700;
  box-shadow: var(--shadow-cta);
}

/* La franja de cierre va centrada; sus botones también, sobre todo en móvil,
   donde se ponen uno debajo de otro y quedaban pegados a la izquierda. */
.cta-band .row { justify-content: center; }
@media (max-width: 640px) {
  .cta-band .row { flex-direction: column; align-items: stretch; width: 100%; }
}

/* Separador de grupo: hace de rótulo sin ser un titular grande. Se usa cuando
   una sección solo agrupa contenido (los bloques de preguntas) y un titular a
   tamaño completo chocaría con el título de la página. */
.grupo {
  display: flex;
  align-items: center;
  gap: var(--s-4);
}
.grupo__label {
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--primary);
  white-space: nowrap;
}
.grupo__linea {
  flex: 1;
  height: 1px;
  background: linear-gradient(90deg, var(--primary-line), transparent);
}

/* Título que existe para los buscadores y los lectores de pantalla, pero no se
   ve: lo usamos cuando la sección no necesita cabecera a la vista. */
.solo-lector {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Las dos formas de entrar sin cuota. Fondo negro macizo para que se lean como
   otra cosa distinta de los planes de arriba. */
.extras {
  display: grid;
  gap: var(--s-4);
  margin-top: var(--s-6);
}
/* Las dos, en una sola fila. */
@media (min-width: 760px) { .extras { grid-template-columns: repeat(2, 1fr); } }

/* Cada tarjeta en una sola fila: icono, nombre, precio y explicación en
   horizontal. Ocupan la mitad de alto y la franja no compite con los planes. */
.extra {
  position: relative;
  overflow: hidden;
  display: grid;
  /* En móvil, icono a la izquierda y el resto a la derecha en dos filas: sin
     columnas estrechas donde el nombre y el precio se partían letra a letra. */
  grid-template-columns: auto minmax(0, 1fr);
  column-gap: var(--s-4);
  row-gap: var(--s-2);
  align-items: center;
  padding: var(--s-5);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--radius-lg);
  transition: border-color 0.35s ease, transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
}
/* Móvil: una sola línea con icono, nombre y precio, y debajo la explicación a
   todo lo ancho. La etiqueta "Sin cuota" sobra aquí: ya lo dice la sección. */
.extra { grid-template-columns: auto minmax(0, 1fr) auto; }
.extra__ico { grid-column: 1; grid-row: 1; align-self: center; margin-bottom: 0; }
.extra__eyebrow { display: none; }
/* Icono, nombre y precio en la misma línea: nombre pegado al icono y precio
   pegado al borde derecho, los tres a la misma altura. */
.extra__nombre { grid-column: 2; grid-row: 1; text-align: left; align-self: center; }
.extra__precio { grid-column: 3; grid-row: 1; align-self: center; margin-top: 0; font-size: 1.75rem; }
/* La explicación arranca donde arranca el nombre, no debajo del icono: así las
   dos tarjetas quedan alineadas entre sí. */
.extra__texto { grid-column: 2 / -1; grid-row: 2; }

/* A partir de tableta: icono, texto y precio en una sola línea. */
@media (min-width: 560px) {
  .extra {
    column-gap: var(--s-5);
    padding: var(--s-5) var(--s-6);
  }
  .extra__ico { grid-row: 1 / span 3; }
  .extra__eyebrow { display: block; grid-column: 2; grid-row: 1; }
  .extra__nombre { grid-row: 2; text-align: left; }
  .extra__precio { grid-row: 1 / span 3; align-self: center; font-size: clamp(2.25rem, 4vw, 2.75rem); }
  .extra__texto { grid-column: 2; grid-row: 3; }
}
/* Resplandor verde en la esquina, que crece al pasar por encima. */
.extra::before {
  content: "";
  position: absolute;
  top: -6rem;
  right: -6rem;
  width: 16rem;
  height: 16rem;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(146, 188, 31, 0.22) 0%, transparent 70%);
  transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.4s ease;
  opacity: 0.7;
  pointer-events: none;
}
.extra:hover { border-color: var(--primary-line); transform: translateY(-4px); }
.extra:hover::before { transform: scale(1.35); opacity: 1; }
.extra > * { position: relative; z-index: 1; }

.extra__ico {
  display: grid;
  place-items: center;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: var(--radius-sm);
  border: 1px solid var(--primary-line);
  background: var(--primary-soft);
  color: var(--primary);
  margin-bottom: var(--s-5);
}
.extra__eyebrow {
  font-size: 0.6875rem;
  font-weight: 700;
  color: var(--primary);
  margin-bottom: 0.35rem;
}
.extra__nombre { font-size: 1.0625rem; font-weight: 600; color: var(--fg); }
.extra__precio {
  display: flex;
  align-items: baseline;
  gap: 0.2rem;
  margin-top: var(--s-2);
  font-size: clamp(2.25rem, 4vw, 2.75rem);
  font-weight: 700;
  letter-spacing: -0.05em;
  line-height: 1;
  color: var(--fg);
}
.extra__precio span { font-size: 0.45em; font-weight: 600; color: var(--primary); }
.extra__texto {
  margin-top: 0.35rem;
  font-size: 0.875rem;
  line-height: 1.6;
  color: var(--fg-muted);
  max-width: 46ch;
}

.extras__pie {
  margin-top: var(--s-5);
  font-size: 0.8125rem;
  color: var(--fg-faint);
  text-align: center;
}

/* En móvil, primero los datos de contacto (teléfono, dirección, horario) y el
   formulario al final: quien va con el móvil en la mano suele querer llamar o
   abrir el mapa, no escribir un formulario. */
@media (max-width: 959px) {
  .contacto-grid { display: flex; flex-direction: column; }
  .contacto-grid .contacto-form { order: 2; }
  .contacto-grid .contacto-datos { order: 1; }
}

/* ─────────────── Lo que va incluido en todas las cuotas ────────────────── */

.incluido { display: grid; gap: var(--s-7); align-items: start; }
@media (min-width: 1024px) {
  .incluido { grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); gap: clamp(3rem, 6vw, 6rem); }
  .incluido__intro { position: sticky; top: 7rem; }
}

.incluido__precio { display: flex; align-items: baseline; gap: var(--s-3); flex-wrap: wrap; }
.incluido__cero {
  font-size: clamp(3.5rem, 9vw, 5.5rem);
  font-weight: 700;
  letter-spacing: -0.05em;
  line-height: 1;
  background: linear-gradient(180deg, var(--primary-bright), var(--primary));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  text-shadow: 0 0 60px rgba(146, 188, 31, 0.25);
}
.incluido__cero-texto { font-size: 0.9375rem; color: var(--fg-muted); }

.incluido__lista { display: grid; gap: var(--s-3); }
@media (min-width: 640px) { .incluido__lista { grid-template-columns: repeat(2, 1fr); } }

.incluido__item {
  display: flex;
  gap: var(--s-4);
  align-items: flex-start;
  padding: var(--s-5);
  border-radius: var(--radius);
  border: 1px solid var(--border);
  background: linear-gradient(160deg, rgba(255, 255, 255, 0.04), transparent 70%);
  transition: border-color 0.3s ease, transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), background 0.3s ease;
}
.incluido__item:hover {
  border-color: var(--primary-line);
  transform: translateY(-3px);
  background: linear-gradient(160deg, rgba(146, 188, 31, 0.1), transparent 70%);
}
.incluido__tick {
  flex-shrink: 0;
  width: 1.85rem;
  height: 1.85rem;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--primary);
  color: var(--primary-fg);
  box-shadow: 0 0 0 5px rgba(146, 188, 31, 0.12);
}
.incluido__tick svg { width: 14px; height: 14px; stroke-width: 3; }
.incluido__titulo { font-size: 0.9375rem; font-weight: 600; color: var(--fg); }
.incluido__texto { font-size: 0.8125rem; line-height: 1.65; color: var(--fg-muted); margin-top: 0.25rem; }

/* ─────────────────── 3. Contacto, horario y mapa ───────────────────────── */

.info-list { display: flex; flex-direction: column; gap: var(--s-4); }
.info-item { display: flex; gap: var(--s-4); align-items: flex-start; }
.info-item__text { display: flex; flex-direction: column; gap: 0.15rem; }
.info-item__label {
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--fg-faint);
}
.info-item__value { font-size: 0.9375rem; color: var(--fg-soft); line-height: 1.6; }
.info-item__value a { color: var(--fg); border-bottom: 1px solid var(--primary-line); }
.info-item__value a:hover { color: var(--primary); }

/* Las tarjetas "planas" venían sin fondo y sobre el negro de la web se veían
   transparentes, sin recortarse del todo. Fondo macizo y borde marcado. */
.card--flat {
  background: #0a0a0c;
  border: 1px solid var(--border-strong);
}

.hours { display: flex; flex-direction: column; gap: 0; }
.hours__row {
  display: flex;
  justify-content: space-between;
  gap: var(--s-4);
  padding: 0.7rem 0;
  border-bottom: 1px solid var(--border);
  font-size: 0.9375rem;
}
.hours__row:last-child { border-bottom: 0; }
.hours__day { color: var(--fg); }
.hours__time { color: var(--fg-soft); font-variant-numeric: tabular-nums; }
.hours__row--closed .hours__day,
.hours__row--closed .hours__time { color: var(--fg-faint); }
/* El día de hoy se marca solo, desde el guion. */
.hours__row.is-today .hours__day { color: var(--fg); font-weight: 600; }
.hours__row.is-today .hours__time { color: var(--primary); }

.map {
  border-radius: var(--radius-lg);
  overflow: hidden;
  border: 1px solid var(--border);
  box-shadow: var(--shadow-media);
}
.map iframe { display: block; width: 100%; height: 100%; border: 0; }

/* El mapa acompaña en altura a la columna de al lado: si no, en escritorio
   quedaba un hueco enorme debajo. */
.map--stretch { min-height: 22rem; }
@media (min-width: 960px) {
  .map--stretch { align-self: stretch; height: 100%; }
}

/* ──────────────────────────── 4. Galería ───────────────────────────────── */

.gallery {
  display: grid;
  gap: var(--s-3);
  grid-template-columns: repeat(2, 1fr);
}
@media (min-width: 700px) { .gallery { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1100px) { .gallery { grid-template-columns: repeat(4, 1fr); } }

.gallery .media { cursor: zoom-in; }

/* Galería en carrusel: mismo raíl que los casos, con fotos algo más anchas y
   anclaje al principio para que no se corte la primera. */
.rail--fotos > * {
  flex: 0 0 min(80%, 21rem);
  scroll-snap-align: start;
  cursor: zoom-in;
}
@media (min-width: 768px) { .rail--fotos > * { flex-basis: min(40%, 24rem); } }
@media (min-width: 1180px) { .rail--fotos > * { flex-basis: 26rem; } }
.rail--fotos { padding-block: 0.25rem; }
/* El difuminado de los lados venía muy marcado y parecía que las fotos se
   metían en una sombra negra: se deja apenas insinuado. */
.rail {
  -webkit-mask-image: linear-gradient(90deg, rgba(0, 0, 0, 0.55), #000 1.5%, #000 98.5%, rgba(0, 0, 0, 0.55));
  mask-image: linear-gradient(90deg, rgba(0, 0, 0, 0.55), #000 1.5%, #000 98.5%, rgba(0, 0, 0, 0.55));
}
.rail--fotos:focus-visible { outline: 2px solid var(--primary); outline-offset: 4px; }

/* Visor a pantalla completa. */
.lightbox {
  border: 0;
  padding: 0;
  background: transparent;
  max-width: min(96vw, 1200px);
  max-height: 92vh;
}
.lightbox::backdrop { background: rgba(0, 0, 0, 0.88); backdrop-filter: blur(6px); }
.lightbox img {
  display: block;
  max-width: 100%;
  max-height: 86vh;
  margin-inline: auto;
  border-radius: var(--radius);
  cursor: zoom-out;
}

/* Los vídeos entran por el mismo visor que las fotos. Como son verticales,
   el marco se estrecha para que las flechas queden pegadas al vídeo y no
   perdidas a un palmo de distancia. */
.lightbox video {
  display: block;
  max-width: 100%;
  max-height: 86vh;
  margin-inline: auto;
  border-radius: var(--radius);
  background: #000;
}
/* [hidden] por sí solo no gana a los display:block de arriba. */
.lightbox img[hidden],
.lightbox video[hidden] { display: none; }
.lightbox--video { max-width: min(92vw, 26rem); }

/* El marco sostiene la foto y los controles que van encima de ella. */
.lightbox__marco { position: relative; }

/* Flechas de los lados y aspa de cerrar: mismo botón redondo oscuro. */
.lightbox__nav,
.lightbox__cerrar {
  position: absolute;
  display: grid;
  place-items: center;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.18);
  background: rgba(0, 0, 0, 0.6);
  color: #fff;
  cursor: pointer;
  backdrop-filter: blur(4px);
  transition: background-color 0.25s ease, border-color 0.25s ease, color 0.25s ease, transform 0.25s ease;
}
.lightbox__nav:hover,
.lightbox__cerrar:hover {
  background: var(--primary);
  border-color: var(--primary);
  color: var(--primary-fg);
}
.lightbox__nav { top: 50%; transform: translateY(-50%); }
.lightbox__nav:hover { transform: translateY(-50%) scale(1.06); }
.lightbox__nav--prev { left: 0.75rem; }
.lightbox__nav--prev .ico { transform: rotate(180deg); }
.lightbox__nav--next { right: 0.75rem; }
.lightbox__cerrar { top: 0.75rem; right: 0.75rem; }
.lightbox__nav .ico,
.lightbox__cerrar .ico { width: 1.1rem; height: 1.1rem; }

@media (max-width: 560px) {
  .lightbox__nav { width: 2.4rem; height: 2.4rem; }
  .lightbox__nav--prev { left: 0.25rem; }
  .lightbox__nav--next { right: 0.25rem; }
}

/* ─────────────────────── 5. Calculadora de peso ────────────────────────── */

/* La tarjeta parte en dos: a la izquierda el porqué, a la derecha la
   herramienta. Antes era una columna estrecha centrada y se veía vacía. */
.calc-card { display: grid; gap: var(--s-6); align-items: center; }
@media (min-width: 960px) {
  .calc-card { grid-template-columns: minmax(0, 1fr) minmax(0, 0.85fr); gap: clamp(2.5rem, 5vw, 5rem); }
}

.calc {
  display: flex;
  flex-direction: column;
  gap: var(--s-5);
  padding: var(--s-5);
  border-radius: var(--radius-lg);
  border: 1px solid var(--border);
  background: var(--surface-2);
}

.calc__slider-head { display: flex; justify-content: space-between; align-items: baseline; gap: var(--s-3); }
.calc__altura { font-size: 1.125rem; font-weight: 600; color: var(--primary); font-variant-numeric: tabular-nums; }
.calc__escala { display: flex; justify-content: space-between; font-size: 0.75rem; color: var(--fg-faint); }

.calc__opts { display: flex; gap: var(--s-3); }
.calc__opt { flex: 1; }
.calc__opt input { position: absolute; opacity: 0; pointer-events: none; }
.calc__opt span {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.7rem 1rem;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface-2);
  color: var(--fg-muted);
  font-size: 0.875rem;
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease, background 0.2s ease;
}
.calc__opt input:checked + span {
  border-color: var(--primary-line);
  background: var(--primary-soft);
  color: var(--fg);
}
.calc__opt input:focus-visible + span { outline: 2px solid var(--primary); outline-offset: 2px; }

.calc__slider { display: flex; flex-direction: column; gap: var(--s-3); }
.calc__slider input[type="range"] {
  width: 100%;
  appearance: none;
  height: 4px;
  border-radius: 4px;
  background: linear-gradient(90deg, var(--primary) 0%, var(--border-strong) 0%);
  background: var(--surface-3);
  cursor: pointer;
}
.calc__slider input[type="range"]::-webkit-slider-thumb {
  appearance: none;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--primary);
  border: 3px solid #000;
  box-shadow: var(--shadow-cta);
}
.calc__slider input[type="range"]::-moz-range-thumb {
  width: 20px;
  height: 20px;
  border: 3px solid #000;
  border-radius: 50%;
  background: var(--primary);
}

.calc__out {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: var(--s-6) var(--s-5);
  border-radius: var(--radius);
  border: 1px solid var(--primary-line);
  background: linear-gradient(180deg, rgba(146, 188, 31, 0.14), rgba(146, 188, 31, 0.04));
  text-align: center;
  overflow: hidden;
}
/* Resplandor detrás del número: es lo que hace que el bloque llame. */
.calc__halo {
  position: absolute;
  top: -40%;
  left: 50%;
  width: 22rem;
  height: 22rem;
  transform: translateX(-50%);
  border-radius: 50%;
  background: radial-gradient(circle, rgba(146, 188, 31, 0.35) 0%, transparent 70%);
  filter: blur(40px);
  pointer-events: none;
}
.calc__out > *:not(.calc__halo) { position: relative; z-index: 1; }

.calc__value {
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: 0.35rem;
  font-size: clamp(3rem, 8vw, 4.5rem);
  font-weight: 700;
  letter-spacing: -0.05em;
  line-height: 1;
  color: var(--fg);
  font-variant-numeric: tabular-nums;
  text-shadow: 0 0 40px rgba(146, 188, 31, 0.35);
}
.calc__unidad { font-size: 0.35em; font-weight: 600; color: var(--primary); letter-spacing: 0; }
.calc__range { font-size: 0.875rem; color: var(--fg-soft); }

/* Barra con la franja razonable y tu posición dentro de ella. */
.calc__barra {
  position: relative;
  height: 0.6rem;
  margin-top: var(--s-5);
  border-radius: var(--radius-pill);
  background: rgba(255, 255, 255, 0.09);
}
.calc__banda {
  position: absolute;
  top: 0;
  bottom: 0;
  border-radius: var(--radius-pill);
  background: linear-gradient(90deg, var(--primary), var(--primary-bright));
  transition: left 0.35s cubic-bezier(0.16, 1, 0.3, 1), width 0.35s cubic-bezier(0.16, 1, 0.3, 1);
}
.calc__marca {
  position: absolute;
  top: 50%;
  width: 1.15rem;
  height: 1.15rem;
  margin-left: -0.575rem;
  border-radius: 50%;
  background: #fff;
  border: 3px solid #000;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.35);
  transform: translateY(-50%);
  transition: left 0.35s cubic-bezier(0.16, 1, 0.3, 1);
}
.calc__marca b {
  position: absolute;
  bottom: calc(100% + 0.55rem);
  left: 50%;
  transform: translateX(-50%);
  font-size: 0.75rem;
  font-weight: 700;
  color: var(--fg);
  background: #000;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-pill);
  padding: 0.15rem 0.5rem;
  white-space: nowrap;
}

.calc__veredicto {
  margin-top: var(--s-4);
  font-size: 0.9375rem;
  line-height: 1.6;
  color: var(--fg);
}
.calc__veredicto b { color: var(--primary); }

/* En móvil se apilaban tres cajas con borde y relleno propios (tarjeta,
   formulario y resultado) y el ancho útil se quedaba en nada. La caja del
   formulario desaparece: solo queda la de la tarjeta. */
@media (max-width: 700px) {
  .calc-card.card--pad-lg { padding: var(--s-4); }
  .calc {
    padding: 0;
    border: 0;
    background: transparent;
    gap: var(--s-4);
  }
  .calc__out { padding: var(--s-5) var(--s-4); gap: 0.35rem; }
  /* Hueco para la etiqueta con tu peso, que va encima de la barra y se comía
     la línea del rango. */
  .calc__barra { margin-top: 2.1rem; }
  .calc__veredicto { margin-top: var(--s-3); }
}

/* ───────────────── Tarjetas de zona (con foto) ─────────────────────────── */

.zona { display: flex; flex-direction: column; overflow: hidden; }
.zona__texto { display: flex; flex-direction: column; gap: var(--s-2); padding: var(--s-5); }

/* ─────────────────────────── 5 bis. Equipo ─────────────────────────────── */

/* Retrato a un lado y datos al otro: en horizontal la foto no se recorta por la
   cabeza, que es lo que pasaba con la tarjeta apaisada. */
.person { display: grid; gap: 0; overflow: hidden; }
@media (min-width: 620px) {
  .person {
    grid-template-columns: minmax(0, 0.85fr) minmax(0, 1fr);
    align-items: stretch;
    /* Los retratos son verticales: sin alto suficiente, el recorte se comía
       medio cuerpo. La tarjeta crece y la foto se ve entera. */
    min-height: clamp(24rem, 27vw, 32rem);
  }
}
.person__media {
  position: relative;
  /* Los retratos son verticales: en móvil se enseñan cuadrados. Con el 4/3 de
     antes el recorte lateral dejaba a la persona descentrada. */
  aspect-ratio: 1 / 1;
}
@media (min-width: 620px) {
  .person__media { aspect-ratio: auto; height: 100%; }
}
/* En el recorte cuadrado del móvil sobraba techo: se baja el encuadre para que
   la persona quede centrada y no hundida. */
.person__media { --encuadre: 22%; }
@media (max-width: 619px) {
  .person__media { --encuadre: 38%; }
}
/* Los dos retratos vienen de sesiones distintas y no encuadran igual: a Julià
   lo pillaron de cuerpo entero y con la cabeza casi pegada al borde de arriba;
   a Andrés, de medio cuerpo y con mucho aire por encima. Puestos uno al lado
   del otro, una cara queda mucho más alta que la otra.
   Cada retrato lleva por eso su propio encuadre: cuánto se amplía (--zoom) y
   cuánto se sube (--subir). Van en % del alto de la tarjeta, no en píxeles,
   para que valgan igual en el móvil que en el escritorio. */
.person__media img {
  transform: translateY(var(--subir, 0%)) scale(var(--zoom, 1));
  transform-origin: 50% 0;
}
.person__media--andres { --zoom: 1.28; --subir: -26.1%; }
/* A Julià se le enseña desde el borde mismo de su foto (--encuadre: 0%): es
   todo el aire que tiene por encima de la cabeza. */
/* El -0.5% no es estético: sin él la foto empieza justo en el borde y por
   redondeo se cuela una raya de fondo de un píxel por arriba. */
.person__media--julia { --zoom: 1.25; --subir: -0.5%; --encuadre: 0%; }

.person__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* Los retratos están hechos de medio cuerpo: encuadrando arriba no se corta
     la cara al recortar. */
  object-position: 50% var(--encuadre, 22%);
}
.person__body {
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
  padding: var(--s-6);
  justify-content: center;
}
.person__role { font-size: 0.8125rem; color: var(--primary); font-weight: 600; }

/* ───────────────────── 5 ter. Comunidad y eventos ──────────────────────── */

/* El fondo de la web (rejilla + manchas verdes) se apagaba del todo en los
   laterales y dejaba dos franjas negras muy anchas a los lados de cada página.
   Ahora el apagado empieza casi en el borde y no llega a negro. */
body::before {
  -webkit-mask-image: linear-gradient(90deg, rgba(0, 0, 0, 0.5), #000 2%, #000 98%, rgba(0, 0, 0, 0.5));
  mask-image: linear-gradient(90deg, rgba(0, 0, 0, 0.5), #000 2%, #000 98%, rgba(0, 0, 0, 0.5));
}

/* La columna del hero no puede crecer con la frase que rota: si la palabra que
   entra es más larga, la columna se ensanchaba y los botones se estiraban con
   ella. Se fija el ancho y el titular parte línea si hace falta. */
.hero__grid > * { min-width: 0; }
@media (max-width: 959px) {
  .hero__grid { grid-template-columns: minmax(0, 1fr); }
}
.hero .txt-display { overflow-wrap: break-word; }
.rota, .rota__palabra { max-width: 100%; }

/* Al pasar el hero a dos columnas, la frase más larga necesita una escala
   propia para no quedar recortada antes de llegar al escritorio ancho. */
@media (min-width: 960px) and (max-width: 1439px) {
  .hero .txt-display { font-size: clamp(3.2rem, 5vw, 4.5rem); }
}

/* En móvil la insignia "Sin permanencia" caía encima del precio: pasa a ir
   centrada arriba del todo, dentro del flujo de la tarjeta. */
@media (max-width: 640px) {
  .price-badge {
    position: static;
    align-self: center;
    margin-bottom: var(--s-3);
  }
}

/* La entrada al hacer scroll, más corta en móvil: con el recorrido de
   escritorio se nota demasiado en una pantalla pequeña. */
@media (max-width: 700px) {
  .js .reveal {
    transform: translateY(14px);
    filter: blur(3px);
    transition-duration: 0.6s;
  }
  .js .reveal--left { transform: translateX(-18px); }
  .js .reveal--right { transform: translateX(18px); }
  .js .reveal--scale { transform: scale(0.97); }
  .js .reveal--soft { transform: translateY(8px); }
  .reveal-d1 { transition-delay: 0.06s; }
  .reveal-d2 { transition-delay: 0.12s; }
  .reveal-d3 { transition-delay: 0.18s; }
  .reveal-d4 { transition-delay: 0.24s; }
  .reveal-d5 { transition-delay: 0.3s; }
}

/* ── Móviles de la app dentro de un bloque de dos columnas ──
   En la landing de El Reto ocupan una columna ancha. En los avances de Inicio y
   de Tarifas la columna es más estrecha y el tercer móvil se salía: se encogen
   y se recorta el sobresaliente lateral. */
.grid-split--media .showcase { max-width: 100%; }
/* Solo en escritorio se recorta lo que sobresale: en móvil el bloque es un
   carrusel que se arrastra con el dedo, y taparlo lo dejaba muerto. */
@media (min-width: 900px) {
  .grid-split--media .showcase { overflow: hidden; gap: 0.4rem; }
  .grid-split--media .showcase__item .phone { width: 12.5rem; border-width: 6px; border-radius: 2.1rem; }
  .grid-split--media .showcase__item .phone__screen { border-radius: 1.7rem; font-size: 8.6px; padding: 2rem 0.65rem 0.65rem; }
  .grid-split--media .showcase__item .phone::before { width: 3.4rem; height: 0.9rem; }
  .grid-split--media .showcase__caption { font-size: 0.75rem; margin-top: var(--s-2); }
  .grid-split--media .showcase__item--left { transform: rotateY(16deg) translateZ(-60px) translateX(1.6rem) scale(0.94); }
  .grid-split--media .showcase__item--right { transform: rotateY(-16deg) translateZ(-60px) translateX(-1.6rem) scale(0.94); }
}

/* ── Comunidad: frases cortas, una debajo de otra ──
   Cada línea se lee sola, sin párrafos que haya que atravesar. */
.frases {
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
  max-width: 46rem;
  margin: 0 auto;
  padding: 0;
  list-style: none;
  text-align: center;
}
.frases li {
  font-size: clamp(1.125rem, 2.2vw, 1.5rem);
  font-weight: 500;
  line-height: 1.35;
  letter-spacing: -0.02em;
  color: var(--fg);
}
.frases li:last-child { color: var(--primary); }

.frases__pie {
  max-width: 46rem;
  margin: var(--s-5) auto 0;
  font-size: 0.9375rem;
  line-height: 1.7;
  color: var(--fg-muted);
  text-align: center;
}

/* Las fotos van al final, y en su sitio: tres, en fila, del mismo tamaño. */
.tira {
  display: grid;
  gap: var(--s-3);
  margin-top: var(--s-7, 3rem);
}
@media (min-width: 760px) { .tira { grid-template-columns: repeat(3, 1fr); } }
.tira .media { cursor: zoom-in; }
@media (hover: hover) {
  .tira:hover .media { opacity: 0.6; transition: opacity 0.35s ease; }
  .tira .media:hover { opacity: 1; }
}

/* Tira de vídeos. Los reels de Instagram son verticales, así que la tarjeta
   es 9:16 y hay menos por fila que con fotos.
   Cada tarjeta carga un bucle mudo de pocos segundos, muy comprimido, y solo
   cuando entra en pantalla. El vídeo entero con sonido no se descarga hasta
   que alguien lo pulsa: la página abre igual de rápido que con fotos. */
.tira--video { margin: var(--s-7, 3rem) auto 0; gap: var(--s-3); }
.tira.tira--video--uno { grid-template-columns: 1fr; max-width: 20rem; }
/* En el móvil, dos vídeos verticales uno al lado del otro salen a menos de
   200 px de ancho y no se ve una cara. Van uno debajo de otro hasta que hay
   sitio de sobra. */
.tira.tira--video--dos { grid-template-columns: 1fr; max-width: 20rem; }
@media (min-width: 600px) {
  .tira.tira--video--dos { grid-template-columns: repeat(2, minmax(0, 1fr)); max-width: 42rem; }
}

.tira .vid { cursor: pointer; }
.tira .vid > video { background: #000; }
.tira .vid:focus-visible { outline: 2px solid var(--primary); outline-offset: 4px; }

/* Distintivo de play. Va en la esquina y no en el centro: el bucle ya se está
   moviendo, así que no hace falta un botón enorme tapando la escena; basta con
   avisar de que detrás hay un vídeo entero y con sonido. */
.vid__play {
  position: absolute;
  right: var(--s-3);
  bottom: var(--s-3);
  z-index: 2;
  pointer-events: none;
}
.vid__play > span {
  display: grid;
  place-items: center;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 999px;
  background: rgba(0, 0, 0, 0.42);
  border: 1px solid rgba(255, 255, 255, 0.55);
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1), background 0.35s ease;
}
.vid__play svg {
  width: 16px;
  height: 16px;
  margin-left: 2px;
  color: #fff;
  fill: currentColor;
  stroke: none;
}
@media (hover: hover) {
  .tira .vid:hover .vid__play > span { transform: scale(1.12); background: var(--primary); border-color: transparent; }
}

/* El pie deja hueco a la derecha para que nunca se meta debajo del play. */
.vid__pie {
  position: absolute;
  left: var(--s-3);
  right: calc(var(--s-3) + 3.25rem);
  bottom: calc(var(--s-3) + 0.5rem);
  z-index: 2;
  font-size: 0.8125rem;
  line-height: 1.35;
  color: #fff;
  text-shadow: 0 1px 12px rgba(0, 0, 0, 0.75);
  pointer-events: none;
}

/* ──────────────────────── 6. Testimonios ───────────────────────────────── */

.stars { display: inline-flex; gap: 0.15rem; color: var(--primary); }
.stars svg { width: 15px; height: 15px; fill: currentColor; stroke: none; }

.tcard { display: flex; flex-direction: column; gap: var(--s-4); height: 100%; }
.tcard__text { font-size: 0.9375rem; line-height: 1.75; color: var(--fg-soft); }
.tcard__foot { display: flex; align-items: center; gap: var(--s-3); margin-top: auto; }
.tcard__avatar {
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 50%;
  object-fit: cover;
  border: 1px solid var(--border-strong);
  flex-shrink: 0;
}
.tcard__name { font-size: 0.9375rem; font-weight: 600; color: var(--fg); }
.tcard__role { font-size: 0.75rem; color: var(--fg-faint); }

/* Rejilla en mampostería: los testimonios no miden todos lo mismo. */
.tgrid { display: grid; gap: var(--s-4); }
@media (min-width: 760px) { .tgrid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1100px) { .tgrid { grid-template-columns: repeat(3, 1fr); } }

/* ─────────────────── 7. Texto largo (páginas legales) ──────────────────── */

.prose { display: flex; flex-direction: column; gap: var(--s-5); }
.prose h2 {
  font-size: clamp(1.25rem, 2.6vw, 1.6rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  color: var(--fg);
  margin-top: var(--s-4);
}
.prose h3 { font-size: 1.0625rem; font-weight: 600; color: var(--fg); }
.prose p, .prose li { font-size: 0.9375rem; line-height: 1.8; color: var(--fg-muted); }
.prose ul { display: flex; flex-direction: column; gap: var(--s-2); padding-left: 1.1rem; list-style: disc; }
.prose a { color: var(--primary); border-bottom: 1px solid var(--primary-line); }
.prose table { width: 100%; border-collapse: collapse; font-size: 0.875rem; }
.prose th, .prose td {
  text-align: left;
  padding: 0.7rem 0.75rem;
  border-bottom: 1px solid var(--border);
  color: var(--fg-muted);
}
.prose th { color: var(--fg-soft); font-weight: 600; }
.prose__scroll { overflow-x: auto; }

/* ─────────────────────── 7 bis. Movimiento ─────────────────────────────── */

/* Botón principal: un brillo cruza la píldora al pasar por encima. */
.btn--primary { position: relative; overflow: hidden; }
.btn--primary::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: -60%;
  width: 45%;
  background: linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.45), transparent);
  transform: skewX(-18deg);
  opacity: 0;
  pointer-events: none;
}
.btn--primary:hover::after { opacity: 1; animation: ef-brillo 0.75s ease-out; }
@keyframes ef-brillo { to { left: 115%; } }

/* Tarjetas: se levantan y el icono responde. */
.card--hover { transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.35s ease, box-shadow 0.35s ease; }
.card--hover:hover .icon-badge { transform: translateY(-2px) scale(1.06); }
.icon-badge { transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1), background 0.3s ease; }

/* Chips: pequeño empuje al pasar por encima. */
.chip { transition: transform 0.25s ease, border-color 0.25s ease, color 0.25s ease; }
.chip:hover { transform: translateY(-2px); border-color: var(--primary-line); color: var(--fg); }

/* Enlaces del menú: subrayado que crece desde la izquierda. */
.nav__links a { position: relative; }
.nav__links a::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -0.35rem;
  height: 2px;
  border-radius: 2px;
  background: var(--primary);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}
.nav__links a:hover::before { transform: scaleX(1); }

/* Filas del horario y de contacto: se iluminan al pasar. */
.hours__row { transition: background 0.25s ease, padding-left 0.25s ease; }
.hours__row:hover { background: rgba(255, 255, 255, 0.04); }
.info-item { transition: transform 0.25s ease; }
.info-item:hover { transform: translateX(3px); }

/* Fotos de la galería: al pasar, el resto se apaga un poco. */
@media (hover: hover) {
  .gallery:hover .media,
  .rail--fotos:hover .media { opacity: 0.55; transition: opacity 0.35s ease; }
  .gallery .media:hover,
  .rail--fotos .media:hover { opacity: 1; }
}

/* La flecha del botón se va al pulsar el enlace de sección. */
.btn:active { transform: translateY(1px) scale(0.99); }

/* Respeta a quien pide menos movimiento. */
@media (prefers-reduced-motion: reduce) {
  .ef-chat-btn::after,
  .ef-msg,
  .ef-msg--wait { animation: none !important; }
  .btn--primary:hover::after { animation: none; opacity: 0; }
}

/* ─────────────────── 7 ter. Bandas de sección ──────────────────────────── */

/* Una sección con fondo propio para que no todo sea el mismo negro. */
.section--dark {
  background: #050506;
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}

/* ──────────────────────────── 8. Asistente ─────────────────────────────── */

.ef-chat-btn {
  position: fixed;
  right: clamp(1rem, 3vw, 1.75rem);
  bottom: clamp(1rem, 3vw, 1.75rem);
  z-index: 62;
  width: 4rem;
  height: 4rem;
  border: 0;
  border-radius: 50%;
  background: linear-gradient(150deg, var(--primary-bright), var(--primary));
  color: var(--primary-fg);
  box-shadow: var(--shadow-cta);
  cursor: pointer;
  display: grid;
  place-items: center;
  transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);
}
.ef-chat-btn:hover { transform: translateY(-3px) scale(1.06); }

/* Dentro de la burbuja conviven el icono de la marca y el aspa de cerrar:
   se cruzan girando según esté abierto o cerrado. */
.ef-chat-btn__chat,
.ef-chat-btn__x {
  grid-area: 1 / 1;
  width: 26px;
  height: 26px;
  transition: opacity 0.28s ease, transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
}
.ef-chat-btn__x {
  opacity: 0;
  transform: rotate(-90deg) scale(0.6);
}
.ef-chat-btn.is-open .ef-chat-btn__chat { opacity: 0; transform: rotate(90deg) scale(0.6); }
.ef-chat-btn.is-open .ef-chat-btn__x { opacity: 1; transform: none; }
/* Con el chat abierto, el anillo deja de latir: ya te ha llamado. */
.ef-chat-btn.is-open::after { animation: none; opacity: 0; }

/* Anillo que late: sin él, el botón pasa desapercibido. */
.ef-chat-btn::after {
  content: "";
  position: absolute;
  inset: -6px;
  border-radius: 50%;
  border: 2px solid var(--primary);
  opacity: 0;
  animation: ef-latido 2.8s ease-out infinite;
  pointer-events: none;
}
@keyframes ef-latido {
  0% { transform: scale(0.9); opacity: 0.55; }
  70% { transform: scale(1.25); opacity: 0; }
  100% { opacity: 0; }
}

.ef-chat {
  position: fixed;
  right: clamp(1rem, 3vw, 1.75rem);
  bottom: calc(clamp(1rem, 3vw, 1.75rem) + 4.75rem);
  z-index: 61;
  width: min(27rem, calc(100vw - 2rem));
  height: min(42rem, calc(100vh - 9rem));
  display: flex;
  flex-direction: column;
  border: 1px solid rgba(255, 255, 255, 0.16);
  border-radius: var(--radius-lg);
  /* Más claro que el fondo de la web: antes era casi negro sobre negro y
     parecía un agujero. */
  background: linear-gradient(180deg, #1b1b20 0%, #121215 100%);
  backdrop-filter: blur(18px);
  box-shadow: 0 32px 80px -24px rgba(0, 0, 0, 0.95), 0 0 0 1px rgba(146, 188, 31, 0.12);
  overflow: hidden;
  opacity: 0;
  transform: translateY(16px) scale(0.96);
  transform-origin: bottom right;
  transition: opacity 0.26s cubic-bezier(0.16, 1, 0.3, 1), transform 0.26s cubic-bezier(0.16, 1, 0.3, 1);
}
.ef-chat.is-open { opacity: 1; transform: none; }

.ef-chat__head {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: var(--s-4) var(--s-5);
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  background: linear-gradient(180deg, rgba(146, 188, 31, 0.16), rgba(146, 188, 31, 0.02));
}
/* El logotipo completo, como en la cabecera de la web. */
.ef-chat__logo {
  height: 2.4rem;
  width: auto;
  object-fit: contain;
  flex-shrink: 0;
}
.ef-chat__name { font-size: 0.9375rem; font-weight: 600; color: var(--fg); }
.ef-chat__state { font-size: 0.8125rem; color: var(--fg-muted); display: flex; align-items: center; gap: 0.35rem; }
.ef-chat__state .dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--primary);
  box-shadow: 0 0 0 3px rgba(146, 188, 31, 0.18);
}
.ef-chat__close {
  margin-left: auto;
  border: 0;
  background: transparent;
  color: var(--fg-faint);
  cursor: pointer;
  padding: 0.25rem;
}
.ef-chat__close:hover { color: var(--fg); }
.ef-chat__close svg { width: 20px; height: 20px; }

.ef-chat__body {
  flex: 1;
  overflow-y: auto;
  padding: var(--s-4);
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
}
.ef-msg {
  max-width: 88%;
  padding: 0.75rem 1rem;
  border-radius: var(--radius-sm);
  font-size: 0.9375rem;
  line-height: 1.65;
  white-space: normal;
  /* Cada mensaje entra desde abajo: da sensación de conversación viva. */
  animation: ef-msg-entra 0.28s cubic-bezier(0.16, 1, 0.3, 1) both;
}
@keyframes ef-msg-entra {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: none; }
}
.ef-msg--bot {
  align-self: flex-start;
  background: rgba(255, 255, 255, 0.09);
  color: #fff;
  border-bottom-left-radius: 0.3rem;
}
.ef-msg--yo {
  align-self: flex-end;
  background: var(--primary);
  color: var(--primary-fg);
  border-bottom-right-radius: 0.3rem;
}
/* Puntos suspensivos que parpadean mientras la respuesta viene de camino. */
.ef-msg--wait { color: var(--fg-muted); letter-spacing: 0.25em; animation: ef-msg-entra 0.28s both, ef-esperando 1.2s ease-in-out 0.3s infinite; }
@keyframes ef-esperando { 0%, 100% { opacity: 0.4; } 50% { opacity: 1; } }
.ef-msg a { color: var(--primary); text-decoration: underline; }
.ef-msg--yo a { color: var(--primary-fg); }

.ef-chat__quick {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2);
  padding: 0 var(--s-4) var(--s-3);
}
.ef-chat__quick button {
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--fg-muted);
  font-size: 0.75rem;
  padding: 0.35rem 0.75rem;
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease;
}
.ef-chat__quick button:hover { border-color: var(--primary-line); color: var(--fg); }

.ef-chat__form {
  display: flex;
  align-items: flex-end;
  gap: var(--s-2);
  padding: var(--s-3) var(--s-4) var(--s-4);
  border-top: 1px solid var(--border);
}
/* Caja de escritura de varias líneas: crece con el texto y a partir de cinco
   líneas se queda quieta con barra propia. */
.ef-chat__form .field {
  flex: 1;
  padding: 0.6rem 0.85rem;
  font-size: 0.875rem;
  line-height: 1.5;
  min-height: 2.6rem;
  max-height: 8.25rem;
  resize: none;
  overflow-y: auto;
  font-family: inherit;
}
.ef-chat__send {
  width: 2.6rem;
  height: 2.6rem;
  border: 0;
  border-radius: var(--radius-sm);
  background: var(--primary);
  color: var(--primary-fg);
  cursor: pointer;
  display: grid;
  place-items: center;
  flex-shrink: 0;
}
.ef-chat__send svg { width: 17px; height: 17px; }

/* En móvil ocupa la pantalla entera menos el hueco de abajo, donde se queda la
   burbuja para poder cerrarlo. */
@media (max-width: 700px) {
  .ef-chat {
    top: 0;
    right: 0;
    left: 0;
    bottom: 5.5rem;
    width: auto;
    height: auto;
    max-height: none;
    border-radius: 0 0 var(--radius-lg) var(--radius-lg);
    border-left: 0;
    border-right: 0;
    border-top: 0;
    transform-origin: bottom center;
  }
  .ef-chat__body { padding: var(--s-5); }
  .ef-msg { max-width: 90%; font-size: 1rem; }
}
