/* ============================================================================
   Interagentic — sistema del sitio (una sola hoja, sin frameworks, sin build)

   Decisiones y por qué (guía `design-taste-frontend`, §4 y §5):

   · UN SOLO ACENTO, familia "Cobalt + Cream": el azul de la marca sobre neutros
     CALIBRADOS. Antes el blanco (#f9f9ff) y el negro (#121318) eran azulados, y
     un sitio azul sobre gris azulado se lee como panel de administración. El
     azul sigue siendo dominante, pero el neutro ya no compite con él.
   · Azul "de campo" y azul "de texto" son TOKENS DISTINTOS: en modo oscuro el
     #005ab4 no da contraste para texto, así que los campos grandes y el texto
     de enlace tienen su propio valor. Es la diferencia entre un color de marca
     y un color legible.
   · UNA escala de radios con regla escrita (§4.4): interactivos = pill,
     paneles = 16, campos = 12, etiquetas = 8. Se acabó el 16/12/pill mezclado
     sin criterio.
   · MOVIMIENTO: solo `transform` y `opacity` (§6.A). Nada de `top`/`width`.
     Nada de escuchar `scroll` (§5.D): los reveals van con IntersectionObserver
     y el estado de la barra con un centinela.
   · Todo el movimiento está tras `prefers-reduced-motion` (§6.B, obligatorio).
   · MODO OSCURO: sigue al sistema por defecto, pero el visitante puede forzarlo con el
     interruptor de la barra, y su elección se recuerda. El tema se resuelve en CSS a
     partir de `data-tema` en la raíz, y ese atributo lo escribe un script en línea del
     <head>: decidirlo con JavaScript diferido hace que la página entre con un tema y
     salte al otro (un destello por carga).
   ========================================================================= */

/* ============================================================================
   FUENTES — alojadas aquí, no en Google

   Las dos familias vivían en un <link> al CDN de Google. Eso tenía dos costos: cada visita
   mandaba la IP del visitante a Google, y el texto no se podía pintar hasta resolver dos
   DNS y completar dos handshakes TLS contra un tercero. Ahora son dos archivos de este
   sitio: cero peticiones externas.

   Son las versiones VARIABLES y el subconjunto `latin`, que cubre el español completo
   (á-ú, ñ, ¿, ¡). Un archivo por familia sirve todo el rango de pesos, así que no hay una
   descarga por peso. El `unicode-range` es el mismo que declara Google: dice qué caracteres
   cubre el archivo, y lo que quede fuera —la flecha → de los enlaces, por ejemplo— usa la
   fuente del sistema, exactamente igual que antes.

   Los archivos y sus licencias están en `fuentes/`, con un LEEME que explica su origen.
   ========================================================================= */
@font-face {
  font-family: 'Geist';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url(../fuentes/geist-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Geist Mono';
  font-style: normal;
  font-weight: 400 500;
  font-display: swap;
  src: url(../fuentes/geist-mono-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ---------------------------------------------------------------- tokens ---- */
:root {
  /* El lienzo y los controles nativos (barra de desplazamiento, desplegables de
     <details>) siguen el tema claro por defecto. Los bloques oscuros de abajo lo cambian.
     `color-scheme` NO es decorativo: es lo que hace que el navegador pinte el fondo antes
     de tener contenido y en el color correcto, en vez del que le dicte el sistema. */
  color-scheme: light;

  /* Roles del acento */
  --acento: #005ab4;        /* texto, iconos, enlaces, bordes de foco */
  --acento-texto: #00417f;  /* acento sobre fondos claros, con más contraste */
  --acento-campo: #005ab4;  /* campos grandes rellenos (con texto blanco) */
  --acento-suave: #e8effa;  /* capa tonal para hover sobre claro */

  /* Neutros calibrados (ni azulados ni beige cálido) */
  --base: #fafaf8;
  --base-2: #f3f3f0;
  --base-3: #e9e9e5;
  --tinta: #15171a;
  --tinta-2: #4a5058;
  --tinta-3: #6d737b;
  --linea: #dededa;
  --linea-2: #c8c8c2;
  --blanco: #ffffff;

  /* Tipografía */
  --sans: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
  --mono: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, monospace;

  /* Radios — REGLA: interactivos pill · paneles 16 · campos 12 · etiquetas 8 */
  --r-boton: 999px;
  --r-panel: 16px;
  --r-campo: 12px;
  --r-etiqueta: 8px;

  /* Ritmo */
  --ancho: 1200px;
  --gutter: 24px;
  --seccion: 104px;
  --alto-barra: 68px;

  /* Movimiento (un solo lugar para afinarlo) */
  --curva: cubic-bezier(.16, 1, .3, 1);
  --rapido: 150ms;
  --medio: 320ms;
  --lento: 620ms;
}

/* ------------------------------------------------------------- modo oscuro ----
   Los VALORES oscuros viven una sola vez (--o-*). El MAPEO se escribe dos veces porque
   son dos condiciones distintas: la preferencia del sistema y la elección del visitante.
   Repetir los `var()` es el precio de que ambas convivan sin repetir los colores. */
:root {
  --o-acento: #8fb8ff;        /* el azul de marca, aclarado para LEER sobre oscuro */
  --o-acento-texto: #a8c8ff;
  --o-acento-campo: #0b5cb4;  /* el campo relleno conserva el azul saturado */
  --o-acento-suave: #16243a;

  --o-base: #101215;
  --o-base-2: #171a1e;
  --o-base-3: #1f2328;
  --o-tinta: #f1f1ef;
  --o-tinta-2: #b8bcc2;
  --o-tinta-3: #8b9098;
  --o-linea: #2a2e34;
  --o-linea-2: #3a3f46;
  --o-blanco: #0b0d10;
}

/* 1) El visitante eligió: su elección gana sobre el sistema, en los dos sentidos. */
html[data-tema="claro"] { color-scheme: light; }

html[data-tema="oscuro"] {
  color-scheme: dark;
  --acento: var(--o-acento);
  --acento-texto: var(--o-acento-texto);
  --acento-campo: var(--o-acento-campo);
  --acento-suave: var(--o-acento-suave);
  --base: var(--o-base);
  --base-2: var(--o-base-2);
  --base-3: var(--o-base-3);
  --tinta: var(--o-tinta);
  --tinta-2: var(--o-tinta-2);
  --tinta-3: var(--o-tinta-3);
  --linea: var(--o-linea);
  --linea-2: var(--o-linea-2);
  --blanco: var(--o-blanco);
}

/* 2) Nadie eligió nada: manda el sistema. El `:not([data-tema="claro"])` es justo lo que
   permite que quien pidió claro lo conserve aunque su sistema esté en oscuro. */
@media (prefers-color-scheme: dark) {
  html:not([data-tema="claro"]) {
    color-scheme: dark;
    --acento: var(--o-acento);
    --acento-texto: var(--o-acento-texto);
    --acento-campo: var(--o-acento-campo);
    --acento-suave: var(--o-acento-suave);
    --base: var(--o-base);
    --base-2: var(--o-base-2);
    --base-3: var(--o-base-3);
    --tinta: var(--o-tinta);
    --tinta-2: var(--o-tinta-2);
    --tinta-3: var(--o-tinta-3);
    --linea: var(--o-linea);
    --linea-2: var(--o-linea-2);
    --blanco: var(--o-blanco);
  }
}

/* ------------------------------------------------------------------ base ---- */
*, *::before, *::after { box-sizing: border-box; }

/* El fondo se pinta en `html`, no solo en `body`: así el lienzo completo —incluido el
   rebote del scroll en iOS— sale del mismo token y no de un blanco del navegador. */
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; background: var(--base); }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  margin: 0;
  background: var(--base);
  color: var(--tinta);
  font-family: var(--sans);
  font-size: 17px;
  line-height: 1.6;
  font-synthesis-weight: none;
  -webkit-font-smoothing: antialiased;
}

img, svg { display: block; max-width: 100%; }
a { color: inherit; }
h1, h2, h3 { margin: 0; line-height: 1.08; letter-spacing: -0.03em; font-weight: 600; text-wrap: balance; }
p { margin: 0; }
ul, ol { margin: 0; padding: 0; list-style: none; }

/* Foco visible SIEMPRE (AA): 2px de acento con separación del fondo */
:focus-visible {
  outline: 2px solid var(--acento);
  outline-offset: 3px;
  border-radius: 4px;
}

.contenedor { width: 100%; max-width: var(--ancho); margin-inline: auto; padding-inline: var(--gutter); }
.estrecho { max-width: 760px; }

/* Enlace de salto: invisible hasta que se tabula hacia él */
.saltar {
  position: absolute; left: 16px; top: -60px; z-index: 100;
  background: var(--acento-campo); color: #fff; padding: 10px 16px;
  border-radius: var(--r-etiqueta); text-decoration: none;
  transition: transform var(--rapido) var(--curva);
}
.saltar:focus { transform: translateY(72px); }

/* Centinela de 1px: su salida del viewport pone el borde a la barra */
.centinela { height: 1px; }

/* ------------------------------------------------------- barra superior ---- */
.barra {
  position: sticky; top: 0; z-index: 50;
  background: color-mix(in srgb, var(--base) 88%, transparent);
  backdrop-filter: blur(12px);
  border-bottom: 1px solid transparent;
  transition: border-color var(--medio) var(--curva), background-color var(--medio) var(--curva);
}
.barra[data-pegada] { border-bottom-color: var(--linea); background: color-mix(in srgb, var(--base) 94%, transparent); }

.barra__fila {
  height: var(--alto-barra);
  display: flex; align-items: center; gap: 24px;
}

.marca { display: inline-flex; align-items: center; color: var(--tinta); }
/* El logo de la portada va incrustado (4 KB de trazado dentro del HTML). En las demás
   páginas se usa `sitio/marca/interagentic.svg`: una sola copia de la marca para todo el
   sitio, cacheada entre navegaciones y pintada con `background: currentColor` a través de
   la máscara, así que hereda el color del tema sin necesidad de un archivo por tema.
   `mask` usa el ALFA del SVG: el color del archivo da igual.
   PENDIENTE: unificar la portada a esta forma (una línea de HTML). */
span.marca__logo {
  display: block; aspect-ratio: 856 / 259;
  background-color: currentColor;
  -webkit-mask: url(../marca/interagentic.svg) no-repeat left center / contain;
  mask: url(../marca/interagentic.svg) no-repeat left center / contain;
}
/* Tamaño del logo, con la cuenta a la vista: en el lockup el wordmark ocupa solo el 44 % de
   la altura del lienzo (medido: 115 de 259), así que a 25 px las letras salían a 11 px de
   caja y a unos 6 px de altura real — la mitad que el texto del menú, que es 15 px. Por eso
   se veía pequeño aunque el hueco estuviera lleno: el problema no era el tamaño de la caja,
   era la proporción del lockup. A 38 px el wordmark mide 16.9 px y sus mayúsculas 9.2 px,
   comparable al menú. */
.marca__logo { height: 28px; width: auto; }
.barra .marca__logo { height: 38px; }   /* en la barra, donde compite con el menú */

.nav { display: flex; gap: 28px; margin-inline-start: 20px; }
.nav a {
  color: var(--tinta-2); text-decoration: none; font-size: 15px; font-weight: 500;
  padding-block: 4px; position: relative;
  transition: color var(--rapido) var(--curva);
}
.nav a::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 2px;
  background: var(--acento); transform: scaleX(0); transform-origin: left;
  transition: transform var(--medio) var(--curva);
}
.nav a:hover { color: var(--tinta); }
.nav a:hover::after { transform: scaleX(1); }

.barra__acciones { margin-inline-start: auto; display: flex; align-items: center; gap: 12px; }

/* -------------------------------------------------------------- botones ---- */
.boton {
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  padding: 12px 22px; border-radius: var(--r-boton); border: 1px solid transparent;
  font-family: inherit; font-size: 15px; font-weight: 600; line-height: 1;
  text-decoration: none; white-space: nowrap; cursor: pointer;
  transition: background-color var(--rapido) var(--curva), color var(--rapido) var(--curva),
              border-color var(--rapido) var(--curva), transform var(--rapido) var(--curva),
              box-shadow var(--rapido) var(--curva);
}
.boton:active { transform: scale(.98); }   /* respuesta táctil (§4.5) */
.icono { width: 18px; height: 18px; fill: currentColor; }

.boton--primario { background: var(--acento-campo); color: #fff; }
.boton--primario:hover { background: color-mix(in srgb, var(--acento-campo) 86%, #000); }

.boton--contorno { background: transparent; color: var(--tinta); border-color: var(--linea-2); }
.boton--contorno:hover { background: var(--acento-suave); border-color: var(--acento); color: var(--acento-texto); }

.boton--claro { background: #fff; color: #0b3f7d; }
.boton--claro:hover { background: color-mix(in srgb, #fff 88%, var(--acento)); }

/* Hamburguesa: solo existe por debajo de 1024px */
.hamburguesa {
  display: none; width: 42px; height: 42px; padding: 0;
  background: transparent; border: 1px solid var(--linea-2); border-radius: var(--r-boton);
  cursor: pointer; position: relative;
}
.hamburguesa span {
  position: absolute; left: 11px; right: 11px; height: 2px; background: var(--tinta);
  border-radius: 2px; transition: transform var(--medio) var(--curva), opacity var(--rapido) var(--curva);
}
.hamburguesa span:nth-child(1) { transform: translateY(-4px); }
.hamburguesa span:nth-child(2) { transform: translateY(4px); }
.hamburguesa[aria-expanded="true"] span:nth-child(1) { transform: rotate(45deg); }
.hamburguesa[aria-expanded="true"] span:nth-child(2) { transform: rotate(-45deg); }

/* -------------------------------------------------- interruptor de tema ---- */
/* Mismo lenguaje que la hamburguesa: pill de 42px con borde. Al ser un <button> real,
   entra en el orden de tabulación y responde a teclado sin trabajo extra. */
.tema {
  flex: none; width: 42px; height: 42px; padding: 0;
  display: inline-grid; place-items: center;
  background: transparent; border: 1px solid var(--linea-2); border-radius: var(--r-boton);
  color: var(--tinta-2); cursor: pointer;
  transition: color var(--rapido) var(--curva), border-color var(--rapido) var(--curva),
              background-color var(--rapido) var(--curva);
}
.tema:hover { color: var(--tinta); border-color: var(--acento); background: var(--acento-suave); }

/* Los dos iconos comparten celda y se intercambian con opacity + rotate, NUNCA con
   `display`: así no hay salto de maquetación y el navegador solo compone. */
.tema__icono {
  grid-area: 1 / 1; width: 19px; height: 19px;
  fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round;
  transition: opacity var(--medio) var(--curva), transform var(--medio) var(--curva);
}
/* Estado de partida: tema claro, así que se ofrece la luna. */
.tema__icono--sol { opacity: 0; transform: rotate(40deg) scale(.7); }

/* Cuál se pinta se deduce en CSS (atributo en la raíz o preferencia del sistema) y no en
   JavaScript: de otro modo el botón saldría con el icono equivocado hasta que corre el guion. */
html[data-tema="oscuro"] .tema__icono--sol { opacity: 1; transform: none; }
html[data-tema="oscuro"] .tema__icono--luna { opacity: 0; transform: rotate(-40deg) scale(.7); }
@media (prefers-color-scheme: dark) {
  html:not([data-tema="claro"]) .tema__icono--sol { opacity: 1; transform: none; }
  html:not([data-tema="claro"]) .tema__icono--luna { opacity: 0; transform: rotate(-40deg) scale(.7); }
}

/* ------------------------------------------------------- texto y enlaces --- */
.etiqueta {
  font-family: var(--mono); font-size: 12.5px; font-weight: 500;
  letter-spacing: .12em; text-transform: uppercase; color: var(--acento-texto);
  margin-bottom: 18px;
}
.enlace {
  display: inline-flex; align-items: center; gap: 8px;
  color: var(--acento-texto); font-weight: 600; font-size: 15px; text-decoration: none;
}
.enlace::after { content: ""; }
.enlace .flecha { transition: transform var(--medio) var(--curva); }
.enlace:hover .flecha { transform: translateX(4px); }
.enlace:hover { text-decoration: underline; text-underline-offset: 4px; }
.enlace--claro { color: #fff; }

/* --------------------------------------------------------------- hero ------ */
.hero { padding-top: 56px; }   /* tope de 6rem: más y el hero flota en medio de la pantalla */

.hero__rejilla {
  display: grid; grid-template-columns: 7fr 5fr; gap: 56px; align-items: center;
  min-height: min(72vh, 620px);
}
.hero__titulo { font-size: clamp(2.4rem, 5.4vw, 4.1rem); }
/* La escala de la portada está calibrada para un titular de 35 caracteres. El de producto
   es más largo y con la misma medida se iba a CUATRO líneas y empujaba los botones fuera
   de la primera pantalla: la escala se ajusta a la longitud, no al revés. */
.hero__titulo--producto { font-size: clamp(2rem, 4.3vw, 3.3rem); }
/* Centrado, con una conversación de 815px de alto el texto queda flotando en medio de la
   columna y deja 370px muertos arriba. Alineado al tope, el titular manda. */
.hero--producto .hero__rejilla { align-items: start; }
.hero__titulo em { font-style: italic; color: var(--acento-texto); }
.hero__entrada { margin-top: 22px; font-size: 19px; color: var(--tinta-2); max-width: 46ch; }
.hero__cta { margin-top: 32px; display: flex; flex-wrap: wrap; gap: 12px; }

.hero__grafico { display: flex; justify-content: center; }
.grafico { width: min(100%, 460px); height: auto; }

/* La identidad: la marca se arma al cargar y después respira. Una sola pieza en
   movimiento —el resto del hero está quieto— porque dos animaciones compitiendo
   no son jerarquía, son ruido. */
.grafico__plano--alto { animation: plano-alto var(--lento) var(--curva) both; }
.grafico__plano--bajo { animation: plano-bajo var(--lento) var(--curva) 120ms both; }
.grafico__ecos { animation: aparecer 900ms var(--curva) 260ms both; }
.grafico__nodos { animation: aparecer 700ms var(--curva) 420ms both; }
.grafico__nodos > g { animation: derivar 14s ease-in-out 1.4s infinite; transform-origin: 340px 340px; }

@keyframes plano-alto { from { opacity: 0; transform: translateY(-26px); } to { opacity: 1; transform: none; } }
@keyframes plano-bajo { from { opacity: 0; transform: translateY(26px); } to { opacity: 1; transform: none; } }
@keyframes aparecer { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
@keyframes derivar { 0%, 100% { transform: translate(0, 0); } 50% { transform: translate(-6px, -8px); } }

.confianza {
  display: flex; flex-wrap: wrap; gap: 14px 28px; margin-top: 48px; padding-top: 22px;
  border-top: 1px solid var(--linea);
  font-family: var(--mono); font-size: 13px; color: var(--tinta-3);
}
.confianza li { position: relative; padding-inline-start: 18px; }
.confianza li::before {
  content: ""; position: absolute; left: 0; top: 50%; width: 6px; height: 6px;
  background: var(--acento); border-radius: 2px; transform: translateY(-50%) rotate(45deg);
}

/* ------------------------------------------------------------ secciones ---- */
.seccion { padding-block: var(--seccion); }
.seccion__cabecera { max-width: 620px; margin-bottom: 56px; }
.seccion__cabecera h2 { font-size: clamp(1.9rem, 3.4vw, 2.7rem); }

/* ---------------------------------------------------------------- bento ---- */
/* Con jerarquía: el producto estrella en un campo azul grande y el resto agrupado
   con líneas. Una rejilla uniforme de 5 tarjetas iguales no dice qué importa. */
.bento { display: grid; grid-template-columns: 5fr 7fr; gap: 32px; align-items: start; }

.destacado {
  display: block; padding: 40px; border-radius: var(--r-panel);
  background: var(--acento-campo); color: #fff; text-decoration: none;
  /* Se queda pegada mientras se leen las capacidades: con seis filas al lado, la columna
     izquierda dejaba 331 px de hueco muerto. De paso mantiene el producto a la vista
     justo mientras se compara con todo lo demás. */
  position: sticky; top: calc(var(--alto-barra) + 24px);
  transition: transform var(--medio) var(--curva), box-shadow var(--medio) var(--curva);
}
.destacado:hover { transform: translateY(-3px); box-shadow: 0 18px 40px -24px color-mix(in srgb, var(--acento-campo) 70%, transparent); }
.destacado__etiqueta { font-family: var(--mono); font-size: 12px; letter-spacing: .12em; text-transform: uppercase; opacity: .8; margin-bottom: 14px; }
.destacado h3 { font-size: 1.7rem; margin-bottom: 12px; }
.destacado p { color: color-mix(in srgb, #fff 88%, transparent); }
.destacado .enlace { color: #fff; margin-top: 26px; }

.capacidades { border-top: 1px solid var(--linea); }
.capacidad { padding: 22px 0; border-bottom: 1px solid var(--linea); display: grid; grid-template-columns: 220px 1fr; gap: 24px; align-items: baseline; }
.capacidad h3 { font-size: 1.06rem; }
.capacidad p { color: var(--tinta-2); font-size: 15.5px; }

.otros { margin-top: 40px; color: var(--tinta-2); display: flex; gap: 10px; flex-wrap: wrap; }

/* ------------------------------------------------- pila pegajosa (pasos) --- */
/* CSS puro: cada panel se queda pegado arriba y el siguiente lo tapa. El `top`
   escalona para que se vean los cantos de los anteriores: eso es lo que lee como
   pila y no como lista. Cero JavaScript. */
.pila { max-width: var(--ancho); margin-inline: auto; padding-inline: var(--gutter); }
.pila__panel {
  position: sticky; top: calc(var(--alto-barra) + 20px);
  background: var(--base-2); border: 1px solid var(--linea); border-radius: var(--r-panel);
  padding: 34px 40px; margin-bottom: 18px;
  /* 48px para el número, un ancho acotado para el título y el texto a continuación.
     Con `auto 1fr auto` el texto se iba al extremo derecho y quedaba a 500px de su
     título: se leía como fila de tabla, no como paso. */
  display: grid; grid-template-columns: 48px minmax(150px, 210px) 1fr; gap: 24px; align-items: baseline;
}
.pila__panel:nth-child(1) { top: calc(var(--alto-barra) + 20px); }
.pila__panel:nth-child(2) { top: calc(var(--alto-barra) + 42px); }
.pila__panel:nth-child(3) { top: calc(var(--alto-barra) + 64px); }
.pila__panel:nth-child(4) { top: calc(var(--alto-barra) + 86px); }
.pila__panel--ultimo { background: var(--acento-campo); border-color: transparent; color: #fff; }
.pila__panel--ultimo p { color: color-mix(in srgb, #fff 86%, transparent); }
.pila__num { font-family: var(--mono); font-size: 13px; color: var(--acento-texto); letter-spacing: .1em; }
.pila__panel--ultimo .pila__num { color: color-mix(in srgb, #fff 75%, transparent); }
.pila__panel h3 { font-size: 1.35rem; margin-bottom: 6px; }
.pila__panel p { color: var(--tinta-2); max-width: 52ch; }

/* Cuando el navegador soporta animaciones de scroll nativas, el panel tapado se
   encoge un poco: refuerza la sensación de profundidad sin una línea de JS. */
@supports (animation-timeline: view()) {
  .pila__panel:not(.pila__panel--ultimo) {
    animation: encoger linear both;
    animation-timeline: view();
    animation-range: exit-crossing 0% exit-crossing 100%;
  }
  @keyframes encoger { to { transform: scale(.965); } }
}

/* ------------------------------------------------------------- fundador ---- */
/* La imagen del bloque es la misma `estampa` de la página de Nosotros. Aquí vivía
   `.fundador__retrato`, que era el hueco con la palabra «Foto» dentro: el último marcador
   que quedaba en el sitio, y ya no queda ninguno. */
.fundador { display: grid; grid-template-columns: 340px 1fr; gap: 56px; align-items: start; }
.fundador__texto h2 { font-size: clamp(1.7rem, 3vw, 2.3rem); }
.fundador__rol { color: var(--acento-texto); font-weight: 600; margin: 8px 0 20px; }
.fundador__texto p + .enlace { margin-top: 26px; }

/* ------------------------------------------------------------------ faq ---- */
.faq { border-top: 1px solid var(--linea); }
.faq details { border-bottom: 1px solid var(--linea); }
.faq summary {
  cursor: pointer; list-style: none; padding: 22px 0;
  font-weight: 600; font-size: 1.06rem; display: flex; align-items: center; justify-content: space-between; gap: 16px;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after {
  content: "+"; font-family: var(--mono); color: var(--acento-texto); font-size: 20px;
  transition: transform var(--medio) var(--curva);
}
.faq details[open] summary::after { transform: rotate(45deg); }
.faq p { padding-bottom: 24px; color: var(--tinta-2); max-width: 68ch; }

/* ---------------------------------------------------------------- cierre --- */
/* La sección anterior ya termina con una línea: 104px arriba más otros 104 abajo dejaban
   un hueco muerto de más de 200px antes del cierre. */
.cierre { padding-block: 56px var(--seccion); }
.cierre__caja {
  background: var(--acento-campo); color: #fff; border-radius: 24px;
  padding: clamp(40px, 6vw, 72px);
}
.cierre__caja h2 { font-size: clamp(1.9rem, 3.6vw, 3rem); max-width: 22ch; }
.cierre__caja p { margin-top: 18px; color: color-mix(in srgb, #fff 86%, transparent); max-width: 52ch; }
.cierre__cta { margin-top: 32px; display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
/* El dato de contacto, además del enlace: en mono y con su propia línea, para que se pueda
   copiar a mano sin depender de que el enlace abra la app. */
.cierre__dato {
  margin-top: 30px; padding-top: 20px;
  border-top: 1px solid color-mix(in srgb, #fff 24%, transparent);
  font-family: var(--mono); font-size: 13px;
  color: color-mix(in srgb, #fff 80%, transparent);
}

/* ------------------------------------------------------------------ pie ---- */
.pie { border-top: 1px solid var(--linea); padding-top: 64px; }
.pie__rejilla { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 40px; }
.pie__marca p { margin-top: 18px; color: var(--tinta-3); font-size: 14px; }
.pie__col h3 { font-family: var(--mono); font-size: 12px; letter-spacing: .12em; text-transform: uppercase; color: var(--tinta-3); margin-bottom: 16px; font-weight: 500; }
.pie__col a { display: block; color: var(--tinta-2); text-decoration: none; font-size: 15px; padding-block: 5px; }
.pie__col a:hover { color: var(--acento-texto); }
.pie__abajo {
  margin-top: 56px; padding-block: 24px; border-top: 1px solid var(--linea);
  display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  font-size: 14px; color: var(--tinta-3);
}
/* Los dos números van ETIQUETADOS. Hasta ahora el pie los daba desnudos y son cosas distintas:
   uno contesta solo, el otro es una persona. Quien buscaba «cómo contacto a esta gente» no
   podía saber cuál era cuál, y escribirle al bot queriendo hablar con alguien es una
   conversación perdida antes de empezar. */
.pie__tel { display: flex; gap: 24px; flex-wrap: wrap; }
.pie__tel > span { display: flex; align-items: baseline; gap: 8px; }
.pie__rol {
  font-family: var(--mono); font-size: 11px; letter-spacing: .06em;
  text-transform: uppercase; color: var(--tinta-3);
}
.pie__tel a { color: var(--tinta-2); text-decoration: none; }
.pie__tel a:hover { color: var(--acento-texto); }

/* --------------------------------------------------------------- revelar --- */
/* Entrada al viewport con IntersectionObserver (NUNCA escuchando scroll, §5.D).
   Se revela UNA vez: volver a animar al subir es fatigante, no elegante. */
.revelar {
  opacity: 0; transform: translateY(20px);
  transition: opacity var(--lento) var(--curva), transform var(--lento) var(--curva);
  transition-delay: calc(var(--d, 0) * 70ms);
}
.revelar[data-visible] { opacity: 1; transform: none; }

/* Escalonado dentro de un grupo: la secuencia cuenta algo (importancia), no adorno */
.capacidad:nth-child(1) { --d: 0; }
.capacidad:nth-child(2) { --d: 1; }
.capacidad:nth-child(3) { --d: 2; }
.capacidad:nth-child(4) { --d: 3; }
.capacidad:nth-child(5) { --d: 4; }
.capacidad:nth-child(6) { --d: 5; }
.capacidad:nth-child(7) { --d: 6; }
.capacidad:nth-child(8) { --d: 7; }
.capacidad:nth-child(9) { --d: 8; }

/* ============================================================================
   CONVERSACIÓN DE EJEMPLO (página de producto)

   El producto no se explica con una ilustración: se explica con la conversación.
   El panel imita el canal que el cliente ya conoce —izquierda quien escribe,
   derecha el agente— pero pintado con nuestro azul, no con el verde de la app: es
   nuestra marca atendiéndote, no una captura de pantalla de WhatsApp.
   ========================================================================= */
.chat {
  width: min(100%, 400px); margin-inline: auto; overflow: hidden;
  background: var(--base-2); border: 1px solid var(--linea); border-radius: var(--r-panel);
  box-shadow: 0 32px 64px -46px rgba(0, 0, 0, .55);
}
.chat__cabecera {
  display: flex; align-items: center; gap: 12px; padding: 14px 18px;
  background: var(--base-3); border-bottom: 1px solid var(--linea);
}
.chat__avatar {
  flex: none; width: 36px; height: 36px; border-radius: 11px;
  background: var(--acento-campo); color: #fff; display: grid; place-items: center;
}
.chat__avatar svg { height: 19px; width: auto; }
.chat__quien { font-size: 14.5px; font-weight: 600; line-height: 1.3; }
.chat__estado {
  display: flex; align-items: center; gap: 6px;
  font-family: var(--mono); font-size: 11.5px; color: var(--tinta-3);
}
.chat__estado::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--acento); }
.chat__hilo { display: grid; gap: 10px; padding: 22px 18px; }
.chat__pie {
  padding: 12px 18px; border-top: 1px solid var(--linea);
  font-family: var(--mono); font-size: 11.5px; color: var(--tinta-3);
}

.burbuja {
  justify-self: start; max-width: 86%;
  padding: 11px 15px; border-radius: 14px;
  background: var(--base); border: 1px solid var(--linea);
  font-size: 15px; line-height: 1.5;
}
.burbuja--agente { justify-self: end; background: var(--acento-campo); color: #fff; border-color: transparent; }
.burbuja__hora { display: block; margin-top: 5px; font-family: var(--mono); font-size: 11px; opacity: .68; }
.burbuja--agente .burbuja__hora { color: color-mix(in srgb, #fff 84%, transparent); }

/* La conversación entra burbuja a burbuja: se lee como algo que está pasando, no como
   una captura. La animación SOLO se declara aquí, con el estado inicial en los keyframes
   y sin `opacity: 0` en la regla base: así, si el guion no corre, las burbujas se ven —
   esconder contenido que depende de JavaScript es convertir una mejora en un fallo. */
.burbuja { animation: burbuja-entra 420ms var(--curva) both; animation-delay: calc(180ms + var(--d, 0) * 90ms); }
@keyframes burbuja-entra { from { opacity: 0; transform: translateY(10px) scale(.98); } }
.chat__hilo > :nth-child(1) { --d: 0; }
.chat__hilo > :nth-child(2) { --d: 1; }
.chat__hilo > :nth-child(3) { --d: 2; }
.chat__hilo > :nth-child(4) { --d: 3; }
.chat__hilo > :nth-child(5) { --d: 4; }
.chat__hilo > :nth-child(6) { --d: 5; }
.chat__hilo > :nth-child(7) { --d: 6; }
.chat__hilo > :nth-child(8) { --d: 7; }

/* ------------------------------------------- ficha técnica del producto ---- */
/* Forma distinta a la de «lo que hace» a propósito: clave en mono y valor al lado, como
   una hoja de especificaciones. Repetir la misma lista de filas dos veces seguidas
   convierte dos secciones en una sola que se lee dos veces. */
.ficha { display: grid; grid-template-columns: 5fr 7fr; gap: 56px; align-items: start; }
.ficha__lista { border-top: 1px solid var(--linea); }
.ficha__fila {
  display: grid; grid-template-columns: 190px 1fr; gap: 24px; align-items: baseline;
  padding: 15px 0; border-bottom: 1px solid var(--linea);
}
.ficha__clave {
  font-family: var(--mono); font-size: 12px; letter-spacing: .06em;
  text-transform: uppercase; color: var(--tinta-3);
}
.ficha__valor { margin: 0; color: var(--tinta-2); font-size: 15.5px; }
.ficha__intro { margin-top: 18px; color: var(--tinta-2); }

/* -------------------------------------------------------------- límites ---- */
/* Los límites se muestran, no se esconden: un agente del que conoces el borde es más
   útil que uno que promete todo. Panel propio para que no se confunda con una lista
   de ventajas más. */
.limites {
  background: var(--base-2); border: 1px solid var(--linea);
  border-radius: var(--r-panel); padding: 36px 40px;
}
.limites h3 { font-size: 1.15rem; margin-bottom: 18px; }
.limites ul { display: grid; gap: 14px; }
.limites li { position: relative; padding-inline-start: 26px; color: var(--tinta-2); font-size: 15.5px; }
.limites li::before {
  content: ""; position: absolute; inset-inline-start: 0; top: .72em;
  width: 11px; height: 2px; background: var(--tinta-3);
}

/* --------------------------------------------- índice del hero (servicios) --- */
/* El hueco del gráfico lo ocupa el ÍNDICE: siete líneas en mono que además son navegación
   real hacia cada servicio. Es la única ilustración que sirve para algo en esta página. */
.indice { width: 100%; border-top: 1px solid var(--linea); }
.indice__item {
  display: flex; align-items: baseline; gap: 14px;
  padding: 11px 0; border-bottom: 1px solid var(--linea);
  color: var(--tinta-2); text-decoration: none; font-size: 15.5px;
  transition: color var(--rapido) var(--curva);
}
.indice__item:hover { color: var(--acento-texto); }
/* En el hero de servicios el índice es la única pieza de su columna; en la página de error va
   debajo del párrafo y necesita separarse. */
.indice--separado { margin-top: 40px; }
.indice__num { flex: none; font-family: var(--mono); font-size: 12px; color: var(--tinta-3); }
.indice__item:hover .indice__num { color: var(--acento-texto); }

/* ------------------------------------------------- los siete servicios ---- */
/* Editorial, no tarjetas: número, título y texto en tres columnas con una línea fina
   entre cada uno. Repetir la fila de «capacidad» de la portada haría que dos páginas
   distintas se leyeran igual — que es lo contrario de tener un sistema. */
.servicios { border-top: 1px solid var(--linea); }
.servicio {
  display: grid; grid-template-columns: 56px 1fr 1.15fr; gap: 28px; align-items: start;
  padding: 36px 0; border-bottom: 1px solid var(--linea);
}
.servicio__num { padding-top: 5px; font-family: var(--mono); font-size: 13px; color: var(--acento-texto); }
.servicio h3 { font-size: 1.28rem; max-width: 22ch; }
.servicio p { color: var(--tinta-2); font-size: 16px; }

/* --------------------------------------------------- banda de principios --- */
/* A sangre, no en caja: la banda azul de la portada ya es una caja redondeada, y repetir
   la misma forma en la misma página le quita el acento en vez de dárselo. */
.principios { background: var(--acento-campo); color: #fff; padding-block: 76px; }
.principios__rejilla { display: grid; grid-template-columns: repeat(3, 1fr); gap: 44px; }
.principios h3 {
  margin-bottom: 12px; font-family: var(--mono); font-size: 12.5px; font-weight: 500;
  letter-spacing: .12em; text-transform: uppercase; opacity: .8;
}
.principios p { font-size: 1.05rem; color: color-mix(in srgb, #fff 92%, transparent); }

/* ------------------------------------------------ layout editorial (2 col) --- */
/* Etiqueta/título a la izquierda, texto a la derecha. Es la forma de las secciones que
   no son listas ni rejillas: dos columnas y aire. */
.editorial { display: grid; grid-template-columns: 5fr 7fr; gap: 56px; align-items: start; }
.editorial__texto p { color: var(--tinta-2); }
.editorial__texto p + p { margin-top: 18px; }

/* ------------------------------------------------------ estampa (nosotros) --- */
/* El dueño no quiso foto suya: prefirió algo más ambiguo, y eligió el Cerro de la Silla.
   Va DIBUJADO, no fotografiado: un plano lleno con su eco detrás —el mismo recurso del
   hero de la portada— así que no hay derechos que negociar, pesa lo que un párrafo y se
   ve nítido en cualquier pantalla y en los dos temas. Se llamaba `retrato` cuando el hueco
   esperaba una cara: el nombre mentía en cuanto dejó de serlo. */
.estampa {
  display: grid; grid-template-rows: 1fr auto;
  width: min(100%, 380px); aspect-ratio: 1; margin-inline: auto; overflow: hidden;
  background: var(--base-2); border: 1px solid var(--linea); border-radius: var(--r-panel);
}
.estampa__dibujo { width: 100%; height: 100%; }
/* La estampa va en MONOCROMO, no en azul. El sitio ya gasta el azul en el botón de la barra,
   en la banda de principios, en el campo del cierre y en la tarjeta del producto: una
   silueta pintada con el color del texto se lee como una fotografía en blanco y negro y
   deja el acento para lo que se pulsa. Llevaba una loma de fondo y se quitó: solo asomaba
   por las esquinas inferiores como dos manchas, porque la sierra ocupa casi todo el ancho. */
.estampa__sierra { fill: var(--tinta); }
.estampa__pie {
  padding: 0 20px 18px; font-family: var(--mono); font-size: 11px;
  letter-spacing: .1em; text-transform: uppercase; color: var(--tinta-3);
}

/* ------------------------------------------------------------- rejilla --- */
/* Tarjetas para lo que se explica mejor por piezas sueltas que por una lista corrida:
   cada panel del producto es una capacidad independiente y no tiene orden de lectura. */
.rejilla { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.tarjeta {
  padding: 26px; background: var(--base-2);
  border: 1px solid var(--linea); border-radius: var(--r-panel);
}
.tarjeta h3 { margin-bottom: 8px; font-size: 1.04rem; }
.tarjeta p { color: var(--tinta-2); font-size: 15px; }

/* ------------------------------------------------------------ responsive --- */
@media (max-width: 1024px) {
  :root { --seccion: 76px; }
  .nav {
    position: fixed; inset: var(--alto-barra) 0 auto 0;
    flex-direction: column; gap: 0; margin: 0; padding: 12px var(--gutter) 22px;
    background: var(--base); border-bottom: 1px solid var(--linea);
    transform: translateY(-8px); opacity: 0; pointer-events: none;
    transition: opacity var(--medio) var(--curva), transform var(--medio) var(--curva);
  }
  .nav[data-abierto] { opacity: 1; transform: none; pointer-events: auto; }
  .nav a { padding: 15px 0; border-bottom: 1px solid var(--linea); font-size: 17px; }
  .nav a::after { display: none; }
  .hamburguesa { display: block; }
  .barra__cta { display: none; }   /* en móvil el CTA vive dentro del menú */

  .hero__rejilla { grid-template-columns: 1fr; gap: 40px; min-height: 0; }
  .hero__grafico { order: -1; }
  /* En la portada el gráfico es un SVG de 340px y va primero: se ve. En la página de
     producto el gráfico es la conversación y mide ~700px, así que si fuera primero dejaría
     el titular FUERA de la primera pantalla y el visitante aterrizaría en un chat sin saber
     de qué es. En una columna manda el texto; la conversación va justo debajo. */
  .hero--producto .hero__grafico { order: 0; }
  /* Mismo motivo en servicios: el índice son siete líneas de lista, no un gráfico que
     se explique solo. Primero el titular. */
  .hero--servicios .hero__grafico { order: 0; }
  /* Y en nosotros: con el retrato primero, «Escribirme por WhatsApp» quedaba a 855 px con
     una pantalla de 844 — justo fuera. Con el texto primero entran el titular, los botones
     Y el retrato en la misma pantalla. */
  .hero--nosotros .hero__grafico { order: 0; }
  .grafico { width: min(100%, 340px); }
  .fundador { grid-template-columns: 1fr; gap: 32px; }
  .fundador .estampa { max-width: 260px; }
  .pie__rejilla { grid-template-columns: 1fr 1fr; gap: 32px; }
  .rejilla { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 860px) {
  .bento { grid-template-columns: 1fr; }
  /* En una columna la tarjeta no puede quedarse pegada: las filas de abajo pasarían por
     encima y taparían el texto. */
  .destacado { position: static; }
  .capacidad { grid-template-columns: 1fr; gap: 6px; }
  .pila__panel { grid-template-columns: 40px 1fr; padding: 26px; }
  .pila__panel p { grid-column: 2; }
  .ficha { grid-template-columns: 1fr; gap: 32px; }
  .ficha__fila { grid-template-columns: 1fr; gap: 2px; padding: 14px 0; }
  .limites { padding: 28px; }
  .servicio { grid-template-columns: 40px 1fr; gap: 20px; padding: 28px 0; }
  .servicio p { grid-column: 2; }
  .principios { padding-block: 56px; }
  .principios__rejilla { grid-template-columns: 1fr; gap: 28px; }
  .editorial { grid-template-columns: 1fr; gap: 28px; }
  .estampa { width: min(100%, 240px); }
  .rejilla { grid-template-columns: 1fr; gap: 14px; }
  .tarjeta { padding: 22px; }
}

@media (max-width: 560px) {
  :root { --gutter: 20px; --seccion: 62px; }
  body { font-size: 16px; }
  .hero { padding-top: 34px; }
  .hero__cta .boton { width: 100%; }
  .confianza { font-size: 12px; gap: 10px 18px; }
  .destacado { padding: 28px; }
  .cierre__caja { border-radius: var(--r-panel); }
  .pie__rejilla { grid-template-columns: 1fr; }
}

/* --------------------------------------------- movimiento reducido (§6.B) --- */
/* No es un detalle de cortesía: quien lo pide suele ser por mareo o vértigo.
   Con la preferencia activa, todo aparece ya colocado y nada late. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    transition-delay: 0ms !important;
  }
  .revelar { opacity: 1 !important; transform: none !important; }
  .grafico__plano--alto, .grafico__plano--bajo, .grafico__ecos, .grafico__nodos,
  .grafico__nodos > g { animation: none !important; }
}
