/* ============================================================
   Climent Media — AI Assistants pages
   Extends the main styles.css (tokens + nav + footer + buttons).
   Solo anade: badges de estado y la maqueta de las paginas hoja (.lp-*).
   El bloque de directorio (.dir, .assist-card) se borro el 2-ago: 20 reglas
   con CERO usos, restos de /assistants/. CSS muerto no falla, solo pesa y
   confunde a quien lo lee despues.
   ============================================================ */

:root {
  --st-live: var(--ok);
  --st-live-soft: rgba(var(--ok-rgb), 0.12);
  --st-beta: var(--accent);
  --st-beta-soft: rgba(var(--accent-rgb), 0.12);
  --st-build: var(--warn);
  --st-build-soft: rgba(var(--warn-rgb), 0.12);
  --st-plan: #8a8a86;
  --st-plan-soft: rgba(var(--white-rgb), 0.06);
}

/* ---------- Status badge ---------- */
.st-live::before {
  content: "";
  display: inline-block;
  width: 6px; height: 6px;
  border-radius: 50%;
  background: currentColor;
  margin-right: 0.4rem;
  vertical-align: 0.08em;
  animation: st-pulse 2.4s ease-in-out infinite;
}

/* Anima OPACITY, no box-shadow. Chrome no puede componer box-shadow: repinta
   en el hilo principal sin parar, y este punto sale en cada tarjeta de estado
   del directorio. Sobre un punto de 6px el halo no se apreciaba; el latido si.
   (Mismo arreglo que .pulse-dot en styles.css, 31-jul.) */
@keyframes st-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.45; }
}

/* Toda animacion necesita su salida. Sin esto, quien pide menos movimiento
   igualmente ve el punto latiendo. */
@media (prefers-reduced-motion: reduce) {
  .st-live::before { animation: none; }
}

/* ---------- Landing ---------- */
.lp { max-width: 860px; margin: 0 auto; padding: 8rem clamp(1.2rem, 5vw, 2rem) 4rem; }
.lp-back { display: inline-block; color: var(--muted); font-size: 0.88rem; margin-bottom: 2rem; text-decoration: none; }
.lp-back:hover { color: var(--accent-bright); }

.lp-hero { border-bottom: 1px solid var(--border); padding-bottom: 2.4rem; margin-bottom: 2.4rem; }
.lp-hero__top { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.2rem; }
.lp-hero__icon {
  width: 54px; height: 54px; display: grid; place-items: center;
  border-radius: 13px; color: var(--accent);
  background: rgba(var(--accent-rgb), 0.09); border: 1px solid rgba(var(--accent-rgb), 0.22);
}
.lp-hero__icon svg { width: 28px; height: 28px; }
.lp p.lp-cat { font-size: 0.74rem; font-weight: 800; letter-spacing: 0.18em; text-transform: uppercase; color: var(--accent-bright); margin: 0; }
.lp h1 { font-size: clamp(2.1rem, 5.5vw, 3.2rem); font-weight: 800; letter-spacing: -0.02em; line-height: 1.08; margin-top: 0.4rem; }
.lp-tagline { color: var(--muted); font-size: 1.12rem; margin-top: 1rem; max-width: 640px; }
.cmp-wrap { overflow-x: auto; margin: 1.6rem 0; }
.cmp { width: 100%; border-collapse: collapse; font-size: 0.95rem; min-width: 460px; }
.cmp th, .cmp td { text-align: left; padding: 0.7rem 0.9rem; border-bottom: 1px solid var(--border); vertical-align: top; }
.cmp thead th { border-bottom: 2px solid var(--border); color: var(--text); font-weight: 800; }
.cmp td:first-child, .cmp th:first-child { color: var(--muted); font-weight: 700; }
.cmp strong { color: var(--text); }

.lp h2 { font-size: 1.4rem; font-weight: 800; letter-spacing: -0.01em; margin: 2.6rem 0 1rem; }
.lp p { color: var(--muted); font-size: 1rem; margin-bottom: 1rem; }
.lp strong { color: var(--text); }

.construction {
  display: flex; align-items: flex-start; gap: 0.9rem;
  border: 1px solid rgba(var(--warn-rgb), 0.32);
  background:
    repeating-linear-gradient(45deg, rgba(var(--warn-rgb), 0.05) 0 12px, transparent 12px 24px),
    rgba(var(--warn-rgb), 0.04);
  border-radius: var(--radius);
  padding: 1.1rem 1.3rem;
  margin: 1.6rem 0;
}
.construction svg { width: 22px; height: 22px; color: var(--st-build); flex-shrink: 0; margin-top: 2px; }
.construction p { margin: 0; color: var(--text); font-size: 0.95rem; }
.construction strong { color: var(--st-build); }

.offer {
  border: 1px solid var(--border);
  border-radius: calc(var(--radius) + 4px);
  padding: 1.8rem;
  margin-top: 2.4rem;
  background:
    radial-gradient(500px circle at 30% -20%, rgba(var(--accent-rgb), 0.1), transparent 60%),
    var(--surface);
}
.offer h2 { margin-top: 0; }
.offer p { margin-bottom: 1.2rem; }
.offer .btn-primary { margin-top: 0.4rem; }

.spec-row { display: flex; flex-wrap: wrap; gap: 0.5rem 1.6rem; margin-top: 1rem; color: var(--muted); font-size: 0.85rem; }
.spec-row span { display: inline-flex; align-items: center; gap: 0.4rem; }
.spec-row b { color: var(--text); font-weight: 600; }

/* ---------- Rich landing sections (optional per assistant) ---------- */
.lp-lead { border-left: 3px solid var(--accent); padding-left: 1.3rem; margin: 0 0 0.5rem; }
.lp-lead p { color: var(--text); font-size: 1.1rem; line-height: 1.6; }
.lp-lead p:last-child { margin-bottom: 0; }

.faq { display: grid; gap: 0.8rem; margin: 0.6rem 0 1rem; }
.faq-item { border: 1px solid var(--border); border-radius: var(--radius); padding: 1.1rem 1.3rem; background: var(--surface); }
.faq-q { color: var(--text); font-weight: 700; margin: 0 0 0.4rem; font-size: 1rem; }
.faq-a { color: var(--muted); margin: 0; font-size: 0.96rem; line-height: 1.55; }

@media (max-width: 640px) {
  .lp { padding-top: 6.5rem; }
}

/* --- Content extras (added 2026-07-28 for /guides/ pieces: source quotes,
       copy-pasteable snippets, own explanatory figures). Additive only. --- */
.srcquote {
  margin: 1.6rem 0; padding: 1.1rem 1.3rem 1.1rem 1.5rem;
  border-left: 3px solid var(--accent); background: var(--surface);
  border-radius: 0 var(--radius) var(--radius) 0;
}
.srcquote p { color: var(--text); font-size: 1.03rem; line-height: 1.55; margin: 0; }
.srcquote cite { display: block; margin-top: 0.6rem; color: var(--muted); font-size: 0.9rem; font-style: normal; }
.srcquote cite a { color: var(--muted); text-decoration: underline; text-underline-offset: 2px; }
.srcquote cite a:hover { color: var(--accent-bright); }

.snip {
  margin: 1.2rem 0; padding: 1.1rem 1.2rem; overflow-x: auto;
  background: #0b0b0d; border: 1px solid var(--border); border-radius: var(--radius);
  font-family: "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace;
  font-size: 0.86rem; line-height: 1.6; color: #d8d8d4; white-space: pre;
}
.snip-label { color: var(--muted); font-size: 0.86rem; font-weight: 700; margin: 1.4rem 0 0.1rem; }

.fig { margin: 1.9rem 0; }
.fig img { width: 100%; height: auto; border: 1px solid var(--border); border-radius: var(--radius); }
.fig figcaption { color: var(--muted); font-size: 0.9rem; line-height: 1.5; margin-top: 0.7rem; }

/* Content links inside prose. The global rule is `a { color: inherit;
   text-decoration: none }`, which made in-body links invisible on every guide.
   Scoped to direct children of <p> and <li> so nav, .lp-back, the hub list
   (li > strong > a) and .offer-actions buttons keep their existing look.
   La miga (13-ago-2026) queda fuera por la misma razon que el resto de la
   lista: es NAVEGACION, no prosa. Sin el `:not()` sus enlaces salian naranjas y
   subrayados -- MEDIDO con getComputedStyle, no leido de una captura:
   `.lp li > a` (0,2,1) le gana a `.crumbs a` (0,1,1) y ademas va despues. Se
   excluye aqui en vez de subir la especificidad alla, que seria un parche que
   el siguiente componente de navegacion volveria a pisar. */
/* 🔴 20-ago-2026 · Y LOS BOTONES TAMBIEN QUEDAN FUERA, por la misma razon y
   con un fallo peor: `.lp p > a` (0,2,1) le gana a `.btn-primary` (0,1,0),
   asi que un <a class="btn-primary"> dentro de un <p> se pintaba naranja
   SOBRE el degradado naranja del propio boton. Contraste ~1:1: el boton
   existe, ocupa 426x53 px, el gate de densidad lo cuenta como CTA -- y no
   se ve. Catorce asi en el sitio. Medido con getComputedStyle sobre el
   candidato, no leido de una captura: color rgb(255,122,38) sobre
   linear-gradient(rgb(255,122,38), rgb(255,92,0)).
   Se excluye por CLASE y no por sitio: un boton es un boton este donde
   este, y la alternativa -no meter botones en parrafos- no sobrevive al
   siguiente generador que emita `after` como <p>. */
.lp p > a:not([class*="btn"]), .lp li:not(.crumbs li) > a:not([class*="btn"]) {
  color: var(--accent-bright); text-decoration: underline;
  text-underline-offset: 2px; text-decoration-thickness: 1px;
}
.lp p > a:not([class*="btn"]):hover, .lp li:not(.crumbs li) > a:not([class*="btn"]):hover { color: var(--accent-bright); }

/* Logos de plataforma dentro del megamenu de P1 (V2, 2026-07-31). */
.mp-list--logos a { display: flex; align-items: center; gap: 0.6rem; }
.mp-list--logos img { width: 18px; height: 18px; flex: none; }

/* ---------- Bloque de texto para copiar a una IA (paginas /copy/) ----------
   Sustituye al ZIP: se lee en el navegador o se pega en un asistente, sin
   descargar nada. La pagina se GENERA desde los ficheros fuente, asi que no
   puede desincronizarse -- que es justo lo que le paso al zip que servia
   antes. */
.llm-block {
  margin: 2rem 0 0;
  padding: 1.3rem 1.4rem;
  max-height: 70vh;
  overflow: auto;               /* scrollea el bloque, nunca la pagina */
  background: rgba(var(--bg-rgb), 0.6);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--muted);
  font-family: var(--report-font-family-monospace, ui-monospace, "SFMono-Regular", Consolas, monospace);
  font-size: 0.82rem;
  line-height: 1.55;
  white-space: pre-wrap;        /* respeta saltos y no desborda en movil */
  word-break: break-word;
  -webkit-overflow-scrolling: touch;
}

.lp-note {
  color: var(--muted);
  font-size: var(--fs-small);
  border-left: 2px solid rgba(var(--accent-rgb), 0.45);
  padding-left: 1rem;
  margin-top: 1.4rem;
}

button.btn-primary { font: inherit; cursor: pointer; }

/* ============================================================================
   PRECIOS  (/ads-assistant/pricing/)
   ----------------------------------------------------------------------------
   Los importes NO estan aqui ni en el HTML: los escribe script.js leyendo el
   catalogo publico en este mismo origen. Estas reglas solo dan la forma.

   Sin animaciones a proposito: la rejilla esta por encima del pliegue y el
   proyecto tiene medido que animar ahi cuesta Speed Index en movil.
   ========================================================================== */
.pr-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 1rem;
  margin: 1.8rem 0 1.2rem;
  align-items: start;
}

.pr-card {
  display: flex;
  flex-direction: column;
  gap: 0.55rem;
  padding: 1.5rem 1.35rem 1.35rem;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  position: relative;
}

/* El destacado se marca con el borde de marca, no con escala ni sombra: escalar
   una tarjeta descoloca la rejilla en movil y las sombras no las compone Chrome. */
.pr-card--featured {
  border-color: rgba(var(--accent-rgb), 0.55);
  background: rgba(var(--accent-rgb), 0.045);
}

.pr-flag {
  margin: 0;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--accent-bright);
}

/* `.pr-card .pr-name` y no `.pr-name` a secas: el nombre del plan paso de h3 a h2
   para no dejar el salto h1->h3 en /ads-assistant/pricing, y `.lp h2` (0,1,1) le
   ganaba a `.pr-name` (0,1,0) -- lo habria hinchado a 1,4rem con 2,6rem de margen
   superior. Con `.pr-card .pr-name` (0,2,0) manda esta. El nivel del titular es
   accesibilidad; su tamano es diseno, y se eligen por separado. */
.pr-card .pr-name {
  margin: 0;
  font-size: 1.05rem;
  font-weight: 700;
  letter-spacing: -0.01em;
}

.pr-price {
  margin: 0.15rem 0 0;
  display: flex;
  align-items: baseline;
  gap: 0.35rem;
  flex-wrap: wrap;
}

.pr-amount {
  font-size: 2.1rem;
  font-weight: 800;
  letter-spacing: -0.03em;
  line-height: 1;
  font-variant-numeric: tabular-nums;
}

.pr-per {
  font-size: 0.82rem;
  color: var(--muted);
}

.pr-clients {
  margin: 0;
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--accent-bright);
  min-height: 1.2em;
}

.pr-for {
  margin: 0.1rem 0 0.3rem;
  font-size: 0.86rem;
  color: var(--muted);
}

.pr-feat {
  margin: 0 0 0.4rem;
  font-size: 0.86rem;
}

.pr-feat li { margin-bottom: 0.3rem; }

/* Empuja el boton al fondo para que las tarjetas de distinta altura alineen sus
   llamadas a la accion en la misma linea. */
.pr-cta {
  margin-top: auto;
  text-align: center;
  width: 100%;
}

.pr-foot {
  font-size: 0.82rem;
  color: var(--muted);
  margin-top: 0.2rem;
}

/* Contador de plazas Fundador. Es un dato REAL servido por el backend, no un
   numero escrito: lo exige el gate FRONT-SAAS-F1. */
.pr-seats {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.4rem 0.8rem;
  border: 1px solid rgba(var(--accent-rgb), 0.35);
  border-radius: 999px;
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--accent-bright);
}

.pr-seats[hidden] { display: none; }

/* ============================================================================
   GUIA MAQUETADA (.gd-*)  --  2026-08-10
   ----------------------------------------------------------------------------
   Traduce una guia larga de /learn/ de "h2 + tirada de <p>" a maqueta
   seccionada SIN tocar una palabra del copy. Existe porque el gate de maqueta
   (client-site/references/gate-estructura.js) marcaba estas paginas como
   pagina-prosa. Medido a 1440px antes de tocar nada, en /learn/what-is-a-good-roas/:
     · 36 <p> hijos DIRECTOS de <main class="lp"> y CERO <section>
     · 4 de 10 bloques (40%) prosa pura, limite 30%
     · mediana de linea 105 cpl, con el rango legible en 45-90
   09-tipos-de-pagina.md 2.6 lo dice literal: un <h2> es una ETIQUETA, no un
   limite de seccion. Sin <section> el gate sintetiza bloques por titular y todos
   salen clasificados como prosa, que es exactamente el hecho.

   CHASIS PROPIO A PROPOSITO. Los moldes de la libreria vienen claros y azules;
   esta web es oscura y naranja. Se conserva la ESTRUCTURA del molde y se
   reimplementa sobre los tokens de ESTE sitio (--border, --surface, --radius).
   El gate detecta primitivas por ESTRUCTURA, no por nombre de clase.

   Prefijo gd- (guide) para no colisionar con .lp / .tpl- / .cmp / .faq, que ya
   existen y los usan las otras 33 paginas. Nada de aqui las toca.
============================================================================ */
.gd-sec { padding-block: 2.6rem; border-top: 1px solid var(--border); }
.gd-sec:first-of-type { padding-top: 0; border-top: 0; }
/* El h2 ya no necesita su margen de "separador": el limite lo da la seccion. */
.gd-sec > h2:first-child { margin-top: 0; }
/* .lp-hero traia SU propia linea divisoria. Con la seccion puesta salian DOS
   reglas seguidas con una banda muerta en medio (vista en la captura a 1440,
   no en el DOM: el gate daba verde). El limite lo marca ahora la seccion. */
.gd-sec .lp-hero { border-bottom: 0; padding-bottom: 0; margin-bottom: 0; }

/* LA COLUMNA DE LECTURA -- el defecto ANCHO.
   Se acota en `em` y NO en `ch` a proposito: `ch` se resuelve con la fuente del
   ELEMENTO, asi que el mismo valor daria anchos distintos en .lp-tagline
   (1.12rem) y en el cuerpo (1rem). Es la trampa de 10-vocabulario 3.
   `max-width` NUNCA estrecha por debajo del contenedor: dentro de una tarjeta
   de FAQ o de una celda ya angosta simplemente no llega a aplicar.
   33em NO es un numero elegido: a 36em la peor linea medida seguia en 85 cpl.
   33em la deja en ~78 y la mediana en ~69, dentro del rango 45-90. */
.gd-sec p, .gd-sec li { max-width: 33em; }
/* Tablas, figuras y bloques de codigo mandan sobre la columna de lectura: son
   evidencia, no texto corrido, y necesitan el ancho entero. */
.gd-sec .cmp-wrap, .gd-sec .fig, .gd-sec .snip { max-width: none; }

/* FAQ a dos columnas. Hace tres cosas de una: baja de ~100 cpl las respuestas
   sin tocar el texto, da a la seccion una maqueta 2D real, y convierte una pila
   de tarjetas en una rejilla escaneable. Modificador sobre .faq (no la
   redefine): las otras paginas que usan .faq siguen a una columna. */
.gd-faq { grid-template-columns: repeat(auto-fit, minmax(19rem, 1fr)); }

@media (max-width: 640px) {
  .gd-sec { padding-block: 2rem; }
}

/* ---------- Testimonios · molde `web-testimonios-001` de la libreria ---------
   20-ago-2026. Estaba registrado como 🟢 EN PRODUCCION en nora desde el 6-ago
   (`oraculo-web/_gen.ps1 -> Testimonios()`) y aqui se habian escrito a mano como
   parrafos sueltos: exactamente lo que el indice existe para evitar.
   Lo que se roba del molde, que no es el aspecto:
     · UN AUTOR, UNA TARJETA. Dos citas de la misma persona salian lado a lado.
     · <figure>/<blockquote>/<cite>, no <p><em>. Ademas de correcto, `figure`
       esta en la lista de PARADAS de medir-pantallas.js: cuatro citas en
       parrafos son un muro de una pantalla, en figuras no.
     · 🔴 SIN schema Review/AggregateRating a proposito: Google penaliza las
       resenas que una web publica sobre si misma, y ahi caen las acciones
       manuales. La cita va como texto, no como dato estructurado.
     · Permiso del cliente, y nunca capturas. Los cuatro de aqui estan
       transcritos en sus fichas de Notion y Manuel autorizo los nombres.
   Tokens de climentmedia, no los de nora: --surface/--border/--radius. */
.testi-grid { display: grid; gap: 1.1rem; margin-top: 1.6rem;
              grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
.testi { margin: 0; background: var(--surface); border: 1px solid var(--border);
         border-radius: var(--radius); padding: 1.5rem 1.6rem 1.2rem; position: relative; }
/* La comilla es decorativa. Va en ::before con el color de marca al 30% para
   que no compita con el texto y para que ningun lector de pantalla la lea. */
.testi::before { content: "\201C"; position: absolute; top: 0; left: 0.7rem;
                 font-size: 3.2rem; line-height: 1; color: var(--accent-bright);
                 opacity: 0.3; pointer-events: none; }
.testi blockquote { margin: 0; padding: 0; border: 0; font-style: normal;
                    font-size: 0.97rem; line-height: 1.6; color: var(--muted); }
.testi figcaption { margin-top: 1rem; padding-top: 0.85rem; border-top: 1px solid var(--border); }
.testi cite { font-style: normal; font-weight: 700; font-size: 0.88rem; color: var(--accent-bright); }
.testi-quien { display: block; font-weight: 400; font-size: 0.84rem; color: var(--muted); margin-top: 0.15rem; }

/* ---------- Indice compacto · primitiva `13-indice-con-guias` de la libreria --
   20-ago-2026. El molde lo dice con estas palabras: «Es lo primero que hay que
   anadirle a /learn/». Llevaba escrito desde el 10-ago y nunca se hizo.
   Por que aqui y no una rejilla de tarjetas: el catalogo de /learn/ son ONCE
   piezas. En tarjetas, a 390 px eso son mas de 3 pantallas en UN solo bloque, y
   `medir-pantallas.js` lo tumbaba por el tope del contenedor -- con razon, once
   tarjetas apiladas no se leen, se sufren. La seccion `calificacion` de encima
   ya hace el trabajo de elegir; esta hace el de ENUMERAR, y para enumerar una
   lista compacta gana. Cada <li> es ademas una PARADA para el gate.
   Los puntos-guia son un borde punteado, no caracteres: «......» escrito se lee
   en voz alta punto a punto. Y desaparecen bajo 640 px, que es lo que dice el
   molde en su nota de responsive. */
.idx { border-top: 2px solid var(--text); margin: 1.4rem 0 0; padding: 0;
       list-style: none; counter-reset: idx; }
.idx li { counter-increment: idx; border-bottom: 1px solid var(--border); }
.idx a { display: flex; align-items: baseline; gap: 0.9rem; padding: 0.85rem 0;
         text-decoration: none; color: var(--text); font-size: var(--fs-body); line-height: 1.4; }
.idx a:hover { color: var(--accent-bright); }
.idx a:focus-visible { outline: 2px solid var(--accent-bright); outline-offset: -2px; }
.idx a::before { content: counter(idx, decimal-leading-zero); flex: none;
                 color: var(--muted); font-size: 0.82rem; font-weight: 700;
                 letter-spacing: 0.06em; font-variant-numeric: tabular-nums; }
.idx__t { flex: none; max-width: calc(100% - 5rem); }
.idx__g { display: none; }
.idx__n { margin-left: auto; flex: none; color: var(--muted); font-size: 0.82rem; }
@media (min-width: 40rem) {
  .idx__g { display: block; flex: 1; min-width: 2rem;
            border-bottom: 1px dotted var(--border); transform: translateY(-0.35em); }
  .idx__n { margin-left: 0; }
}

/* Foto del hero en una ficha (hoy solo /about/). El hero de .lp es una columna
   estrecha: sin tope, una imagen de 900x1350 se come dos pantallas. 260px es el
   ancho al que la cara se lee sin robarle el sitio al texto. */
.lp-foto { max-width: 260px; margin: 2rem 0 0; }
.lp-foto .about-frame { aspect-ratio: 2 / 3; }

/* ---------------------------------------------------------------------------
   .cta-linea  ·  el CTA DISCRETO de mitad de articulo   (26-ago-2026)
   ---------------------------------------------------------------------------
   POR QUE EXISTE, con el numero delante. `09-tipos-de-pagina.md §2.6` PROHIBE
   mas de 2,5 pantallas seguidas sin nada que pulsar. Inventario de las 17
   guias de /learn/ medido en produccion ese dia: 12 lo incumplian, y
   `marketing-attribution` llegaba a 19,2 pantallas seguidas sin un solo CTA.

   En una guia de 21 pantallas ese limite pide unos 8 puntos de accion. Ocho
   botones naranjas serian relleno, que es el OTRO fallo que perseguimos
   (anti-slop §6: el mismo texto repetido en varios huecos). Hacia falta un
   SEGUNDO PESO: un enlace, no un boton.

   Cuenta para el gate porque su clase lleva `cta` -- el selector de
   `medir-pantallas.js` es `a[class*=cta]` -- y se lee como lo que es: una
   salida ofrecida al final de una idea, no un anuncio.

   USO   al cierre de una seccion que no merece boton. El boton primario
         (`.gd-cta` + `.btn-primary`) se reserva para 2-3 momentos de alta
         intencion por pagina: tras la tabla, tras el entregable, en el cierre.
   NO    dos seguidos · el mismo texto en dos sitios · como unico CTA de la
         pagina (el lector que llega convencido necesita el boton).

   COLOR `--accent-bright`, que es el token que `DESIGN.md §2` declara para
         "el naranja como TEXTO PEQUENO sobre el lienzo". El `--accent` puro no
         llega a AA a este tamano, y eso se mide con getComputedStyle, nunca
         leyendolo de una captura.
--------------------------------------------------------------------------- */
.lp .cta-linea {
  display: block; margin: 1.7rem 0 0; padding-top: 0.9rem;
  border-top: 1px solid var(--border);
  font-size: 0.95rem; font-weight: 700; line-height: 1.45;
  color: var(--accent-bright); text-decoration: none;
}
.lp .cta-linea:hover { text-decoration: underline; }
.lp .cta-linea:focus-visible { outline: 2px solid var(--accent-bright); outline-offset: 3px; }
.lp .cta-linea::after { content: " \2192"; }
