/* ═══ Tokens del sistema ══════════════════════════════════════════════ */
:root {
  /* Ángulo del paralelogramo. Hasta ahora solo existía como valor de reserva
     repetido en cada var(--adn-slant, -12deg); declararlo aquí no cambia nada
     visualmente, pero convierte esas copias en un único sitio donde tocarlo. */
  --adn-slant: -12deg;
    /* Ritmo vertical de sección. Fluidos: interpolan solos entre móvil y
     escritorio, así el espaciado no necesita @media. Progresión ×1,5. */
  --adn-sec-sm: clamp(40px, 5vw, 64px);     /* interno y secciones ligeras */
  --adn-sec:    clamp(56px, 7vw, 100px);    /* estándar de sección */
  --adn-sec-lg: clamp(72px, 9.5vw, 150px);  /* separaciones mayores */
  /* Contenedor de contenido de página. El margen es el ritmo del hero
     (cabecera-pagina); el ancho lo deriva de él con tope de 1400px, así
     hero, cuerpo y relacionadas comparten borde en toda resolución. El
     100% se resuelve donde se usa: el elemento debe colgar de una sección
     SIN padding lateral. Las barras (topbar/nav/footer) van aparte. */
  --adn-margen: clamp(20px, 8vw, 130px);
  --adn-ancho: min(1400px, 100% - 2 * var(--adn-margen));
}

/* ═══ Botón del sistema (paralelogramo + acento) ═════════════════════ */
.adn-boton {
  position: relative;
  isolation: isolate;
  display: inline-flex;
  align-items: center;
  height: 62px;
  padding: 0 42px;
  color: var(--color-sobre-grad, var(--color-sobre-acento));
  /* Contorno oscuro por detrás del relleno. El color va en un token: es oscuro
     fijo porque `--color-sobre-acento` es BLANCO en tres de las cuatro marcas.
     Mejora la lectura sobre la rampa, no el dato medido. */
  paint-order: stroke fill;
  -webkit-text-stroke: var(--trazo-sobre-grad);
  text-decoration: none;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: 22px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
  transition: transform 0.15s;
}
/* El fondo va en ::before inclinado, no en clip-path: así el borde se dibuja
   entero si algún día hace falta una variante fantasma. */
.adn-boton::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  transform: skewX(var(--adn-slant, -12deg));
  /* Rampa de marca (azul de ADN → acento de la web). El color plano queda
     debajo como respaldo. Definida en el Layout como --grad-marca. */
  background-image: var(--grad-marca);
  background-color: var(--color-accent);
  transition: background 0.15s, box-shadow 0.2s;
}
.adn-boton:hover::before { background-image: var(--grad-marca-hover); background-color: var(--color-accent-hover, var(--color-accent)); }
/* Micro-elevación del CTA. La sombra va en el ::before (inclinado), no en el
   botón, para que siga el paralelogramo y no salga un rectángulo torcido. */
@media (hover: hover) and (pointer: fine) {
  .adn-boton:hover { transform: translateY(-2px); }
  .adn-boton:hover::before { box-shadow: 0 6px 16px rgba(13, 15, 17, 0.22); }
}

/* ═══ Cabecera de sección: antetítulo + título + texto, centrada ══════
   Hereda el color del contenedor (currentColor), así sirve igual sobre
   fondo oscuro (Estructura) que claro (App Peaks, Empezar). */
.adn-cabecera { max-width: 1053px; margin: 0 auto; text-align: center; }
.adn-cabecera__ante {
  margin: 0;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(18px, 1.9vw, 24px);
  letter-spacing: 0.03em;
  text-transform: uppercase;
}
.adn-cabecera__titulo {
  margin: 4px 0 0;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(28px, 3.4vw, 44px);
  letter-spacing: 0.03em;
  text-transform: uppercase;
  text-wrap: balance;
}
.adn-cabecera__texto {
  margin: 24px auto 0;
  font-style: italic;
  font-size: clamp(17px, 1.5vw, 20px);
  line-height: 28px;
}
/* Resalte en color de marca, para destacar parte de un título */
.adn-acento { color: var(--color-accent-texto); }

/* …salvo cuando el fondo es OSCURO. `--color-accent-texto` está oscurecido para
   cumplir AA sobre BLANCO, así que contra el negro de marca se queda corto: en
   triatleta da 4,17:1 y solo pasa porque estos textos son grandes (umbral 3:1).
   Ahí va el ACLARADO, que es para lo que existe `--color-accent-ante`:
   triatleta 13,79:1 · ciclista 8,16 · running 7,43 · paraguas 7,09.
   Va en reglas CONCRETAS y NO reasignando el token en el contenedor: una banda
   oscura contiene tarjetas blancas y sus hijos heredarían el aclarado igual.
   Ojo con `.adn-cabecera__titulo`: aparece en los dos fondos (21 claros y 8
   oscuros en paraguas), así que hay que calificarlo por la sección que pinta
   el fondo, nunca a secas. El hero lleva su propia regla en `Hero.astro`. */
/* …sobre FOTO (cabeceras con imagen, captación) va el mismo token que el hero:
   está calibrado marca a marca midiendo sobre las fotos reales, porque una foto
   tiene zonas claras que una superficie plana no tiene. */
/* El claim de las cabeceras con foto usa el MISMO token que el hero de la home
   (sep-2026, a petición de Ricard): son el mismo trabajo —acento sobre foto— y
   tenerlos en tokens distintos hacía que el color cambiara al pasar de la home a
   /entrenamiento en ciclismo y running. Solo lo llevan esas tres páginas
   (/entrenamiento, /nutricion y /app): son las únicas con `__claim`.
   La captación se queda con el aclarado: su fondo es otro. */
.cabecera-pagina__claim .adn-acento {
  color: var(--color-accent-hero);
}
.adn-captacion__titulo .adn-acento {
  color: var(--color-accent-ante);
}
/* …y sobre superficie PLANA oscura, el aclarado — que en ciclista, running y
   triatleta ES el propio acento de marca, porque ahí el crudo ya cumple
   (5,42:1 · 5,05 · 13,79). Solo paraguas necesita aclararlo: su cian crudo se
   queda en 3,85:1. */
.adn-banda:not(.adn-banda--claro) .adn-cabecera__titulo .adn-acento {
  color: var(--color-accent);
}

/* --color-accent-texto: el acento OSCURECIDO hasta cumplir AA como TEXTO sobre
   fondo claro. Hace falta porque el acento crudo solo llega en paraguas: sobre
   blanco da 3,54:1 en ciclista, 3,80 en running y 1,39 en triatleta. En
   paraguas vale lo mismo que el acento, así que esta web no cambia de aspecto.

   Se probó reasignarlo por contenedor (.adn-banda, .cabecera-pagina…) para que
   dentro de una sección oscura volviera al acento aclarado. NO funciona, y la
   medición lo dijo enseguida: `.adn-banda` también casa con `.adn-banda--claro`,
   y una banda oscura contiene tarjetas BLANCAS (.plan) cuyos hijos heredaban el
   token igual — 12 textos a 2,50:1 y 2,71:1 que antes pasaban. La herencia de
   variables no distingue "sobre la banda" de "sobre una tarjeta dentro de la
   banda". Si algún día hace falta el acento aclarado, va en la regla concreta
   (var(--color-accent-ante)), no en un contenedor. */


/* ═══ Iconos (Lucide · /iconos/) ══════════════════════════════════════
   Se pintan con MÁSCARA, no como <img>: los SVG de Lucide traen
   stroke="currentColor" y, cargados como imagen externa, saldrían negros.
   Con máscara el color lo pone `background`, así el mismo archivo sirve
   en blanco sobre acento o en acento sobre blanco. */
.adn-icono {
  display: inline-block;
  width: 24px;
  height: 24px;
  background: currentColor;
  -webkit-mask: var(--adn-icono) center / contain no-repeat;
  mask: var(--adn-icono) center / contain no-repeat;
}
.adn-icono--footprints  { --adn-icono: url(/iconos/footprints.svg); }
.adn-icono--carrot      { --adn-icono: url(/iconos/carrot.svg); }
.adn-icono--dispositivos{ --adn-icono: url(/iconos/monitor-smartphone.svg); }
.adn-icono--calendario  { --adn-icono: url(/iconos/calendar-clock.svg); }
.adn-icono--aviso       { --adn-icono: url(/iconos/bell-dot.svg); }
.adn-icono--grafica     { --adn-icono: url(/iconos/chart-no-axes-combined.svg); }
.adn-icono--perfil      { --adn-icono: url(/iconos/sliders-horizontal.svg); }
.adn-icono--sync        { --adn-icono: url(/iconos/cloud-sync.svg); }
.adn-icono--portatil    { --adn-icono: url(/iconos/laptop-minimal.svg); }
.adn-icono--chat        { --adn-icono: url(/iconos/message-circle-more.svg); }

/* Círculo de acento con el icono dentro */
.adn-icono-circulo {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--color-accent);
  color: var(--color-sobre-acento);              /* lo hereda el icono vía currentColor */
}

/* ═══ Cabecera de página (foto + título + miga) ══════════════════════════
   Patrón de las páginas internas (Precio, Quiénes somos, App…). Vive en el CSS
   de la página en su primer uso; al reutilizarse en la 2ª página se sube al
   global (regla de los tres niveles). */
.cabecera-pagina {
  position: relative;
  min-height: 236px;
  display: flex;
  align-items: flex-end;
  padding: var(--adn-sec-sm) 0;
  overflow: hidden;
  background: #0d0f11;
}
.cabecera-pagina__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}
/* Velo para que el texto blanco se lea sobre cualquier foto. */
.cabecera-pagina::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, rgba(13, 15, 17, 0.85) 0%, rgba(13, 15, 17, 0.35) 60%, rgba(13, 15, 17, 0.15) 100%);
  z-index: 1;
}
.cabecera-pagina__inner {
  position: relative;
  z-index: 2;
  width: var(--adn-ancho);
  margin-inline: auto;
}
.cabecera-pagina__titulo {
  margin: 0;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(40px, 6vw, 50px);
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #fff;
}
.cabecera-pagina__ruta {
  margin: 4px 0 0;
  font-family: var(--font-titulos);
  font-style: italic;
  font-size: 16px;
  color: #cdcdcd;
}
.cabecera-pagina__ruta a {
  color: #cdcdcd;
  text-decoration: none;
}
.cabecera-pagina__ruta a:hover {
  color: #fff;
}
/* Acento aclarado: el crudo sobre el velo oscuro se queda en 3,85:1 en paraguas.
   Va el TOKEN y no el valor: escrito a mano era el cian de paraguas, y las tres
   temáticas heredaban azul en su miga de pan. */
.cabecera-pagina__ruta span {
  color: var(--color-accent-ante);
}

/* ── Cabecera fina (barra de título compacta, sin foto: tienda, legales…) ──
   Textura: degradado carbón diagonal + destello del acento en la zona derecha
   (vacía). Sin velo ::after porque no hay foto que proteger. */
.cabecera-pagina--fina {
  min-height: 0;
  align-items: center;
  padding: clamp(8px, 1.1vw, 14px) 0;
  background-color: #0d0f11;
  background-image:
    radial-gradient(135% 210% at 82% 60%, color-mix(in srgb, var(--color-accent) 55%, transparent) 0%, transparent 78%),
    linear-gradient(118deg, #0d0f11 0%, #1b2932 100%);
}
.cabecera-pagina--fina::after { display: none; }
.cabecera-pagina--fina .cabecera-pagina__titulo {
  font-size: clamp(22px, 2.6vw, 30px);
}

/* ═══ Cuerpo de las entradas del blog ═════════════════════════════════
   Biblioteca de clases para el campo `contenido` de las fichas. La
   plantilla /blog/[slug] pone cabecera y relacionadas; el cuerpo se
   monta con estas piezas. Las pestañas ([data-tabs]) las activa el JS
   genérico de la plantilla; sin JS, los paneles se muestran apilados. */

/* Rejilla de dos columnas: tarjetas técnicas | prosa */
.adn-ficha {
  display: grid;
  grid-template-columns: minmax(280px, 370px) 1fr;
  gap: 24px;
  align-items: start;
  width: var(--adn-ancho);
  margin: 0 auto;
  text-align: left;
}
.adn-ficha__lado,
.adn-ficha__cuerpo {
  display: grid;
  gap: 24px;
  align-content: start;
}
@media (max-width: 900px) {
  .adn-ficha { grid-template-columns: 1fr; }
  /* Apilada, la columna lateral deja de ser apoyo y pasa a ser la apertura:
     hay que bajar 1.192px antes de llegar al texto que explica el entreno.
     De esas tres tarjetas, la ultima es la ALTERNATIVA (rodillo, 563px) — un
     plan B que se leia antes que la explicacion del entreno principal. Se manda
     al final.
     `display: contents` disuelve la columna para que sus tarjetas sean items de
     la reticula de .adn-ficha y `order` pueda con ellas; no se pierde nada,
     porque .adn-ficha__lado solo aportaba `gap: 24px`, el mismo que el padre.
     El guardia `:nth-child(n+3)` evita mover la unica tarjeta de una ficha
     sencilla: solo actua si la columna tiene tres o mas. */
  .adn-ficha__lado {
    display: contents;
  }
  .adn-ficha__cuerpo {
    order: 0;
  }
  .adn-ficha__lado > :last-child:nth-child(n + 3) {
    order: 1;
  }
  /* El grafico de intensidad por delante de los pasos: de un vistazo dice de
     que va la sesion (bloques, intensidades, duracion) antes de pedir que se
     lea una lista. En escritorio no hace falta, porque los dos se ven a la vez.
     El selector solo casa con el SEGUNDO de exactamente TRES hijos
     (`:nth-child(2):nth-last-child(2)`): asi solo actua sobre la composicion
     canonica [sesion, grafico, alternativa] y no toca fichas con otra forma. */
  .adn-ficha__lado > :nth-child(2):nth-last-child(2) {
    order: -1;
  }
}

/* Tarjeta base */
.adn-carta {
  background: #fff;
  border: 1px solid #e7e7e7;
  /* Sin redondeos: el lenguaje de la marca es el corte, no la curva. */
  border-radius: 0;
  padding: 20px 22px;
  text-align: left;
}
.adn-carta__titulo {
  margin: 0 0 12px;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: 19px;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: var(--color-accent-texto);
}
.adn-carta p + .adn-carta__titulo,
.adn-carta .adn-lista + .adn-carta__titulo,
.adn-carta .adn-tabla + .adn-carta__titulo,
.adn-carta .adn-beneficios + .adn-carta__titulo,
.adn-carta .adn-callout + .adn-carta__titulo {
  /* Aire de sección: ~3× el margen inferior del título (12px). Con 26px
     el bloque anterior se pegaba al título y las secciones no respiraban. */
  margin-top: 38px;
}
.adn-carta p {
  margin: 0 0 0.9em;
  font-size: 15px;
  font-style: italic;
  line-height: 1.65;
  color: #3a3d40;
}
.adn-carta p:last-child { margin-bottom: 0; }
.adn-carta img {
  display: block;
  max-width: 100%;
  margin: 0 auto;
}

/* Tarjeta con pestañas (la activa el JS de la plantilla) */
.adn-tabs { padding: 0; overflow: hidden; }
.adn-tabs__barra {
  display: flex;
  border-bottom: 1px solid #e7e7e7;
}
/* Mismo gesto que las pestañas de disciplina del blog (.blog-tab): raya de
   acento abajo y cambio de color de texto. Antes la activa era un rectángulo
   blanco con un paralelogramo de acento flotando dentro (inset 6px 10px), y eso
   rompía dos reglas del sistema: aquí el sesgo NO era el borde de la pieza sino
   un relleno metido dentro de otra forma —en badges, chips y botones el
   paralelogramo ES el elemento—, y dejaba las dos pestañas sin parecido: una
   con diagonal y fondo blanco, la otra un rectángulo gris.
   De paso arregla un problema de contraste: el texto activo usaba
   --color-accent-fg (blanco) sobre el acento, que en triatlón es amarillo.
   Ahora es oscuro sobre claro en las cuatro marcas. */
.adn-tabs__tab {
  flex: 1;
  padding: 12px 8px;
  border: none;
  /* La raya no debe mover el texto al aparecer: reservada en transparente. */
  border-bottom: 3px solid transparent;
  margin-bottom: -1px;
  background: none;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: 15px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: #56565a;
  cursor: pointer;
  transition: color 0.15s, border-color 0.15s;
}
@media (hover: hover) and (pointer: fine) {
  .adn-tabs__tab:not(.is-activa):hover {
    color: #0d0f11;
    border-bottom-color: #cdcdcd;
  }
}
.adn-tabs__tab.is-activa {
  color: #0d0f11;
  border-bottom-color: var(--color-accent);
}
.adn-tabs__panel { padding: 18px 20px; }
.adn-tabs__panel + .adn-tabs__panel { border-top: 1px solid #e7e7e7; }
/* Con JS solo se ve el panel activo (y sobran los bordes de apilado) */
.adn-tabs--js .adn-tabs__panel:not(.is-activo) { display: none; }
.adn-tabs--js .adn-tabs__panel + .adn-tabs__panel { border-top: none; }

/* Línea de metadatos: "Cantidad para: … / (sesión de 2:00h)" */
.adn-meta {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  margin: 0 0 10px;
  font-size: 14px;
  font-style: italic;
  color: #6f7170;
}
.adn-meta strong {
  font-weight: 700;
  color: var(--color-accent-texto);
}

/* Fase de una sesión: CALENTAMIENTO / BLOQUE PRINCIPAL / FINAL DE SESIÓN */
.adn-fase {
  margin: 16px 0 2px;
  font-family: var(--font-titulos);
  font-weight: 700;
  font-size: 12.5px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #0d0f11;
}
.adn-meta + .adn-fase { margin-top: 6px; }

/* Lista con viñeta-paralelogramo y filetes */
.adn-lista {
  list-style: none;
  margin: 0;
  padding: 0;
}
.adn-lista li {
  position: relative;
  padding: 9px 0 9px 18px;
  border-bottom: 1px solid #ececec;
  font-size: 14.5px;
  font-style: italic;
  line-height: 1.45;
  color: #3a3d40;
}
.adn-lista li:last-child { border-bottom: none; }
.adn-lista li::before {
  content: '';
  position: absolute;
  left: 2px;
  top: 15px;
  width: 7px;
  height: 7px;
  background: var(--color-accent);
  clip-path: polygon(25% 0, 100% 0, 75% 100%, 0 100%);
}

/* Tabla (nutricional, leyendas…) */
.adn-tabla {
  width: 100%;
  border-collapse: collapse;
  font-size: 14px;
  font-style: italic;
}
/* La rampa va en la FILA, no en las celdas: con el fondo en cada `th` cada
   columna recibiría su propia rampa completa y habría un corte seco de vuelta
   al azul en cada linde de columna. La segunda mitad del selector cubre las
   tablas escritas sin `<thead>`, y necesita el `:has(th)`: `tr:first-child` a
   secas es "primer hijo de SU PADRE", así que también casa con la primera fila
   del `<tbody>` y le pintaba la rampa a la fila de datos. */
.adn-tabla thead tr,
.adn-tabla tr:first-child:has(th) {
  background: var(--color-accent);
  background-image: var(--grad-marca);
}
.adn-tabla th {
  padding: 10px 12px;
  background: transparent;
  font-family: var(--font-titulos);
  font-style: italic;
  font-weight: 700;
  font-size: 12.5px;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  text-align: left;
  /* Blanco + contorno: `--color-sobre-acento` es oscuro en triatlón, correcto
     sobre el amarillo PLANO, y aquí el fondo ya no es plano — la columna
     derecha cae en el tramo amarillo, donde el blanco solo da ~1,4:1. */
  color: var(--color-sobre-grad);
  paint-order: stroke fill;
  -webkit-text-stroke: var(--trazo-sobre-grad);
}
.adn-tabla td {
  padding: 9px 12px;
  border-bottom: 1px solid #ececec;
  color: #3a3d40;
}
.adn-tabla tr:last-child td { border-bottom: none; }

/* Aviso/consejo con filo de acento */
.adn-callout {
  position: relative;
  margin: 14px 0;
  padding: 12px 16px 12px 24px;
  background: #f2f4f5;
  border-left: none;
  font-size: 14.5px;
  font-style: italic;
  line-height: 1.55;
  color: #3a3d40;
}
.adn-callout::before {
  content: '';
  position: absolute;
  left: 8px;
  top: 9px;
  bottom: 9px;
  width: 4px;
  background: var(--color-accent);
  /* Recta a propósito (mobile-first): inclinada, en callouts altos de
     móvil se convertía en una diagonal larga y rara. */
}

/* Checklist de beneficios (icono circle-check) */
.adn-beneficios {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 24px;
}
.adn-beneficios li {
  position: relative;
  padding-left: 30px;
  font-size: 14.5px;
  font-style: italic;
  line-height: 1.45;
  color: #3a3d40;
}
.adn-beneficios li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  width: 20px;
  height: 20px;
  background: var(--color-accent);
  -webkit-mask: url(/iconos/circle-check.svg) center / contain no-repeat;
  mask: url(/iconos/circle-check.svg) center / contain no-repeat;
}
@media (max-width: 640px) {
  .adn-beneficios { grid-template-columns: 1fr; }
}

/* Valoración con estrellas: <span class="adn-estrellas__tira"><span style="--v:3.5"></span></span> */
.adn-estrellas {
  margin: 0 0 20px;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 6px 16px;
  align-items: center;
}
.adn-estrellas dt {
  font-family: var(--font-titulos);
  font-style: italic;
  font-weight: 600;
  font-size: 13px;
  color: #0d0f11;
}
.adn-estrellas dd { margin: 0; }
.adn-estrellas__tira {
  position: relative;
  display: inline-block;
  font-size: 17px;
  line-height: 1;
  letter-spacing: 2px;
  color: #d4d8da;
}
.adn-estrellas__tira::before { content: '★★★★★'; }
.adn-estrellas__tira > span {
  position: absolute;
  inset: 0;
  overflow: hidden;
  width: calc(var(--v, 0) / 5 * 100%);
  white-space: nowrap;
  color: var(--color-accent-texto);
}
.adn-estrellas__tira > span::before { content: '★★★★★'; }

/* Fila de descargas (Garmin / Zwift / Bkool / Rouvy) */
.adn-descargas {
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid #ececec;
}
.adn-descargas__titulo {
  margin: 0 0 10px;
  font-family: var(--font-titulos);
  font-style: italic;
  font-weight: 700;
  font-size: 12.5px;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: #0d0f11;
}
.adn-descargas__grid {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.adn-descargas__grid a {
  position: relative;
  isolation: isolate;
  padding: 7px 16px;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: 13px;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-accent-texto);
  text-decoration: none;
  transition: color 0.15s;
}
/* El borde va en ::before inclinado: mini-versión outline del adn-boton */
.adn-descargas__grid a::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  border: 2px solid var(--color-accent);
  transform: skewX(var(--adn-slant));
  transition: background 0.15s;
}
/* Hover: relleno en la rampa de marca. El borde va con ella (`border-image`
   vale porque el paralelogramo no tiene `border-radius`); con el borde plano
   quedaba un filo de acento rodeando el degradado. Texto en blanco + contorno:
   `--color-sobre-acento` es oscuro en triatlon y ahí el fondo ya no es plano. */
.adn-descargas__grid a:hover {
  color: var(--color-sobre-grad);
  paint-order: stroke fill;
  -webkit-text-stroke: var(--trazo-sobre-grad);
}
.adn-descargas__grid a:hover::before {
  background: var(--grad-marca);
  border-image: var(--grad-marca) 1;
}

/* Prosa de artículo (una columna) */
.adn-prosa {
  width: min(780px, var(--adn-ancho));
  margin: 0 auto;
  text-align: left;
}
.adn-prosa p {
  margin: 0 0 1em;
  font-size: 16px;
  line-height: 1.7;
  color: #3a3d40;
}
.adn-prosa h2 {
  margin: 1.6em 0 0.5em;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: 24px;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #0d0f11;
}
.adn-prosa h2:first-child { margin-top: 0; }
.adn-prosa h1 {
  margin: 0 0 0.5em;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(30px, 5vw, 42px);
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #0d0f11;
}
.adn-prosa h3 {
  margin: 1.3em 0 0.4em;
  font-family: var(--font-titulos);
  font-weight: 600;
  font-size: 18px;
  color: #0d0f11;
}
.adn-prosa ul { margin: 0 0 1em; padding-left: 1.3em; }
.adn-prosa li { margin: 0 0 0.4em; font-size: 16px; line-height: 1.7; color: #3a3d40; }
.adn-prosa strong { color: #0d0f11; }
.adn-prosa a {
  color: var(--color-accent-texto);
  text-decoration: underline;
}
.adn-prosa .adn-prosa__nota {
  font-size: 14px;
  font-style: italic;
  color: #6f7170;
}

/* ═══ Testimonios (cita + autor) ══════════════════════════════════════
   Rejilla de tarjetas. Reutilizable (ficha de libro, blog, landing).
   Markup: <div class="adn-testimonios"><blockquote class="adn-testimonio">
   <p class="adn-testimonio__cita">…</p><footer class="adn-testimonio__autor">
   <img class="adn-testimonio__foto" src="…"><span>
   <strong class="adn-testimonio__nombre">…</strong>
   <span class="adn-testimonio__rol">…</span></span></footer></blockquote>…</div> */
.adn-testimonios {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 20px;
  margin: 0;
  padding: 0;
}
.adn-testimonio {
  display: flex;
  flex-direction: column;
  gap: 16px;
  margin: 0;
  padding: 22px 24px;
  background: #fff;
  border: 1px solid #e7e7e7;
}
.adn-testimonio__cita {
  position: relative;
  margin: 0;
  padding-left: 18px;
  font-style: italic;
  font-size: 15px;
  line-height: 1.6;
  color: #3a3d40;
}
/* Filo de acento a la izquierda (mismo lenguaje que el callout). */
.adn-testimonio__cita::before {
  content: '';
  position: absolute;
  left: 0;
  top: 2px;
  bottom: 2px;
  width: 4px;
  background: var(--color-accent);
  /* Vertical: el filete mide 4x116, así que la rampa tiene que seguir su eje
     largo o no se ve. */
  background-image: var(--grad-marca-vert);
}
.adn-testimonio__autor {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: auto;
}
.adn-testimonio__foto {
  flex: none;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  object-fit: cover;
}
.adn-testimonio__nombre {
  display: block;
  font-family: var(--font-titulos);
  font-style: italic;
  font-weight: 700;
  font-size: 15px;
  color: #0d0f11;
}
.adn-testimonio__rol {
  display: block;
  font-style: italic;
  font-size: 13px;
  color: #6f7170;
}

@media (max-width: 640px) {
  .adn-boton { height: 52px; padding: 0 24px; font-size: 18px; }
}

/* ── Layout de sección (ritmo claro-oscuro) ─────────────────────────────── */
.adn-seccion     { padding: var(--adn-sec) 0; }
.adn-seccion--sm { padding: var(--adn-sec-sm) 0; }
.adn-contenedor       { width: var(--adn-ancho); margin-inline: auto; }
.adn-contenedor--medio{ width: min(920px, var(--adn-ancho)); margin-inline: auto; }

/* Separación estándar cabecera de sección → su contenido (cuando son hermanos
   directos). Evita repetir márgenes a mano en cada página. */
.adn-cabecera + .adn-cifras,
.adn-cabecera + .adn-pasos,
.adn-cabecera + .adn-galeria,
.adn-cabecera + .adn-grid-3,
.adn-cabecera + .adn-duo,
.adn-cabecera + .adn-testimonios,
.adn-cabecera + .adn-beneficios { margin-top: var(--adn-sec-sm); }

/* Banda oscura: el recurso de contraste de la home (como .estructura). El filo
   de acento superior marca el corte entre la sección clara y la oscura. */
.adn-banda {
  padding: var(--adn-sec) 0;
  background: #0d0f11;
  color: #fff;
  border-top: 6px solid var(--color-accent);
  /* `border-image` es la única forma de meter un degradado en un borde. Aquí no
     hay `border-radius` que perder, así que no hay efecto colateral. */
  border-image: var(--grad-marca) 1;
}
.adn-banda--claro {
  background: #f6f6f5;
  color: #0d0f11;
  border-top-color: var(--color-accent);
}

/* ── Hero de página (variante grande de cabecera-pagina) ────────────────── */
.cabecera-pagina--hero {
  min-height: clamp(440px, 64vh, 620px);
  align-items: flex-end;
  padding-block: var(--adn-sec);
}
/* Velo reforzado: oscurece izquierda Y base, para que el claim se lea sobre
   cualquier foto aunque ocupe hasta 760px de ancho.
   El punto medio de la componente horizontal es 0,55 al 62% y NO es un número
   redondeado a ojo: el claim mide hasta 760px, o sea que a 1440 llega al 61%
   del ancho, mientras que la rampa anterior (0,45 ya al 55%) se había abierto
   antes de que el texto terminara. Medido en /nutricion: el 16,8% del titular
   caía por debajo de 4,5:1, y los píxeles que fallaban estaban TODOS en el
   final de la primera línea, entre el 46% y el 53% del ancho — justo donde la
   rampa se había soltado. La componente vertical no podía arreglarlo: se
   desvanece al 46% del alto, que queda por debajo del titular. */
.cabecera-pagina--hero::after {
  background:
    linear-gradient(90deg, rgba(13,15,17,0.88) 0%, rgba(13,15,17,0.55) 62%, rgba(13,15,17,0.22) 100%),
    linear-gradient(0deg, rgba(13,15,17,0.72) 0%, rgba(13,15,17,0) 46%);
}
.cabecera-pagina__claim {
  margin: 0;
  max-width: 760px;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(34px, 5.5vw, 48px);
  line-height: 1.3;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #fff;
}
.cabecera-pagina__sub {
  margin: 18px 0 0;
  max-width: 560px;
  font-style: italic;
  font-size: clamp(17px, 2vw, 21px);
  line-height: 1.5;
  color: #e7e7e7;
}
.cabecera-pagina__cta { margin-top: 28px; }

/* ── Cifras / métricas de prueba (tira de números grandes) ──────────────── */
.adn-cifras {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: clamp(24px, 4vw, 52px);
  width: var(--adn-ancho);
  margin-inline: auto;
  text-align: center;
}
.adn-cifra__num {
  margin: 0;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(40px, 5.5vw, 66px);
  line-height: 1;
  /* Las cifras van SIEMPRE sobre banda oscura, así que el acento crudo: sobre
     el negro de marca da 5,42:1 en ciclista, 5,05 en running y 13,79 en
     triatleta. El oscurecido (`--color-accent-texto`) está calculado contra
     BLANCO y aquí se quedaba en 4,17:1 — y en triatleta se veía oro donde
     tenía que verse amarillo. */
  color: var(--color-accent);
}
.adn-cifra__label {
  margin: 10px 0 0;
  font-style: italic;
  font-size: clamp(14px, 1.5vw, 17px);
  line-height: 1.35;
  color: inherit;
  opacity: 0.72;                 /* se adapta a fondo claro u oscuro */
}

/* ── Pasos numerados (generaliza estructura/unidad) ─────────────────────── */
.adn-pasos {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(28px, 4vw, 56px);
  width: var(--adn-ancho);
  margin-inline: auto;
}
.adn-paso {
  position: relative;
  padding-top: 18px;
  text-align: left;
}
.adn-paso::before {                /* filo de acento superior */
  content: '';
  position: absolute;
  top: 0; left: 0;
  width: 42px; height: 4px;
  background: var(--color-accent);
}
.adn-paso__num {
  margin: 0;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(42px, 5vw, 60px);
  line-height: 1;
  color: var(--color-accent-texto);
}
.adn-paso__titulo {
  margin: 6px 0 0;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(22px, 2.4vw, 30px);
  letter-spacing: 0.02em;
  text-transform: uppercase;
}
.adn-paso__texto {
  margin: 12px 0 0;
  font-style: italic;
  font-size: 16px;
  line-height: 1.55;
  opacity: 0.82;
}
@media (max-width: 900px) { .adn-pasos { grid-template-columns: 1fr; gap: 36px; } }

/* ── Bloque alternado foto/texto (generaliza peaks__bloque) ─────────────── */
.adn-duo {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(40px, 7vw, 96px);
  align-items: center;
  width: var(--adn-ancho);
  margin-inline: auto;
}
.adn-duo + .adn-duo { margin-top: var(--adn-sec); }
/* Alternancia por ORDEN del DOM (no `order`, que rompe el foco por teclado):
   foto-derecha = __contenido primero; foto-izquierda = __media primero. */
.adn-duo__media img { width: 100%; height: auto; display: block; }
@media (max-width: 900px) { .adn-duo { grid-template-columns: 1fr; gap: 40px; } }

/* Feature en fila: icono cuadrado + título + descripción (generaliza .feature).
   Sirve sobre fondo claro y oscuro (el filete usa gris translúcido). */
.adn-feature-lista { list-style: none; margin: 0; padding: 0; }
.adn-feature {
  display: flex;
  align-items: flex-start;
  gap: 16px;
  padding: 20px 0;
  border-bottom: 1px solid rgba(128, 128, 128, 0.28);
}
.adn-feature:last-child { border-bottom: none; }
.adn-feature__icono {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px; height: 34px;
  border-radius: 5px;
  background: var(--color-accent);
  /* La misma pieza que `.feature__icono` de la home, con otro nombre: si se
     cambia una, cambiar la otra. 135°, el ángulo del logo. */
  background-image: var(--grad-marca-diag);
  color: var(--color-sobre-grad, var(--color-sobre-acento));
}
.adn-feature__titulo {
  margin: 0;
  font-family: var(--font-titulares);
  font-style: italic;
  /* Suelo 22 (era 20) a petición de Ricard, sep-2026: en móvil el título se
     quedaba corto frente a su texto. El tope de escritorio sigue en 26; la
     home mantiene su propio clamp con tope 28. */
  font-size: clamp(22px, 2.2vw, 26px);
  letter-spacing: 0.02em;
  text-transform: uppercase;
}
.adn-feature__desc {
  margin: 6px 0 0;
  font-style: italic;
  font-size: 16px;
  line-height: 1.5;
  opacity: 0.85;
}

/* ── Grid de 3 (planes, tarjetas) y galería de 4 (entregables) ──────────── */
.adn-grid-3 {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(20px, 3vw, 32px);
  width: var(--adn-ancho);
  margin-inline: auto;
}
@media (max-width: 900px) { .adn-grid-3 { grid-template-columns: 1fr; } }

.adn-galeria {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 20px;
  width: var(--adn-ancho);
  margin-inline: auto;
}
/* La carta de galería: la foto manda, el pie es una etiqueta corta. */
.adn-galeria .adn-carta { padding: 0; overflow: hidden; }
/* Alto uniforme: recorta a 4:3 para que las tarjetas queden parejas aunque las
   capturas vengan con proporciones distintas (usa imágenes apaisadas). */
.adn-galeria .adn-carta img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; }
.adn-galeria .adn-carta__pie {
  display: block;
  margin: 0;
  padding: 12px 16px;
  font-family: var(--font-titulos);
  font-style: italic;
  font-weight: 700;
  font-size: 13px;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: #0d0f11;
}
@media (max-width: 900px) { .adn-galeria { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .adn-galeria { grid-template-columns: 1fr; } }

/* Cabeceras centradas dentro de bandas/secciones: limitar al contenedor para
   que no toquen el borde en anchos medios (mismo criterio que la home). */
.adn-banda .adn-cabecera,
.adn-seccion .adn-cabecera { width: min(1053px, var(--adn-ancho)); }

/* Las tarjetas se alinean arriba (no se estiran a la más alta). */
.adn-grid-3 { align-items: start; }

/* Filo de acento que separa la recomendada del resto sobre la banda oscura. */
.adn-carta--destacada { border: 2px solid var(--color-accent); }

/* Etiqueta "La más elegida" (paralelogramo del sistema, arriba de la tarjeta). */
.adn-carta__badge {
  display: inline-block;
  margin-bottom: 14px;
  padding: 4px 15px;
  background: var(--color-accent);
  color: var(--color-sobre-acento);
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: 12px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  clip-path: polygon(6px 0, 100% 0, calc(100% - 6px) 100%, 0 100%);
}

/* Pilares grandes (18px), para la lista marcada con adn-beneficios--grande. */
.adn-beneficios--grande { gap: 16px 32px; }
.adn-beneficios--grande li { padding-left: 36px; font-size: clamp(16px, 1.5vw, 18px); line-height: 1.5; }
.adn-beneficios--grande li::before { width: 24px; height: 24px; top: 1px; }

/* Método: sube el texto de los pasos de 16px a 18px (override de la regla del kit). */
.adn-paso__texto { font-size: clamp(16px, 1.5vw, 18px); }

/* ── Bloque de captación: foto + pitch (izq) + tarjeta de formulario (der) ──
   Generalizado desde el hero de /entrena. Cierre de conversión a 2 columnas
   sobre foto con velo; colapsa a 1 en móvil. La tarjeta del form es blanca
   (el form no es agnóstico al fondo, así que va en tarjeta clara). */
.adn-captacion {
  position: relative;
  overflow: hidden;
  background: #0d0f11;
  padding: var(--adn-sec) 24px;
}
.adn-captacion__foto {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}
/* Velo: oscuro a la izquierda (texto blanco), se abre a la derecha (la tarjeta
   del form ya es opaca). */
.adn-captacion::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, rgba(13, 15, 17, 0.92) 0%, rgba(13, 15, 17, 0.78) 45%, rgba(13, 15, 17, 0.55) 100%);
  z-index: 1;
}
.adn-captacion__inner {
  position: relative;
  z-index: 2;
  display: grid;
  grid-template-columns: 1fr minmax(0, 470px);
  gap: clamp(32px, 5vw, 72px);
  align-items: center;
  max-width: 1180px;
  margin: 0 auto;
}
.adn-captacion__ante {
  margin: 0;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: 16px;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  /* El TOKEN, no el valor: escrito a mano era el cian de paraguas y las tres
     temáticas mostraban «Prueba 15 días gratis» en azul. Va sobre la foto
     oscurecida de la captación, que es el contexto de `--color-accent-ante`. */
  color: var(--color-accent-ante);
}
.adn-captacion__titulo {
  margin: 6px 0 0;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(38px, 5.5vw, 64px);
  line-height: 1.02;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  color: #fff;
}
.adn-captacion__lead {
  margin: 36px 0 0;
  max-width: 520px;
  font-style: italic;
  font-size: clamp(17px, 2vw, 20px);
  line-height: 1.5;
  color: #e7e7e7;
}
.adn-captacion__ventajas {
  list-style: none;
  margin: 26px 0 0;
  padding: 0;
}
.adn-captacion__ventajas li {
  position: relative;
  padding: 0 0 0 32px;
  font-size: 16px;
  line-height: 22px;
  color: #fff;
}
.adn-captacion__ventajas li + li {
  margin-top: 12px;
}
.adn-captacion__ventajas li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 1px;
  width: 20px;
  height: 20px;
  background: var(--color-accent);
  -webkit-mask: url(/iconos/circle-check.svg) center / contain no-repeat;
  mask: url(/iconos/circle-check.svg) center / contain no-repeat;
}
.adn-captacion__sellos {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 28px;
}
.adn-captacion__sello {
  padding: 6px 14px;
  border: 1px solid rgba(255, 255, 255, 0.5);
  border-radius: 20px;
  font-family: var(--font-titulos);
  font-style: italic;
  font-weight: 700;
  font-size: 12px;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: #fff;
}
.adn-captacion__form {
  padding: clamp(24px, 3vw, 36px);
  background: #fff;
  border-radius: 14px;
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.35);
}
.adn-captacion__form-titulo {
  margin: 0 0 20px;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: 26px;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #0d0f11;
}
.adn-captacion__legal {
  margin: 18px 0 0;
  font-size: 12px;
  line-height: 1.6;
  color: #6f7170;
  text-align: center;
}
.adn-captacion__legal a {
  color: #6f7170;
  text-decoration: underline;
}
@media (max-width: 900px) {
  .adn-captacion__inner { grid-template-columns: 1fr; }
}
.adn-duo .adn-beneficios { grid-template-columns: 1fr; }
.adn-duo .adn-beneficios { grid-template-columns: 1fr; }
.adn-duo__media--corte { filter: drop-shadow(0 18px 40px rgba(13, 15, 17, 0.22)); }
.adn-duo__media--corte img { clip-path: polygon(0 0, 100% 0, 100% calc(100% - 26px), 0 100%); }
.adn-duo__media--corte-inv { filter: drop-shadow(0 18px 40px rgba(13, 15, 17, 0.22)); }
.adn-duo__media--corte-inv img { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - 26px)); }


/* Testimonios en una landing: constreñir al contenedor (por defecto se estiran
   al ancho del padre; en las fichas el padre ya los limita, aquí la seccion es
   full-bleed). */
.adn-banda .adn-testimonios,
.adn-seccion .adn-testimonios {
  width: var(--adn-ancho);
  margin-inline: auto;
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
@media (max-width: 900px) {
  .adn-banda .adn-testimonios,
  .adn-seccion .adn-testimonios { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
  .adn-banda .adn-testimonios,
  .adn-seccion .adn-testimonios { grid-template-columns: 1fr; }
}

/* ═══ Flujo ilustrado — timeline "Tu semana con ADN" ══════════════════════
   Eje vertical: nodos numerados (círculos de acento) conectados por una línea,
   y en cada fila una miniatura mediana + texto. Reutilizable (Entrenamiento,
   Nutrición…): se escribe en el HTML con estas clases. Un paso puede llevar
   media doble (`adn-flujo__media--dual`) para insinuar dualidad. */
.adn-flujo {
  position: relative;
  width: min(900px, var(--adn-ancho));
  margin: var(--adn-sec-sm) auto 0;
  display: flex;
  flex-direction: column;
  gap: clamp(26px, 3.5vw, 40px);
}
.adn-flujo__paso {
  position: relative;
  display: grid;
  grid-template-columns: 44px minmax(0, 320px) 1fr;
  grid-template-areas: 'nodo media cuerpo';
  gap: clamp(16px, 2.4vw, 32px);
  align-items: start;
}
/* El eje: cada paso (menos el último) prolonga la línea hasta el nodo siguiente,
   por detrás; el círculo sólido del nodo la tapa a su altura. */
.adn-flujo__paso:not(:last-of-type)::before {
  content: '';
  position: absolute;
  left: 21px;
  top: 22px;
  bottom: calc(-1 * clamp(26px, 3.5vw, 40px));
  width: 2px;
  /* La rampa recorre el eje de arriba abajo: el proceso avanza de ADN a tu
     disciplina. Se conserva el aclarado al 32% en LOS DOS extremos para no
     cambiar el peso de la línea, que es un apoyo, no un protagonista. */
  background: linear-gradient(
    180deg,
    color-mix(in srgb, var(--color-adn) 32%, #e3e4e5) 0%,
    color-mix(in srgb, var(--color-accent) 32%, #e3e4e5) 100%
  );
  z-index: -1;
}
.adn-flujo__nodo {
  grid-area: nodo;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--color-accent);
  /* PRUEBA: rampa en el círculo. A 44px el recorrido es corto y se lee como un
     matiz, no como dos colores; además el número va encima, así que su contraste
     cambia de un lado a otro del círculo. */
  background-image: var(--grad-marca-diag);
  color: var(--color-sobre-grad, var(--color-sobre-acento));
  /* Contorno oscuro por detrás del relleno. El color va en un token: es oscuro
     fijo porque `--color-sobre-acento` es BLANCO en tres de las cuatro marcas.
     Mejora la lectura sobre la rampa, no el dato medido. */
  paint-order: stroke fill;
  -webkit-text-stroke: var(--trazo-sobre-grad);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: 20px;
  line-height: 1;
}
.adn-flujo__media {
  grid-area: media;
  min-width: 0;
}
.adn-flujo__media img {
  width: 100%;
  height: auto;
  display: block;
  border-radius: 4px;
  /* drop-shadow (no box-shadow): sigue el canal alfa, así los mockups
     transparentes flotan recortados en vez de verse en tarjeta blanca; las
     fotos opacas mantienen su sombra igual. */
  filter: drop-shadow(0 10px 18px rgba(13, 15, 17, 0.18));
}
.adn-flujo__media--dual {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  align-items: start;
}
.adn-flujo__cuerpo {
  grid-area: cuerpo;
  padding-top: 4px;
}
.adn-flujo__titulo {
  margin: 0;
  font-family: var(--font-titulares);
  font-style: italic;
  font-size: clamp(19px, 2vw, 24px);
  line-height: 1.05;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #0d0f11;
}
.adn-flujo__texto {
  margin: 14px 0 0;
  font-size: 16.5px;
  line-height: 1.65;
  color: #3a3d40;
  max-width: 46ch;
}
.adn-flujo__texto strong {
  color: #0d0f11;
}
.adn-flujo__texto + .adn-flujo__texto {
  margin-top: 10px;
}
/* Cierre en bucle: alineado bajo el eje, cerrando el ciclo. */
.adn-flujo__paso--cierre {
  grid-template-columns: 44px 1fr;
  grid-template-areas: 'nodo cuerpo';
  align-items: end;
}
/* El eje sólido entra también en el nodo de cierre (bottom-aligned), cerrando
   el recorrido 05 → bucle antes del retorno discontinuo. */
.adn-flujo__paso--cierre::before {
  content: '';
  position: absolute;
  left: 21px;
  top: 0;
  bottom: 22px;
  width: 2px;
  /* La rampa recorre el eje de arriba abajo: el proceso avanza de ADN a tu
     disciplina. Se conserva el aclarado al 32% en LOS DOS extremos para no
     cambiar el peso de la línea, que es un apoyo, no un protagonista. */
  background: linear-gradient(
    180deg,
    color-mix(in srgb, var(--color-adn) 32%, #e3e4e5) 0%,
    color-mix(in srgb, var(--color-accent) 32%, #e3e4e5) 100%
  );
  z-index: -1;
}
.adn-flujo__nodo--bucle {
  font-size: 22px;
}
.adn-flujo__paso--cierre .adn-flujo__titulo {
  color: var(--color-accent-texto);
}
/* El texto del cierre va en una sola línea (no se topa con el max-width de 46ch
   del cuerpo normal); en móvil ajusta solo dentro de la columna. */
.adn-flujo__paso--cierre .adn-flujo__texto {
  max-width: none;
}
/* Flecha de retorno al paso 1 (solo escritorio): bracket discontinuo por la
   izquierda del eje, del nodo de cierre (abajo) al nodo 01 (arriba). */
.adn-flujo__retorno {
  display: none;
}
@media (min-width: 701px) {
  .adn-flujo__retorno {
    display: block;
    position: absolute;
    left: -34px;
    top: 22px;
    bottom: 12px;
    width: 26px;
    border: 2px dashed var(--color-accent);
    border-right: 0;
    border-radius: 13px 0 0 13px;
    pointer-events: none;
  }
  .adn-flujo__retorno::after {
    content: '';
    position: absolute;
    top: -6px;
    right: -6px;
    border: 6px solid transparent;
    border-left-color: var(--color-accent);
  }
}
.adn-flujo__bucle {
  width: min(900px, var(--adn-ancho));
  margin: clamp(22px, 3vw, 36px) auto 0;
  padding-left: 60px;
  font-family: var(--font-titulares);
  font-style: italic;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  font-size: clamp(15px, 1.6vw, 18px);
  color: var(--color-accent-texto);
}
@media (max-width: 700px) {
  .adn-flujo__paso {
    grid-template-columns: 40px 1fr;
    grid-template-areas:
      'nodo media'
      'nodo cuerpo';
    column-gap: 14px;
    row-gap: 12px;
  }
  .adn-flujo__paso:not(:last-of-type)::before {
    left: 19px;
  }
  .adn-flujo__paso--cierre::before {
    left: 19px;
  }
  .adn-flujo__nodo {
    width: 40px;
    height: 40px;
    font-size: 18px;
  }
  .adn-flujo__bucle {
    padding-left: 54px;
  }
  /* La media doble se apila para verse grande. */
  .adn-flujo__media--dual {
    grid-template-columns: 1fr;
  }
}


/* ── FAQ / acordeón (adn-faq) ──────────────────────────────────────────────
   <details>/<summary> nativo (grupo exclusivo por name="faq"), sin JS.
   Estilo ADN: preguntas en Anton, item abierto "encendido" (tinte + filete de
   acento) y marcador en chip paralelogramo. Themeable (var(--color-accent)). */
.adn-faq {
  width: min(820px, var(--adn-ancho));
  margin-inline: auto;
}
.adn-faq__item {
  border-bottom: 1px solid #e3e4e5;
  transition: background 0.2s ease, box-shadow 0.2s ease;
}
.adn-faq__item > summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  padding: clamp(16px, 2.1vw, 22px) clamp(14px, 1.8vw, 20px);
  /* Montserrat y no Anton (sep-2026). Una pregunta es un «título dentro de
     página», que es el papel de --font-titulos según el sistema tipográfico.
     Aquí importaba más que en otros sitios: con el acordeón cerrado —como llega
     el visitante— las 18 piezas visibles de la página eran TODAS Anton, porque
     el único Roboto está dentro de los desplegables. Sin nada con lo que
     contrastar, la página entera se leía como un titular.
     Los tres grupos y el H1 siguen en Anton: son pocos, cortos y en versales,
     que es donde esa letra funciona. */
  font-family: var(--font-titulos);
  font-style: normal;
  font-weight: 600;
  font-size: clamp(16px, 1.9vw, 20px);
  line-height: 1.35;
  letter-spacing: 0;
  color: #0d0f11;
  transition: color 0.15s ease, background 0.2s ease;
}
.adn-faq__item > summary::-webkit-details-marker { display: none; }
/* Marcador: chip paralelogramo de acento con el signo en blanco (+ -> x). */
.adn-faq__item > summary::after {
  content: '+';
  flex: none;
  display: grid;
  place-items: center;
  width: 36px;
  height: 34px;
  background: var(--color-accent);
  background-image: var(--grad-marca);
  /* El glifo va en blanco con contorno: en 36px la rampa se resuelve casi en
     su color medio, y en triatlón ese verde-amarillo deja el blanco por debajo
     de 3:1. El trazo es lo que lo sostiene. */
  color: var(--color-sobre-grad);
  paint-order: stroke fill;
  -webkit-text-stroke: var(--trazo-sobre-grad);
  font-family: var(--font-texto);
  font-style: normal;
  font-weight: 400;
  font-size: 24px;
  line-height: 1;
  clip-path: polygon(14% 0, 100% 0, 86% 100%, 0 100%);
  transition: background 0.2s ease;
}
.adn-faq__item[open] > summary::after { content: '\00d7'; }
.adn-faq__item > summary:focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: 3px;
  border-radius: 2px;
}
/* Item abierto: se "enciende" con tinte de acento + filete a la izquierda. */
.adn-faq__item[open] {
  background: color-mix(in srgb, var(--color-accent) 6%, #fff);
  box-shadow: inset 3px 0 0 0 var(--color-accent);
}
.adn-faq__item[open] > summary { color: var(--color-accent-texto); }
.adn-faq__respuesta {
  padding: 0 clamp(14px, 1.8vw, 20px) clamp(16px, 2.1vw, 22px);
  color: #3a3d40;
}
.adn-faq__respuesta p { margin: 0; font-size: 16.5px; line-height: 1.65; }
.adn-faq__respuesta p + p { margin-top: 12px; }
.adn-faq__respuesta a { color: var(--color-accent-texto); text-decoration: underline; text-underline-offset: 2px; }
/* Hover (solo puntero fino): el item cerrado insinúa con un tinte muy leve. */
@media (hover: hover) and (pointer: fine) {
  .adn-faq__item:not([open]) > summary:hover {
    color: var(--color-accent-texto);
    background: color-mix(in srgb, var(--color-accent) 4%, #fff);
  }
}

/* ── Hero de página a pantalla completa en móvil ──────────────────────────────
   Mismo criterio que el carrusel de la home: se descuenta el chrome (franja de
   acento + barra, que van encima y en flujo) y el hero se queda con el resto.
   `dvh` y no `vh`: en iOS el 100vh incluye la barra de URL y cortaría el hero.
   Las variables son globales desde ago-2026; el respaldo cubre por si faltaran.
   El texto ya iba anclado abajo (align-items: flex-end), así que no se toca.     */
@media (max-width: 640px) {
  .cabecera-pagina--hero {
    min-height: calc(100vh - var(--navbar-h, 56px) - var(--topbar-h, 10px));
    min-height: calc(100dvh - var(--navbar-h, 56px) - var(--topbar-h, 10px));
  }
}
/* El <picture> del recorte móvil no debe crear caja: sin esto el <img>, que va
   absoluto a inset:0, se posicionaría respecto a un elemento inline. */
.cabecera-pagina--hero picture {
  display: contents;
}
/* ── Apilado: la imagen siempre primero ──────────────────────────────────────
   Los adn-duo alternan por orden del DOM (contenido/media) para dar zigzag en
   dos columnas. Apilados, esa alternancia deja unos bloques abriendo con foto y
   otros con texto sin criterio visible, y en secciones seguidas llega a juntar
   dos imágenes. Con la imagen siempre delante, cada bloque enseña de qué habla
   antes de explicarlo.

   EXCEPCIÓN CONSCIENTE a la nota de arriba ("no `order`, que rompe el foco por
   teclado"): .adn-duo__media contiene solo un <img>, que no es enfocable, así
   que el orden de tabulación no cambia. Lo único que se desacopla es que un
   lector de pantalla oye el alt después de la lista. Si algún día ese bloque
   pasa a llevar algo enfocable —un enlace, un botón, un vídeo con controles—
   esta regla hay que quitarla y resolverlo por DOM.                            */
@media (max-width: 900px) {
  .adn-duo__media {
    order: -1;
  }
}

/* Botón de cierre de un adn-duo, centrado al apilar. No se toca el display del
   propio botón: es inline-flex y su fondo va en un ::before inclinado, así que
   convertirlo en bloque le rompería la forma. Al ser de nivel inline basta con
   centrar su párrafo. Afecta a los 2 bloques que llevan botón: "Descubre la app"
   en /entrenamiento y "Conóceme más" en /quienes-somos.                        */
@media (max-width: 900px) {
  .adn-duo__contenido p:has(> .adn-boton) {
    text-align: center;
  }
}

/* Testimonios que solo se muestran cuando hay más de una columna. Apilados en
   una sola, seis seguidos son ~1700px: dos pantallas completas de prueba social,
   y el quinto y el sexto no convencen a quien no se convenció con los cuatro
   primeros. Se marcan con clase EXPLÍCITA en el HTML y no por posición
   (:nth-child): así reordenar o añadir testimonios en el panel no cambia sin
   avisar cuáles ve la mitad de los visitantes. El corte es 560px, que es donde
   la retícula pasa a una columna.                                              */
@media (max-width: 560px) {
  .adn-testimonio--extra {
    display: none;
  }
}

/* Captación en móvil: fuera la foto, entra degradado + textura. La foto de la
   pista pesa 703 KB y en 390px solo se ve el 16% del encuadre, escalado x2,6.
   Como el <img> es lazy, con display:none el navegador ni lo pide. La textura
   es la diagonal de 12 grados del sistema, al 2,8% de blanco. Escritorio se
   queda con la foto: dirección de arte por breakpoint, igual que los heros. */
@media (max-width: 640px) {
  .adn-captacion__foto {
    display: none;
  }
  .adn-captacion::after {
    display: none;
  }
  .adn-captacion {
    background:
      repeating-linear-gradient(-12deg, rgba(255, 255, 255, 0.028) 0 2px, transparent 2px 10px),
      radial-gradient(120% 65% at 12% 0%, color-mix(in srgb, var(--color-accent) 12%, transparent) 0%, transparent 62%),
      linear-gradient(180deg, #171c20 0%, #0d0f11 100%);
  }

  /* Aire: el antetítulo estaba a 6px del título (24px de interlínea), se leían
     pegados. Y las ventajas se separaban 12px teniendo 22px de interlínea: los
     ítems quedaban más juntos entre sí que sus propias líneas y la lista se
     leía como una masa. Ahora los ítems se separan más de lo que separan sus
     líneas, que es lo que hace que una lista parezca una lista. */
  .adn-captacion__titulo {
    margin-top: 12px;
  }
  .adn-captacion__ventajas li + li {
    margin-top: 18px;
  }
  /* Doble de aire sobre la fila de sellos: 28 -> 56px. */
  .adn-captacion__sellos {
    margin-top: 56px;
  }
  /* El hueco hasta la tarjeta iguala al de arriba (32 -> 56px): apilados, los
     sellos flotan centrados entre el argumentario y el formulario. */
  .adn-captacion__inner {
    row-gap: 56px;
  }
}




/* ═══ ENLACES DE BIO ══════════════════════════════════════════════════════
   La fila a ancho completo de una página tipo Linktree. No existía: `adn-boton`
   es un CTA en línea e inclinado, y aquí hace falta lo contrario — una fila
   apilada, ancha y con área táctil generosa, porque se toca con el pulgar en el
   navegador interno de Instagram.

   Los tres tokens de acento van cada uno en su sitio, que es donde se rompe
   esto en las marcas de acento claro:
     · `--color-accent`       RELLENO del destacado
     · `--color-sobre-acento` texto ENCIMA de ese relleno
     · `--color-accent-texto` acento como LETRA sobre fondo claro
   Confundirlos no se nota en paraguas y deja ilegible el amarillo de triatlón.
*/
.adn-enlaces {
  display: grid;
  gap: 12px;
  width: min(520px, 100%);
  margin-inline: auto;
}
.adn-enlace {
  display: flex;
  align-items: center;
  gap: 14px;
  /* 62px de alto mínimo: muy por encima de los 24 de área táctil, porque aquí
     el objetivo es que no se falle con el pulgar en movimiento. */
  min-height: 62px;
  padding: 14px 18px;
  background: #fff;
  border: 1px solid #d9d9d6;
  border-radius: 6px;
  text-decoration: none;
  color: #0d0f11;
  transition: transform 0.15s, box-shadow 0.15s, border-color 0.15s;
}
.adn-enlace__icono {
  flex: none;
  width: 34px;
  height: 34px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: color-mix(in srgb, var(--color-accent) 12%, #fff);
  color: var(--color-accent-texto);
}
.adn-enlace__icono svg { width: 19px; height: 19px; display: block; }
.adn-enlace__cuerpo { min-width: 0; }
.adn-enlace__texto {
  display: block;
  font-family: var(--font-titulos);
  font-weight: 700;
  font-size: 16px;
  line-height: 1.25;
}
.adn-enlace__sub {
  display: block;
  margin-top: 2px;
  font-size: 13.5px;
  line-height: 1.4;
  color: #56565a;
}
.adn-enlace__chevron {
  flex: none;
  margin-left: auto;
  color: #a8aaa9;
  transition: transform 0.15s;
}

/* Destacado: el enlace que quieres que se toque. Relleno de acento y texto con
   el token que le corresponde ENCIMA del acento. */
.adn-enlace--destacado {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: var(--color-sobre-acento);
}
.adn-enlace--destacado .adn-enlace__sub,
.adn-enlace--destacado .adn-enlace__chevron { color: inherit; opacity: 0.82; }
.adn-enlace--destacado .adn-enlace__icono {
  background: color-mix(in srgb, var(--color-sobre-acento) 16%, transparent);
  color: var(--color-sobre-acento);
}

/* Misma micro-elevación que el resto de CTAs del sistema (−2px), y solo con
   ratón: en táctil el hover se queda pegado tras el toque. */
@media (hover: hover) and (pointer: fine) {
  .adn-enlace:hover {
    transform: translateY(-2px);
    box-shadow: 0 6px 16px rgba(13, 15, 17, 0.13);
    border-color: var(--color-accent);
  }
  .adn-enlace:hover .adn-enlace__chevron { transform: translateX(3px); }
}
.adn-enlace:focus-visible {
  outline: 3px solid var(--color-accent-texto);
  outline-offset: 3px;
}

/* Cabecera de la página: la promesa, no la bienvenida. */
.adn-bio {
  width: min(520px, 100%);
  margin: 0 auto 26px;
  text-align: center;
}
.adn-bio__claim {
  margin: 0 0 10px;
  font-family: var(--font-titulares);
  font-style: italic;
  text-transform: uppercase;
  font-size: clamp(26px, 7vw, 34px);
  line-height: 1.05;
}
.adn-bio__sub {
  margin: 0;
  font-size: 16px;
  line-height: 1.55;
  color: #56565a;
}


/* ── Feature: el icono se apila en móvil ─────────────────────────────────────
   Con el icono al lado, su caja (34px) más el hueco (16) se llevan 50 de los
   328 disponibles y el texto se queda en 22-33 caracteres por línea; el rango
   cómodo empieza en 35. Apilado sube a 28-39. Es el mismo remedio que la home
   ya aplicaba a su `.feature` local, medido y adoptado aquí en sep-2026.
   Cuesta alto: +96px en /quienes-somos y +204px en /app. Decisión de Ricard.

   OJO: la home NO usa esta clase. Tiene su propio `.feature` en el CSS de la
   página, con la misma regla de apilado y tipografía mayor (título 28 vs 26,
   texto 18 vs 16). Son dos componentes parecidos, no el mismo: si se cambia
   el apilado aquí, hay que cambiarlo también allí.                            */
@media (max-width: 640px) {
  /* Icono y título EN LA MISMA FILA, y la descripción debajo a ancho completo,
     alineada con el icono. Se queda con lo bueno de las dos versiones que hubo
     antes: el icono no se despega de su título (como en la fila) y el texto no
     pierde ancho por la columna del icono (como en el apilado).

     Medido a 390px: la descripción se queda igual de ancha que apilada —los
     caracteres por línea no se mueven— y el bloque BAJA 126px en la home, 144
     en /quienes-somos y 216 en /app, o sea por debajo de lo que medía con el
     icono a la izquierda. El título pierde 50px de ancho y con Anton aguanta.

     El HTML del CMS mete título y descripción dentro de un <div>, así que
     `display: contents` lo disuelve para que sus dos hijos sean casillas de la
     retícula del padre. Mismo truco que la ficha de entreno con su columna
     lateral. NO se toca el marcado: son 16 páginas.                            */
  .adn-feature {
    display: grid;
    grid-template-columns: auto 1fr;
    column-gap: 16px;
    row-gap: 8px;
    align-items: center;
  }
  .adn-feature > div {
    display: contents;
  }
  .adn-feature__icono {
    grid-column: 1;
    margin-bottom: 0;
  }
  .adn-feature__titulo {
    grid-column: 2;
  }
  /* La separación la pone `row-gap`; su margen propio se sumaría. */
  /* Interlínea 1.75 como en la home (allí el texto va a 16/28 y aquí iba a
     16/24). Era la diferencia REAL entre las dos: el título medía lo mismo en
     las dos —20px— y el de quienes-somos parecía menor porque su texto era un
     17% más denso. */
  .adn-feature__desc {
    grid-column: 1 / -1;
    margin-top: 0;
    line-height: 1.75;
  }
}

/* ── Dos redacciones para un mismo título ────────────────────────────────────
   Para títulos que en un móvil estrecho se parten en dos líneas y dejan un
   huérfano. Se escriben los dos textos y el CSS enseña uno u otro; NO hay JS,
   que estas webs son estáticas.

   El corte son 409px y está medido, no elegido: «El entrenamiento se adapta a
   ti» a 22px se parte hasta 408 y entra entero desde 410. Así los móviles
   anchos (Pixel 412, iPhone 414 y 430) siguen viendo el título completo, que
   se lee mejor, y solo lo pierden los estrechos.

   Lo oculto por CSS no lo lee el lector de pantalla ni cuenta dos veces para
   Google: en cada ancho hay un solo título.                                   */
.adn-titulo-corto {
  display: none;
}
@media (max-width: 409px) {
  .adn-titulo-largo {
    display: none;
  }
  .adn-titulo-corto {
    display: inline;
  }
}

/* ── Grupos del acordeón de preguntas ────────────────────────────────────────
   14 preguntas seguidas mezclan tres asuntos y obligan a leerlas todas para
   encontrar la tuya. Los <h2> las agrupan y, de paso, dan a la página una
   estructura de encabezados navegable, que antes no tenía: los <summary> no
   son títulos.                                                               */
.adn-faq__grupo {
  margin: 0 0 6px;
  font-family: var(--font-titulares);
  font-style: italic;
  /* Fluido, no fijo (sep-2026). Era el ÚNICO tamaño fijo de la página: en
     escritorio la pregunta sube a 20 y el grupo se quedaba en 18, o sea la
     etiqueta de sección más pequeña que lo que agrupa. Y Anton es condensada
     —una «E» mide 7,4px de ancho frente a los 13,4 de Montserrat—, así que
     con el mismo cuerpo ya pesaría menos. Suelo 18: en móvil no cambia nada. */
  /* Pendiente 2.1vw y no 1.7: la pregunta crece a 1.9vw, así que con una
     pendiente menor el grupo se quedaba corto entre 950 y 1.180px —a 1.024
     la pregunta medía 19,5 y el grupo 18, otra vez al revés—. Medido en
     nueve anchos, de 360 a 1.600. */
  font-size: clamp(18px, 2.1vw, 22px);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--color-accent-texto);
}
/* El primero abre la lista; los demás separan, así que necesitan aire por
   arriba —y más del que hay entre dos preguntas, o no se leen como corte—. */
.adn-faq__grupo + .adn-faq__item {
  border-top: 1px solid #e3e4e5;
}
.adn-faq__item + .adn-faq__grupo {
  margin-top: 34px;
}

/* Iconos circulares del acento: rampa en diagonal, el ángulo del logo. */
.adn-icono-circulo {
  background-image: var(--grad-marca-diag);
  color: var(--color-sobre-grad, var(--color-sobre-acento));
}
