/* //cambio: estilos de la landing FAL. CSS plano — se sirve directo via wp_enqueue_style.
   Se carga solo en page-fal.php. Clases coinciden con partials de inc/fal/*.php.
   Variables en :root (NO en .page-template-* — body_class() puede no estar disponible).
   Valores extraídos del mockup aprobado. */

/* //cambio: CRÍTICO — el tema GST escala el font-size base del <html> de forma fluida
   (app.css: `font-size: clamp(5px, 180px, 23 * 100vw/var(--size))` → a 1536px = 18.4px,
   no 16px). Eso infla TODOS los rem de esta landing ×1.15 y rompe medidas extraídas del
   mockup — ej. las 4 stat-cards de la calculadora (15.1875rem c/u) dejan de entrar en una
   fila. El mockup usa 16px fijo + clamps internos para el responsive, así que acá fijamos
   16px. fal.css se encola SOLO en page-fal.php (is_page_template), por lo que esto NO afecta
   otras páginas del sitio. Verificado en dev: calculadora ok (4 cards en fila) y footer
   corporativo intacto. */
/* //cambio: fix 6 auditoría — dist/css/app.css declara html{letter-spacing:-.04em} y acá solo
   se reseteaba el font-size: TODO el cuerpo de FAL quedaba -0.8px/carácter más apretado que el
   diseño. La prueba de que era un olvido: .stat-desc y .gestion-check-item-desc ya lo
   corregían a mano. Los títulos con tracking propio declaran el suyo y no se ven afectados. */
html { font-size: 16px; letter-spacing: normal; }

/* ============================================================
   RESET BOOTSTRAP — Bootstrap CDN se carga después de app.css y pisa estilos del nav.
   Restauramos text-decoration y color del header del tema.
   ============================================================ */
.header a,
.header .menu-item a,
.header .menu a {
  text-decoration: none;
  color: inherit;
}

/* //cambio: mismo problema en el footer corporativo — Bootstrap le mete su color azul
   (#0d6efd) + underline. El tema lo quiere blanco sin subrayado (footer oscuro). Los links
   están anidados (.text-block p a) y hay reglas que le ganan a `footer a`, así que va con
   !important — es un reset scopeado a esta landing para neutralizar Bootstrap (igual criterio
   que el resto de este bloque). Verificado en dev: sin !important no alcanza. */
footer a,
footer a:hover,
footer a:focus {
  text-decoration: none !important;
  color: #fff !important;
}

/* ============================================================
   NAVBAR FAL — portado del mockup (global.css). Navbar de anchors propio
   de la landing. Markup en layout/header-fal.php. JS en src/js/fal.js
   (initNavHighlight resalta .nav-link.active; initSiteHeaderOffset usa .site-header).
   ============================================================ */
.site-header {
  padding: 1rem 0;
  background: var(--color-bg);
  z-index: 1030;
}

/* //cambio: comparación navbar vs Figma (2895:1289) — el Figma es full-bleed: el nav pinta de
   borde a borde del canvas de 1440 y los 80px de padding SON el único margen contra el logo.
   Acá el nav vivía dentro del `.container` corporativo (tope 1320 + su padding propio de
   Bootstrap, ~12px), que le sumaba un gutter extra de afuera. A eso se le sumaba el padding
   propio del navbar-glass: el logo terminaba a ~160px del borde real del viewport en vez de
   los ~80px del Figma (a 1440px de ancho, exactamente el doble). Fix real: sacarle a
   `.site-header .container` el tope y el padding de Bootstrap (ver regla más abajo) para que
   sea el navbar-glass el único responsable del margen, igual que en el diseño. Con eso, los
   80px de acá abajo SÍ son los 80px del Figma. */
.site-header .container {
  max-width: 1440px;
  padding-inline: 0;
}

.navbar-glass {
  background: rgba(255, 255, 255, 0.4);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border-radius: 8px;
  /* //cambio: restaurado a los 80px del Figma (2895:1289) — antes en 48px porque el
     `.container` de Bootstrap topaba en 1296px efectivos y con 80 por lado el bloque de
     links (830px medidos, con el gap de 32 entre ítems) se encimaba con "Contacto". Con el
     fix de `.site-header .container` de arriba el nav dispone de hasta 1440px, así que 80px
     por lado deja ~1280px de contenido — entran logo (123) + links (830) + botón (~140) con
     margen de sobra. */
  /* //cambio (2026-07-29): el navbar se veía demasiado voluminoso. Se saca el override de
     padding —probado en dev por el usuario, así queda bien—. Valor anterior:
     `padding: 32px 80px 24px` (los 80px laterales venían del Figma 2895:1289, ver nota de
     arriba, que se conserva como referencia por si hay que volver).
     No se borra la declaración: se deja explícito el valor que queda al sacar el override, que
     es el default de `.navbar` de Bootstrap 5.3 (`--bs-navbar-padding-y: .5rem` /
     `--bs-navbar-padding-x: 0`). Escribirlo evita que el alto del navbar dependa de un
     default implícito de un CDN externo.
     Sólo afecta al estado desplegado: por debajo manda `@media (max-width: 1199.98px)`, que
     redefine este padding a `0 20px` con `min-height: 90px`.
     Nada que actualizar a mano: initSiteHeaderOffset (fal.js) recalcula `--site-header-height`
     desde `header.offsetHeight`, así que el scroll-margin-top de los anchors y el panel mobile
     se reajustan solos.
     Efecto lateral BUENO: liberó los 160px laterales, que es justo el espacio que faltaba para
     bajar el breakpoint del navbar a -xl (ver problema del zoom al 90%). Ese cambio se hizo
     acto seguido, el mismo día — por eso los umbrales de esta nota ya son los nuevos (1200),
     no los 1400 que había cuando se escribió. */
  /* //cambio (2026-07-29, posterior): vuelve un padding lateral, pero de 24px. Valor anterior:
     `padding: 0.5rem 0`. Con 0 el logo y el botón "Contacto" quedaban pegados al borde del
     viewport en cualquier ancho menor a 1440 (reportado a 125% de zoom): abajo de ese ancho
     `.site-header .container` ya no topa en su max-width, el panel pasa a ser full-bleed y sin
     padding no queda ningún respiro. Arriba de 1440 no se veía porque el max-width deja aire.
     Por qué 24 y no los 80 del Figma: el presupuesto horizontal a 1200px de viewport es
     1200 - 2×padding, y el contenido mide ~1093 (logo 123 + links 830 + botón ~140). Con 80
     por lado quedan 1040 y NO entra —era exactamente el motivo por el que el navbar estaba en
     -xxl—. Con 24 quedan 1152, entra con ~59px de sobra. El alto no se toca: sigue en 0.5rem,
     que es como quedó aprobado. */
  padding: 0.5rem 24px;
}

/* //cambio (2026-07-29): a partir de 1440px se recuperan los 80px laterales del Figma
   (2895:1289). Ahí el panel ya topa en `max-width: 1440px`, así que el espacio disponible deja
   de depender del viewport y el presupuesto es siempre 1440 - 160 = 1280 contra los ~1093 que
   mide el contenido: entra holgado, que es la situación para la que se diseñó el valor.
   O sea: 24px es el gutter de supervivencia del rango 1200-1439, y 80px es el valor de diseño
   donde hay lugar para respetarlo. No colisiona con el `@media (max-width: 1199.98px)` de más
   abajo: los dos rangos son disjuntos. */
@media (min-width: 1440px) {
  .navbar-glass {
    padding: 0.5rem 80px;
  }
}

/* //cambio: separación entre ítems del menú. El Figma distribuye 5 links en 808px con
   space-between (~43px de gap); el markup usaba `gap-lg-3` de Bootstrap (16px), que los
   dejaba apelotonados contra el logo. 32px es lo máximo que entra a 1296px sin solapar.
   Va con !important porque las utilidades `gap-*` de Bootstrap ya lo llevan y le ganarían
   a esta regla aunque sea más específica — mismo criterio que el bloque RESET BOOTSTRAP. */
/* //cambio (2026-07-29): el gap base baja a 20px. Valor anterior: `gap: 32px !important`.
   Los 32px del Figma se conservan, pero pasan al bloque `@media (min-width: 1440px)` de más
   abajo — misma división de dos niveles que ya usa el padding de .navbar-glass: compacto en
   el rango angosto, valor de diseño donde hay lugar.
   Motivo: el contenido del navbar es de tamaño FIJO (~1093px) y a 1200px de viewport sólo
   sobraban 59px. Los links salen de un repeater de ACF (`nav_links`), así que desde el admin
   se puede agregar un sexto link o un texto más largo y romper el layout en silencio. Bajar
   el gap a 20 libera 48px (4 huecos × 12px) en el rango donde está justo.
   Este valor sólo rige entre 1200 y 1439: abajo de 1200 el `@media (max-width: 1199.98px)` lo
   pisa con `gap: 0` (menú vertical). */
.site-header .navbar-nav {
  gap: 20px !important;
}

.navbar-brand img {
  height: 45px;
  width: auto;
}

.nav-link-custom {
  font-family: var(--font-title);
  /* //cambio: sin esto, el navegador pide weight 400 — Cocogoose Pro no tiene cara en 400
     (solo 100/200/300/350/800) y algunos navegadores resuelven esa falta contra la Bold (800). */
  font-weight: var(--font-weight-title);
  /* //cambio (2026-07-29): la fuente base de los links baja a 13px. Valor anterior:
     `font-size: var(--font-size-body-sm)` (= 0.875rem = 14px fijos, es el único tamaño de la
     landing sin clamp()). Los 14px del Figma se conservan y pasan al `@media (min-width:
     1440px)` de abajo, misma división de dos niveles que el gap y el padding.
     1px menos recorta ~7% de los 724px que suman los 5 textos ≈ 52px, que sumados a los 48px
     del gap llevan el colchón a 1200px de 59px a ~159px. Con eso el navbar aguanta un sexto
     link cargado por ACF sin encimarse con "Contacto".
     Va en rem y no en px para no romper el escalado si algún día se saca el
     `html { font-size: 16px }` del principio del archivo. */
  font-size: 0.8125rem;
  /* //cambio: el Figma usa #55585A (= --color-text-muted) en los links del nav, no negro.
     Se reusa la variable existente en vez de hardcodear el hex. */
  color: var(--color-text-muted) !important;
  display: flex;
  align-items: center;
  gap: 7px;
  text-decoration: none;
  /* //cambio: los textos del Figma son largos ("La reforma en tu empresa"); sin nowrap se
     parten en dos líneas y rompen el alto del navbar.
     El padding lateral va con !important porque quien lo impone es
     `.navbar-expand-xxl .navbar-nav .nav-link { padding-inline: var(--bs-navbar-nav-link-padding-x) }`
     de Bootstrap, con especificidad (0,3,0) — le gana a `.nav-link-custom` (0,1,0). Eran 8px
     por lado × 5 links = 80px de más, suficiente para que el menú chocara con el botón. */
  /* //cambio (2026-07-29): el selector de Bootstrap que impone ese padding ahora es
     `.navbar-expand-xl .navbar-nav .nav-link` (el navbar pasó de -xxl a -xl en header-fal.php).
     Sólo se actualiza la referencia del comentario: la especificidad es la misma (0,3,0) y los
     dos `!important` de abajo le siguen ganando igual, así que no hay nada que cambiar en el
     código. Se anota para que la nota de arriba no quede citando un selector que ya no existe
     en la página. */
  white-space: nowrap;
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* //cambio (2026-07-29): segundo nivel del navbar — a partir de 1440px se recuperan los valores
   exactos del Figma (2895:1289) que las reglas de arriba bajaron para sobrevivir al rango
   angosto. A ≥1440 el panel ya topa en su `max-width`, el presupuesto es fijo (1440 - 160 de
   padding = 1280 contra ~1093 de contenido) y no hace falta comprimir nada.
   Es un bloque SEPARADO del `@media (min-width: 1440px)` de más arriba (el del padding de
   .navbar-glass) y tiene que estar acá abajo a propósito: los media queries NO suman
   especificidad, así que un override sólo gana si viene DESPUÉS de la regla que pisa. Puesto
   arriba, `.site-header .navbar-nav { gap: 32px }` perdería contra el `gap: 20px` base aunque
   el media query matchee. Mismo motivo para el font-size.
   Los dos rangos son disjuntos con el `@media (max-width: 1199.98px)` del menú colapsado. */
@media (min-width: 1440px) {
  .site-header .navbar-nav {
    gap: 32px !important;
  }

  .nav-link-custom {
    font-size: var(--font-size-body-sm);
  }
}

.nav-link-custom.active {
  color: var(--color-primary) !important;
  /* //cambio: era 600 — Cocogoose Pro no tiene esa cara (solo 100/200/300/350/800), mismo
     problema ya resuelto para --font-weight-title-semibold. 350 = Semilight, la del Figma. */
  font-weight: var(--font-weight-title-semibold);
}

/* //cambio (2026-07-29): estados hover y pressed de los links del navbar. Antes NO existían:
   el link sólo tenía el gris de reposo, el azul de `.active` (que pone initNavHighlight al
   scrollear, no el click) y el anillo de :focus-visible. Pasar el mouse no daba ninguna señal.

   Jerarquía de tres niveles, para que el hover no se confunda con la sección actual:
     reposo  → --color-text-muted        (#55585a, Figma)
     hover   → --color-text-muted-strong (#313436, el mismo gris más oscuro)
     activo  → --color-primary           (#003da0, sección en pantalla)

   Dos detalles de implementación que NO son opcionales:

   1. `!important`. La regla base declara `color: ... !important` (por el reset de Bootstrap),
      y !important le gana a CUALQUIER especificidad sin !important. Sin esto el hover no se
      vería, por más específico que fuera el selector.

   2. `:not(.active)`. Sin él, pasar el mouse por el link de la sección en la que ya estás lo
      volvería GRIS —perdería el azul—, que es exactamente al revés de lo que se espera.
      Se resuelve en el selector y no por orden de reglas, para que no se rompa si alguien
      mueve este bloque de lugar más adelante.

   `:active` es el pressed real del navegador: pinta mientras el botón del mouse está apretado.
   Al soltar, el scroll llega a la sección e initNavHighlight deja el `.active` puesto — así
   que el azul del click empalma con el azul del estado activo sin parpadeo. */
.nav-link-custom {
  transition: color 0.2s ease;
}

.nav-link-custom:not(.active):hover {
  color: var(--color-text-muted-strong) !important;
}

.nav-link-custom:active {
  color: var(--color-primary) !important;
}

/* //cambio: fix 5 auditoría — al tabular el navbar aparecía el halo #0d6efd default de
   Bootstrap, ajeno a la paleta FAL. */
.nav-link-custom:focus-visible {
  box-shadow: 0 0 0 0.25rem rgba(0, 61, 160, 0.25);
}

/* //cambio: CTA del navbar. El Figma (2895:1341) lo define en 40px de alto con texto
   Cocogoose Pro Light 300 / 14px, mientras que `.btn-fal-primary` global mide 56px y usa
   --font-body 500. Ese botón global lo comparten hero, stats, calculadora y cards_grid, así
   que el override va SCOPEADO a .site-header para no tocar el resto de la landing. */
.site-header .btn-fal-primary {
  height: 40px;
  padding: 8px 24px;
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-sm);
  line-height: 1.5;
  white-space: nowrap;
}

.lang-selector {
  font-family: var(--font-title);
  font-size: var(--font-size-body-sm);
  color: var(--color-primary-dark);
  border: var(--border-width) solid var(--color-primary-dark);
  border-radius: var(--radius-pill);
  /* //cambio: era 0.75rem 1.5rem (48px de alto). El selector de idioma no está en el Figma
     —se conserva porque el switch ES/EN es funcional en el sitio— pero se alinea al alto del
     botón "Contacto" (40px) para que no descuadre la fila. */
  padding: 8px 16px;
  line-height: 1.5;
  background: transparent;
  text-decoration: none;
}

/* //cambio: era max-width 991.98px. Ahora el navbar colapsa a hamburguesa bajo 1400px
   (navbar-expand-xxl en header-fal.php), así que el breakpoint de estos overrides tiene que
   acompañar — si no, entre 992 y 1400px el menú ya está colapsado pero seguiría aplicando el
   gap horizontal de 32px y el nowrap, pensados para la fila. */
/* //cambio (2026-07-28): menú colapsado rediseñado según el Figma mobile 3125:1811 — antes
   este estado NO tenía estilos propios (defaults de Bootstrap sobre el glass translúcido:
   lista apretada, toggler genérico). Ahora: barra blanca de 90px, hamburguesa/cruz propia,
   panel blanco fullscreen con links en filas de 12px y CTA full-width. Aplica a TODO el
   rango colapsado (<1400): el Figma solo especifica <768 pero 768-1399 estaba igual de roto
   y el mismo diseño escala bien. Valores anteriores del bloque:
   .navbar-glass { padding: 0.75rem 1rem; } */
/* //cambio (2026-07-29): el breakpoint baja a 1199.98px. Valor anterior: `max-width: 1399.98px`.
   Acompaña al `navbar-expand-xl` de header-fal.php (era -xxl): este bloque define el estado
   COLAPSADO, así que su tope tiene que ser exactamente el breakpoint donde Bootstrap colapsa,
   ni uno más ni uno menos. Los .98 son la convención de Bootstrap para no solapar con el
   `min-width: 1200px` del estado desplegado.
   Con esto, 1200-1399 —donde caen las notebooks de 1366 y 1280— pasa de mostrar el panel
   mobile (barra blanca de 90px, hamburguesa, panel fullscreen) a mostrar la fila de desktop.
   Por debajo de 1200 no cambia nada: sigue el mismo diseño colapsado del Figma 3125:1811.
   VA ATADO al navbar-expand de header-fal.php: cambiar uno solo deja el menú desplegado en
   fila con los estilos del panel mobile encima. */
@media (max-width: 1199.98px) {
  .site-header {
    padding: 0;
    background: #fff;
  }

  .navbar-glass {
    background: #fff;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    border-radius: 0;
    /* Figma: barra de 90 de alto */
    min-height: 90px;
    padding: 0 20px;
  }

  /* Figma: logo 93.62×34 */
  .navbar-brand img {
    height: 34px;
  }

  .navbar-toggler {
    width: 48px;
    height: 48px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: 0;
    box-shadow: none;
  }

  /* hamburguesa (ícono "reorder" 24px del Figma) — pisa el background-image default de Bootstrap */
  .navbar-toggler-icon {
    width: 24px;
    height: 24px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M3 6h18M3 12h18M3 18h18' stroke='%23003DA0' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E");
  }

  /* abierto → ícono "close" (Bootstrap togglea aria-expanded solo) */
  .navbar-toggler[aria-expanded="true"] .navbar-toggler-icon {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M6 6l12 12M18 6L6 18' stroke='%23003DA0' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E");
  }

  /* panel fullscreen blanco (Figma 3125:1840: padding 16 20 160) */
  .site-header .navbar-collapse {
    position: fixed;
    top: var(--site-header-height, 90px);
    left: 0;
    right: 0;
    bottom: 0;
    background: #fff;
    padding: 16px 20px 160px;
    overflow-y: auto;
    z-index: 1029;
  }

  /* la animación de height de .collapsing rompe con position:fixed — se anula */
  .site-header .navbar-collapse.collapsing {
    height: auto;
    transition: none;
  }

  /* //cambio: con el menú colapsado el listado es vertical, el gap horizontal de 32px no
     aplica y el nowrap de los links tampoco hace falta. */
  .site-header .navbar-nav {
    gap: 0 !important;
  }

  .nav-link-custom {
    white-space: normal;
    /* Figma: filas de 12px de padding, texto 16px */
    padding: 12px 0 !important;
    font-size: 1rem;
  }

  /* CTA full-width 56px, Noto 500 16 (Figma 3141:3455 — mobile vuelve a Noto, no Cocogoose 14) */
  .site-header .navbar-collapse .btn-fal-primary {
    width: 100%;
    height: 56px;
    justify-content: center;
    font-family: var(--font-body);
    font-weight: 500;
    font-size: 1rem;
  }

  /* scroll-lock con el menú abierto (FAL usa scroll nativo — sin conflicto con Lenis) */
  body:has(.site-header .navbar-collapse.show) {
    overflow: hidden;
  }
}

/* //cambio: clip horizontal sticky-safe en FAL (el tema no tiene body{overflow-x:hidden} ni body_class()).
   overflow-x:clip + overflow-y:visible NO crea scroll-container → la pila sticky de gestión sigue intacta
   (a diferencia de overflow:hidden). Atrapa cualquier desborde residual en mobile. */
#fal { overflow-x: clip; }

/* //cambio (2026-07-28): al llegar por navegación nativa a /fal/#seccion (links del navbar de
   la FAQ, ahora fuera del router con data-router-disabled en header-fal.php), el browser
   posiciona el ancla en el borde superior del viewport y el header sticky la tapa.
   scroll-margin-top reserva el alto real del header (la var la mantiene initSiteHeaderOffset).
   No afecta el scroll suave interno de la landing: initAnchorScroll ya compensa solo. */
#hero, #reforma, #equipo, #como-funciona, #gestion, #calculadora, #alianza, #contacto {
  scroll-margin-top: calc(var(--site-header-height, 90px) + 1rem);
}

/* ============================================================
   VARIABLES (de variables.css del mockup)
   ============================================================ */
:root {
  /* Colores */
  --color-text: #000000;
  --color-border: #00369a;
  --color-primary: #003da0;
  --color-primary-dark: #11286d;
  --color-accent: #1d68e2;
  --color-text-muted: #55585a;
  /* //cambio (2026-07-29): gris del hover de los links del navbar — el mismo --color-text-muted
     pero oscurecido (misma tonalidad, luminosidad 34%→20%). No se usa --color-text (#000000):
     el negro puro contra el gris del reposo es un salto demasiado duro para un hover. Va como
     variable y no hardcodeado para poder ajustarlo en un solo lugar. */
  --color-text-muted-strong: #313436;
  /* //cambio (2026-07-29): celeste del timeline. Es el `fill_7a61481a` del Figma (2895:1592),
     y NO existía en la paleta: se usa para el borde de la píldora de PERÍODO y para los dos
     divisores que la flanquean. En el diseño esos dos tramos son los únicos celestes de todo
     el cronograma — marcan la extensión del período, no el progreso recorrido. */
  --color-timeline-track: #24b3f9;
  --color-text-light: #727576;
  --color-bg: #ffffff;
  --color-bg-light: #f5f6f9;
  --color-card-overlay: #bbcae8;
  --color-tooltip: #eceff5;
  --color-stat: #216095;
  --color-input-border: #d3daea;
  --color-white-60: rgba(255, 255, 255, 0.6);
  --color-white-80: rgba(255, 255, 255, 0.8);
  --color-overlay-60: rgba(187, 202, 232, 0.6);
  --color-circle-bg: rgba(187, 202, 232, 0.8);

  /* //cambio: variables del diagrama de ecosistema (portadas de texto.html / Figma 2435-1850) */
  --fal-eco-border: #a8c0e1;
  --fal-eco-border-muted: #c0c2c7;
  --fal-eco-bg: #f4f7fc;
  --fal-eco-ring-1: rgba(168, 192, 225, 0.35);
  --fal-eco-ring-2: rgba(168, 192, 225, 0.45);
  --fal-eco-ring-3: rgba(143, 166, 209, 0.5);
  --fal-eco-ring-4: rgba(111, 143, 200, 0.55);
  --fal-eco-ring-5: rgba(79, 120, 190, 0.6);
  --fal-eco-cat-1: #deeafd;
  --fal-eco-cat-2: #d3e2f9;
  --fal-eco-cat-3: #9fb5dd;
  --fal-eco-cat-4: #8fa6d1;
  --fal-eco-shadow-sm: 0 4px 8px -2px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.06);
  --fal-eco-font: "Cocogoose Pro", system-ui, sans-serif;

  /* Gradientes */
  /* //cambio: §3B — manchas de "Cómo funciona" alineadas al Figma vigente (2895:1735,
     2931:1396, 2895:1736): tres elipses 707×317 con fill rgba(33,96,149,α), α .38/.38/.31.
     Los valores viejos eran de la paleta del mockup anterior (familia rgba(187,202,232,…)):
     --gradient-como-blur-1: radial-gradient(ellipse 100% 100% at 50% 50%, rgba(187, 202, 232, 0.9) 0%, rgba(187, 202, 232, 0.45) 38%, rgba(255, 255, 255, 0) 72%);
     --gradient-como-blur-2: radial-gradient(ellipse 100% 100% at 50% 50%, rgba(187, 202, 232, 0.85) 0%, rgba(29, 104, 226, 0.14) 42%, rgba(255, 255, 255, 0) 70%);
     Misma construcción que --gradient-reforma-blur: el radial hace la caída y el blur queda en
     72px — JAMÁS blur(216px) literal del Figma, tumba el compositor (§5 del estado).
     -1 y -2 comparten α 0.38; se mantienen como variables separadas por legibilidad. */
  --gradient-como-blur-1: radial-gradient(ellipse 100% 100% at 50% 50%, rgba(33, 96, 149, 0.38) 0%, rgba(33, 96, 149, 0.15) 45%, rgba(255, 255, 255, 0) 72%);
  --gradient-como-blur-2: radial-gradient(ellipse 100% 100% at 50% 50%, rgba(33, 96, 149, 0.38) 0%, rgba(33, 96, 149, 0.15) 45%, rgba(255, 255, 255, 0) 72%);
  --gradient-como-blur-3: radial-gradient(ellipse 100% 100% at 50% 50%, rgba(33, 96, 149, 0.31) 0%, rgba(33, 96, 149, 0.12) 45%, rgba(255, 255, 255, 0) 72%);
  --gradient-impacto-blur-1: radial-gradient(ellipse 100% 100% at 50% 50%, rgba(187, 202, 232, 0.9) 0%, rgba(187, 202, 232, 0.42) 40%, rgba(245, 246, 249, 0) 72%);
  --gradient-impacto-blur-2: radial-gradient(ellipse 100% 100% at 50% 50%, rgba(187, 202, 232, 0.8) 0%, rgba(29, 104, 226, 0.12) 44%, rgba(245, 246, 249, 0) 70%);
  --gradient-gestion-image: linear-gradient(-1.24deg, rgba(0, 61, 160, 0.58) 1.25%, rgba(255, 255, 255, 0) 62.97%);
  /* //cambio: manchas de la sección "Lo que habilita la reforma" (Figma 3068:914/915, fill
     rgba(33,96,149,0.18)). Mismo color base y misma construcción que las de --gradient-como-blur-*. */
  --gradient-reforma-blur: radial-gradient(ellipse 100% 100% at 50% 50%, rgba(33, 96, 149, 0.18) 0%, rgba(33, 96, 149, 0.07) 45%, rgba(245, 246, 249, 0) 72%);

  /* Espaciado */
  --padding-global: 64px;
  /* //cambio (2026-07-29): valores anteriores `112px` → `24px` → `48px` (actual).
     Acompaña a `.section-padding` (que fue 5rem → 1rem → 2rem), su única consumidora vía
     `.section-padding-lg`, usada por contacto, cómo-funciona y el-fal. Si se quedaba en 112
     esas tres secciones tendrían el triple de aire que las otras nueve: al lado de 32px se
     leía como un error de maquetado, no como una jerarquía.
     Se mantiene en 1.5× la base (48 vs 32) para que "large" siga significando algo: 96px de
     hueco contra los 64px del resto. */
  /* //cambio (2026-07-29): pasa a 40px = 2.5rem, el MISMO valor que `.section-padding`.
     Valor anterior: `48px`. Cadena: `112px` → `24px` → `48px` → `40px`.
     Se abandona a propósito la proporción 1.5× de la nota de arriba: el pedido fue que la
     distancia entre componentes sea igual en toda la landing, y mientras esta clase valiera
     más, las 3 secciones que la usan (contacto, cómo-funciona, el-fal) iban a romper el ritmo.
     El token NO se elimina aunque hoy iguale a la base: sigue siendo el punto único para
     volver a diferenciar `-lg` si alguna vez se quiere. */
  /* //cambio (2026-07-29): pasa a 48px = 3rem. Valor anterior: `40px`. Cadena: `112px` →
     `24px` → `48px` → `40px` → `48px`. Acompaña la suba de `.section-padding` a 3rem para
     mantener el ritmo uniforme (sigue siendo el MISMO valor que la base, no un múltiplo).
     Casualidad a tener en cuenta al leer el historial: vuelve a valer 48px como en un paso
     intermedio de hoy, pero por otro motivo — antes era 1.5× de una base de 32, ahora es 1×
     de una base de 48. */
  --padding-section-large: 48px;
  --space-14: 56px;
  --border-width: 1px;
  --radius-small: 24px;
  --radius-pill: 100px;

  /* Tipografía */
  /* //cambio: --font-title era "Montserrat" (nunca coincidió con el Figma, que usa Cocogoose Pro
     en todos los títulos) — por eso se veía más delgado. Cocogoose Pro ya estaba cargada via
     _fonts.scss (usada en --fal-eco-font) pero el resto de FAL no la referenciaba. */
  --font-title: "Cocogoose Pro", sans-serif;
  --font-body: "Noto Sans", sans-serif;
  --font-weight-title: 300;
  /* //cambio: 500 no tiene @font-face registrado para Cocogoose Pro (solo 100/200/300/350/800) —
     el navegador aproximaba de forma inconsistente. 350 = Semilight, la variante que pide el Figma. */
  --font-weight-title-semibold: 350;
  --font-weight-body: 400;
  /* //cambio: era clamp(2.25rem, 5vw, 4rem) → 64px a partir de 1280px de ancho, muy por
     encima de los 40px que pide el Figma (2895:1351). El token lo usa SOLO .hero-title
     (verificado con grep en todo el tema), así que ajustarlo acá no afecta nada más. */
  --font-size-hero: clamp(2rem, 2.6vw, 2.5rem);
  /* //cambio: era clamp(1.75rem, 4vw, 3.375rem) → 54px desde 1350px de ancho, contra los 36px
     que piden todos los títulos de sección del Figma (2895:1531, 2895:1825, 3068:920…).
     Detectado comparando el render contra el diseño, no leyendo el CSS. El token lo usa sólo
     `.section-title`, exclusiva de los partials de FAL. */
  --font-size-h2: clamp(1.5rem, 2.4vw, 2.25rem);
  /* //cambio: fix 7 auditoría — era clamp(1.5rem, 3vw, 2.25rem) (sin uso): pendiente 3vw
     distinta a la del h2, que hacía que un h3 con ese clamp superara al h2 entre 1200-1440px.
     Se re-deriva con la misma pendiente del h2 escalada 32/36 (el Figma 2895:4308 define los
     títulos de slide de "Cómo funciona" en 32px), así el h3 nunca supera al h2. */
  --font-size-h3: clamp(1.334rem, 2.134vw, 2rem);
  --font-size-h4: clamp(1.125rem, 2vw, 1.75rem);
  --font-size-body-lg: 1.25rem;
  --font-size-body: 1rem;
  --font-size-body-sm: 0.875rem;
  --font-size-caption: 0.75rem;
  --font-size-stat: 2rem;
  --font-size-display: 5rem;

  /* Sombras */
  --shadow-small: 0 2px 4px -2px rgba(0, 0, 0, 0.06), 0 4px 8px -2px rgba(0, 0, 0, 0.1);
  --shadow-medium: 0 4px 6px -2px rgba(0, 0, 0, 0.03), 0 12px 8px rgba(0, 0, 0, 0.08);
  --shadow-card: 0 2px 2px rgba(0, 0, 0, 0.06), 0 4px 4px rgba(0, 0, 0, 0.1);

  /* Altura del header sticky (actualizada en JS) */
  --site-header-height: 5.5rem;
}

/* ============================================================
   ESTILOS GLOBALES (de global.css del mockup)
   ============================================================ */

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

h1, h2, h3, h4, h5, h6,
.font-title {
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  color: var(--color-primary);
}

.font-body,
.font-title .font-body {
  font-family: var(--font-body);
  font-weight: var(--font-weight-body);
}

.font-title strong,
.font-title-semibold {
  font-weight: var(--font-weight-title-semibold);
}

/* === Botones === */
.btn-fal-primary {
  --bs-btn-bg: var(--color-primary);
  --bs-btn-border-color: var(--color-primary);
  --bs-btn-color: #fff;
  --bs-btn-hover-bg: #002d80;
  --bs-btn-hover-border-color: #002d80;
  /* //cambio: faltaba esta. Bootstrap NO hereda --bs-btn-color en el hover: usa su propia
     --bs-btn-hover-color, que por defecto cae a --bs-body-color (#212529). Resultado: al pasar
     el mouse el texto se ponía casi negro sobre el azul oscuro, ilegible. Las variantes
     outline sí la declaraban; sólo la primaria la había omitido, así que el bug estaba en
     TODOS los botones azules de la landing. */
  --bs-btn-hover-color: #fff;
  --bs-btn-active-color: #fff;
  /* //cambio: fix 1 auditoría — mismo mecanismo que el hover: Bootstrap tampoco hereda el
     fondo en :active. Sin estas dos, durante el click --bs-btn-active-bg caía al default
     (transparente) y el botón quedaba texto blanco sobre nada — invisible. */
  --bs-btn-active-bg: #002d80;
  --bs-btn-active-border-color: #002d80;
  /* //cambio: fix 3 auditoría — sin este token Bootstrap no pinta anillo de foco con teclado
     (y además mata el outline nativo): cero indicador de foco. 0,61,160 = #003DA0 en RGB. */
  --bs-btn-focus-shadow-rgb: 0, 61, 160;
  --bs-btn-padding-x: 1.5rem;
  --bs-btn-padding-y: 0.5rem;
  font-family: var(--font-body);
  font-weight: 500;
  border-radius: var(--radius-pill);
  height: 56px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

.btn-fal-outline {
  --bs-btn-color: var(--color-primary-dark);
  --bs-btn-border-color: var(--color-primary-dark);
  --bs-btn-hover-bg: var(--color-primary-dark);
  --bs-btn-hover-color: #fff;
  /* //cambio: fix 2 auditoría — faltaban las TRES active-*: al mantener el click el botón
     perdía el relleno del hover y el texto caía al color del body. */
  --bs-btn-active-color: #fff;
  --bs-btn-active-bg: var(--color-primary-dark);
  --bs-btn-active-border-color: var(--color-primary-dark);
  /* //cambio: fix 3 auditoría — anillo de foco con teclado (ver .btn-fal-primary). */
  --bs-btn-focus-shadow-rgb: 0, 61, 160;
  /* //cambio (2026-07-29): faltaban las dos padding-*. `.btn-fal-primary` las declara
     (1.5rem / 0.5rem) pero esta variante no, así que caía a los defaults de `.btn` de
     Bootstrap 5.3 (`--bs-btn-padding-x: .75rem` / `-y: .375rem`): 12px de padding lateral
     contra los 24px del primario. Efecto visible en el hero, donde los dos botones van uno al
     lado del otro: "Descargar" quedaba 24px más angosto que "Conocé cómo" y con el texto
     pegado al borde, pese a tener el mismo height de 56px. Se igualan a los del primario. */
  --bs-btn-padding-x: 1.5rem;
  --bs-btn-padding-y: 0.5rem;
  /* //cambio (2026-07-29): misma familia de omisión — `.btn` de Bootstrap trae
     `--bs-btn-hover-border-color: transparent`, así que en hover el borde de esta variante
     desaparecía. No se notaba porque el fondo se rellena con el mismo color (el borde
     transparente deja ver el background, que es border-box), pero dejaba el token cayendo a un
     default ajeno a la paleta. `.btn-fal-primary` sí lo declara; se empareja. */
  --bs-btn-hover-border-color: var(--color-primary-dark);
  border-radius: var(--radius-pill);
  height: 56px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-weight: 500;
}

.btn-fal-outline-white {
  --bs-btn-color: #fff;
  --bs-btn-border-color: #fff;
  --bs-btn-hover-bg: #fff;
  --bs-btn-hover-color: var(--color-primary);
  /* //cambio: fix 3 auditoría — SOLO el anillo de foco. Las active-* de esta variante NO se
     agregan: el verificador demostró que sus fallbacks caen justo en los valores del diseño. */
  --bs-btn-focus-shadow-rgb: 0, 61, 160;
  border-radius: var(--radius-pill);
  height: 56px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

/* === Secciones === */
/* //cambio (2026-07-29): historial de este valor, que se ajustó dos veces el mismo día.
   Original: `5rem` (80px) → 160px de hueco entre secciones (80 abajo + 80 arriba).
   Primer intento: `1rem` (16px) → 32px de hueco. Se eligió así porque el pedido fue que la
   DISTANCIA entre componentes fuera 2rem, y el padding es arriba Y abajo: entre dos secciones
   contiguas el hueco real es la suma de las dos, así que para 2rem de distancia el padding
   tiene que ser la mitad. Probado en dev: quedó demasiado apretado.
   Valor actual: `2rem` (32px) → 64px de hueco. Es el doble de la distancia pedida en el
   párrafo anterior, pero es lo que se validó a ojo, que manda por sobre la cuenta.
   Se aparta del Figma a propósito (la nota del bloque mobile registra 80-112 en desktop): es
   una decisión de diseño del usuario, no un match del diseño. Para volver al original, 5rem.
   El dial es este solo valor. Si hay que retocarlo, acordarse de acompañar
   `--padding-section-large` y el bloque `@media (max-width: 767.98px)`, que se mantienen en
   proporción 1.5× y 0.75× respecto de acá. */
/* //cambio (2026-07-29): sube a 2.5rem. Valor anterior: `2rem`. Cadena completa del día:
   `5rem` → `1rem` → `2rem` → `2.5rem`. Los 2rem se probaron en dev y quedaron bien pero
   "faltaba un pelín"; 2.5rem (40px) da 80px de hueco entre secciones.
   A partir de acá el valor deja de tener acompañantes proporcionales: se unifica. Todas las
   secciones pasan a 2.5rem para que el ritmo sea EL MISMO en toda la landing —era el pedido—,
   así que `--padding-section-large`, `.hero-section` y `.calculadora-section` toman este mismo
   valor en vez de múltiplos. La nota de arriba, que hablaba de proporciones 1.5×/0.75×, queda
   como registro de cómo estaba antes. */
/* //cambio (2026-07-29): sube a 3rem. Valor anterior: `2.5rem`. Cadena completa del día:
   `5rem` → `1rem` → `2rem` → `2.5rem` → `3rem`. Los 2.5rem se probaron en dev y quedaron
   chicos. 3rem (48px) da 96px de hueco entre secciones.
   Sigue valiendo lo de la nota de arriba: TODAS las secciones de desktop comparten este
   número (`--padding-section-large`, `.hero-section` y `.calculadora-section` también están
   en 3rem), así que el ritmo es uniforme.
   MOBILE NO ACOMPAÑA esta suba: quedó en 2rem a pedido del usuario, que todavía no lo vio
   renderizado. O sea que hoy la proporción mobile/desktop es 0.67× (32 contra 48), no la
   0.75× histórica — si al revisar mobile se decide mantener esa relación, el valor que le
   corresponde es 2.25rem. */
.section-padding {
  padding-top: 3rem;
  padding-bottom: 3rem;
}

.section-padding-lg {
  padding-top: var(--padding-section-large);
  padding-bottom: var(--padding-section-large);
}

.section-blue {
  background: var(--color-primary);
  border-radius: var(--radius-small);
  color: #fff;
}

.section-blue h2,
.section-blue .font-title {
  color: #fff;
}

.section-gray {
  background: var(--color-bg-light);
  border-radius: var(--radius-small);
}

.eyebrow {
  font-family: var(--font-title);
  /* //cambio: fix 11 auditoría — sin declarar, el navegador pide 400: cara inexistente en
     Cocogoose Pro (solo 100/200/300/350/800), resolución inconsistente entre navegadores. */
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-lg);
  color: var(--color-accent);
  margin-bottom: 0;
}

.eyebrow-white {
  color: rgba(255, 255, 255, 0.9);
}

.section-title {
  font-size: var(--font-size-h2);
  line-height: 1.2;
  /* //cambio: era -0.03em; el Figma usa -0.02em en los títulos de sección. */
  letter-spacing: -0.02em;
}

.section-subtitle {
  /* //cambio: comparación reforma vs Figma (2026-07-28) — faltaban font-family y color acá.
     Sin `.font-body` ni ningún ancestro que los fije, el navegador caía al stack default de
     Bootstrap (system-ui/Segoe UI, NO Noto Sans) y al color de texto por defecto (#212529, casi
     negro) en vez del gris muted del Figma (fill_bd64f0d8 #55585A, ej. 3068:921). Como esta
     clase es compartida por varias secciones, el fix corrige todas de una — no solo reforma. */
  font-family: var(--font-body);
  color: var(--color-text-muted);
  font-size: var(--font-size-body-lg);
  font-weight: 300;
  /* //cambio: era 52ch (≈536px), una aproximación por cantidad de caracteres. El Figma fija los
     bloques de subtítulo en 682px (2895:1532, 3068:921), que es bastante más ancho — el texto
     entraba en más líneas de las que muestra el diseño. */
  max-width: 682px;
}

/* === Cards === */
.fal-card {
  background: #002f8e;
  border-radius: var(--radius-small);
  padding: 1.5rem;
  color: #fff;
  min-height: 280px;
  display: flex;
  flex-direction: column;
  /* //cambio (2026-07-29): centrado vertical. Valor anterior: `justify-content: space-between`.
     El Figma (2895:1525, frame "Content" de la card) declara `justifyContent: center` con gap
     24px — no space-between. Con space-between el título quedaba clavado arriba y el párrafo
     abajo, con un hueco muerto en el medio que crecía según el largo de cada texto, así que
     los párrafos de las 4 cards ni siquiera arrancaban a la misma altura.
     El gap de 1.5rem de abajo ya coincidía con los 24px del Figma; solo estaba mal el reparto.
     FE DE ERRATAS: esta nota decía que afectaba también a #alianza. NO es así — verificado en
     la página: las 4 únicas .fal-card están en #equipo. #alianza existe pero es la sección del
     bento (.fal-bento-tile). `.fal-card` aparece en cards_grid.php, pero ese partial está
     reemplazado por bento_grid y no se renderiza. */
  /* //cambio (2026-07-29, posterior): pasa a flex-start. Valor anterior: `center`.
     Medido en dev: los párrafos de las 4 cards tienen 5, 4, 4 y 3 líneas (el copy de ACF es
     más largo y desparejo que el del Figma, donde los cuatro textos miden lo mismo). Con esa
     diferencia NINGÚN justify-content los alinea:
       - space-between (lo que había): títulos alineados arriba, párrafos alineados ABAJO, y
         los arranques escalonados 60px (163/193/193/223).
       - center (lo que pide el Figma): desalinea TAMBIÉN los títulos, porque cada bloque de
         contenido mide distinto. Peor que el anterior.
     La alineación real se consigue anclando todo arriba y dándole al título una altura fija de
     2 líneas (ver `min-height` en .fal-card h3): así los párrafos arrancan todos a la misma
     altura sin depender del largo del texto.
     El `center` del Figma funciona allá porque el copy del diseño es uniforme; con contenido
     editable por ACF no se sostiene. */
  justify-content: flex-start;
  gap: 1.5rem;
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.55s ease, transform 0.55s cubic-bezier(0.4, 0, 0.2, 1), transition-delay 0s;
}

.fal-card.is-visible,
.fal-ref-card.is-visible {
  opacity: 1;
  transform: translateY(0);
  transition-delay: var(--fal-card-reveal-delay, 0ms);
}

.fal-card:not(.is-visible),
.fal-ref-card:not(.is-visible) {
  transition-delay: 0ms;
}

.fal-card h3 {
  /* //cambio (2026-07-29): baja a 1.55rem. Valor anterior: `1.75rem` (28px). Los títulos de
     dos palabras largas ("Seguimiento en tiempo real", "Sin costo adicional") no entraban bien
     en el ancho de la card. No hay override mobile de esta regla, así que el mismo valor rige
     en los dos breakpoints — que es lo pedido.
     Se suma overflow-wrap por si un editor carga desde ACF una palabra más larga que la card:
     sin esto desbordaría en vez de partirse. */
  font-size: 1.55rem;
  color: #fff;
  line-height: 1.4;
  margin-bottom: 0;
  overflow-wrap: break-word;
  /* //cambio (2026-07-29): se saca el `min-height: 2.8em` que reservaba 2 líneas de alto.
     Era el primer intento de alinear los párrafos entre cards, y falla apenas un título
     necesita 3 líneas (pasa al achicarse la card, ej. a 125% de zoom con "Seguimiento en
     tiempo real"): ese párrafo se va abajo y rompe la alineación. Subirlo a 3 líneas sólo
     corre el problema de lugar y agrega hueco muerto donde todos entran en 2.
     Lo reemplaza el subgrid de `.equipo-cards` (más abajo en el archivo), que hace que las 4
     cards compartan las mismas filas: la altura del título la fija el más alto, sin declarar
     ninguna medida. Valor anterior, por si hay que volver: `min-height: 2.8em`. */
}

.fal-card p {
  /* //cambio: comparación #equipo vs Figma 2895:1524 (2026-07-28) — faltaba font-family:
     caía al stack default (system-ui/Segoe UI) y el peso Light 300 se veía distinto al del
     diseño. El Figma (style_a4f357aa) pide Noto Sans Light 300 20px. Mismo bug ya corregido
     en reforma y timeline. */
  font-family: var(--font-body);
  font-size: var(--font-size-body-lg);
  font-weight: 300;
  line-height: 1.5;
}

/* === Equipo panel === */
.equipo-panel {
  display: flex;
  flex-direction: column;
  /* //cambio: espaciados medidos contra el Figma 2895:1524 (2026-07-28) — los clamps viejos
     quedaban muy por encima del diseño en desktop (medido en dev a 1536px):
     gap: clamp(3rem, 8vw, 6.25rem)          → 100px reales (Figma: 80 entre bloques)
     padding: clamp(3.5rem,10vw,8.75rem) …   → 140/76.8/100 (Figma: 100 top, 80 lados, 80 abajo) */
  gap: clamp(2.5rem, 5.5vw, 5rem);
  /* //cambio (2026-07-29): el padding LATERAL baja de `clamp(1.5rem, 5.5vw, 5rem)` (80px) a
     `clamp(1.5rem, 3.3vw, 3rem)` (48px). Los verticales no se tocan.
     Motivo: medido en dev a 1525px de viewport, la card mide 266px de ancho contra los 302px
     del Figma (2895:1547 — fila de 4 cards con gap 24 sobre un contenido de 1280). Un 12%
     menos, y ese 12% es lo que empuja el copy a una línea extra respecto del diseño.
     De dónde sale la diferencia: el `.container` de Bootstrap corta en 1320px y este panel le
     come 80px por lado → 1160px de contenido, contra los 1280 del Figma. Es el mismo patrón
     que ya apareció en el navbar: el ancho real del contenido es menor que el del diseño.
     Por qué 48 y no bajarlo hasta igualar los 1280: para eso habría que llevar el container a
     1440 (como se hizo en `.site-header .container`), y eso dejaría a #equipo MÁS ANCHO que
     todas las demás secciones de la landing, que siguen topando en 1320. Se prefiere mantener
     el ritmo horizontal parejo entre secciones y recuperar solo lo que se puede sin romperlo:
     la card pasa de 266 a ~282px.
     OJO: esto NO empareja por sí solo las líneas de los párrafos (siguen siendo 5/4/4/3, es
     largo de copy). Lo que alinea es el min-height del h3. */
  padding: clamp(3.5rem, 7vw, 6.25rem) clamp(1.5rem, 3.3vw, 3rem) clamp(3rem, 5.5vw, 5rem);
}

.equipo-panel-content {
  display: flex;
  flex-direction: column;
  /* //cambio: header→cards del Figma: 56px (gap del frame 2895:1525). Antes 76.8px reales. */
  gap: clamp(2rem, 4vw, 3.5rem);
}

/* //cambio: la regla compartida con gap 56 (--space-14) se parte: el Figma da gaps distintos
   a cada header — intro título→subtítulo 32px (frame 2895:1529) y cronograma título→subtítulo
   40px (frame 2895:1595). Antes ambos en 56. */
.equipo-intro {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

.equipo-cronograma-intro {
  display: flex;
  flex-direction: column;
  gap: 2.5rem;
}

/* //cambio: el Figma (2895:1531) le da al título de esta sección una caja de 724px, no el ancho
   completo del panel. Sin el tope medía 1142px: partía en dos líneas igual, pero cortando en
   otro punto y quedando estirado. Va scopeado a esta sección porque otros títulos —el del bento,
   por ejemplo— van centrados y a todo el ancho. */
.equipo-intro .section-title,
.equipo-cronograma-intro .section-title {
  max-width: 724px;
}

.equipo-cronograma {
  display: flex;
  flex-direction: column;
  /* //cambio: header cronograma→timeline del Figma: 80px (gap del frame 2895:1592).
     Antes clamp(2.5rem, 6vw, 6.25rem) → 92px reales a 1536. */
  gap: clamp(2.5rem, 5.5vw, 5rem);
}

.equipo-cronograma-intro {
  max-width: 52rem;
}

/* //cambio (2026-07-29): se saca el `min-height: 353px`. Eran los 353px de alto que la card
   tiene en el Figma (2895:1547), hardcodeados para igualar las alturas entre las 4.
   Dos motivos para sacarlo:
     1. Con el contenido anclado arriba, todo lo que sobraba hasta llegar a 353px quedaba como
        HUECO MUERTO al pie de la card — reportado por el usuario. Antes no se veía porque el
        `space-between` empujaba el párrafo al piso y lo tapaba.
     2. Ya no hace falta: el grid del bloque de subgrid (ver más abajo) iguala las alturas solo,
        tomando la del contenido más alto. El 353 era un parche para algo que el grid hace gratis
        — y encima atado a una resolución.
   La regla NO se borra, queda comentada como registro del valor del Figma:
   @media (min-width: 992px) { .equipo-cards .fal-card { min-height: 353px; } } */

/* //cambio: alianza swiper mobile — mismo patrón que .benefits-swiper, grid 3-up en desktop */
.alianza-swiper { overflow: visible; min-width: 0; max-width: 100%; }
.alianza-swiper .swiper-slide { height: auto; }
.alianza-swiper .swiper-slide .fal-card { height: 100%; }
.alianza-swiper .swiper-pagination { display: none; }

@media (min-width: 768px) {
  .alianza-swiper .swiper-wrapper { flex-wrap: wrap; gap: 1.5rem; transform: none !important; }
  .alianza-swiper .swiper-slide { width: calc(33.333% - 1rem); }
}
@media (max-width: 767.98px) {
  .alianza-swiper { overflow: hidden; }
  .alianza-swiper .swiper-pagination { display: block; position: static; margin-top: 1rem; text-align: center; }
  .alianza-swiper .fal-card { min-height: 0; }
  .alianza-swiper .swiper-pagination-bullet { background: rgba(255,255,255,0.5); opacity: 1; }
  .alianza-swiper .swiper-pagination-bullet-active { background: #fff; }
}

/* //cambio: benefits swiper mobile — padre es flex-column, sin min-width:0 el swiper explota a min-content */
.benefits-swiper { overflow: visible; min-width: 0; max-width: 100%; }
.benefits-swiper .swiper-slide { height: auto; }
.benefits-swiper .swiper-slide .fal-card { height: 100%; }
.benefits-swiper .swiper-pagination { display: none; }

@media (min-width: 768px) {
  .benefits-swiper .swiper-wrapper { flex-wrap: wrap; gap: 1.5rem; transform: none !important; }
  .benefits-swiper .swiper-slide { width: calc(50% - 0.75rem); }
}
@media (min-width: 992px) {
  .benefits-swiper .swiper-slide { width: calc(25% - 1.125rem); }
}
@media (max-width: 767.98px) {
  .benefits-swiper { overflow: hidden; }
  .benefits-swiper .swiper-pagination { display: block; position: static; margin-top: 1rem; text-align: center; }
  .benefits-swiper .fal-card { min-height: 0; }
  .benefits-swiper .swiper-pagination-bullet { background: rgba(255,255,255,0.5); opacity: 1; }
  .benefits-swiper .swiper-pagination-bullet-active { background: #fff; }
}

/* //cambio (2026-07-29): SUBGRID en las cards de #equipo — reemplaza los parches de altura.
   Problema que resuelve: título y párrafo no arrancaban a la misma altura entre cards. Cada
   card medía su propio contenido, y como el copy de ACF es desparejo (párrafos de 5/4/4/3
   líneas) y los títulos wrapean distinto según el ancho, ningún `justify-content` los alineaba.
   Se intentó antes con `min-height: 2.8em` en el h3 (reservar 2 líneas): funciona hasta que un
   título necesita 3 —cosa que pasa al achicarse la card, ej. a 125% de zoom con "Seguimiento en
   tiempo real"— y ahí vuelve a desalinearse. Subir el min-height a 3 líneas sólo mueve el
   problema: deja hueco muerto donde todos entran en 2, y se rompe de nuevo con 4.
   Con subgrid las 4 cards COMPARTEN las mismas dos filas del grid padre: la fila del título
   toma la altura del título más alto y se aplica a todas, así que los párrafos arrancan
   siempre parejos — con cualquier zoom, cualquier ancho y cualquier copy cargado por ACF.
   Sin números mágicos y sin tener que emparchar por breakpoint.

   Va encadenado en DOS niveles porque la card es nieta del wrapper
   (.swiper-wrapper > .swiper-slide > .fal-card): el slide pasa las filas hacia adentro. El
   subgrid anidado está soportado.

   Scopeado a `.equipo-cards` y no a `.benefits-swiper` para que no pueda filtrarse a otro
   carrusel que reuse esa clase. Va DESPUÉS de las reglas de arriba a propósito: comparten
   especificidad (0,2,0) y tienen que ganarle al `width: calc(...)` y al `flex-wrap`.

   Abajo de 768px NO aplica: ahí el swiper es un carrusel real de a una card, no hay nada que
   alinear entre hermanas.

   Soporte: Chrome 117+, Safari 16+, Firefox 71+. En un navegador sin subgrid las cards caen a
   su comportamiento normal (cada una mide su contenido) — se desalinean, pero nada se rompe. */
@media (min-width: 768px) {
  .equipo-cards .swiper-wrapper {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    /* dos filas por card: título y texto. Con 4 cards en 2 columnas, las dos de abajo caen en
       filas implícitas (3 y 4) y se alinean entre ellas — que es lo correcto. */
    grid-template-rows: auto auto;
    gap: 1.5rem;
    transform: none !important;
  }

  .equipo-cards .swiper-slide {
    /* anula el `width: calc(50% - 0.75rem)` de arriba: el ancho ahora lo da la columna */
    width: auto;
    display: grid;
    grid-template-rows: subgrid;
    grid-row: span 2;
  }

  .equipo-cards .fal-card {
    display: grid;
    grid-template-rows: subgrid;
    grid-row: span 2;
  }
}

@media (min-width: 992px) {
  .equipo-cards .swiper-wrapper {
    grid-template-columns: repeat(4, 1fr);
  }
}

/* === Impacto === */
.impacto-panel {
  position: relative;
  overflow: hidden;
  background: var(--color-bg-light);
  border-radius: var(--radius-small);
  padding: clamp(3rem, 8vw, 6.25rem) clamp(1.5rem, 5vw, 5rem);
}

.impacto-panel-bg {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
}

.impacto-blur {
  position: absolute;
  border-radius: 50%;
  filter: blur(72px);
  opacity: 0.95;
}

.impacto-blur--1 {
  left: clamp(0px, 2vw, 29px);
  top: clamp(40px, 8vw, 80px);
  width: clamp(300px, 55vw, 707px);
  height: clamp(220px, 38vw, 545px);
  background: var(--gradient-impacto-blur-1);
  transform: scale(1.55);
  transform-origin: center;
}

.impacto-blur--2 {
  right: clamp(-20px, -2vw, 29px);
  bottom: clamp(48px, 10vw, 100px);
  width: clamp(260px, 40vw, 513px);
  height: clamp(180px, 28vw, 408px);
  background: var(--gradient-impacto-blur-2);
  transform: scale(1.7);
  transform-origin: center;
}

.impacto-panel-content {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: clamp(3rem, 6vw, 5rem);
}

.impacto-intro {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

.impacto-intro .section-title {
  color: var(--color-primary);
}

.impacto-subtitle {
  font-family: var(--font-title);
  font-size: var(--font-size-body-lg);
  font-weight: 300;
  color: var(--color-text-muted);
  line-height: 1.5;
  max-width: 41.25rem;
}

.impacto-stat-card {
  background: #fff;
  border-radius: var(--radius-small);
  box-shadow: var(--shadow-card);
  padding: 1.5rem;
  min-height: clamp(320px, 40vw, 456px);
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: 1rem;
}

.impacto-stat-card .stat-label {
  font-family: var(--font-title);
  font-size: var(--font-size-body);
  font-weight: 300;
  color: var(--color-text-light);
  text-transform: uppercase;
  line-height: 1.4;
  margin-bottom: 0;
}

.impacto-stat-body {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.impacto-stat-card .stat-value {
  font-family: var(--font-title);
  font-size: clamp(1.5rem, 2.5vw, 2rem);
  /* //cambio: fix 10 auditoría — era 600, cara inexistente en Cocogoose (caía a la Bold 800).
     Sección `stats` hoy fuera de la página; se corrige igual. */
  font-weight: var(--font-weight-title-semibold);
  color: var(--color-primary);
  letter-spacing: -0.02em;
  line-height: 1.3;
  margin-bottom: 0;
  overflow-wrap: break-word;
  word-break: break-word;
}

.impacto-stat-card .stat-value-approx {
  display: block;
  margin-bottom: 0.15rem;
}

.impacto-stat-card .stat-desc {
  font-family: var(--font-body);
  font-size: var(--font-size-body-lg);
  font-weight: 400;
  color: var(--color-text-muted);
  line-height: 1.5;
  letter-spacing: -0.02em;
}

/* === Placeholder imágenes === */
.img-placeholder {
  background: var(--color-bg-light);
  border-radius: var(--radius-small);
  width: 100%;
}

.img-placeholder-hero {
  min-height: 450px;
  border-radius: var(--radius-small);
}

.img-placeholder-stack {
  min-height: 400px;
  max-width: 978px;
  margin: 0 auto;
}

.img-placeholder-side {
  aspect-ratio: 600 / 640;
  min-height: 300px;
}

/* === Hero === */
/* //cambio (2026-07-29): se empareja con el resto. Valor anterior: `padding: 2rem 0 4rem`
   (32px arriba / 64px abajo). Esta sección NO usa la clase `.section-padding` —tiene padding
   propio—, así que quedaba fuera de todos los ajustes de ritmo: sus 64px de abajo contra los
   40px de la sección siguiente daban 104px de hueco donde el resto tiene 80.
   Ahora 2.5rem arriba y abajo, igual que `.section-padding`. El de arriba es contra el navbar
   (no contra otra sección), así que ahí el número no suma con nada; se iguala igual por
   coherencia. */
/* //cambio (2026-07-29): sube a 3rem. Valor anterior: `2.5rem 0`. Acompaña a
   `.section-padding`, que pasó de 2.5rem a 3rem. */
.hero-section {
  padding: 3rem 0;
}

.hero-inner {
  border-radius: var(--radius-small);
  /* //cambio: el Figma (2895:1347) define el container en 640px de alto con padding 0 80px.
     Era min-height 500px / padding 3rem 2rem. */
  min-height: 640px;
  display: flex;
  align-items: center;
  padding: 0 5rem;
  position: relative;
  overflow: hidden;
}

/* //cambio: gradiente del Figma sobre la imagen del hero (2895:1347). Va como ::after porque
   la imagen se renderiza como <img class="hero-inner-bg"> con z-index 0 (ver hero.php) y el
   pseudo-elemento pinta después, quedando entre la foto y .hero-content (z-index 1).
   Solo aparece si hay imagen cargada — sin ella el bloque usa .img-placeholder. */
.hero-inner:not(.img-placeholder)::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background: linear-gradient(86deg, rgba(102, 102, 102, 0.24) 0%, rgba(0, 0, 0, 0) 58%);
}

.hero-content {
  position: relative;
  z-index: 1;
  /* //cambio: era 600px. El Figma fija la columna de texto en 542px (2895:1348). */
  max-width: 542px;
}

.hero-title {
  font-size: var(--font-size-hero);
  color: var(--color-primary);
  /* //cambio: eran 1.1 y -0.03em. El Figma (2895:1351) pide 1.3em y -0.02em. */
  line-height: 1.3;
  letter-spacing: -0.02em;
  /* //cambio: separación título→texto del Figma (32px). Reemplaza al `mb-4` de Bootstrap
     (24px) que traía el markup, sacado de hero.php para no pelear con su !important. */
  margin-bottom: 2rem;
}

.hero-text {
  font-size: var(--font-size-body-lg);
  /* //cambio: el Figma (2895:1352) usa Noto Sans acá, no la Cocogoose de los títulos. Se
     explicita porque el bloque hereda de .hero-content y conviene no depender de la cascada. */
  font-family: var(--font-body);
  font-weight: 300;
  line-height: 1.5;
  color: var(--color-primary);
  /* //cambio: detectado comparando el render contra el Figma. El nodo del subtítulo (2895:1352)
     mide 374px, no los 542 de la columna: sin este tope el texto entraba en una sola línea y en
     el diseño va en dos. */
  max-width: 374px;
  /* //cambio: separación bloque de texto→CTAs del Figma (56px). Reemplaza al `mb-4` (24px). */
  margin-bottom: 3.5rem;
}

/* //cambio: el Figma (2895:1356) separa los dos CTAs por 12px; el markup traía `gap-3` de
   Bootstrap (16px), que se sacó de hero.php. */
.hero-content .hero-ctas {
  gap: 0.75rem;
}

/* //cambio: comparación hero vs Figma (2026-07-28) — título y subtítulo matchean, pero los
   botones no: el Figma (2895:1357/1359, style_8349c4a2) pide Cocogoose Pro Light 300 14px,
   y `.btn-fal-primary`/`.btn-fal-outline` traen por default Noto Sans 500 16px (el estilo
   genérico que SÍ corresponde a otros botones de la landing, como el de la calculadora).
   Mismo mecanismo ya resuelto para `.site-header .btn-fal-primary`: override scopeado acá. */
.hero-ctas .btn {
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-sm);
  line-height: 1.5;
}

/* === Timeline === */
.timeline { width: 100%; }

.timeline-steps {
  display: flex;
  width: 100%;
  gap: 0;
}

.timeline-step {
  flex: 1 1 0;
  min-width: 0;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding: 8px 0;
}

.timeline-step-track {
  display: flex;
  align-items: center;
  width: 100%;
  gap: 8px;
}

.timeline-segment {
  flex: 1 1 0;
  min-width: 0;
  height: 3px;
  background: var(--color-overlay-60);
  transition: background 0.55s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.35s ease;
}

.timeline-step:first-child .timeline-segment--before,
.timeline-step:last-child .timeline-segment--after {
  opacity: 0;
}

.timeline-step:first-child.is-visible .timeline-segment--before,
.timeline-step:first-child.is-complete .timeline-segment--before,
.timeline-step:last-child.is-visible .timeline-segment--after,
.timeline-step:last-child.is-complete .timeline-segment--after {
  opacity: 1;
}

/* //cambio (2026-08-04): el tramo RECORRIDO pasa de blanco a cyan. Valor anterior:
   `background: #fff`.
   Pedido del usuario: que la línea cyan avance animada hasta el final y se quede ahí. Antes el
   cyan era estático y sólo marcaba la extensión del período (como en el Figma), mientras que lo
   que animaba se pintaba de blanco. Ahora el cyan ES el color del recorrido: arranca en
   `--color-overlay-60` (tramo sin recorrer) y se va llenando paso a paso.
   El one-shot y la velocidad ya estaban resueltos en initTimeline (400ms, sin loop, observer con
   disconnect), así que al completarse queda fijo sin necesidad de tocar el JS. */
.timeline-step.is-visible .timeline-segment--before,
.timeline-step.is-complete .timeline-segment--before,
.timeline-step.is-complete .timeline-segment--after {
  background: var(--color-timeline-track);
}

.timeline-dot {
  width: 15px;
  height: 15px;
  flex-shrink: 0;
  border-radius: 50%;
  border: 2px solid var(--color-card-overlay);
  background: transparent;
  transition: background 0.4s ease, border-color 0.4s ease, transform 0.4s ease;
}

/* //cambio: paso de tipo `periodo` (Figma 3068:493). A diferencia de un hito, no lleva punto
   ni texto debajo: es una píldora ancha apoyada SOBRE la línea, que la interrumpe.
   Va en position:absolute centrada sobre el track para que su altura no empuje la línea de
   los demás pasos —todos los .timeline-step comparten una fila flex y una píldora en flujo
   normal desalinearía el track del resto. Markup en inc/fal/beneficios.php. */
.timeline-step-track {
  position: relative;
  min-height: 15px;
}

.timeline-step--periodo {
  /* la píldora del Figma mide 278px: necesita más ancho que los pasos con punto */
  flex: 1.8 1 0;
}

/* //cambio (2026-07-29): los dos divisores que flanquean el PERÍODO van en celeste.
   En el Figma (2895:1592) el celeste #24B3F9 aparece SÓLO en dos tramos: el divisor que sale
   del hito anterior al período y el que entra al siguiente. El resto de la línea es blanca.
   O sea que el celeste NO marca progreso recorrido —eso lo sigue manejando la animación con
   --color-overlay-60 → #fff— sino la EXTENSIÓN del período, haciendo juego con el borde de la
   píldora. Por eso se pinta sobre el propio paso de tipo `periodo`: en nuestro layout la
   píldora va absolute centrada sobre el track y sus segmentos asoman a los costados, que es
   exactamente donde el diseño pone el celeste.
   Va con !important porque las reglas de estado (.is-visible / .is-complete) que pintan los
   segmentos de blanco tienen especificidad mayor (0,2,0) y se lo comerían al activarse. */
/* //cambio (2026-08-04): esta regla se DESACTIVA. Valor anterior:
   `.timeline-step--periodo .timeline-segment { background: var(--color-timeline-track) !important; }`
   Motivo: al pasar el progreso a cyan (ver la regla de .is-visible/.is-complete más arriba), el
   cyan dejó de ser "la extensión del período" y pasó a ser "lo recorrido". Con el !important
   puesto, los dos tramos del período aparecían cyan DESDE EL ARRANQUE, adelantándose a la
   animación y rompiendo justamente el efecto de llenado que se pidió.
   Ahora esos dos tramos se pintan cuando el avance llega, como cualquier otro. El cyan del
   PERÍODO sigue presente donde el Figma lo pide de verdad: en el borde de la píldora. */

.timeline-periodo {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  /* //cambio: medidas verificadas contra el render, no estimadas. Con padding 0.75rem y gap 2px
     la píldora daba 248×66; el Figma (3068:493) la fija en 278×57. El min-width la iguala al
     ancho del diseño en vez de dejarla depender del largo del texto. */
  gap: 0;
  /* //cambio (2026-07-29): la píldora estaba INVERTIDA respecto del Figma vigente (3068:493).
     Valores anteriores:
       min-width: 278px;  padding: 0.5rem 1.5rem;
       background: #003092;  border: 2px solid #fff;  color: #fff;
     El diseño la define al revés: fondo BLANCO, borde CELESTE #24B3F9 de 3px y texto AZUL
     #003DA0, con padding 16px 24px y radio 154px. El #003092 de la nota de abajo venía de una
     lectura anterior del canvas y ya no corresponde — se conserva el comentario como registro.
     El ancho baja de 278 a 228: el Figma da el texto en una caja de 180 + 24 de padding por
     lado. Sigue siendo min-width (no width) para que no corte si el copy de ACF es más largo. */
  min-width: 228px;
  padding: 1rem 1.5rem;
  white-space: nowrap;
  /* #003092 es el valor exacto del Figma — un punto más oscuro que --color-primary (#003DA0),
     para que la píldora se despegue del fondo de la sección. */
  background: #fff;
  border: 3px solid var(--color-timeline-track);
  border-radius: var(--radius-pill);
  color: var(--color-primary);
  line-height: 1.1;
}

/* //cambio: comparación timeline vs Figma (3068:494) — la píldora de período es UN solo texto
   ("PERIODO PARA\nElegir Entidad + abrir Cuenta") en Noto Sans Medium 500 14px, misma cara en
   las dos líneas. Acá estaba partida en dos tamaños distintos: eyebrow 12px/400 y texto
   16px/400 — ninguno de los dos coincidía con el Figma. Antes:
   .timeline-periodo-eyebrow { font-size: var(--font-size-caption); }  (12px)
   .timeline-periodo-texto   { font-size: var(--font-size-body); }    (16px, sin weight) */
/* //cambio (2026-07-29): los dos spans pasan a compartir el MISMO estilo. En el Figma vigente
   (3068:494) el período es UN solo texto —"PERIODO PARA ELEGIR LA ENTIDAD"— en Noto Sans
   SemiBold 600 18px, todo en mayúsculas, ls -0.02em, color #003DA0.
   Acá el markup lo parte en dos spans porque son dos campos distintos del repeater ACF
   (`fecha` y `descripcion`), y eso NO se toca: cambiar la estructura obligaría a re-cargar el
   contenido a mano. Lo que se hace es estilar los dos igual para que se lean como un texto
   corrido, que es el efecto del diseño.
   Valores anteriores de los dos: `font-size: var(--font-size-body-sm)` (14px), `font-weight: 500`,
   y el uppercase + ls 0.04em sólo en el eyebrow. */
/* //cambio (2026-08-04): la fuente baja de 1.125rem (18px) a 1rem (16px). Reportado por el
   usuario: "veo la fuente grande".
   Los 18px salen del Figma (3068:494), pero ahí el copy es "PERIODO PARA ELEGIR LA ENTIDAD" y
   entra en una línea. El copy real cargado en ACF es más largo —"PERIODO PARA" + "ELEGIR
   ENTIDAD + ABRIR CUENTA"— así que a 18px wrapea y la píldora se ve pesada.
   16px es el punto medio: sigue muy por encima de los 14px que tenía antes de la pasada de
   ayer, y deja el texto en dos líneas cómodas en vez de apretadas. */
.timeline-periodo-eyebrow,
.timeline-periodo-texto {
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: -0.02em;
  line-height: 1.1;
}

/* //cambio (2026-07-29): estado de la píldora de PERÍODO cuando lleva link (subcampo ACF
   `cta_link`). La clase la agrega beneficios.php sólo si el campo tiene valor, así que sin
   link no se aplica nada de esto y la píldora queda idéntica a antes.
   Criterio del hover —a pedido, quedaba a mi criterio—: NO se invierten los colores. Lo obvio
   sería pintar el fondo de celeste, pero el texto es #003DA0 y azul sobre #24B3F9 da un
   contraste pobre. En su lugar el borde pasa del celeste al azul primary y aparece una sombra
   suave: se lee como interactivo sin tocar la legibilidad ni el color de fondo.
   El :focus-visible usa el mismo anillo que el resto de la landing (.nav-link-custom,
   .btn-fal-*), para que la navegación por teclado sea consistente.
   El `text-decoration: none` es necesario: Bootstrap subraya los <a> por default y acá la
   píldora ya se lee como botón. */
.timeline-periodo--link {
  cursor: pointer;
  text-decoration: none;
  transition: border-color 0.25s ease, box-shadow 0.25s ease;
}

.timeline-periodo--link:hover {
  border-color: var(--color-primary);
  box-shadow: 0 4px 12px -2px rgba(0, 61, 160, 0.25);
}

.timeline-periodo--link:focus-visible {
  outline: none;
  box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.55);
}

/* //cambio: en mobile el timeline se apila en vertical (ver media query más abajo), así que
   la píldora vuelve al flujo normal — centrarla en absoluto sobre un track vertical la
   sacaría de lugar. */
@media (max-width: 767.98px) {
  .timeline-step--periodo {
    flex: 1 1 0;
  }

  .timeline-periodo {
    position: static;
    transform: none;
    white-space: normal;
    /* //cambio: los 278px del diseño desktop desbordan en mobile; acá la píldora se adapta. */
    min-width: 0;
  }
}

.timeline-step.is-visible .timeline-dot,
.timeline-step.is-complete .timeline-dot {
  background: #fff;
  border-color: #fff;
}

.timeline-step.is-visible .timeline-dot {
  transform: scale(1.12);
}

.timeline-pill {
  border-radius: 72px;
  padding: 8px 16px;
  /* //cambio: comparación timeline vs Figma (2895:1524) — faltaba font-family, caía al stack
     default de Bootstrap (system-ui/Segoe UI) en vez de Noto Sans. Mismo bug que reforma. */
  font-family: var(--font-body);
  font-weight: 600;
  font-size: clamp(0.75rem, 1.6vw, var(--font-size-body-lg));
  line-height: 1.4;
  /* //cambio (2026-08-04): el borde pasa de 1px a 2px. Valor anterior: `1px`.
     El Figma pide strokeWeight 2 en el chip de fecha (EL-df52d90f). Medido en dev, el de 1px
     rendía 0.8px reales y se veía como un pelo. */
  border: 2px solid var(--color-white-80);
  color: var(--color-white-60);
  white-space: nowrap;
  max-width: 100%;
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 0.45s ease, transform 0.45s ease, background 0.35s ease, color 0.35s ease, border-color 0.35s ease;
}

.timeline-desc {
  /* //cambio: comparación timeline vs Figma (2895:1524) — faltaba font-family, mismo bug que
     .timeline-pill y que reforma (ver .fal-ref-card-subtitulo). */
  font-family: var(--font-body);
  /* //cambio: reportado por el usuario (2026-07-28, captura "timeline no corregido") — a pesar
     de medir 16px/400 (igual al valor crudo del Figma), se ve más grande/pesada que el
     diseño. Bajado a Light 300 y el tope del clamp un poco menos que --font-size-body (16px)
     para achicarlo visualmente, tal como pidió el usuario ("bajá la weight y un poco el size"). */
  font-weight: 300;
  font-size: clamp(0.7rem, 1.3vw, 0.9375rem);
  line-height: 1.3;
  color: var(--color-white-60);
  text-align: center;
  /* //cambio: el Figma (2962:2156) parte las descripciones en dos líneas en un punto concreto
     —"El FAL entra en vigencia / 1° aporte"— y esos saltos vienen en el propio campo ACF.
     Sin pre-line el navegador los colapsa a un espacio y el corte queda donde caiga. */
  white-space: pre-line;
  width: 100%;
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 0.45s ease 0.05s, transform 0.45s ease 0.05s, color 0.35s ease, font-size 0.35s ease;
}

.timeline-step.is-visible .timeline-pill,
.timeline-step.is-complete .timeline-pill {
  opacity: 1;
  transform: translateY(0);
  /* //cambio (2026-08-04): el chip de fecha deja de RELLENARSE al activarse.
     Valores anteriores: `background: #fff` / `color: var(--color-primary)` / `border-color: #fff`.
     El Figma desktop (2962:2136, 2154, 2162, 2170 — template EL-df52d90f) lo define CALADO en
     todos los estados: fills [] o sea sin relleno, stroke blanco de 2px y texto blanco. Lo que
     había invertía el chip al activarse (blanco macizo con texto azul), que es justo el
     tratamiento del chip MOBILE, no el de desktop.
     La animación no se pierde: el paso todavía apagado queda en --color-white-60 (borde y texto
     atenuados) y al activarse sube a blanco pleno. Antes el salto era de atenuado a relleno. */
  background: transparent;
  color: #fff;
  border-color: var(--color-white-80);
}

.timeline-step.is-visible .timeline-desc,
.timeline-step.is-complete .timeline-desc {
  opacity: 1;
  transform: translateY(0);
  color: #fff;
  /* //cambio: esta es la causa de "las fuentes del timeline se ven muy grandes" que reportó
     el usuario — el Figma (style_564d9502, 2962:2138/2156/2164/2172) define la descripción
     SIEMPRE en 16px Regular 400, sin importar el estado (solo cambia opacidad/color al
     activarse). Acá el estado activo la subía a un clamp que tope a 20px y la ponía en 500
     —el peso/tamaño del Figma solo lo usa el date-pill (arriba), no la descripción—. Medido
     en dev con la transición forzada a instantánea: sin este fix rendería 20px/500 en vez de
     16px/400 apenas el paso se vuelve visible, que es el estado en el que se lo ve la mayor
     parte del tiempo. Antes:
     font-weight: 500;
     font-size: clamp(0.8rem, 1.6vw, var(--font-size-body-lg)); */
}

/* //cambio: timeline vertical en mobile — los 6 pasos horizontales se enciman en <768px */
@media (max-width: 767.98px) {
  .timeline-steps { flex-direction: column; gap: 0; }

  .timeline-step {
    display: grid;
    grid-template-columns: 24px 1fr;
    grid-template-rows: auto 1fr;
    /* //cambio (2026-08-04): 14px → 16px. Valor anterior: `14px`.
       Es el gap entre la columna del progreso (círculo + línea) y la del contenido. El Figma
       mobile lo fija en 16 (frame EL-94a17615 del nodo 3125:1091). */
    column-gap: 16px;
    width: 100%;
    text-align: left;
    padding: 0;
    align-items: start;
    flex: none;
  }

  .timeline-step-track {
    grid-column: 1; grid-row: 1 / -1;
    flex-direction: column;
    width: 24px; height: 100%;
    gap: 4px;
    align-items: center;
  }

  .timeline-segment { width: 3px; height: auto; flex: 1 1 auto; min-height: 14px; }

  .timeline-pill {
    grid-column: 2; grid-row: 1;
    justify-self: start;
    white-space: nowrap;
    margin-bottom: 6px;
    /* //cambio (2026-07-28): era font-size: 0.8rem — el Figma mobile (style_7d2c28a7,
       3134:3103) pide la fecha a 20px SemiBold, MÁS protagonista que en desktop. */
    font-size: 1.25rem;
    font-weight: 600;
  }

  /* //cambio (2026-08-04): en MOBILE el chip sí va relleno, al revés que en desktop.
     El Figma mobile (frame EL-6cc3ca2c, nodo 3134:3102) lo define con fill blanco macizo y
     texto #003DA0, sin stroke. El desktop (EL-df52d90f) lo quiere calado: transparente, borde
     blanco 2px y texto blanco. Son tratamientos opuestos a propósito, no una inconsistencia.
     Arriba en la regla de estado se corrigió el desktop, así que acá hay que volver a poner el
     relleno o mobile heredaría el calado. Se declara en los DOS estados (apagado y activo)
     para que el chip mobile se vea relleno desde el arranque de la animación. */
  .timeline-pill,
  .timeline-step.is-visible .timeline-pill,
  .timeline-step.is-complete .timeline-pill {
    background: #fff;
    color: var(--color-primary);
    border-color: #fff;
  }

  .timeline-desc {
    grid-column: 2; grid-row: 2;
    text-align: left;
    /* //cambio (2026-07-28): era font-size: 0.8rem / padding-bottom: 22px — el Figma mobile
       (3134:3104) pide 16px lh 1.3-1.4 y más aire entre pasos. */
    padding-bottom: 28px;
    font-size: 1rem;
    line-height: 1.4;
  }
}

/* === Cómo funciona === */
.como-funciona-section {
  position: relative;
  overflow: hidden;
  background: #fff;
}

/* //cambio: el Figma VIGENTE apila el subtítulo DEBAJO del título, a la izquierda: el nodo
   2943:1742 es hijo de la columna "Section Title" (2895:1715), no una segunda columna de la
   fila — verificado contra el render del frame 2895:1713 (2026-07-27). El layout anterior a
   dos columnas alineadas abajo era de una lectura previa del nodo:
   .como-funciona-header { display: flex; align-items: flex-end; gap: 2rem; }
   El gap visual título→subtítulo en el render es ~20px (la caja del subtítulo es de 47px con
   texto de 60px alineado abajo — desborda hacia arriba y come parte del gap de 32 declarado). */
.como-funciona-header {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1.25rem;
}

.como-funciona-header-titulo {
  flex: 1 1 auto;
  min-width: 0;
  /* //cambio: reportado por el usuario (2026-07-28) — eyebrow y título quedaban PEGADOS
     (gap real medido: 0px; el eyebrow lleva mb-0 y nada separaba). El Figma (frame 2895:1717,
     gap del column) pide 32px entre "flujo operativo y cobertura" y el título. */
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2rem;
}

.como-funciona-header-subtitulo {
  /* //cambio: era `flex: 0 1 38.6%` (columna derecha). Ahora es un bloque bajo el título.
     El nodo del Figma (2943:1742) mide 446px PARA SU COPY ("Te contamos cuales son los
     puntos…", 80 caracteres, 2 líneas). El copy cargado en dev es más largo (95 caracteres)
     y a 446px caía en 3 líneas con "empresa" huérfana — reportado por el usuario 2026-07-28.
     Medido en vivo: 500px es el mínimo que reproduce las 2 líneas del diseño con el copy
     actual (y el copy del Figma también entra en 2 a ese ancho). */
  flex: none;
  max-width: 31.25rem;
  font-family: var(--font-body);
  font-size: var(--font-size-body-lg);
  font-weight: 300;
  line-height: 1.5;
  color: var(--color-text-muted);
}

/* //cambio: en mobile las dos columnas se apilan — a 494px de subtítulo junto al título no
   entran, y el Figma mobile los muestra uno debajo del otro. */
@media (max-width: 991.98px) {
  .como-funciona-header {
    flex-direction: column;
    align-items: stretch;
    gap: 1rem;
  }

  .como-funciona-header-subtitulo {
    flex-basis: auto;
  }
}

.como-funciona-bg {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
}

.como-funciona-blur {
  position: absolute;
  width: clamp(280px, 55vw, 707px);
  height: clamp(160px, 25vw, 317px);
  border-radius: 50%;
  filter: blur(72px);
  opacity: 0.95;
}

/* //cambio: §3B — posiciones del Figma vigente (lienzo 1920, frame 2895:1713). Se quita el
   scale(1.75) del mockup viejo: la elipse ya mide 707×317 como el diseño y la caída la hace
   el gradiente. Valores anteriores:
   --1: left clamp(0px,2vw,29px); top clamp(120px,18vw,226px); transform scale(1.75)
   --2: right clamp(-40px,-3vw,29px); bottom clamp(40px,8vw,120px); transform scale(1.75) */
.como-funciona-blur--1 {
  /* elipse 2895:1735 — x142 y318 */
  left: clamp(0px, 7.4vw, 142px);
  top: clamp(150px, 16.5vw, 318px);
  background: var(--gradient-como-blur-1);
}

.como-funciona-blur--2 {
  /* elipse 2931:1396 (la señalada por el usuario) — x1057 y454 */
  left: clamp(320px, 55vw, 1057px);
  top: clamp(220px, 23.6vw, 454px);
  background: var(--gradient-como-blur-2);
}

/* //cambio: §3B — tercera mancha (2895:1736, x1131 y964): en el Figma queda casi toda por
   debajo del frame (844px de alto) y solo su halo tiñe el borde inferior derecho. Se ancla al
   fondo con bottom negativo para reproducir esa porción visible (la sección tiene
   overflow:hidden, clipea el resto). */
.como-funciona-blur--3 {
  right: clamp(20px, 4.3vw, 82px);
  bottom: clamp(-260px, -12vw, -160px);
  background: var(--gradient-como-blur-3);
}

.como-funciona-content {
  position: relative;
  z-index: 1;
}

/* === Flujo circular === */
.flow-circles {
  display: flex;
  flex-wrap: nowrap;
  justify-content: center;
  gap: 0;
  margin: 2rem 0;
  max-width: 100%;
}

.flow-circles[data-flow-circles] .flow-circle {
  opacity: 0;
  transform: scale(0.55);
  transition: opacity 0.55s ease, transform 0.55s cubic-bezier(0.34, 1.4, 0.64, 1), transition-delay 0s;
}

.flow-circles[data-flow-circles] .flow-circle.is-visible {
  opacity: 1;
  transform: scale(1);
}

.flow-circles[data-flow-circles] .flow-circle.is-visible:nth-child(1) { transition-delay: 0ms; z-index: 1; }
.flow-circles[data-flow-circles] .flow-circle.is-visible:nth-child(2) { transition-delay: 140ms; z-index: 2; }
.flow-circles[data-flow-circles] .flow-circle.is-visible:nth-child(3) { transition-delay: 280ms; z-index: 3; }
.flow-circles[data-flow-circles] .flow-circle.is-visible:nth-child(4) { transition-delay: 420ms; z-index: 4; }
.flow-circles[data-flow-circles] .flow-circle.is-visible:nth-child(5) { transition-delay: 560ms; z-index: 5; }
.flow-circles[data-flow-circles] .flow-circle.is-visible:nth-child(6) { transition-delay: 700ms; z-index: 6; }

.flow-circle {
  width: clamp(130px, 18vw, 240px);
  height: clamp(130px, 18vw, 240px);
  border-radius: 50%;
  background: var(--color-circle-bg);
  mix-blend-mode: multiply;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 0.5rem;
  margin-right: clamp(-16px, -2.3vw, -30px);
  flex-shrink: 0;
}

.flow-circle:last-child { margin-right: 0; }
.flow-circle:first-child { margin-left: 0; }

.flow-circle strong {
  font-family: var(--font-title);
  /* //cambio: fix 9 auditoría — el <strong> hereda bolder→700 y Cocogoose no tiene 700: caía
     a la Bold 800. Sección hoy oculta (círculos vaciados); se corrige igual. */
  font-weight: var(--font-weight-title-semibold);
  font-size: var(--font-size-body-lg);
  color: var(--color-primary);
  display: block;
}

.flow-circle span {
  font-size: var(--font-size-body-lg);
  color: var(--color-primary);
}

/* === Carrusel Swiper Cómo funciona === */
/* //cambio: el Figma no lleva el carrusel al ancho completo del container (1280): la fila de
   slides mide 1070 centrada (2895:1804) y la botonera 1074 (2895:1808). */
.como-swiper-wrapper { position: relative; max-width: 66.875rem; margin-inline: auto; }
.como-funciona-swiper { overflow: hidden; }
.como-funciona-swiper .swiper-slide { height: auto; }

.como-swiper-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  /* //cambio: la botonera del Figma (2895:1808) lleva padding lateral 24px y queda a 16px de
     la card (gap del frame 2943:1728); antes 12px/24px. */
  margin-top: 1rem;
  padding-inline: 1.5rem;
}

.como-swiper-pagination {
  flex: 0 0 auto;
  justify-content: flex-start;
  position: static !important;
  width: auto !important;
  transform: none !important;
}

.como-swiper-nav {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  flex-shrink: 0;
  margin-left: auto;
}

.como-swiper-footer .carousel-nav-btn { flex-shrink: 0; }

.como-swiper-footer .carousel-nav-btn.swiper-button-disabled {
  opacity: 0.35;
  cursor: not-allowed;
}

.como-swiper-pagination .step-dot { display: inline-block; }

.como-slide-title {
  /* //cambio: fixes 7-8 auditoría + Figma 2895:4308. El clamp propio (1.5rem,3vw,2.25rem)
     tenía otra pendiente que el token del h2 y el h3 del slide salía MÁS GRANDE que el h2 de
     la sección entre 1200-1440px; y pedía weight 500, cara que Cocogoose no tiene (caía a la
     Bold 800). El Figma define el título de slide en 32px / Light 300 / lh 1.2. */
  font-size: var(--font-size-h3);
  font-weight: var(--font-weight-title);
  line-height: 1.2;
  color: var(--color-primary);
  letter-spacing: -0.03em;
  /* //cambio: separación título→contenido del Figma (40px, gap del frame 2895:4306).
     Reemplaza al mb-5 (48px) que traía el markup de flujo.php. */
  margin-bottom: 2.5rem;
}

.step-carousel-panel-inner {
  background: #fff;
  border-radius: var(--radius-small);
  box-shadow: var(--shadow-medium);
  /* //cambio: el Figma (2895:1805/1806/1807) da a las cards de slide padding 60px y altura
     432-454px; los topes anteriores (80px / 480px) venían del mockup viejo. */
  padding: clamp(1.5rem, 4vw, 3.75rem);
  min-height: clamp(360px, 45vw, 28.375rem);
}

/* //cambio: comparación slides vs Figma (2026-07-27) — en los slides "¿Qué cubre?" y "Pago de
   indemnización" la fila alinea lista/pasos y card ABAJO (align-items flex-end, Figma
   2895:4365 y 2895:4404). Solo en la fila de 2 columnas (clase puesta en flujo.php); la fila
   de cards del slide 1 mantiene el stretch para el h-100. En mobile las columnas apilan a
   ancho completo y esta regla no tiene efecto visual. */
.como-slide-row-split {
  align-items: flex-end;
}

.step-dots {
  display: flex;
  gap: 8px;
  align-items: center;
}

.step-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #d3daea;
  border: none;
  padding: 0;
  cursor: pointer;
}

.step-dot.active {
  background: var(--color-primary);
  width: 24px;
  border-radius: 4px;
}

.carousel-nav-btn {
  width: 57px;
  height: 57px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 2px solid var(--color-primary);
  background: transparent;
  cursor: pointer;
  padding: 0;
  /* //cambio: reportado por el usuario (2026-07-28) — la flecha del botón outline (prev) se
     veía casi negra: el SVG usa stroke="currentColor" y sin color declarado heredaba el color
     del body. El Figma (2895:1816) la pide en el azul primary, igual que el borde. */
  color: var(--color-primary);
}

.carousel-nav-btn.primary {
  background: var(--color-primary);
  border-color: var(--color-primary);
  color: #fff;
}

.carousel-nav-btn img {
  width: 20px;
  height: 20px;
}

.carousel-nav-btn.primary img {
  filter: brightness(0) invert(1);
}

.section-blue .carousel-nav-btn:not(.primary) {
  border-color: #fff;
  /* //cambio: acompaña el color:var(--color-primary) nuevo de la base — sobre fondo azul la
     flecha outline vuelve a blanco (antes lo heredaba de .section-blue, ahora hay que pisarlo). */
  color: #fff;
}

.section-blue .step-dot { background: rgba(255, 255, 255, 0.4); }
.section-blue .step-dot.active { background: #fff; }

/* === Aportes cards === */
.aporte-card {
  background: var(--color-tooltip);
  border-radius: 8px;
  padding: 1rem 1rem 1.25rem;
  min-height: 250px;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

.aporte-card-white {
  background: #fff;
  border-radius: 16px;
  padding: 1rem;
}

/* //cambio (2026-07-28): antes inline en flujo.php (style="color:...;font-size:2rem") — a
   clase para poder adaptarlos en el bloque mobile sin !important. Mismos valores. */
.aporte-valor {
  color: var(--color-border);
  font-size: 2rem;
}

.aporte-valor-unidad {
  font-size: 1.5rem;
}

/* //cambio: ícono de aporte (portado del mockup global.css) */
.aporte-icon {
  width: 38px;
  height: 38px;
  flex-shrink: 0;
}

/* //cambio: comparación slides vs Figma (2026-07-27) — etiquetas de las cards de aportes
   ("Grandes empresas", "Resto", "Condiciones"): Cocogoose Semilight 350 a 20px
   (style_bc5f5ee0); antes quedaban en 16px Light por el .font-title pelado. */
.aporte-card-label {
  font-size: 1.25rem;
  font-weight: var(--font-weight-title-semibold);
  line-height: 1.2;
}

.check-list {
  list-style: none;
  padding: 0;
  margin: 0;
}

.check-list li {
  display: flex;
  gap: 8px;
  align-items: flex-start;
  margin-bottom: 1rem;
  font-size: var(--font-size-body);
  /* //cambio: comparación slides vs Figma (2026-07-27) — las condiciones del slide "Esquema
     de aportes" (nodos 4356/4359) van en Noto 16 AZUL #00369A; antes heredaban familia y
     color del body del tema. */
  font-family: var(--font-body);
  color: var(--color-border);
}

/* //cambio: la lista de cobertura del slide "¿Qué cubre?" usa otra cara que las condiciones
   del slide 1 (Figma 4371/4375/4378/4381): Cocogoose Light 18px gris #55585A. Modificador en
   flujo.php sobre la misma .check-list. */
.check-list--cobertura li {
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: 1.125rem;
  color: var(--color-text-muted);
}

.check-list img,
.check-list svg { /* //cambio: svg inline además de img (íconos hardcodeados) */
  /* //cambio: eran 24px; el Figma (EL-c93591d6 / layout 20×20) los define en 20. */
  width: 20px;
  height: 20px;
  flex-shrink: 0;
  margin-top: 2px;
}

.info-box {
  background: var(--color-tooltip);
  border-radius: 8px;
  /* //cambio: comparación slides vs Figma (2026-07-27) — la card (EL-eb0ff1d5) lleva padding
     16px 24px con el bloque ícono+etiqueta arriba y la caja blanca abajo (space-between);
     antes padding 1.5rem y todo centrado. */
  padding: 1rem 1.5rem;
  min-height: 238px;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

/* //cambio: en el Figma el ícono va ARRIBA de la etiqueta (columna, gap 16 — EL-f6efe3b4),
   no en fila. Markup en flujo.php. */
.info-box-head {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1rem;
}

/* //cambio: etiqueta "Concepto clave"/"Importante" — 20px Semilight (style_bc5f5ee0). */
.info-box-label {
  font-size: 1.25rem;
  font-weight: var(--font-weight-title-semibold);
  line-height: 1.2;
}

/* //cambio: caja blanca interna del Figma (2939:1504/1614 — fondo #fff, radio 8, 105px de
   alto, texto centrado verticalmente). Antes el texto iba directo sobre el gris. */
.info-box-white {
  background: #fff;
  border-radius: 8px;
  padding: 0.5rem 1rem;
  min-height: 105px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.info-box-icon {
  /* //cambio: eran 24px; el Figma (layout 38×38 de lightbulb-05 / alert-circle) pide 38. */
  width: 38px;
  height: 38px;
  flex-shrink: 0;
}

.info-box-highlight {
  /* //cambio: era clamp(1.125rem, 2vw, 1.5rem) directo sobre el gris; el Figma
     (style_6d7225f5) lo define en 16px lh 1.4 dentro de la caja blanca. */
  font-size: 1rem;
  color: var(--color-border);
  line-height: 1.4;
}

/* //cambio: "Cómo funciona" mobile — col-md-4/col-lg-6 no fuerzan 100% bajo su breakpoint
   (quedan pegadas costado a costado) y los min-height fijos dejan espacio en blanco al apilar */
@media (max-width: 767.98px) {
  .step-carousel-panel-inner { min-height: 0; }
  .aporte-card { min-height: auto; }
  .step-carousel-panel-inner .row > [class*="col-"] {
    flex: 0 0 100%;
    max-width: 100%;
    width: 100%;
  }
}

/* === Gestión FAL — stack vertical apilado + scroll pin === */
.gestion-section { position: relative; }

.gestion-section.section-blue {
  padding-block: clamp(2rem, 5vh, 6.25rem);
}

/* //cambio: stacking puro CSS sticky — ya no es scroll-pin con JS. Cada card se clava
   80px más abajo que la anterior, sin transforms ni opacity changes. */
.gestion-pin {
  height: auto;
  position: relative;
}

/* gestion-pin-sticky: ya no es sticky — cada card es individualmente sticky */
.gestion-pin-sticky {
  position: relative;
  top: 0;
  z-index: 1;
  height: auto;
  min-height: 0;
  display: block;
  padding-block: 0;
  overflow: visible;
}

.gestion-pin-sticky.gestion-layout-scrollable {
  max-height: none;
  overflow: visible;
}

.gestion-pin-sticky > .gestion-container { width: 100%; }

.gestion-header {
  display: flex;
  flex-direction: column;
  gap: 2rem;
  /* //cambio (2026-08-04): aire arriba de "Simple, claro y concreto". Medido en dev: el
     eyebrow quedaba a 24px del borde superior del panel azul, pegado.
     El culpable no es esta regla sino el `@media (max-height: 960px)` de más abajo, que baja
     el `padding-block` de la sección de `clamp(2rem, 5vh, 6.25rem)` a `1.5rem` — y ese media
     query se activa en CUALQUIER notebook (844px de alto de viewport es lo típico), así que en
     la práctica los 24px son el caso normal, no el borde.
     Se agrega el aire acá y no subiendo ese padding-block porque `padding-block` toca arriba Y
     abajo, y el de abajo está calibrado contra la pila sticky de cards. Este padding vive por
     encima del stack, así que no altera el pineado. */
  padding-top: clamp(1.5rem, 4vh, 3rem);
  margin-bottom: clamp(2rem, 6vh, 5rem);
  max-width: 80rem;
}

.gestion-eyebrow {
  font-size: var(--font-size-body-lg);
  line-height: 1.5;
}

.gestion-section-title {
  /* //cambio: comparación vs Figma vigente 2895:4757 (2026-07-28) — el diseño CAMBIÓ desde
     que una sesión anterior lo bajó a 36px citando el nodo 2895:1825: el canvas actual define
     "Así se gestiona tu FAL" en 54px Cocogoose ULTRALIGHT 200 (cara que sí existe:
     100/200/300/350/800), letter-spacing -0.03em. La pendiente del clamp es la del h2
     escalada 54/36 para que acompañe en pantallas chicas. Valor anterior:
     font-size: var(--font-size-h2); (36px, weight heredado 300) */
  font-size: clamp(2.25rem, 3.6vw, 3.375rem);
  font-weight: 200;
  line-height: 1.2;
  letter-spacing: -0.03em;
}

.gestion-stack-wrapper {
  /* //cambio: offset chico estilo complif.com (antes 80px). Es la "solapa" visible de cada
     card cuando las 3 quedan apiladas: con ~32px se ven las 3 con un peek parejo y la 3ra
     NO tapa a la 1ra. */
  --gestion-stack-offset: clamp(1.5rem, 3vh, 2.25rem);
  position: relative;
  height: auto;
  max-width: 90.25rem;
  margin-inline: auto;
}

/* Stack viewport: flex column. //cambio: gap chico + padding-bottom chico (antes 30vh / 80vh).
   Esos valores gigantes creaban el "scroll muerto" y el espacio azul vacío hacia la siguiente
   sección. El recorrido de apilado lo da la altura natural de las cards, no un gap inflado. */
.gestion-stack-viewport {
  display: flex;
  flex-direction: column;
  gap: clamp(2rem, 5vh, 4rem);
  /* //cambio: era clamp(2.5rem, 12vh, 7rem) — unos 88px de aire después de la última card.
     Un elemento sticky sólo permanece pegado mientras su CONTENEDOR tenga recorrido: acá el
     contenedor terminaba justo cuando la tercera card llegaba, así que las tres se despegaban
     y se iban juntas en vez de apilarse. Medido: a scroll 5257 estaban pegadas la 1 y la 2, y
     a 5466 la tercera aparecía en top=153 —por encima de su propio sticky de 225— y las otras
     ya se habían soltado.
     OJO: el recorrido extra NO puede darse con padding-bottom. Un elemento sticky está
     limitado por la CONTENT BOX de su contenedor, y el padding queda fuera de ella — probado:
     subir el padding de 88px a 366px no movió el aguja. Se hace con margin-bottom en la última
     card (ver más abajo), que sí suma a la altura de contenido del flex container. */
  padding-bottom: clamp(2.5rem, 12vh, 7rem);
  height: auto;
  overflow: visible;
}

/* //cambio: espaciador que da el recorrido de scroll durante el cual la última card queda
   "sostenida" arriba de la pila. Fue el tercer intento y los dos anteriores fallaron por la
   misma razón de fondo — vale dejarla escrita:
     1) padding-bottom en el contenedor: NO sirve. El sticky se acota contra la content box y
        el padding queda afuera. Subirlo de 88px a 366px no movió nada.
     2) margin-bottom en .gestion-card:last-child: TAMPOCO. El margin forma parte de la margin
        box de la propia card, y el sticky exige que ESA caja entre en el contenedor: empuja y
        agranda en la misma medida, neto cero.
     3) un ::after: sí funciona, porque en un contenedor flex es un ítem más y agranda la
        content box sin pertenecer a la caja de ninguna card. */
.gestion-stack-viewport::after {
  content: "";
  flex: 0 0 auto;
  height: clamp(12rem, 60vh, 32rem);
  pointer-events: none;
}

/* STACKING DE SOLAPAS — Puro CSS sticky (sin JS)
   Cada card tiene position:sticky con top escalonado desde una base común.
   //cambio: el escalón ahora es var(--gestion-stack-offset) (~32px, estilo complif.com),
   no 80px. Base = header + 1.5rem. Card N se clava en base + N×offset → las 3 quedan
   apiladas con una solapa pareja y la 3ra no se solapa con la 1ra. */
.gestion-card {
  position: sticky;
  inset-inline: 0;
  background: #fff;
  border-radius: var(--radius-small);
  box-shadow: var(--shadow-card);
  padding: clamp(1.75rem, 3.5vw, 5rem);
  width: 100%;
  color: var(--color-primary);
  pointer-events: auto;
  border: 1px solid rgba(0, 0, 0, 0.05);
}

.gestion-card[data-gestion-card="0"] {
  top: calc(var(--site-header-height) + 1.5rem);
  z-index: 10;
}

.gestion-card[data-gestion-card="1"] {
  top: calc(var(--site-header-height) + 1.5rem + var(--gestion-stack-offset));
  z-index: 20;
}

.gestion-card[data-gestion-card="2"] {
  top: calc(var(--site-header-height) + 1.5rem + (var(--gestion-stack-offset) * 2));
  z-index: 30;
}

.gestion-card .font-title,
.gestion-card .gestion-card-title,
.gestion-card .gestion-step-text,
.gestion-card strong {
  color: var(--color-primary);
}

.gestion-card .eyebrow {
  color: var(--color-accent);
  font-size: var(--font-size-body-lg);
  line-height: 1.5;
}

.gestion-card-row { min-height: 0; }

@media (min-width: 992px) {
  .gestion-card-row > [class*="col-"] {
    display: flex;
    flex-direction: column;
  }
  .gestion-card-content {
    flex: 1;
    height: 100%;
  }
}

@media (min-width: 1200px) {
  .gestion-card-row { --bs-gutter-x: 5rem; }
}

.gestion-card-content {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: clamp(1.25rem, 2.5vh, 2rem);
}

.gestion-card-copy {
  display: flex;
  flex-direction: column;
  gap: clamp(1.25rem, 2.5vh, 2rem);
}

.gestion-card-heading {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

.gestion-card-title {
  /* //cambio: su clamp llegaba a 54px y renderizaba 49.8px; el Figma (I2957:1849;2895:4779) lo
     fija en 40px. Mismo tope que --font-size-hero, pero se deja explícito acá porque es un
     título de card, no el del hero, y compartir ese token sería confuso al leerlo. */
  font-size: clamp(1.75rem, 2.6vw, 2.5rem);
  line-height: 1.2;
  letter-spacing: -0.03em;
  color: var(--color-primary);
  font-weight: var(--font-weight-title);
}

/* //cambio: modificadores de gestion-card-copy (de global.css) — controlan el gap entre heading y contenido según tipo de card */
.gestion-card-copy--steps {
  gap: clamp(2rem, 6vh, 6.5625rem);
}

.gestion-card-copy--checks {
  gap: clamp(1.5rem, 3vh, 2.3125rem);
}

.gestion-card-copy--checks-tight .gestion-check-list--tight {
  gap: 0.75rem;
}

/* //cambio: estilar ol/li del wysiwyg de gestion como step-items del mockup (círculo numerado + texto) */
.gestion-card-body ol {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 1rem;
  counter-reset: gestion-step;
}

.gestion-card-body ol > li {
  counter-increment: gestion-step;
  display: flex;
  align-items: flex-start;
  gap: 1rem;
  font-family: var(--font-title);
  /* //cambio (2026-08-04): mismo caso que .gestion-step-text de más abajo — sin weight
     declarado cae en 400, cara que Cocogoose no tiene, y termina renderizando en Bold 800.
     Esta rama es la del contenido cargado por wysiwyg; se corrige por consistencia aunque hoy
     los pasos que se ven vengan del otro camino. */
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-lg);
  color: var(--color-primary);
  line-height: 1.5;
  margin-bottom: 0;
}

.gestion-card-body ol > li::before {
  content: counter(gestion-step);
  width: 30px;
  height: 30px;
  min-width: 30px;
  border: var(--border-width) solid var(--color-primary);
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-body);
  font-size: var(--font-size-body);
  color: var(--color-primary);
  flex-shrink: 0;
}

.gestion-card-media {
  position: relative;
  min-height: clamp(200px, 40vw, 28.5rem);
  height: auto;
  border-radius: 12px;
  overflow: hidden;
  background: var(--color-bg-light);
}

.gestion-card-media-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: inherit;
}

.gestion-card-media::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  border-radius: inherit;
  z-index: 1;
  background: var(--gradient-gestion-image);
}

@media (min-width: 992px) {
  .gestion-card-media {
    flex: 1 1 auto;
    min-height: 28.5rem;
    height: 100%;
  }
}

.gestion-steps {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.gestion-step-text {
  font-family: var(--font-title);
  /* //cambio (2026-08-04): faltaba declarar el weight. Medido en dev: computaba `400`, y
     Cocogoose Pro NO tiene cara 400 (solo 100/200/300/350/800), así que el navegador la
     resolvía contra la Bold 800 — los 4 pasos de "Tu ID FAL" salían en negrita mientras que
     las otras cards no. La diferencia era que `.gestion-check-item-row strong` SÍ declara
     `var(--font-weight-title)` y computa 300.
     Es exactamente el mismo bug que ya arreglaron los fixes 9/10/11/12 de auditoría en este
     mismo archivo (.flow-circle strong, .stat-value, .eyebrow, .calc-display). */
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-lg);
  color: var(--color-primary);
  line-height: 1.5;
}

.gestion-check-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.gestion-check-item {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  margin-bottom: 0;
}

.gestion-check-item-row {
  display: flex;
  align-items: center;
  gap: 1rem;
}

.gestion-check-item-row img {
  width: 24px;
  height: 24px;
  flex-shrink: 0;
}

.gestion-check-item-row strong {
  font-family: var(--font-title);
  font-size: var(--font-size-body-lg);
  line-height: 1.5;
  /* //cambio: era semibold 350; el Figma (style_71cc0bbf, nodos 4842/4849/4885/4892) define
     los títulos de check en Cocogoose LIGHT 300, igual que los pasos numerados. */
  font-weight: var(--font-weight-title);
  color: var(--color-primary);
}

.gestion-check-item-desc {
  padding-left: 2.5625rem;
  color: var(--color-text-muted);
  font-family: var(--font-body);
  font-size: var(--font-size-body);
  line-height: 1.5;
  letter-spacing: -0.02em;
}


.gestion-tooltip {
  background: var(--color-tooltip);
  border-radius: 4px;
  padding: 8px 12px;
  font-family: var(--font-body);
  font-size: var(--font-size-caption);
  line-height: 1.5;
  color: var(--color-primary);
}

.gestion-layout-compact {
  --gestion-stack-offset: clamp(28px, 4vh, 48px);
  padding-block: 0.875rem;
}

.gestion-layout-compact .gestion-header { gap: 0.875rem; margin-bottom: 1.25rem; }
.gestion-layout-compact .gestion-card { padding: clamp(1.375rem, 2.5vw, 2rem); }
.gestion-layout-compact .gestion-card-copy,
.gestion-layout-compact .gestion-card-content { gap: 1.125rem; }
.gestion-layout-compact .gestion-steps { gap: 0.875rem; }
.gestion-layout-compact .gestion-card-media { min-height: clamp(140px, 24vh, 200px); }

@media (max-height: 960px) {
  .gestion-section.section-blue { padding-block: 1.5rem; }
  .gestion-header { gap: 0.875rem; margin-bottom: 1.5rem; }
  .gestion-card { padding: clamp(1.5rem, 3vw, 2.5rem); }
  .gestion-card-media { min-height: clamp(160px, 28vh, 240px); }
  .gestion-stack-wrapper { --gestion-stack-offset: clamp(28px, 4vh, 48px); }
}

@media (max-width: 767.98px) {
  .gestion-stack-wrapper {
    padding: 0 3.25rem;
    --gestion-stack-offset: clamp(28px, 5vh, 48px);
  }

  /* //cambio (2026-08-04): en mobile las cards DEJAN de ser sticky y scrollean normal.
     Reportado: "antes de empezar a solaparse con las demás tarjetas debería dejar ir hasta el
     final de la card".
     Medido en dev (viewport 390×844, que rinde 486 de ancho): las cards miden 808, 877 y 827px
     de alto, y se clavan en top 114 / 150.6 / 187.2. Una card de 808 pinneada en 114 necesita
     922px de viewport para verse entera: sobran 78px que la siguiente ya está tapando. Y la
     segunda, con 877, NO ENTRA en 844 ni siquiera con top:0 — no hay valor de `top` que lo
     arregle, el problema es que la card es más alta que la pantalla.
     El apilado de solapas es un efecto pensado para desktop, donde la card entra holgada. En
     mobile, donde no entra, deja de ser un efecto y pasa a cortar la lectura. Se desactiva.
     Se neutraliza también el ::after espaciador: existe sólo para darle recorrido de scroll al
     sticky (ver su nota larga más arriba), y sin sticky quedaría como un hueco muerto de hasta
     32rem. Mismo motivo para el padding-bottom del viewport.
     Desktop no se toca: el stacking sigue igual de 768px para arriba. */
  .gestion-card {
    position: static;
  }

  .gestion-stack-viewport::after {
    display: none;
  }

  .gestion-stack-viewport {
    padding-bottom: 0;
    /* //cambio (2026-08-04): era `gap: 1.5rem`. Ahora el viewport es el `.swiper-wrapper` del
       carrusel (ver bloque de abajo) y la separación entre slides la pone Swiper con
       `spaceBetween: 16` = margin-right inline en cada slide. Un `gap` de CSS se SUMA a ese
       margen y descalibra el translate: Swiper mide el ancho del slide, no el del gap, así
       que cada swipe quedaría corrido 24px. Tiene que ser 0. */
    gap: 0;
  }

  /* //cambio: g-5 stackea en mobile; su gutter grande (margen negativo -24px) desborda el container. Reducirlo no tiene efecto visual (columnas full-width) y mata el overflow horizontal. */
  .row.g-5 { --bs-gutter-x: 1.5rem; }
}

/* //cambio (2026-08-04): "Así se gestiona tu FAL" pasa a CARRUSEL EN MOBILE.
   Pedido: "SOLO EN MOBILE las cards pasalas de sticky a que sean en forma de slide".
   Sustituye al scroll plano que había puesto antes en esta misma tanda (el `position: static`
   de arriba se conserva: un slide de Swiper no puede ser sticky, así que sigue haciendo falta).

   La estructura ya calzaba 1:1 con lo que pide Swiper, así que en `inc/fal/gestion.php` sólo se
   AGREGAN clases, no se reordena nada del DOM:
     .gestion-stack-wrapper  += swiper gestion-swiper   (contenedor)
     .gestion-stack-viewport += swiper-wrapper          (track)
     .gestion-card           += swiper-slide            (slides)
   Es el mismo patrón que ya usan .benefits-swiper, .alianza-swiper y .reforma-swiper: markup de
   swiper siempre presente y el CSS lo "apaga" en desktop. El init está en fal.js vía
   initResponsiveSwiper(), que instancia sólo bajo 768px y hace destroy() al volver a subir.

   DESKTOP — qué hay que neutralizar y por qué:
   El riesgo real es UNO y es `.swiper { overflow: hidden }`. Un ancestro con overflow distinto
   de visible ANULA el position:sticky de sus descendientes, así que dejarlo puesto rompía el
   apilado de solapas de desktop entero. `.gestion-stack-wrapper` no declara overflow, o sea que
   no había nada compitiendo: ganaba Swiper.
   El resto de lo que trae Swiper es inofensivo acá, pero se restituye igual por las dudas:
   `.swiper-wrapper` fuerza `display:flex` en fila (el track es columna) y `.swiper-slide` pone
   `position:relative` (pisaría el sticky de la card).
   Los selectores van con DOS clases a propósito. Verificado que hoy fal.css carga después de
   swiper-bundle.min.css (índices 9 y 8 de document.styleSheets), así que a igual especificidad
   ya ganaría por orden — pero eso depende del orden de enqueue, que es frágil. Con 2 clases
   gana siempre, sin importar el orden. */
@media (min-width: 768px) {
  .gestion-stack-wrapper.swiper {
    overflow: visible;   /* ← el crítico: sin esto muere el sticky de las cards */
  }
  .gestion-stack-viewport.swiper-wrapper {
    display: flex;
    flex-direction: column;
    height: auto;
    box-sizing: border-box;
    transform: none !important;
    transition: none !important;
  }
  .gestion-card.swiper-slide {
    position: sticky;    /* Swiper lo pondría en relative y perdería el escalonado */
    width: auto;
    height: auto;
  }
  .gestion-swiper-pagination { display: none; }
}

@media (max-width: 767.98px) {
  .gestion-stack-wrapper.swiper {
    overflow: hidden;    /* recorta los slides que quedan fuera de vista */
  }
  /* `.swiper-wrapper` viene con `box-sizing: content-box` y el track tiene padding-bottom.
     Con autoHeight Swiper escribe `height: <alto de la card>` inline, y en content-box ese
     padding se SUMA: medido en vivo daba 896 de track contra 808 de card = 88px de hueco azul
     abajo, en las tres. Acá arriba el padding-bottom ya se pone en 0, así que el hueco no
     aparece; esto es para que no vuelva si alguien restituye el padding. */
  /* //cambio (2026-08-04): EL TRACK VUELVE A FILA. Este era el bug de fondo detrás de "cuando
     hago slide no las veo".
     `.gestion-stack-viewport` declara `flex-direction: column` en su regla base (línea ~2148),
     que es lo que necesita el apilado sticky de desktop. Swiper no toca flex-direction —el
     layout horizontal se lo da al contenedor, no al track—, así que en mobile el track seguía
     siendo una COLUMNA: las tres cards quedaban una debajo de otra, todas en la misma X.
     Medido en vivo: las 3 slides con `x=12` idénticas, y con la card 0 activa el track arrancaba
     en y=-514 mientras la slide 1 estaba en y=445 (959px más abajo, fuera del track de 808).
     Swiper igual desplazaba el track de a 478px en horizontal, pero como no había nada a la
     derecha, deslizar mostraba vacío.
     Va con 2 clases para ganarle a la regla base, que tiene 1. Desktop no se entera: su bloque
     de arriba fija `flex-direction: column` explícitamente. */
  .gestion-stack-viewport.swiper-wrapper {
    flex-direction: row;
    box-sizing: border-box;
  }

  /* //cambio (2026-08-04): neutraliza el escalonado del sticky, segunda mitad del mismo bug.
     Arriba en este bloque ya hay un `.gestion-card { position: static }`, pero NO alcanza: la
     regla ganadora resultó ser `.swiper-slide { position: relative }` servida desde una hoja
     INLINE que el navegador ubica después de fal.css. A igual especificidad (1 clase cada una)
     gana la última, o sea Swiper. Verificado enumerando las reglas que matchean la card.
     El daño: con `relative` los `top` del apilado (114 / 150.6 / 187.2px, uno por card) dejan
     de clavar y pasan a EMPUJAR. Medido: las 3 slides ya en fila pero con topes -400 / -363 /
     -327, escalonadas justo el `--gestion-stack-offset` (~37px = 5vh).
     Se resuelve con 2 clases. Y se usa `relative` + `top: auto` en vez de `static` porque un
     slide de Swiper conviene que siga siendo un bloque posicionado; `top: auto` es lo que
     anula el offset, no el `position`. */
  .gestion-card.swiper-slide {
    position: relative;
    top: auto;
  }

  /* //cambio (2026-08-04): la ALTURA del track deja de animarse. Reportado: "las veo cortadas".
     Swiper, con autoHeight, trae `.swiper-autoheight .swiper-wrapper { transition-property:
     transform, height }`, o sea interpola el alto junto con el desplazamiento. Medido en vivo a
     los 50ms de un slide 0→1: track en 823px contra una card entrante de 877 → el
     `overflow: hidden` del wrapper le recortaba 53px durante toda la transición.
     Sacando `height` de la lista, el alto salta de una al valor final y la card entrante se ve
     entera desde el primer frame. El transform se sigue animando, así que el deslizamiento no
     pierde suavidad. Contrapartida asumida: la card que SALE queda con hasta 69px de aire abajo
     mientras dura la transición — se nota mucho menos que ver la card nueva cortada.
     Van 3 clases para ganarle a `.swiper-autoheight .swiper-wrapper`, que tiene 2. */
  .gestion-swiper.swiper-autoheight .swiper-wrapper {
    transition-property: transform;
  }
  /* El ancho lateral del wrapper NO se toca: define el de la imagen, y las posiciones de las
     glass pills están calibradas en % sobre una imagen de 412px. Moverlo las descalibra todas.
     Medido en vivo: el padding efectivo acá es 0, no los `0 3.25rem` de la regla de más arriba
     (línea ~2471) — la pisa `.gestion-stack-wrapper { padding: 0 }` del bloque mobile de la
     línea ~4396, que va después. Con padding 0 el slide ocupa el ancho completo del contenedor,
     así que NO se asoma el slide siguiente: la única señal de que hay más son los bullets.
     Por eso la paginación es obligatoria acá y no un adorno.
     Se descartó darle peek con slidesPerView 1.05 o restituyendo el padding: las dos cosas
     achican la imagen y descalibran las pills que se acaban de ajustar en esta misma tanda. */
  .gestion-swiper-pagination {
    display: block;
    position: static;
    margin-top: 1.5rem;
    text-align: center;
  }
  /* Bullets blancos: el panel de esta sección es azul, igual que benefits y alianza. */
  .gestion-swiper-pagination .swiper-pagination-bullet {
    background: rgba(255, 255, 255, 0.5);
    opacity: 1;
  }
  .gestion-swiper-pagination .swiper-pagination-bullet-active { background: #fff; }
}

/* Slide step items dentro de gestion */
.gestion-slide .step-number {
  width: 30px;
  height: 30px;
  /* //cambio: comparación slides vs Figma (2026-07-27) — el círculo numerado (EL-94ed9f7d)
     lleva borde 1.5px en ACCENT #1D68E2 y el número también en accent; antes 1px primary. */
  border: 1.5px solid var(--color-accent);
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-body);
  font-size: var(--font-size-body);
  color: var(--color-accent);
  flex-shrink: 0;
}

.gestion-slide .step-item {
  display: flex;
  margin-bottom: 0;
}

/* //cambio: FE DE ERRATAS (2026-07-28) — estas tres reglas nacieron para el slide 3 de
   "Cómo funciona" pero estaban scopeadas a `.gestion-slide`, clase que TAMBIÉN llevan las
   cards de la sección "Así se gestiona tu FAL": el margin de 32px y el texto 18px gris se
   filtraron a los pasos de "Tu ID FAL" (que el Figma 2895:4750 quiere con gap 16 y texto
   20px azul — .gestion-step-text). Se re-scopean al panel del carrusel, que es el único
   lugar donde aplican. */
.step-carousel-panel-inner .step-item {
  /* Figma flujo (EL-c094fdcc): gap 12 y círculo alineado a la PRIMERA línea del texto */
  gap: 0.75rem;
  align-items: flex-start;
}

/* separación entre pasos del Figma flujo (gap 32 del frame 2895:4406) */
.step-carousel-panel-inner .step-item + .step-item {
  margin-top: 2rem;
}

/* texto del paso del flujo — Cocogoose Light 18px gris (style_2f099ac6) */
.step-carousel-panel-inner .step-item p {
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: 1.125rem;
  line-height: 1.5;
  color: var(--color-text-muted);
}

/* //cambio: pasos de las cards de gestión — Figma 2895:4750 (EL-235879b0): fila con gap 8px
   y círculo centrado; la separación entre pasos la da .gestion-steps (gap 16px). */
.gestion-card .step-item {
  gap: 0.5rem;
  align-items: center;
}

/* //cambio: Gestión — glass pills sobre las imágenes (Figma 2272:330/380/423/431, 2302:577).
   Overlays decorativos posicionados absolute dentro de .gestion-card-media. Markup en inc/fal/gestion.php.
   Los <img> (halo, lock, glyph) se sirven desde assets/images/fal/gestion/ del tema. */
.gestion-glass-pill {
  --gestion-glass-shadow: 0 3px 8px 3px rgba(53, 53, 53, 0.1);
  --gestion-glass-inset:
    inset -1px -3px 3px rgba(255, 255, 255, 0.05),
    inset 1px 3px 5px rgba(255, 255, 255, 0.3),
    inset 0 0 10px rgba(255, 255, 255, 0.15),
    inset 0 2px 15px 6px rgba(53, 53, 53, 0.05);
  position: absolute;
  z-index: 2;
  overflow: hidden;
  box-shadow: var(--gestion-glass-shadow);
  color: var(--color-primary);
}

.gestion-glass-pill::before {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(255, 255, 255, 0.1);
  backdrop-filter: blur(6.5px);
  -webkit-backdrop-filter: blur(6.5px);
  border-radius: inherit;
  pointer-events: none;
}

.gestion-glass-pill__highlight {
  position: absolute;
  width: 25rem;
  height: 25rem;
  left: -5.625rem;
  top: -7.75rem;
  background: rgba(255, 255, 255, 0.4);
  backdrop-filter: blur(10.5px);
  -webkit-backdrop-filter: blur(10.5px);
  border-radius: var(--radius-small);
  pointer-events: none;
}

.gestion-glass-pill__highlight--card { top: -3.625rem; }

.gestion-glass-pill__inset {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  box-shadow: var(--gestion-glass-inset);
  pointer-events: none;
}

/* Badge ID FAL — 200×60 */
.gestion-glass-pill--badge {
  top: 39%;
  left: clamp(1.25rem, 7%, 3.3125rem);
  width: 12.5rem;
  height: 3.75rem;
  border-radius: 30px;
  /* //cambio: las medidas de arriba vienen del canvas ANTERIOR del Figma. El vigente
     (I2957:1849;2895:4803) da un badge de 122×48 sobre una imagen de 602px, o sea el 20.8%
     de su ancho; acá venía ocupando el 35%. Se corrige con scale() y no bajando width/height
     porque todos los internos —anillo, candado, textos— están en rem y px absolutos y se
     quedarían a tamaño original. El origen top-left conserva el anclaje existente. */
  --pill-scale: 0.682;
  transform: scale(var(--pill-scale));
  transform-origin: top left;
}

.gestion-glass-pill__icon-ring {
  position: absolute;
  z-index: 1;
  left: 10px;
  top: 9px;
  width: 2.6875rem;
  height: 2.6875rem;
}

.gestion-glass-pill__halo {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.gestion-glass-pill__lock {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 1.25rem;
  height: 1.25rem;
}

.gestion-glass-pill__copy {
  position: absolute;
  z-index: 1;
  left: 3.9375rem;
  top: 11px;
  display: flex;
  flex-direction: column;
  white-space: nowrap;
}

.gestion-glass-pill__title {
  font-family: var(--font-title);
  font-size: 1.125rem;
  font-weight: var(--font-weight-title-semibold);
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--color-primary);
}

.gestion-glass-pill__code {
  font-family: var(--font-title);
  font-size: 1.125rem;
  font-weight: var(--font-weight-title);
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--color-primary);
}

.gestion-glass-pill--badge-nuevo .gestion-glass-pill__title span {
  font-weight: var(--font-weight-title-semibold);
}

/* Success cards — 198×188 */
.gestion-glass-pill--card {
  width: 12.375rem;
  height: 11.75rem;
  border-radius: var(--radius-small);
  text-align: center;
  /* //cambio: mismo caso que el badge. El Figma vigente (I2957:1849;2943:1770) la define en
     144×148 sobre una imagen de 602px = 24% del ancho; acá ocupaba el 35%.
     La escala va en una variable y no directo en `transform` porque varias variantes
     (--card-pause, --resume, y sus versiones mobile) declaran su propio transform para
     centrarse, y pisarían el scale. Componiéndolo con var() cada una lo conserva. */
  --pill-scale: 0.785;
  transform: scale(var(--pill-scale));
  transform-origin: top left;
}

.gestion-glass-pill__symbol {
  position: absolute;
  z-index: 1;
  left: 50%;
  top: 1.8125rem;
  transform: translateX(-50%);
  width: 5.4375rem;
  height: 5.4375rem;
}

.gestion-glass-pill__symbol .gestion-glass-pill__halo { width: 100%; height: 100%; }

.gestion-glass-pill__glyph {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 2.375rem;
  height: 2.375rem;
}

.gestion-glass-pill__glyph--pause { width: 2.9375rem; height: 2.9375rem; }

.gestion-glass-pill__message {
  position: absolute;
  z-index: 1;
  left: 50%;
  bottom: 1.125rem;
  transform: translateX(-50%);
  width: 100%;
  font-family: var(--font-title);
  font-size: 1.125rem;
  font-weight: var(--font-weight-title-semibold);
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--color-primary);
}

.gestion-glass-pill__message span { font-weight: var(--font-weight-title); }

.gestion-glass-pill--card-move {
  right: clamp(-0.5rem, -2%, 0.5rem);
  bottom: clamp(-2rem, -10%, -1.25rem);
}

.gestion-glass-pill--card-pause {
  left: 50%;
  bottom: clamp(0.75rem, 8%, 1.5rem);
  /* //cambio: compone su centrado con la escala del Figma en vez de pisarla. */
  transform: translateX(-50%) scale(var(--pill-scale, 1));
}

/* Resume pill — 216×46 */
.gestion-glass-pill--resume {
  right: clamp(0.75rem, 5%, 1.5rem);
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  gap: 0.375rem;
  width: 13.5rem;
  height: 2.875rem;
  padding: 0 1rem 0 0.9375rem;
  border-radius: 30px;
}

.gestion-glass-pill__switch {
  position: relative;
  z-index: 1;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  width: 2.5rem;
  height: 1.5rem;
  padding: 4px;
  border-radius: 500px;
  background: var(--color-text-muted);
}

.gestion-glass-pill__switch span {
  width: 1rem;
  height: 1rem;
  border-radius: 50%;
  background: #fff;
}

.gestion-glass-pill__label {
  position: relative;
  z-index: 1;
  font-size: 1.125rem;
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--color-primary);
  white-space: nowrap;
}

/* //cambio: comparación pills vs Figma 2895:4750 (2026-07-28) — las posiciones genéricas por
   tipo de pill no coinciden con el diseño, que ubica CADA pill en un lugar distinto según la
   card (medido como % de la imagen de 600×456 del Figma):
     card 1 · badge "ID FAL":        Figma x438 y293 → 73% / 64%  (dev estaba 7% / 39%)
     card 1 · éxito "Abriste…":      Figma x326 y120 → 54% / 26%  (dev: abajo al centro)
     card 2 · badge "NUEVO ID FAL":  Figma x193 y239 → 32% / 52%  (dev estaba 7% / 39%)
     card 2 · éxito "Moviste…":      abajo a la derecha, DENTRO de la imagen (dev desbordaba)
     card 3 · éxito "Pausaste…":     Figma x57 y102  → 10% / 22%  (dev: abajo al centro)
     card 3 · switch "REANUDAR FAL": derecha, bajo el centro (dev: centrado vertical)
   Van por [data-gestion-card] porque el mismo tipo de pill vive en posiciones distintas según
   la card. Scopeado a ≥992px: abajo de eso rigen las variantes mobile ya existentes. */
@media (min-width: 992px) {
  [data-gestion-card="0"] .gestion-glass-pill--badge {
    left: 73%;
    top: 64%;
  }

  [data-gestion-card="1"] .gestion-glass-pill--badge {
    left: 32%;
    top: 52%;
  }

  [data-gestion-card="0"] .gestion-glass-pill--card-pause {
    left: 54%;
    top: 26%;
    bottom: auto;
    transform: scale(var(--pill-scale, 1));
  }

  [data-gestion-card="2"] .gestion-glass-pill--card-pause {
    left: 10%;
    top: 22%;
    bottom: auto;
    transform: scale(var(--pill-scale, 1));
  }

  [data-gestion-card="1"] .gestion-glass-pill--card-move {
    right: 4%;
    bottom: 6%;
  }

  [data-gestion-card="2"] .gestion-glass-pill--resume {
    right: 8%;
    top: 55%;
  }
}

@media (max-width: 991.98px) {
  .gestion-glass-pill--badge {
    transform: scale(calc(var(--pill-scale, 1) * 0.9));
    transform-origin: left center;
  }
  .gestion-glass-pill--card-move {
    transform: scale(calc(var(--pill-scale, 1) * 0.85));
    transform-origin: bottom right;
  }
  .gestion-glass-pill--card-pause {
    transform: translateX(-50%) scale(calc(var(--pill-scale, 1) * 0.85));
    transform-origin: bottom center;
  }
  .gestion-glass-pill--resume {
    transform: translateY(-50%) scale(0.9);
    transform-origin: center right;
    width: 12rem;
  }
  .gestion-glass-pill__label { font-size: 1rem; }
}

/* === Calculadora === */
/* //cambio (2026-07-29): baja el clamp. Valor anterior: `clamp(3rem, 8vw, 5rem)` (48→80px).
   Medido en dev: esta sección rendereaba 80px de padding vertical mientras sus vecinas tenían
   16-24px, y el hueco contra gestión/alianza saltaba a 104 y 96px contra los 32-48px del resto.
   La causa es que #calculadora SÍ lleva la clase `.section-padding`, pero esta regla la pisa en
   silencio: misma especificidad (0,1,0) y está ~1900 líneas más abajo, así que gana por orden.
   Se baja a 48px de tope en vez de sacar la regla, para conservar la intención original (que la
   calculadora respire un poco más que el resto) sin el salto de 3×. Sigue siendo fluida, así
   que las resoluciones intermedias se siguen adaptando solas.
   Mobile NO se ve afectado: el bloque `@media (max-width: 767.98px)` del final apunta a
   `.section-padding` con la misma especificidad pero está DESPUÉS de esta regla, así que ahí
   ya ganaba él y la calculadora venía pareja con el resto. */
/* //cambio (2026-07-29): pasa a 2.5rem fijo. Valor anterior: `clamp(2rem, 4vw, 3rem)`.
   Se abandona el clamp porque ahora TODO el ritmo es un valor fijo (`.section-padding` es
   2.5rem plano): dejarla fluida hacía que la calculadora fuera la única sección que cambiaba
   de padding con el ancho, o sea justo lo contrario a emparejar. Con 2.5rem queda igual que
   sus vecinas en todo el rango desktop. */
/* //cambio (2026-07-29): sube a 3rem. Valor anterior: `2.5rem`. Acompaña a `.section-padding`.
   OJO: el override mobile de esta misma sección (bloque `@media (max-width: 767.98px)` del
   final) queda en 2rem — no se tocó a pedido del usuario. */
.calculadora-section { padding-block: 3rem; }

.calculadora-header {
  display: flex;
  flex-direction: column;
  gap: 2rem;
  max-width: 80rem;
  margin-inline: auto;
  margin-bottom: clamp(2.5rem, 5vw, 3.75rem);
}

.calculadora-title {
  /* //cambio: mismo caso que .gestion-section-title — llegaba a 54px con su clamp propio y el
     Figma (2895:1878) lo define en 36px. Pasa al token compartido. */
  font-size: var(--font-size-h2);
  line-height: 1.2;
  letter-spacing: -0.02em;
  color: var(--color-primary);
}

.calculadora-subtitle {
  font-family: var(--font-title);
  font-size: var(--font-size-body-lg);
  font-weight: 300;
  line-height: 1.5;
  color: var(--color-text-muted);
  max-width: 52ch;
  margin-inline: auto;
}

.calculator-section {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2rem;
  background: var(--color-bg-light);
  border-radius: var(--radius-small);
  padding: clamp(2rem, 5vw, 3.75rem) clamp(1.5rem, 5vw, 4rem);
  max-width: 80rem;
  margin-inline: auto;
}

.calculator-card {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2.4375rem;
  width: 100%;
  max-width: 63.75rem;
  background: #fff;
  border-radius: 12px;
  box-shadow: var(--shadow-card);
  padding: 2.5rem clamp(1.25rem, 4vw, 2.5rem);
}

.calculator-controls {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1rem;
  width: 100%;
  max-width: 41.625rem;
}

.calc-main-display {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  min-height: 5.0625rem;
  color: var(--color-primary);
}

.calc-employee-label {
  font-size: 1rem;
  line-height: 1.4375;
  max-width: 12.5625rem;
  text-align: left;
}

.calc-slider-wrap {
  display: flex;
  flex-direction: column;
  gap: 0.875rem;
  width: 100%;
  max-width: 41.625rem;
  padding-top: 0.875rem;
}

.calc-salary-note {
  text-align: right;
  font-size: 0.875rem;
  line-height: 1.5;
  color: var(--color-text-muted);
}

.segment-toggle {
  display: inline-flex;
  border: 1px solid var(--color-input-border);
  border-radius: 9999px;
  padding: 5px;
  background: #fff;
}

.segment-toggle button {
  border: none;
  background: transparent;
  padding: 12px 40px;
  border-radius: 9999px;
  font-family: var(--font-body);
  font-weight: 500;
  font-size: var(--font-size-body-sm);
  color: #6b7280;
  cursor: pointer;
  transition: background-color 0.2s ease, color 0.2s ease;
}

.segment-toggle button.active {
  background: var(--color-primary);
  color: #fff;
}

.calc-display {
  font-family: var(--font-title);
  /* //cambio: fix 12 auditoría — sin declarar pedía 400 (inexistente en Cocogoose), y es el
     número más grande de la landing. */
  font-weight: var(--font-weight-title);
  font-size: clamp(3rem, 10vw, 5rem);
  color: var(--color-primary);
  line-height: 1;
  min-width: 3.5rem;
  text-align: center;
}

.calc-slider {
  width: 100%;
  height: 4px;
  -webkit-appearance: none;
  appearance: none;
  /* //cambio: fix 13 auditoría — PHP renderiza value=97 sobre rango 10-500 (= 17.75%): el
     default 0% pintaba el track vacío y había un salto de color al cargar el JS. */
  background: linear-gradient(90deg, var(--color-accent) 17.75%, var(--color-input-border) 17.75%);
  border-radius: 2px;
  outline: none;
  cursor: pointer;
}

.calc-slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--color-primary);
  cursor: pointer;
  border: none;
}

.calc-slider::-moz-range-thumb {
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--color-primary);
  cursor: pointer;
  border: none;
}

.calculator-stats {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1rem;
  width: 100%;
  max-width: 65.25rem;
}

.stat-mini-card {
  background: #fff;
  border-radius: 8px;
  box-shadow: var(--shadow-small);
  padding: 1.5rem;
  width: min(100%, 15.1875rem);
  min-height: 8.6875rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 1rem;
}

.stat-mini-card .label {
  font-family: var(--font-title);
  font-size: var(--font-size-body);
  line-height: 1.4;
  color: var(--color-text-muted);
  text-transform: lowercase;
}

.stat-mini-card .value {
  font-family: var(--font-title);
  font-size: var(--font-size-stat);
  line-height: 1.4;
  letter-spacing: -0.02em;
  color: var(--color-stat);
}

/* //cambio: calculadora mobile — 2×2 grid en vez de columna, fuentes reducidas para que entren */
@media (max-width: 767.98px) {
  .stat-mini-card { width: calc(50% - 0.5rem); min-height: 0; padding: 1rem; }
  .stat-mini-card .value { font-size: 1.25rem; }
  .stat-mini-card .label { font-size: 0.8rem; }
}

.calculator-disclaimer {
  max-width: 44.625rem;
  text-align: center;
  font-size: 0.625rem;
  line-height: 1.5;
  color: var(--color-text-muted);
}

.calculator-cta {
  display: flex;
  justify-content: center;
  width: 100%;
}

/* === Ratings === */
.ratings-bar {
  background: var(--color-card-overlay);
  border-radius: var(--radius-small);
  padding: 2rem;
}

.rating-item {
  border-left: 2px solid var(--color-primary);
  padding-left: 1.5rem;
}

.rating-value {
  font-family: var(--font-title);
  font-size: clamp(2rem, 5vw, 3rem);
  color: var(--color-primary);
  line-height: 1;
}

/* //cambio: sin esto, el texto hereda el color:#fff de .section-blue y queda invisible
   sobre el fondo claro de .ratings-bar. Gris del Figma (fill_bd64f0d8) para "Moody's Local" etc. */
.rating-desc {
  color: var(--color-text-muted);
}

/* ============================================================
   PREGUNTAS FRECUENTES — Figma 3013:971. Página propia (page-fal-faq.php),
   no una sección del flexible content.
   ============================================================ */
/* //cambio: el subtítulo de contacto se estiraba a los 682px del tope general y entraba en 2
   líneas; el Figma (2895:3355) lo muestra en una caja de ~350px, en 3 líneas. Va scopeado a
   esta sección porque el resto de los subtítulos sí usan el ancho grande. */
#contacto .section-subtitle {
  max-width: 22rem;
}

.fal-faq-titulo {
  margin-bottom: 2.5rem;
}

/* //cambio: menú lateral fijo + contenido. El Figma le da al menú ~245px sobre 1280 (19%) y
   deja ~40px de aire entre ambas columnas. */
.fal-faq-layout {
  display: grid;
  grid-template-columns: minmax(0, 19%) minmax(0, 1fr);
  gap: 2.5rem;
  align-items: start;
}

/* //cambio: el menú acompaña el scroll. El offset usa --site-header-height, que fal.js mantiene
   actualizada con el alto real del navbar sticky (initSiteHeaderOffset). */
.fal-faq-nav {
  position: sticky;
  top: calc(var(--site-header-height) + 1.5rem);
}

.fal-faq-nav ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}

.fal-faq-nav-link {
  display: block;
  padding: 0.875rem 0;
  border-bottom: var(--border-width) solid var(--color-input-border);
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-sm);
  text-transform: uppercase;
  letter-spacing: 0.02em;
  line-height: 1.3;
  color: var(--color-text-muted);
  text-decoration: none;
  transition: color 0.25s ease, border-color 0.25s ease;
}

.fal-faq-nav-link:hover {
  color: var(--color-primary);
}

.fal-faq-nav-link.is-active {
  color: var(--color-primary);
  font-weight: var(--font-weight-title-semibold);
  border-bottom-color: var(--color-primary);
}

.fal-faq-cat + .fal-faq-cat {
  margin-top: 4rem;
}

.fal-faq-cat-titulo {
  margin: 0 0 1.5rem;
  font-size: var(--font-size-body-lg);
  font-weight: var(--font-weight-title-semibold);
  text-transform: uppercase;
  letter-spacing: 0.02em;
  color: var(--color-primary);
}

.fal-faq-item {
  border-bottom: var(--border-width) solid var(--color-input-border);
}

.fal-faq-pregunta {
  margin: 0;
}

/* //cambio: el toggle es un <button> y no un <a> — abre y cierra contenido en la misma página,
   no navega. Se le sacan los estilos de botón del navegador para que se vea como el Figma. */
.fal-faq-toggle {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
  padding: 1.25rem 0;
  background: none;
  border: 0;
  text-align: left;
  font-family: var(--font-body);
  font-size: var(--font-size-body);
  line-height: 1.4;
  color: var(--color-primary);
  cursor: pointer;
}

.fal-faq-chevron {
  flex-shrink: 0;
  transition: transform 0.3s ease;
}

.fal-faq-toggle.is-collapsed .fal-faq-chevron {
  /* cerrado apunta abajo; abierto, arriba */
  transform: rotate(0deg);
}

.fal-faq-toggle:not(.is-collapsed) .fal-faq-chevron {
  transform: rotate(180deg);
}

.fal-faq-respuesta {
  padding: 0 0 1.5rem;
  max-width: 68rem;
  font-size: var(--font-size-body-sm);
  line-height: 1.6;
  color: var(--color-text-muted);
}

.fal-faq-respuesta p:last-child {
  margin-bottom: 0;
}

.fal-faq-respuesta.is-hidden {
  display: none;
}

/* //cambio: bajo 992px el menú lateral pasa arriba en horizontal con scroll — a 19% de una
   pantalla chica los nombres de categoría quedan ilegibles. */
@media (max-width: 991.98px) {
  .fal-faq-layout {
    grid-template-columns: 1fr;
  }

  .fal-faq-nav {
    position: static;
  }

  .fal-faq-nav ul {
    flex-direction: row;
    flex-wrap: nowrap;
    overflow-x: auto;
    gap: 1.5rem;
  }

  .fal-faq-nav-link {
    white-space: nowrap;
  }
}

/* ============================================================
   LO QUE HABILITA LA REFORMA — Figma 3068:912. Sección nueva.
   Markup en inc/fal/reforma.php.
   ============================================================ */
.fal-ref-panel {
  position: relative;
  overflow: hidden;
  background: var(--color-bg-light);
  border-radius: var(--radius-small);
  padding: clamp(2.5rem, 5vw, 5rem);
}

.fal-ref-bg {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
}

/* //cambio: las dos manchas del Figma (3068:914 y 3068:915). El diseño las define como un óvalo
   sólido con filter: blur(216px), pero replicar eso literal hace que el navegador tarde tanto en
   componer que llegué a tumbar la captura de pantalla — un blur de ese radio sobre un elemento de
   ~550×470 es carísimo. Se usa el mismo patrón que ya resuelve esto en .como-funciona-blur:
   gradiente radial (que ya trae la caída suave) + un blur moderado de 72px. */
.fal-ref-blur {
  position: absolute;
  border-radius: 50%;
  background: var(--gradient-reforma-blur);
  filter: blur(72px);
  opacity: 0.95;
}

.fal-ref-blur--1 {
  left: 7%;
  top: 29%;
  width: 43%;
  height: 52%;
}

.fal-ref-blur--2 {
  left: 78%;
  top: 40%;
  width: 36%;
  height: 41%;
}

.fal-ref-content {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: 3.5rem;
}

.fal-ref-header {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

/* //cambio: el Figma pone 3 cards de 408px con 28px de gap sobre un lienzo de 1280 — o sea
   tres columnas iguales. Se modela como grilla para que se repartan solas si algún día son
   dos o cuatro. */
.fal-ref-cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 28px;
}

.fal-ref-card {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  background: #fff;
  border-radius: var(--radius-small);
  box-shadow: var(--shadow-small);
  padding: 2.5rem;
  /* //cambio (2026-07-29): mismo reveal que .fal-card (#equipo y #alianza) — fade + subida de
     28px, escalonado 90ms por card vía --fal-card-reveal-delay, que setea initFalCards en
     fal.js. Los valores se repiten en vez de sumar `.fal-ref-card` al selector de `.fal-card`
     porque esa regla está ~2000 líneas más arriba, en el bloque de otra sección; acá queda
     junto al resto de los estilos de la card. El estado `.is-visible` y el reset de
     transition-delay SÍ van en el selector compartido, allá arriba. */
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.55s ease, transform 0.55s cubic-bezier(0.4, 0, 0.2, 1), transition-delay 0s;
}

.fal-ref-card-titulo {
  margin: 0;
  font-size: var(--font-size-h4);
  font-weight: var(--font-weight-title);
  line-height: 1.2;
  color: var(--color-primary);
}

.fal-ref-card-subtitulo {
  margin: 0;
  /* //cambio: comparación reforma vs Figma (2026-07-28) — causa real del salto de línea de más
     que reportó el usuario ("una decisión" partiéndose en "una" + "decisión" en vez de quedar
     junto en la 2ª línea, igual con "misma estructura" y "una incógnita"): a esta clase le
     faltaba `font-family`, así que caía al stack default de Bootstrap (system-ui/Segoe UI,
     más ancho que Noto Sans) y el texto dejaba de entrar en el ancho de la card, generando un
     wrap de más. NO hay ningún `\n` cargado en el campo ACF —el `esc_html()` de reforma.php lo
     confirma— el corte SIEMPRE fue 100% natural por ancho; el `white-space: pre-line` de abajo
     no le hace nada a texto sin saltos reales, sólo queda listo por si algún día se cargan.
     De paso, el Figma (style_8f23cc40) pide color primary #003DA0 (fill_28367f6e), no accent.

     Con SOLO el fix de font-family el wrap ya mejoró mucho (pasó de 3 líneas rotas a 2), pero
     no alcanzaba: a los 282px de ancho real de la card ("una" quedaba en la línea 1 junto con
     "...ser", en vez de bajar con "decisión"). El Figma no deja esto al ancho natural del
     contenedor — el propio nodo de texto (2895:1350, 2895:1006, 2895:1062) tiene un ancho
     PROPIO más angosto que el de la card (236/223/223px) para forzar ese corte exacto. Medido
     en vivo con las 3 cards reales: 210-220px es el rango que reproduce el corte de las tres
     ("...ser" / "una decisión", "Más rendimiento," / "misma estructura", "...ser" / "una
     incógnita") — mismo patrón que .hero-text (max-width fijo para forzar el line-count del
     diseño). */
  max-width: 220px;
  font-family: var(--font-body);
  font-size: var(--font-size-body-lg);
  font-weight: 300;
  /* //cambio: 1.4 → 1.6 (32px/20px del Figma, lineHeight fijo "32px" en style_8f23cc40). */
  line-height: 1.6;
  color: var(--color-primary);
  white-space: pre-line;
}

.fal-ref-items {
  list-style: none;
  margin: 1.5rem 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

.fal-ref-items li {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  /* //cambio: mismo bug de font-family ausente (ver .fal-ref-card-subtitulo) — tamaño y color
     ya coincidían con el Figma (style_3eaa30e9, 16px/#55585A) de casualidad, solo faltaba la
     familia. */
  font-family: var(--font-body);
  font-size: var(--font-size-body);
  line-height: 1.4;
  color: var(--color-text-muted);
}

.fal-ref-check {
  flex-shrink: 0;
  /* alinea el check con la primera línea del texto en ítems de dos renglones */
  margin-top: 0.125rem;
}

.fal-ref-cierre {
  text-align: center;
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-lg);
  line-height: 1.5;
  color: var(--color-primary);
  max-width: 62rem;
  margin-inline: auto;
}

.fal-ref-cta {
  display: flex;
  justify-content: center;
}

/* //cambio: comparación reforma vs Figma (2026-07-28) — mismo caso que `.hero-ctas .btn` y
   `.site-header .btn-fal-primary`: el Figma (3078:1354) pide Cocogoose Pro Light 300 14px para
   "Solicitar diagnóstico", pero `.btn-fal-primary` trae por default Noto Sans 500 16px. */
.fal-ref-cta .btn {
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-sm);
  line-height: 1.5;
}

/* //cambio: bajo 992px las 3 cards no entran en fila — el texto de los ítems queda ilegible. */
@media (max-width: 991.98px) {
  .fal-ref-cards {
    grid-template-columns: 1fr;
  }
}

/* ============================================================
   BENTO GRID — Figma 2957:1898. Reemplaza visualmente a cards_grid.
   Markup en inc/fal/bento_grid.php. Los estilos de .cards-grid NO se tocan:
   ese layout sigue disponible.
   ============================================================ */
.fal-bento-titulo {
  margin-bottom: 3.5rem;
}

/* //cambio (2026-08-04): bajada nueva del bento (Figma 3347:672). Valores tomados del nodo:
   contenedor en columna centrada con gap 32px; título Cocogoose Light 300 36/1.2/-0.03 en
   #003DA0; bajada Cocogoose Light 300 20/1.5 en #55585A, centrada, ancho FIJO 538px.
   Ojo con la fuente: es Cocogoose (--font-title), NO Noto. Se parece a `.section-subtitle`
   —mismo color y tamaño— pero esa clase usa --font-body, así que no se puede reutilizar.
   Y el peso va por variable: Cocogoose Pro sólo tiene 100/200/300/350/800, y pedirle un 400
   o un 600 lo resuelve silenciosamente como Bold 800. --font-weight-title ya es 300. */
.fal-bento-titulo--con-bajada {
  /* 32px del Figma. Los 56px originales pasan a la bajada, que ahora es el último elemento
     antes de la grilla. Valor anterior de este hueco: 3.5rem (heredado de .fal-bento-titulo). */
  margin-bottom: 2rem;
}

.fal-bento-subtitulo {
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: 1.25rem;
  line-height: 1.5;
  color: var(--color-text-muted);
  text-align: center;
  /* ancho fijo 538 del Figma, pero como max-width para que en mobile lo limite el container */
  max-width: 538px;
  margin-inline: auto;
  margin-bottom: 3.5rem;
}

/* ACF envuelve el textarea en <p> vía wpautop y ese <p> trae margen propio de Bootstrap, que
   se sumaría a los 3.5rem de arriba y al gap de 32px de abajo del título. */
.fal-bento-subtitulo p {
  margin: 0;
}

/* //cambio: el Figma arma la grilla sobre 12 columnas de 1280px con 28px de gap. Con
   `repeat(12, 1fr)` y ese mismo gap, un tile de 3 cols da 298px y uno de 6 da 625px, que son
   exactamente las medidas del diseño — por eso se modela como grilla real y no con anchos fijos. */
.fal-bento-grid {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  grid-auto-rows: minmax(260px, auto);
  column-gap: 28px;
  row-gap: 26px;
}

.fal-bento-tile {
  display: flex;
  flex-direction: column;
  padding: 1.5rem;
  border-radius: 12px;
  box-shadow: var(--shadow-small);
  /* //cambio: la etiqueta queda arriba y el resto abajo. Se resuelve con margin-block-end:auto
     en la etiqueta (ver más abajo) en vez de space-between, porque los tiles con cifra +
     descripción necesitan esos dos elementos juntos al pie, no separados entre sí. */
  justify-content: flex-end;
  gap: 1rem;
}

.fal-bento-tile--cols-3 { grid-column: span 3; }
.fal-bento-tile--cols-6 { grid-column: span 6; }
.fal-bento-tile--filas-1 { grid-row: span 1; }
.fal-bento-tile--filas-2 { grid-row: span 2; }

.fal-bento-tile--azul    { background: var(--color-primary); color: #fff; }
.fal-bento-tile--navy    { background: #27396A; color: #fff; }
.fal-bento-tile--gris    { background: #ECECED; color: var(--color-primary); }
.fal-bento-tile--celeste { background: var(--color-card-overlay); color: var(--color-primary); }

.fal-bento-etiqueta {
  margin: 0 0 auto;
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-lg);
  line-height: 1.5;
  color: inherit;
}

/* //cambio: el Figma pide 96px. Va con clamp para que no desborde en desktops angostos —
   una cifra como "5.178.637" a 96px necesita ~413px de ancho y el tile mide 625px. */
.fal-bento-valor {
  margin: 0;
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  /* //cambio: reportado por el usuario ("los números muy grandes", 2026-07-28) — la pendiente
     era 6vw, pero los 96px del Figma viven en un lienzo de 1920: la proporción exacta es
     96/1920 = 5vw. Con 6vw, a 1536px de pantalla la cifra daba 92px cuando la proporción del
     diseño pide 77px — un 20% de más en cualquier monitor menor a 1920. El tope 96px queda:
     se alcanza recién a 1920, como en el Figma. */
  font-size: clamp(2.75rem, 5vw, 6rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: inherit;
}

/* //cambio: la unidad o el signo van más chicos que la cifra. El Figma lo resuelve con dos
   tamaños dentro del mismo texto: en "23 años" el número es 96px y la palabra 64px (2962:2020),
   y en "+600" el signo es 64px y el número 90px (2978:836). Sin esto, "23 años" salía todo a
   92px, se ensanchaba hasta ocupar el 77% del tile —contra el 55% del diseño— y forzaba un
   wrap feo. 0.667em es la relación 64/96 del propio Figma. */
.fal-bento-valor small {
  font-size: 0.667em;
  font-weight: inherit;
  letter-spacing: inherit;
}

.fal-bento-desc {
  margin: 0;
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-lg);
  line-height: 1.5;
  color: inherit;
}

.fal-bento-ratings {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

.fal-bento-rating {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}

.fal-bento-rating-valor {
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  /* //cambio: el Figma (style_2f33757d, nodos 1996/759/764) define las calificaciones en
     48px, no 40 — misma lógica proporcional que .fal-bento-valor: 48/1920 = 2.5vw. */
  font-size: clamp(1.75rem, 2.5vw, 3rem);
  line-height: 1.2;
}

.fal-bento-rating-desc {
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-lg);
  line-height: 1.5;
}

/* //cambio: bajo 992px la grilla pasa a 6 columnas — los tiles de 6 cols ocupan el ancho
   completo y los de 3 van de a dos por fila. El tile alto deja de spanear filas porque con
   menos columnas quedaría un hueco al lado. */
@media (max-width: 991.98px) {
  .fal-bento-grid {
    grid-template-columns: repeat(6, 1fr);
  }

  .fal-bento-tile--cols-3 { grid-column: span 3; }
  .fal-bento-tile--cols-6 { grid-column: span 6; }
  .fal-bento-tile--filas-2 { grid-row: span 1; }
}

@media (max-width: 767.98px) {
  .fal-bento-grid {
    grid-template-columns: 1fr;
  }

  .fal-bento-tile--cols-3,
  .fal-bento-tile--cols-6 {
    grid-column: span 1;
  }
}

/* === Contacto === */
.contact-icon {
  width: 24px;
  height: 24px;
  flex-shrink: 0;
  color: var(--color-text-muted);
}

/* ============================================================
   FORMULARIO DE CONTACTO — Figma 2895:3355 (desktop) y 3125:1639 (mobile).
   //cambio (2026-08-04): rediseño completo. Markup en inc/fal/contacto.php.

   DISCREPANCIA DEL FIGMA, resuelta con criterio: el borde del input es #A5A6A7 en el nodo
   desktop y #55585A en el mobile. El checkbox usa #A5A6A7 en LOS DOS, así que se toma #A5A6A7
   para todo — el input mobile parece haber quedado sin actualizar. Queda anotado por si el
   diseño después dice lo contrario.
   ============================================================ */
:root {
  /* //cambio (2026-08-04): borde de inputs y checkbox del form. NO se reusa
     --color-input-border (#d3daea): ese es del track del slider de la calculadora, otro gris. */
  --color-form-border: #a5a6a7;
}

/* Grilla de 2 columnas con gap 24 en ambos ejes, que es lo que pide el Figma. Los campos son
   items directos; el que ocupa el ancho entero lleva --full. En mobile pasa a 1 columna y el
   mismo gap 24 sirve de separación vertical, sin tocar márgenes. */
.fal-form {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1.5rem;
  /* el Figma alinea el bloque de botón a la derecha (Form: align-items flex-end) */
  justify-items: stretch;
}

.fal-form-field {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.fal-form-field--full {
  grid-column: 1 / -1;
}

/* Ayuda del CUIT — Noto Regular 12/1.5, letter-spacing -0.02em (nodo 3191:741) */
.fal-form-ayuda {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 0.75rem;
  line-height: 1.5;
  letter-spacing: -0.02em;
  color: var(--color-text-muted);
}

/* ── Checkbox de Términos y Condiciones ── */
.fal-form-check {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  /* Figma: padding 0 0 16px */
  padding-bottom: 1rem;
}

/* 18×18 con borde 1px y radio 2. `appearance: none` para poder darle esas medidas exactas:
   el checkbox nativo ignora width/height/border en la mayoría de los navegadores. */
.fal-form-checkbox {
  appearance: none;
  -webkit-appearance: none;
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  margin: 0;
  background: #fff;
  border: var(--border-width) solid var(--color-form-border);
  border-radius: 2px;
  cursor: pointer;
  display: grid;
  place-content: center;
}

/* Tilde dibujada con un pseudo-elemento: al matar el appearance se pierde la del sistema. */
.fal-form-checkbox::before {
  content: "";
  width: 10px;
  height: 10px;
  transform: scale(0);
  transition: transform 0.12s ease-in-out;
  box-shadow: inset 1em 1em #fff;
  clip-path: polygon(14% 44%, 0 65%, 39% 100%, 100% 16%, 83% 0, 39% 62%);
}

.fal-form-checkbox:checked {
  background: var(--color-primary);
  border-color: var(--color-primary);
}

.fal-form-checkbox:checked::before {
  transform: scale(1);
}

.fal-form-checkbox:focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: 2px;
}

/* Noto Regular 10/1.5 — sí, 10px: es lo que dice el Figma (3187:4806 y 3187:4815) */
.fal-form-check-label {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 0.625rem;
  line-height: 1.5;
  color: var(--color-text-muted);
  cursor: pointer;
}

/* El tramo "Términos y Condiciones" va subrayado tanto si es link como si no (cuando el campo
   ACF está vacío el PHP lo renderiza como <span>, para no dejar un <a> sin destino). */
.fal-form-check-label a,
.fal-form-check-destacado {
  color: inherit;
  text-decoration: underline;
}

.fal-form-check-label a:hover {
  color: var(--color-primary);
}

/* ── Botón Enviar ── */
.fal-form-actions {
  display: flex;
  justify-content: flex-end;
}

/* Figma 3078:1391: alto 56, radio 100, padding 8/24, gap 8, texto Cocogoose Light 300 14px.
   El peso va por variable porque Cocogoose Pro sólo tiene 100/200/300/350/800: pedirle 400 o
   500 lo resuelve como Bold 800 sin avisar. */
.fal-form-submit {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  height: 56px;
  padding: 0.5rem 1.5rem;
  border-radius: 100px;
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: var(--font-size-body-sm);
  line-height: 1.5;
}

.fal-form-submit-flecha {
  flex-shrink: 0;
  /* hereda el color del texto del botón, que ya es blanco por --bs-btn-color */
  color: currentColor;
}

.form-control-fal {
  /* //cambio (2026-08-04): el borde pasa a --color-form-border (#A5A6A7).
     Valor anterior: `var(--color-text-muted)` = #55585A, bastante más oscuro que el Figma. */
  border: var(--border-width) solid var(--color-form-border);
  border-radius: 4px;
  height: 48px;
}

/* //cambio: fix 4 auditoría — sin :focus propio, el form de contacto mostraba el borde
   #86b7fe + halo #0d6efd default de Bootstrap, ajenos a la paleta FAL. */
.form-control-fal:focus {
  border-color: var(--color-accent);
  box-shadow: 0 0 0 0.25rem rgba(0, 61, 160, 0.15);
}

.form-label-fal {
  color: var(--color-text-muted);
  font-size: var(--font-size-body);
  /* //cambio (2026-08-04): faltaban font-family, peso y line-height. El Figma pide Noto Sans
     Regular 400 16/1.5 (style_aed80857). Sin declarar la familia dependía de lo que heredara
     de Bootstrap, que es el mismo agujero que ya se tapó en `.section-subtitle`. */
  font-family: var(--font-body);
  font-weight: 400;
  line-height: 1.5;
}

/* //cambio (2026-08-04): el Figma separa la columna de texto del formulario con 80px
   (Component #2895:3357, gap 80). `row g-5` da 48. Se sube sólo acá, en ≥992 que es donde las
   dos columnas conviven; abajo de eso apilan y manda el gap vertical del propio row. */
@media (min-width: 992px) {
  #contacto > .container > .row {
    --bs-gutter-x: 5rem;
  }
}

@media (max-width: 767.98px) {
  /* Figma 3125:1639: una sola columna, mismo gap 24 — que ya lo pone .fal-form */
  .fal-form {
    grid-template-columns: 1fr;
  }

  /* //cambio (2026-08-04): el botón cambia de fuente por breakpoint, igual que `.hero-ctas .btn`.
     Desktop: Cocogoose Light 300 14px (3078:1393). Mobile: Noto Medium 500 16px (3125:1670). */
  .fal-form-submit {
    font-family: var(--font-body);
    font-weight: 500;
    font-size: var(--font-size-body);
  }
}

/* ============================================================
   BANNER CTA — Figma 3325:410. Card azul con título a la izquierda y botón a la
   derecha. Markup en inc/fal/banner_cta.php (layout `banner_cta` del flexible content).
   //cambio (2026-08-04): sección nueva.

   Las tres variables que pide el diseño YA existían y coinciden exactas, así que no se agrega
   ninguna: --color-card-overlay (#bbcae8, fondo del botón), --radius-small (24px, radio de la
   card) y --shadow-small, que es literalmente la sombra "Small" del Figma
   (0 2px 4px -2px rgba(0,0,0,.06), 0 4px 8px -2px rgba(0,0,0,.1)).
   ============================================================ */
.fal-banner-cta {
  background: var(--color-primary);
  border-radius: var(--radius-small);
  /* Figma: padding 48px 115px. El horizontal se hace fluido con clamp porque 115px fijos en un
     viewport de 1200 se comen 230px de los 1140 útiles; a 1440+ vale los 115 del diseño. */
  padding: 3rem clamp(1.5rem, 8vw, 7.1875rem);
}

/* El Figma mete un frame interno de ancho FIJO 1013 con space-between, alineado al arranque del
   contenido (la Card no declara justifyContent, o sea flex-start). Se reproduce con max-width y
   sin centrar: arriba de ~1250px de card queda aire a la derecha, igual que en el diseño; abajo
   de eso el inner ocupa todo y el botón se apoya contra el padding. */
.fal-banner-cta-inner {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
  gap: 2rem;
  width: 100%;
  max-width: 1013px;
}

/* Cocogoose Light 300 36/1.2, ls -0.03, blanco, caja de 473 (nodo 3332:430).
   El peso va por variable: Cocogoose Pro sólo tiene 100/200/300/350/800 y pedirle un 400 lo
   resuelve como Bold 800 sin avisar. */
.fal-banner-cta-titulo {
  font-family: var(--font-title);
  font-weight: var(--font-weight-title);
  font-size: 2.25rem;
  line-height: 1.2;
  letter-spacing: -0.03em;
  color: #fff;
  max-width: 473px;
}

/* Botón: fondo #BBCAE8, texto #003DA0 en Noto Medium 500 16px, alto 56, radio 100, padding 8/24,
   gap 8 con la flecha. Ojo que acá el texto NO es Cocogoose como en el botón del formulario:
   el Figma pide Noto Medium para este (3333:297). */
.fal-banner-cta-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  flex-shrink: 0;
  height: 56px;
  padding: 0.5rem 1.5rem;
  border-radius: 100px;
  background: var(--color-card-overlay);
  color: var(--color-primary);
  box-shadow: var(--shadow-small);
  font-family: var(--font-body);
  font-weight: 500;
  font-size: var(--font-size-body);
  line-height: 1.5;
  text-decoration: none;
  transition: background-color 0.2s ease, transform 0.2s ease;
}

.fal-banner-cta-btn:hover {
  background: #cdd8ee;
  color: var(--color-primary);
}

.fal-banner-cta-flecha {
  flex-shrink: 0;
  color: currentColor;
}

/* //cambio (2026-08-04): el Figma no tiene nodo mobile para este banner, así que el apilado es
   criterio propio y queda anotado como tal. Se sigue el patrón del resto de la landing: columna,
   el mismo gap 32 que ya usa el diseño entre título y botón, y padding lateral reducido para no
   comerse el ancho. El botón se estira a todo el ancho porque a 390px un botón "hug" con este
   texto queda desbalanceado contra el título. */
@media (max-width: 767.98px) {
  .fal-banner-cta {
    padding: 2rem 1.5rem;
  }

  .fal-banner-cta-inner {
    flex-direction: column;
    align-items: flex-start;
  }

  .fal-banner-cta-titulo {
    max-width: none;
    font-size: 1.75rem;
  }

  .fal-banner-cta-btn {
    width: 100%;
  }
}

/* ============================================================
   FOOTER FAL — Figma 2895:3401. Panel azul con logo blanco + bloque
   legal. Markup en layout/footer-fal.php (solo page-fal.php).
   ============================================================ */
.fal-footer {
  background: var(--color-primary);
  /* Figma: padding 40px 0 */
  padding: 2.5rem 0;
  color: #fff;
}

.fal-footer-logo {
  display: inline-block;
  /* Figma: gap 32 entre logo y bloque legal */
  margin-bottom: 2rem;
}

.fal-footer-logo img {
  display: block;
  width: 123px;
  height: auto;
  /* //cambio: reportado por el usuario (2026-07-28) — el logo se veía oscuro sobre el panel
     azul. La opción ACF `logo_footer` devuelve el logo A COLOR, no uno blanco; mismo filtro
     que ya usa el footer corporativo para el mismo asset (_footer.scss:35), así que cualquier
     logo que llegue por esa opción (o el fallback del navbar) sale blanco por igual. */
  filter: invert(1) brightness(100);
}

.fal-footer-legal {
  /* Figma: Inter Extra Light 200, 10px, justificado, blanco, paragraphSpacing 2 */
  font-family: "Inter", var(--font-body);
  font-weight: 200;
  font-size: 0.625rem;
  line-height: 1.5;
  text-align: justify;
}

.fal-footer-legal p {
  margin-bottom: 2px;
}

.fal-footer-legal p:last-child {
  margin-bottom: 0;
}

/* === Responsive === */
@media (prefers-reduced-motion: reduce) {
  .timeline-segment,
  .timeline-pill,
  .timeline-desc,
  .timeline-dot { transition: none; }

  .flow-circles[data-flow-circles] .flow-circle {
    opacity: 1;
    transform: none;
    transition: none;
  }

  /* //cambio (2026-07-29): se suma .fal-ref-card — sin esto las cards de reforma quedaban
     invisibles para quien tiene reducción de movimiento activada (el JS sale temprano y nunca
     les pone .is-visible, así que se quedaban en opacity 0). */
  .fal-card,
  .fal-ref-card {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

@media (max-width: 991.98px) {
  .flow-circles {
    flex-wrap: wrap;
    justify-content: center;
    row-gap: 0.5rem;
  }

  .flow-circle {
    margin-right: 0;
    margin-bottom: -10px;
  }

  .hero-inner {
    min-height: auto;
    padding: 2rem 1rem;
  }
}

/* //cambio: flow circles — scroll horizontal en mobile en vez de grilla rota */
@media (max-width: 767.98px) {
  .flow-circles {
    flex-wrap: nowrap;
    overflow-x: auto;
    justify-content: flex-start;
    padding-bottom: 0.5rem;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .flow-circles::-webkit-scrollbar { display: none; }
  .flow-circle {
    flex-shrink: 0;
    width: 120px;
    height: 120px;
    font-size: 0.8rem;
  }
  .flow-circle strong { font-size: 0.875rem; }
  .flow-circle span { font-size: 0.875rem; }
}

@media (max-width: 575.98px) {
  .timeline-step-track { gap: 4px; }

  .timeline-pill {
    /* //cambio (2026-08-04): vuelve a 8px 16px, el valor base y el del Figma.
       Valor anterior: `6px 10px`.
       El achique de este breakpoint no tenía respaldo en el diseño: el canvas mobile del Figma
       es de 540px, o sea que cae DENTRO de este mismo media query (≤575.98), y ahí la píldora
       de fecha se especifica en 8/16 igual que en desktop (frame EL-6cc3ca2c, 3134:3102).
       `white-space: normal` y el centrado se conservan: eso sí es propio de pantallas angostas. */
    padding: 8px 16px;
    white-space: normal;
    text-align: center;
  }

  .segment-toggle button { padding: 10px 20px; }
}

/* ============================================================
   ECOSISTEMA GST — portado de texto.html (Figma 2435-1850).
   Lienzo fijo 1920×1348 escalado por JS (initEcosistema en fal.js) según
   el ANCHO del contenedor (no por 75vh como el mockup original — a pedido,
   el diagrama se veía chico). Clases idénticas a texto.html; los colores
   de categoría y el ancho del grupo ya no son por nombre de rama (el
   contenido es ACF) sino por posición (:nth-child) y por cantidad de logos.
   ============================================================ */
.fal-eco-panel {
  background: var(--fal-eco-bg);
  border-radius: var(--radius-small, 24px);
  padding: clamp(1.5rem, 4vw, 4rem) clamp(1rem, 3vw, 3rem);
}

.fal-eco-header { max-width: 55rem; margin-inline: auto; }
.fal-eco-header .section-title { color: var(--color-primary); }
.fal-eco-subtitle { color: var(--color-text-muted); font-size: var(--font-size-body-lg); font-weight: 300; }
.fal-eco-subtitle strong { font-weight: 600; }

.fal-viewport {
  display: flex;
  justify-content: center;
  align-items: center;
  padding: clamp(16px, 3vw, 32px);
}

.fal-scaler { position: relative; overflow: visible; }

.fal-ecosystem {
  position: relative;
  width: 1920px;
  height: 1348px;
  overflow: visible;
  font-size: 16px;
  font-family: var(--fal-eco-font);
  transform-origin: top left;
}

.fal-connectors {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  overflow: visible;
  pointer-events: none;
  z-index: 2;
}

.fal-connectors path {
  fill: none;
  stroke: #b7cbe9;
  stroke-width: 3;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.fal-chart {
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(calc(-50% - 1.3%));
  width: 33.2%;
  height: 74.7%;
  z-index: 1;
}

.fal-chart__rings { position: absolute; inset: 0; }

.fal-ring {
  position: absolute;
  border-radius: 50%;
  border: 0.125em solid var(--fal-eco-border);
  left: 38%;
  top: 50%;
  opacity: 0;
}

.fal-ring--1 { width: 142%; aspect-ratio: 1; background: var(--fal-eco-ring-1); }
.fal-ring--2 { width: 116%; aspect-ratio: 1; background: var(--fal-eco-ring-2); }
.fal-ring--3 { width: 92%;  aspect-ratio: 1; background: var(--fal-eco-ring-3); }
.fal-ring--4 { width: 69%;  aspect-ratio: 1; background: var(--fal-eco-ring-4); }
.fal-ring--5 { width: 47%;  aspect-ratio: 1; background: var(--fal-eco-ring-5); }

.fal-chart__hub {
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(calc(-50% - 1.3%));
  width: 33.2%;
  height: 74.7%;
  z-index: 3;
  pointer-events: none;
}

.fal-chart__core {
  position: absolute;
  left: 38%;
  top: 50%;
  width: 31%;
  aspect-ratio: 1;
  border-radius: 50%;
  background: #fff;
  border: 0.125em solid var(--fal-eco-border-muted);
  box-shadow: var(--fal-eco-shadow-sm);
  display: flex;
  align-items: center;
  justify-content: center;
  /* //cambio: 3.72% en vez de 12% — el padding porcentual de un elemento absolute se calcula
     contra el ancho de su containing block (.fal-chart__hub, 33.2% del lienzo), no contra el
     31% propio de este círculo. 12% * 31% = 3.72% recupera el 12% de padding relativo al
     tamaño real del círculo (antes el logo quedaba con un espacio interno 3x más chico). */
  padding: 3.72%;
  pointer-events: auto;
  cursor: default;
}

.fal-chart__logo {
  display: block;
  width: auto;
  height: auto;
  max-width: min(13.0625em, 80%);
  max-height: min(4.4375em, 56%);
  object-fit: contain;
}

.fal-branches {
  position: absolute;
  right: 0;
  top: 0;
  width: 68%;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: 6.8% 0 5.5%;
  z-index: 4;
}

.fal-branch {
  position: relative;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  min-height: 19.4%;
}

.fal-branch__group {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  min-height: 16.375em;
  width: 63.7%;
  border: 0.0625em solid var(--fal-eco-border);
  border-radius: 12.5em;
  padding: 1.5em 3em 1.5em 9.375em;
  opacity: 0;
}

/* //cambio: ancho ancho por cantidad de logos (repeater ACF), no por nombre de rama */
.fal-branch__group--wide { width: 94%; }

/* Globo de categoría — color y offset por posición de la rama en el repeater */
.fal-branch__label {
  position: absolute;
  top: 50%;
  z-index: 5;
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  height: 3.5em;
  padding: 1em 1.5em;
  border-radius: 3.75em;
  color: var(--color-primary);
  font-size: 1.5em;
  letter-spacing: -0.01em;
  line-height: 1.2;
  white-space: nowrap;
  opacity: 0;
  transform: translateY(-50%);
  flex-shrink: 0;
}

.fal-branch:nth-child(1) .fal-branch__label { left: -10.0625em; background: var(--fal-eco-cat-1); gap: 1em; }
.fal-branch:nth-child(1) .fal-branch__label img { max-width: 1.1875em; max-height: 1.1875em; }
.fal-branch:nth-child(2) .fal-branch__label { left: -11.3125em; background: var(--fal-eco-cat-2); }
.fal-branch:nth-child(3) .fal-branch__label { left: -7.5625em; background: var(--fal-eco-cat-3); }
.fal-branch:nth-child(4) .fal-branch__label { left: -8.8125em; background: var(--fal-eco-cat-4); }

.fal-branch__label img {
  display: block;
  width: auto;
  height: auto;
  max-width: 1.5em;
  max-height: 1.5em;
  object-fit: contain;
  flex-shrink: 0;
}

.fal-branch__logos-wrap {
  width: 100%;
  display: flex;
  justify-content: center;
  transform-origin: left center;
  transform: scaleX(0);
  opacity: 0;
}

.fal-branch__group.is-visible { opacity: 1; }

.fal-branch__logos {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1.5em;
  flex-wrap: nowrap;
}

.fal-logo-pod {
  position: relative;
  flex: 0 0 13.375em;
  width: 13.375em;
  height: 13.375em;
  border-radius: 50%;
  background: #fff;
  border: 0.0625em solid var(--fal-eco-border-muted);
  box-shadow: var(--fal-eco-shadow-sm);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1em;
  opacity: 0;
  transform: scale(0.6);
  cursor: pointer;
  transition: border-color 0.3s ease, box-shadow 0.35s ease;
  text-decoration: none;
}

.fal-logo-pod:focus-visible {
  outline: 0.125em solid var(--color-primary);
  outline-offset: 0.25em;
}

.fal-logo-pod.is-bubble {
  z-index: 2;
  border-color: var(--fal-eco-border);
  box-shadow:
    0 14px 32px -6px rgba(0, 61, 160, 0.18),
    0 6px 14px -4px rgba(0, 0, 0, 0.1);
}

/* //cambio: tamaño genérico (los logos son ACF, no hay clase fija por marca) */
.fal-logo-pod img {
  display: block;
  width: auto;
  height: auto;
  max-width: 78%;
  max-height: 50%;
  object-fit: contain;
}

@media (prefers-reduced-motion: reduce) {
  .fal-logo-pod { transition: none; }
}

/* ── Mobile ── */
@media (max-width: 767px) {
  .fal-viewport { padding: 16px 12px; }

  .fal-scaler {
    width: 100% !important;
    height: auto !important;
  }

  .fal-ecosystem {
    display: flex;
    flex-direction: column;
    gap: 0;
    width: 100% !important;
    height: auto !important;
    transform: none !important;
    font-size: clamp(12px, 3.5vw, 16px);
  }

  .fal-chart {
    position: relative;
    left: auto;
    top: auto;
    transform: none;
    width: min(280px, 85vw);
    height: auto;
    aspect-ratio: 1;
    margin: 0 auto 8px;
    flex-shrink: 0;
  }

  .fal-ring { left: 50%; }

  .fal-chart__hub {
    position: relative;
    left: auto;
    top: auto;
    transform: none;
    width: min(280px, 85vw);
    height: auto;
    aspect-ratio: 1;
    margin: calc(-1 * min(280px, 85vw)) auto 8px;
    z-index: 3;
  }

  .fal-chart__core { left: 50%; width: 38%; }

  .fal-branches {
    position: relative;
    right: auto;
    width: 100%;
    height: auto;
    padding: 0;
    gap: 20px;
  }

  .fal-branch {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
    min-height: unset;
  }

  .fal-branch__group {
    display: flex;
    flex-direction: column;
    gap: 10px;
    width: 100% !important;
    height: auto;
    min-height: 10em;
    padding: 1em 0.75em !important;
    border-radius: 7.5em;
  }

  .fal-branch__label {
    position: relative;
    left: auto !important;
    top: auto;
    transform: none;
    align-self: flex-start;
    font-size: 1.25em;
    height: 3em;
    padding: 0.75em 1.25em;
  }

  .fal-branch__logos-wrap {
    transform: none;
    opacity: 1;
  }

  .fal-branch__logos {
    overflow-x: auto;
    justify-content: flex-start;
    padding: 4px 8px;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }

  .fal-branch__logos::-webkit-scrollbar { display: none; }

  .fal-connectors path { stroke-width: 2; }
}

/* ============================================================
   REFORMA SWIPER — //cambio (2026-07-28): las cards de "Lo que habilita la reforma" pasan a
   markup swiper (inc/fal/reforma.php) para el carrusel mobile del Figma (3134:2275). En
   desktop el swiper se "apaga" con el mismo patrón que .benefits-swiper: el wrapper vuelve a
   ser una grilla de 3 y la botonera se oculta. El grid viejo (.fal-ref-cards) quedó comentado
   en el partial; sus reglas CSS de más arriba no se borran (regla del proyecto).
   ============================================================ */
.reforma-swiper { overflow: visible; min-width: 0; max-width: 100%; }
.reforma-swiper .swiper-slide { height: auto; }
.reforma-swiper .swiper-slide .fal-ref-card { height: 100%; }
.reforma-swiper-footer { display: none; }

@media (min-width: 768px) {
  .reforma-swiper .swiper-wrapper {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 28px;
    transform: none !important;
  }
}

@media (max-width: 767.98px) {
  .reforma-swiper { overflow: hidden; }
  .reforma-swiper-footer {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-top: 1.5rem;
    padding-inline: 0.5rem;
  }
  .reforma-swiper-nav { display: flex; align-items: center; gap: 0.75rem; }
  .reforma-swiper-footer .carousel-nav-btn.swiper-button-disabled { opacity: 0.35; cursor: not-allowed; }
  .reforma-swiper-pagination .step-dot { display: inline-block; }
}

/* ============================================================
   MOBILE FAL — //cambio (2026-07-28): pasada mobile completa contra el Figma (sección
   "Mobile" 3226:2921, canvas 540px): landing 3125:1036, navbar 3125:1811, FAQ 3237:2943,
   gestión 3157:4157/3160:4545, bento 3216:733. Todos los valores citan su nodo/estilo.
   Va AL FINAL del archivo a propósito: a igual especificidad pisa los bloques mobile
   históricos de más arriba (timeline, bento 1-col, hero <992) sin borrarlos.
   ============================================================ */

/* ── Primitivas globales ── */
@media (max-width: 767.98px) {
  /* secciones a 60px vertical (Figma: padding 60 20 en casi todas; desktop 80-112) */
  /* //cambio (2026-07-29): valores anteriores `3.75rem` (60px) → `0.75rem` → `1.5rem` (actual).
     OBLIGADO por la bajada de desktop: este bloque es un override de mobile, no un mínimo, así
     que si desktop baja y esto no, el celular queda con MÁS aire que la pantalla grande — al
     revés de como estaba pensado (originalmente 60 < 80).
     1.5rem (24px) conserva la proporción original de 0.75× respecto de desktop (32px): mobile
     un poco más apretado, nunca más suelto.
     El comentario de arriba se deja como registro de los valores del Figma. */
  /* //cambio (2026-07-29): sube a 2rem. Valor anterior: `1.5rem`. Cadena: `3.75rem` →
     `0.75rem` → `1.5rem` → `2rem`. Acompaña la suba de desktop a 2.5rem manteniendo mobile
     un escalón más apretado (32px contra 40px), que es la relación que tenía originalmente
     (60 contra 80). */
  .section-padding,
  .section-padding-lg {
    padding-top: 2rem;
    padding-bottom: 2rem;
  }

  /* paneles con radio 16 (desktop 24) */
  .section-blue,
  .section-gray,
  .hero-inner,
  .fal-ref-panel,
  .calculator-section,
  .impacto-panel {
    border-radius: 16px;
  }

  /* títulos de sección: los clamp de :root bajan a 24px en 390px; el Figma mobile los
     mantiene en 36px (32 para equipo-intro y cómo-funciona — style_eaa603d5) */
  .section-title { font-size: 2.25rem; }
  .equipo-intro .section-title,
  .como-funciona-header .section-title { font-size: 2rem; }
}

/* ── Hero (Figma 3125:1066) ── */
@media (max-width: 767.98px) {
  .hero-inner {
    /* //cambio: el bloque <992 de arriba lo dejaba en auto/2rem — el Figma mobile pide 640
       de alto con el contenido apoyado ABAJO */
    min-height: 640px;
    padding: 40px 20px;
    align-items: flex-end;
  }

  /* gradiente mobile: vertical desde arriba (el desktop usa 86deg lateral) */
  .hero-inner:not(.img-placeholder)::after {
    background: linear-gradient(180deg, rgba(0, 0, 0, 0.55) 0%, rgba(255, 251, 251, 0) 100%);
  }

  /* Figma mobile: 40px (el clamp de --font-size-hero da 32 en 390px) */
  .hero-title { font-size: 2.5rem; }

  /* CTAs mobile: Noto 500 16 (style_9934d5cb) — en desktop son Cocogoose 300 14 */
  .hero-ctas .btn {
    font-family: var(--font-body);
    font-weight: 500;
    font-size: 1rem;
  }
}

/* ── Reforma (Figma 3134:2275) ── */
@media (max-width: 767.98px) {
  .fal-ref-panel { padding: 56px 20px; }
  .fal-ref-cierre { font-size: 1rem; }  /* Figma 3134:2460: 16px */
  .fal-ref-cta .btn {
    font-family: var(--font-body);
    font-weight: 500;
    font-size: 1rem;
  }
}

/* ── #equipo + timeline (Figma 3125:1090) ── */
@media (max-width: 767.98px) {
  .equipo-panel { padding: 56px 20px; gap: 60px; }
  /* //cambio (2026-08-04): 40px → 56px. Valor anterior: `40px`.
     El Figma mobile (frame 3125:1092) separa el header del bloque de cards con 56, el mismo
     valor que ya usa desktop. No había motivo para achicarlo acá. */
  .equipo-panel-content { gap: 56px; }

  /* //cambio (2026-07-29): el título de card baja otro escalón en mobile — 1.35rem contra los
     1.55rem de desktop. En el carrusel la card es más angosta que en la fila de 4, así que
     títulos como "Seguimiento en tiempo real" se parten en más líneas.
     El `min-height: 2.8em` del h3 NO hay que redeclararlo: está en `em`, así que se recalcula
     solo contra este font-size (1.35 × 2.8 = 3.78rem) y sigue reservando exactamente 2 líneas. */
  .fal-card h3 { font-size: 1.35rem; }

  /* //cambio (2026-07-28): la píldora de PERÍODO quedaba aplastada dentro de la columna del
     track (24px) del grid vertical y se veía como un blob circular. El Figma mobile
     (3134:3074) la muestra como fila propia a todo el ancho, centrada, sin línea. */
  .timeline-step--periodo { display: flex; padding: 0 0 24px; }
  .timeline-step--periodo .timeline-step-track {
    flex-direction: row;
    width: 100%;
    height: auto;
    gap: 0;
  }
  .timeline-step--periodo .timeline-segment { display: none; }
  .timeline-periodo {
    width: 100%;
    text-align: center;
    padding: 12px 16px;
  }
}

/* ── Cómo funciona (Figma 3125:1217) ── */
@media (max-width: 767.98px) {
  .step-carousel-panel-inner {
    padding: 40px 20px;
    border-radius: 12px;
  }
  /* título de slide: 24px Semilight ls -0.03 (nodo 3125:1312; desktop 32 Light) */
  .como-slide-title {
    font-size: 1.5rem;
    font-weight: var(--font-weight-title-semibold);
  }
  .aporte-card-label { font-size: 1rem; }        /* 16 Semilight (style_5d6e2066) */
  .aporte-valor { font-size: 1.25rem; letter-spacing: -0.02em; }  /* 20 (style_d24bb693) */
  .aporte-valor-unidad { font-size: 1rem; }
  .como-swiper-footer { padding-inline: 0.5rem; }
}

/* ── Gestión (Figma 3157:4157 / 3160:4545) ── */
@media (max-width: 767.98px) {
  .gestion-section-title {
    /* Figma mobile 3160:4550: 36 Light ls -0.02 — el 54 Ultralight es SOLO desktop */
    font-size: 2.25rem;
    font-weight: 300;
    letter-spacing: -0.02em;
  }
  .gestion-card {
    padding: 40px 24px;
    border-radius: 12px;
  }
  .gestion-card-title { font-size: 2rem; }   /* 32 (style_eaa603d5; desktop 40) */
  .gestion-card .eyebrow { font-size: 1rem; }  /* 16 (style_4cefc2cb; desktop 20) */

  /* //cambio: el bloque histórico de arriba le dejaba padding 0 3.25rem al wrapper — sin
     correlato en el Figma mobile (las cards van al ancho del panel) */
  .gestion-stack-wrapper { padding: 0; }

  /* proporción fija del diseño (452×305) para que las pills posicionadas en % no drifteen */
  .gestion-card-media {
    min-height: 0;
    aspect-ratio: 452 / 305;
    border-radius: 16px;
  }

  /* pills por card — coordenadas del Figma mobile como % de la imagen 452×305. La card de
     éxito mobile es MÁS CHICA (115×118 vs 144×148 desktop) → factor 0.8 compuesto sobre
     var(--pill-scale), nunca reescribiendo width/height del componente compartido. */

  /* //cambio (2026-08-04): fix de DERIVA VERTICAL del badge. Medido en dev a 486px: el CSS pide
     `top: 66.5%` pero rendereaba en **70.7%** — 4.2% de corrimiento (~12px sobre una imagen de
     279px de alto). El Figma (3157:4026) lo quiere en 203/305 = 66.6%.
     Causa: el bloque `@media (max-width: 991.98px)` le aplica `transform-origin: left center`.
     Con origen centrado, al escalar el box se recentra sobre el eje vertical del box SIN
     escalar, así que el borde superior baja (60 - 60×0.614)/2 ≈ 11.6px. Justo la deriva medida.
     Las demás pills del bloque mobile ya usan `top left`; el badge era el único con `left
     center`, heredado del bloque de tablet. Se unifica.
     De paso el factor baja de 0.9 a 0.81: medido daba 123px de ancho contra los ~111px que
     corresponden al Figma escalado (122 × 413/452). */
  .gestion-glass-pill--badge {
    transform: scale(calc(var(--pill-scale, 1) * 0.81));
    transform-origin: top left;
  }

  [data-gestion-card="0"] .gestion-glass-pill--badge {
    left: 65%; top: 66.5%; right: auto;              /* 294/452, 203/305 */
  }
  [data-gestion-card="0"] .gestion-glass-pill--card-pause {
    left: 54.4%; top: 18.4%; bottom: auto;           /* 246/452, 56/305 */
    /* //cambio (2026-08-04): el factor baja de 0.8 a 0.675. Medido en dev a 486px: la card de
       éxito rendereaba 124×118 contra los ~105×108 que corresponden al Figma escalado
       (115×118 sobre imagen 452 → ×413/452). Era ~18% más grande — el "enormes" reportado.
       0.675 sale de despejar el ancho: 105/198 = 0.530 de escala total, y 0.530/0.785
       (--pill-scale) = 0.675. */
    transform: scale(calc(var(--pill-scale, 1) * 0.675));
    transform-origin: top left;
  }
  [data-gestion-card="1"] .gestion-glass-pill--badge {
    left: 52.4%; top: 55%; right: auto;              /* 237/452, 168/305 */
  }
  [data-gestion-card="1"] .gestion-glass-pill--card-move {
    left: 10.4%; top: 30%; right: auto; bottom: auto; /* 47/452, 92/305 */
    /* //cambio (2026-08-04): el factor baja de 0.8 a 0.675. Medido en dev a 486px: la card de
       éxito rendereaba 124×118 contra los ~105×108 que corresponden al Figma escalado
       (115×118 sobre imagen 452 → ×413/452). Era ~18% más grande — el "enormes" reportado.
       0.675 sale de despejar el ancho: 105/198 = 0.530 de escala total, y 0.530/0.785
       (--pill-scale) = 0.675. */
    transform: scale(calc(var(--pill-scale, 1) * 0.675));
    transform-origin: top left;
  }
  [data-gestion-card="2"] .gestion-glass-pill--card-pause {
    left: 4.2%; top: 27.5%; bottom: auto;            /* 19/452, 84/305 */
    /* //cambio (2026-08-04): faltaba el factor reductor. Valor anterior:
       `transform: scale(var(--pill-scale, 1))` — SIN factor, o sea a escala de desktop.
       Las cards 0 y 1 sí lo tenían (0.8, bajado a 0.675 en esta misma tanda) y esta quedó
       afuera. Medido en dev a 486px: rendereaba 155×148 contra los ~105×108 del Figma
       escalado — 48% más grande. Ese es el "la card 3 está enorme" reportado.
       Se unifica en 0.675, el mismo de las otras dos. */
    transform: scale(calc(var(--pill-scale, 1) * 0.675));
    transform-origin: top left;
  }
  [data-gestion-card="2"] .gestion-glass-pill--resume {
    left: auto; right: 1%; top: 61%;                 /* 212/452 → derecha; 186/305 */
    /* //cambio (2026-08-04): el switch tampoco tenía reducción mobile — heredaba el
       `translateY(-50%) scale(0.9)` del bloque ≤991.98px sobre una base de 12rem (192px) y
       rendereaba 173px, o sea 41.9% del ancho de la imagen (413px). En desktop la misma
       píldora ocupa 216 sobre imagen de 602 = 35.9%. Manteniendo esa proporción sobre 413
       da 148px → 148/192 = 0.77. Se conserva el translateY y el origin `center right` del
       bloque de arriba: con `right: 1%` el borde derecho queda anclado al escalar. */
    transform: translateY(-50%) scale(0.77);
  }
}

/* ── Calculadora (Figma 3192:993) ── */
@media (max-width: 767.98px) {
  /* //cambio (2026-07-29): baja a 2rem para igualar al resto de las secciones en mobile.
     Valor anterior: `3.75rem` (60px). Este override venía de la pasada mobile del Figma, donde
     TODAS las secciones estaban en 60px; al bajar las demás a 32px quedó siendo la única con
     casi el doble de aire. Ahora toma el mismo valor que `.section-padding` en este breakpoint. */
  .calculadora-section { padding-block: 2rem; }
  .calculadora-title { font-size: 2.25rem; }
  .calculator-section { padding: 40px 20px; }
  .calculator-card { padding: 40px 12px; }
  .segment-toggle button { padding: 10px 14px; font-size: 0.8125rem; }
}

/* ── Bento (Figma 3216:733) ── */
@media (max-width: 767.98px) {
  /* //cambio (2026-07-28): pila 1-col con alturas fijas del diseño y orden visual propio;
     "23 años" y "+600" van etiqueta+número EN FILA. El grid pasa a flex para poder usar
     order (pisa el grid 1-col del bloque histórico de arriba). OJO data-driven: el mapeo se
     apoya en las clases de color/filas que hoy trae la data ACF (gris=Activos, navy=23 años,
     azul+filas-1=+600, azul+filas-2=Calificaciones, celeste=Patrimonio) — si un editor las
     cambia en el admin, este orden se desarma. */
  .fal-bento-grid {
    display: flex;
    flex-direction: column;
    gap: 16px;
  }
  .fal-bento-tile--gris { order: 1; min-height: 188px; }        /* Activos */
  .fal-bento-tile--navy {
    order: 2;
    min-height: 114px;
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    gap: 24px;
  }
  .fal-bento-tile--navy .fal-bento-etiqueta { margin: 0; }
  .fal-bento-tile--azul.fal-bento-tile--filas-1 {
    order: 3;
    min-height: 114px;
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    gap: 16px;
  }
  .fal-bento-tile--azul.fal-bento-tile--filas-1 .fal-bento-desc { font-size: 1.25rem; line-height: 1.3; }
  .fal-bento-tile--azul.fal-bento-tile--filas-2 {
    order: 4;
    padding: 24px;
    /* //cambio (2026-07-28): reportado por el usuario — las calificaciones no se veían como
       el Figma (3216:810). Medido en el preview: el gap título→lista y el gap entre
       calificaciones estaban INVERTIDOS respecto al diseño. .fal-bento-tile trae gap:1rem
       (16px) por default (title→ratings-ul, ver regla base) y .fal-bento-ratings trae
       gap:2rem (32px, item→item) — son los valores del layout DESKTOP, que en mobile el
       Figma (#3216:816 gap:32 / #3216:819 gap:16) pide al revés. Se pisan ambos, scopeados
       a esta tile para no tocar desktop ni el resto del bento. */
    gap: 2rem;
  }
  .fal-bento-tile--azul.fal-bento-tile--filas-2 .fal-bento-ratings { gap: 1rem; }
  .fal-bento-tile--celeste { order: 5; min-height: 148px; }     /* Patrimonio */

  .fal-bento-valor { font-size: 4rem; line-height: 1; }         /* 64px (style_d7a082d6) */
  .fal-bento-rating-valor {
    font-size: 2.25rem;              /* 36px (style_9a24f14b) */
    letter-spacing: -0.02em;         /* Figma nodo "A.ar" #3216:822 */
  }
  /* calificaciones: valor + label en fila (Figma 3216:820/824/828 — gap real 16px) */
  .fal-bento-rating {
    flex-direction: row;
    align-items: flex-end;
    gap: 1rem;                       /* //cambio: era 12px, el Figma mide 16 en 2 de las 3 filas */
  }
}

/* ── Contacto (Figma 3125:1637) ── */
@media (max-width: 767.98px) {
  #contacto .section-title { font-size: 2.25rem; letter-spacing: -0.03em; }
  /* Figma mobile 3191:822: bajada en Cocogoose Light 20 (desktop va en Noto) */
  #contacto .section-subtitle {
    font-family: var(--font-title);
    font-size: 1.25rem;
  }
  /* botón Enviar a la derecha, 56 de alto, Noto 500 16 (Figma 3125:1668) */
  #contacto button[type="submit"] {
    display: flex;
    margin-left: auto;
    height: 56px;
    font-family: var(--font-body);
    font-weight: 500;
    font-size: 1rem;
  }
}

/* ── Footer (Figma 3225:2835) ── */
@media (max-width: 767.98px) {
  .fal-footer { padding: 2.5rem 0; }
  .fal-footer .container { padding-inline: 1.875rem; }  /* Figma: laterales 30px */
}

/* ── FAQ (Figma 3237:2943) — el bloque <992 de arriba (nav horizontal) queda para tablet ── */
@media (max-width: 767.98px) {
  .fal-faq-titulo { font-size: 2.5rem; letter-spacing: -0.03em; }  /* 40px (3237:2950) */

  /* menú de categorías: columna apilada (Figma 3237:2954) — pisa el row con scroll de <992 */
  .fal-faq-nav ul {
    flex-direction: column;
    overflow-x: visible;
    gap: 0;
  }
  .fal-faq-nav-link {
    white-space: normal;
    padding: 12px 16px;
    font-size: 1rem;               /* inactivo: 16 UPPER gris (style_54b9bc71) */
    border-bottom: 0;
  }
  .fal-faq-nav-link.is-active {
    font-size: 1.125rem;           /* activo: 18 Semilight UPPER azul + subrayado (3237:2961) */
    font-weight: var(--font-weight-title-semibold);
    border-bottom: 1px solid var(--color-border);
  }

  /* preguntas (style_52d5de0c: Noto SemiBold 16 ls -0.03) y respuestas (Noto 14) */
  .fal-faq-toggle {
    font-weight: 600;
    letter-spacing: -0.03em;
    color: var(--color-text-muted);
    padding: 20px 0;
  }
  .fal-faq-item { border-bottom-color: var(--color-primary); }
  .fal-faq-respuesta { font-size: 0.875rem; }
  .fal-faq-cat + .fal-faq-cat { margin-top: 3rem; }
  .fal-faq-layout { gap: 2rem; }
}
