/* ===== core/styles/tokens.css ===== */
/* ============================================================
   tokens.css — tokens de marca OpenCard (fuente de verdad).
   Editables desde v2/config/theme.tokens.json (el build los
   appendea como override al final del bundle si existen).
   ============================================================ */
:root {
  --purple: #542DE3;
  --purple-deep: #3B1FA8;
  --purple-dark: #1F106B;
  --purple-light: #9E88F0;
  --mint: #10f4ae;
  --paytech-blue: #0027BA;
  --text: #14142B;
  --text-soft: #6B6B80;
  --bg-dark: #08081a;
  --font: 'Funnel Display', 'Inter', -apple-system, sans-serif;
  --font-mono: 'JetBrains Mono', monospace;
}


/* ===== core/styles/reset.css ===== */
/* ============================================================
   reset.css — reset mínimo + estilos base del <body>.
   ============================================================ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body { height: 100%; -webkit-font-smoothing: antialiased; }
img, svg, video { display: block; max-width: 100%; }
button { font-family: inherit; cursor: pointer; border: none; background: none; color: inherit; }
a { color: inherit; text-decoration: none; }
ul, ol { list-style: none; }

body {
  font-family: var(--font);
  background: #ffffff;
  color: var(--text);
  font-weight: 500;
  line-height: 1.5;
  overflow: hidden;
}


/* ===== core/styles/scene.css ===== */
/* ============================================================
   scene.css — estructura común de cada slide del storytelling.
   Swiper container + .swiper-slide.scene + scene-bg/scene-content
   + partículas flotantes (.particles/.particle).
   ============================================================ */

/* Swiper container */
.main-swiper {
  width: 100vw;
  height: 100vh;
}

/* Cada slide ocupa 100vh y centra su contenido */
.swiper-slide.scene {
  position: relative;
  width: 100vw;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}

.scene-bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  will-change: transform;
}
.scene-bg::after {
  /* Vignette desactivado en modo claro */
  display: none;
}

.scene-content {
  position: relative;
  width: 100%;
  max-width: 1240px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(20px, 3vw, 40px);
  /* Padding asimétrico: deja espacio a la derecha para la línea de tiempo
     (timeline ocupa ~28px + 24px margen + label oculto = ~80px). */
  padding: 60px 100px 60px 60px;
  z-index: 1;
  text-align: center;
}

/* Partículas flotantes en fondos oscuros (las inyecta ambient.js) */
.particles {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  overflow: hidden;
}
.particle {
  position: absolute;
  width: 3px; height: 3px;
  background: rgba(84, 45, 227, 0.25);
  border-radius: 50%;
  box-shadow: 0 0 10px rgba(16, 244, 174, 0.35);
  will-change: transform;
  animation: particleFloat var(--dur, 12s) ease-in-out infinite;
  animation-delay: var(--delay, 0s);
  left: var(--x, 50%);
  top: var(--y, 50%);
  opacity: var(--op, 0.4);
}
@keyframes particleFloat {
  0%, 100% { transform: translate(0, 0); }
  50%      { transform: translate(var(--dx, 20px), var(--dy, -30px)); }
}


/* ===== core/styles/typography.css ===== */
/* ============================================================
   typography.css — sistema tipográfico común a todas las secciones.
   Headings, párrafos, kicker, highlight, y los wrappers que usa
   el motor de text-reveal (.story-char, .story-word, .swap-target).
   ============================================================ */

h1, h2, h3 { font-weight: 800; letter-spacing: -0.025em; line-height: 1.05; }

.scene-content h1 {
  font-size: clamp(2.5rem, 7vw, 5.5rem);
  font-weight: 900;
  letter-spacing: -0.03em;
  max-width: 1100px;
  color: var(--text);
}
.scene-content h2 {
  font-size: clamp(2rem, 5.5vw, 4rem);
  font-weight: 900;
  letter-spacing: -0.025em;
  max-width: 1000px;
  color: var(--text);
}
.scene-content p {
  font-size: clamp(1.05rem, 1.8vw, 1.4rem);
  max-width: 640px;
  color: #42424f;
  font-weight: 500;
  line-height: 1.55;
}
.scene-content .kicker {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--purple);
  opacity: 0.85;
  /* Kickers ocultos por decisión de diseño. Para volverlos a mostrar,
     quitar la línea siguiente. El contenido sigue vivo en los
     content.json — el editor los puede editar aunque no se vean. */
  display: none;
}

.story-highlight { color: var(--mint); }

/* Palabra que alterna (data-swap-word) — resaltada como con marcador.
   El span .swap-highlight (insertado por JS) se "pinta" de izq a der
   como un marcador real cuando aparece la palabra y se "borra" de der
   a izq cuando cambia. */
.swap-target {
  position: relative;
  display: inline-block;
  text-align: center;
  vertical-align: baseline;
  white-space: nowrap;
  color: var(--text);
  z-index: 1;
}
.swap-highlight {
  position: absolute;
  top: 18%;
  bottom: 14%;
  background: rgba(16, 244, 174, 0.55);
  border-radius: 4px;
  z-index: -1;
  pointer-events: none;
  left: 0;
  width: 0;
  box-shadow: 0 1px 3px rgba(16, 244, 174, 0.25);
  filter: blur(0.3px);
}

/* Text reveal — chars envueltos por el motor. line-height 1.2 + padding
   para que descendentes (g, j, p, q, y) NO se recorten por overflow:hidden. */
.story-char {
  display: inline-block;
  overflow: hidden;
  vertical-align: baseline;
  line-height: 1.2;
  padding-bottom: 0.12em;
}
.story-char-i { display: inline-block; will-change: transform, opacity; line-height: 1; }
.story-word { display: inline-block; }

/* Highlight char (clase que un wire de sección añade a chars específicos). */
.story-char-i.is-highlight {
  color: var(--mint);
  transition: transform 0.4s ease;
}


/* ===== core/styles/scroll-indicator.css ===== */
/* ============================================================
   scroll-indicator.css — DOS indicadores distintos:

   1) .scroll-indicator (hero, slide 0):
      Texto "scroll para empezar" + flecha simple ↓ con bounce.
      Es el saludo de bienvenida — más texto, más prominente.

   2) .scroll-indicator-next (slides intermedios):
      Stack de 3 chevrons con onda secuencial, sin texto.
      Es el "hay más" sutil que se pinta en cada sección excepto
      el hero y el footer.

   ambient.js los administra: activeIndex 0 → indicator,
   intermedios → indicator-next, último → ninguno.
   ============================================================ */

/* ---------- Base común (posición + transición) ---------- */
.scroll-indicator,
.scroll-indicator-next {
  position: fixed;
  bottom: 32px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  z-index: 9997;
  opacity: 0;
  transition: opacity 0.6s ease;
  pointer-events: none;
}
.scroll-indicator.is-visible,
.scroll-indicator-next.is-visible {
  opacity: 1;
}

/* ---------- Indicador del hero (slide 0) ---------- */
.scroll-indicator { gap: 8px; }
.scroll-indicator.is-visible {
  opacity: 0.7;
  animation: scrollIndicatorBounce 2.2s ease-in-out infinite;
}
.scroll-text {
  font-family: 'JetBrains Mono', monospace;
  font-size: 0.65rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--text-soft, #6B6B80);
}
.scroll-arrow {
  font-size: 1.2rem;
  color: var(--purple);
}
@keyframes scrollIndicatorBounce {
  0%, 100% { transform: translate(-50%, 0); }
  50%      { transform: translate(-50%, 8px); }
}

/* ---------- Indicador intermedio (chevron stack) ---------- */
.scroll-indicator-next { gap: 0; }
.scroll-chevrons {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.scroll-chev {
  width: 22px;
  height: 22px;
  color: var(--purple);
  margin-top: -10px;
  opacity: 0;
  animation: scrollChevWave 1.8s ease-in-out infinite;
  will-change: transform, opacity;
}
.scroll-chev:nth-child(1) { animation-delay: 0s;   margin-top: 0; }
.scroll-chev:nth-child(2) { animation-delay: 0.2s; }
.scroll-chev:nth-child(3) { animation-delay: 0.4s; color: var(--mint); }

@keyframes scrollChevWave {
  0%   { opacity: 0;   transform: translateY(-4px); }
  35%  { opacity: 1;   transform: translateY(0); }
  70%  { opacity: 0.4; transform: translateY(6px); }
  100% { opacity: 0;   transform: translateY(8px); }
}

/* ---------- Accesibilidad ---------- */
@media (prefers-reduced-motion: reduce) {
  .scroll-indicator.is-visible { animation: none; }
  .scroll-chev {
    animation: none;
    opacity: 0.85;
    transform: none;
  }
}

/* ---------- Mobile ---------- */
@media (max-width: 640px) {
  .scroll-indicator,
  .scroll-indicator-next { bottom: 24px; }
  .scroll-text { font-size: 0.6rem; }
  .scroll-arrow { font-size: 1.1rem; }
  .scroll-chev { width: 18px; height: 18px; margin-top: -8px; }
  .scroll-chev:nth-child(1) { margin-top: 0; }
}


/* ===== core/styles/timeline.css ===== */
/* ============================================================
   timeline.css — línea de tiempo lateral ("máquina del tiempo").
   El step activo siempre queda en el centro; pasado arriba, futuro
   abajo. El JS (timeline.js) calcula los offsets.
   ============================================================ */

.timeline {
  position: fixed;
  top: 0; right: 24px;
  height: 100vh;
  display: flex;
  align-items: center;
  pointer-events: none;
  z-index: 9998;
  overflow: hidden;
}

/* Track viejo y barra de progreso — desactivados (no se usan en V2). */
.timeline-track { display: none; }
.timeline-progress { display: none; }

/* La línea estática vive como ::before del list — exactamente del alto
   del list, así los íconos viajan dentro de sus límites. */
.timeline-list::before {
  content: '';
  position: absolute;
  top: 0; bottom: 0; left: 50%;
  width: 2px;
  transform: translateX(-50%);
  background: linear-gradient(180deg,
    transparent 0%,
    rgba(20, 20, 43, 0.12) 8%,
    rgba(20, 20, 43, 0.12) 92%,
    transparent 100%);
  border-radius: 1px;
  pointer-events: none;
  z-index: 0;
}
.timeline-list {
  position: relative;
  width: 28px;
  height: 88vh;
  z-index: 1;
  pointer-events: auto;
}

.timeline-step {
  position: absolute;
  top: 50%; left: 0;
  width: 100%;
  transform: translateY(-50%);
  transition: transform 0.85s cubic-bezier(0.65, 0, 0.35, 1),
              opacity 0.6s cubic-bezier(0.4, 0, 0.2, 1);
  will-change: transform, opacity;
}
.timeline-step button {
  display: block;
  width: 28px;
  height: 28px;
  padding: 0;
  background: transparent;
  border: none;
  cursor: pointer;
  position: relative;
}
.timeline-icon {
  width: 28px; height: 28px;
  border-radius: 50%;
  background: #ffffff;
  border: 1.5px solid rgba(20, 20, 43, 0.15);
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(20, 20, 43, 0.5);
  transition: all 0.3s ease;
}
.timeline-icon svg { width: 14px; height: 14px; }

/* Label flotante: position absolute para que no desplace los íconos.
   Aparece a la izquierda del ícono al hacer hover o cuando está activo. */
.timeline-label {
  position: absolute;
  top: 50%;
  right: calc(100% + 14px);
  transform: translateY(-50%) translateX(8px);
  font-family: var(--font-mono);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text);
  opacity: 0;
  transition: opacity 0.3s ease, transform 0.3s ease;
  pointer-events: none;
  white-space: nowrap;
}

/* Hover: muestra el label sin mover el ícono */
.timeline-step:hover .timeline-label {
  opacity: 1;
  transform: translateY(-50%) translateX(0);
}
.timeline-step:hover .timeline-icon {
  border-color: var(--purple);
  color: var(--purple);
}

/* Paso activo: ícono mint con glow */
.timeline-step.is-active .timeline-icon {
  background: var(--mint);
  border-color: var(--mint);
  color: white;
  box-shadow: 0 0 16px rgba(16, 244, 174, 0.5);
}
.timeline-step.is-active .timeline-label {
  opacity: 1;
  transform: translateY(-50%) translateX(0);
  color: var(--purple);
}

/* Pasos ya completados (antes del activo): ícono morado */
.timeline-step.is-done .timeline-icon {
  background: var(--purple);
  border-color: var(--purple);
  color: white;
}


/* ===== core/styles/responsive.css ===== */
/* ============================================================
   responsive.css — media queries COMUNES a todas las secciones.
   Reglas específicas de cada sección viven en su propio .css.
   ============================================================ */

@media (max-width: 768px) {
  .scene-content { padding: 40px 16px; }
  .scene-content h1 { font-size: clamp(2rem, 9vw, 3.5rem); }
  .scene-content h2 { font-size: clamp(1.7rem, 7vw, 2.6rem); }
}

@media (max-width: 640px) {
  .timeline { right: 12px; }
  .timeline-list { gap: 16px; }
  .timeline-icon { width: 22px; height: 22px; }
  .timeline-icon svg { width: 11px; height: 11px; }
  .timeline-label { display: none; }
}



/* === theme override (theme.tokens.json) === */
:root {
  --purple: #542DE3;
  --purple-deep: #3B1FA8;
  --purple-dark: #1F106B;
  --purple-light: #9E88F0;
  --mint: #10f4ae;
  --paytech-blue: #0027BA;
  --text: #14142B;
  --text-soft: #6B6B80;
  --bg-dark: #08081a;
  --font: 'Funnel Display', 'Inter', -apple-system, sans-serif;
  --font-mono: 'JetBrains Mono', monospace;
}


/* ===== sections/hero/hero.css ===== */
/* ============================================================
   hero.css — CSS EXCLUSIVO del hero (data-section="hero").
   Lo compartido (.scene/.scene-bg/.scene-content, .story-char,
   .swap-target, .swap-highlight, h1 base, .scroll-indicator)
   vive en v2/core/styles/. No duplicar acá.
   ============================================================ */

/* Fondo de la escena hero — transparente, deja ver el body claro
   con las partículas que inyecta ambient.js. */
[data-section="hero"] .hero-bg {
  background: transparent;
}

/* Logo del hero — imagen PNG con drop-shadow morado sutil.
   Tamaño fluido entre 220px y 380px (max ~30vw). */
[data-section="hero"] .hero-logo {
  width: clamp(220px, 30vw, 380px);
  height: auto;
  filter: drop-shadow(0 12px 30px rgba(84, 45, 227, 0.2));
}


/* ===== sections/oss/oss.css ===== */
/* ============================================================
   oss.css — CSS EXCLUSIVO de OSS (data-section="oss").
   Reglas portadas del monolito v2 (landing-v2.css, líneas 367–413
   + override móvil líneas 748–749).

   Lo compartido (.scene/.scene-bg/.scene-content, h2 base, .kicker,
   .story-highlight) vive en v2/core/styles/. No duplicar acá.

   Notas de cascada:
   - El monolito tiene `.scene-content p { color: #42424f; weight: 500 }`.
     OSS no usa <p> dentro del diagrama; los labels son <span>, así que
     no chocan con esa regla.
   - `.oss-module` no es <button>, no hereda reset de form controls.
   - `.module-icon` usa `font-size: 1.6em` — la regla `.kicker` (que es
     un sibling fuera del module) no interfiere.
   - El último `.oss-link` (`data-link="end"`) está oculto por display:none
     para no pintar conector después del 5º módulo (ver oss.html para el
     porqué de pintarlo desde el {{#each}}).
   ============================================================ */

/* Fondo transparente: hereda body claro con ambient particles. */
[data-section="oss"] .oss-bg {
  background: transparent;
}

/* "Nuestra propuesta:" línea introductoria — morado, casi del mismo
   tamaño que el h2 principal pero un poco más chico para jerarquía. */
[data-section="oss"] .oss-leadin {
  color: var(--purple);
  font-size: clamp(1.6rem, 4.5vw, 3.2rem);
  font-weight: 800;
  letter-spacing: -0.025em;
  line-height: 1.05;
  margin-bottom: -8px;
}

/* "One-Stop-Shop" — más grande que el h2 base para que dominantle. */
[data-section="oss"] .scene-content h2:not(.oss-leadin) {
  font-size: clamp(3rem, 8vw, 6rem);
  font-weight: 900;
  letter-spacing: -0.03em;
}

/* INTERIM: Imagen oficial del ecosistema OpenCard mientras Iris/Jefer
   iteran las ilustraciones SVG modulares. Se centra y escala dentro
   del slide respetando el alto disponible (no se desborda en 100svh).
   La imagen YA trae sus propios paddings internos → cancelo el gap
   del scene-content con margin-top negativo. */
[data-section="oss"] .oss-ecosystem {
  display: block;
  width: min(1100px, 92vw);
  max-height: 60vh;
  height: auto;
  object-fit: contain;
  margin: calc(-1 * clamp(20px, 3vw, 40px)) auto 0;
}
@media (max-width: 768px) {
  [data-section="oss"] .oss-ecosystem {
    width: 95vw;
    max-height: 55vh;
  }
}

/* Escenario del diagrama: contenedor relativo 16:9. Los módulos
   se posicionan en absoluto dentro de este box. */
[data-section="oss"] .oss-diagram-stage {
  position: relative;
  width: min(900px, 90vw);
  aspect-ratio: 16/9;
  margin-top: 24px;
}

/* Cada módulo = card cuadrada blanca con icon + label dentro. */
[data-section="oss"] .oss-module {
  position: absolute;
  width: clamp(80px, 11vw, 140px);
  aspect-ratio: 1;
  border-radius: 24px;
  background: #ffffff;
  border: 1.5px solid rgba(20, 20, 43, 0.1);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  gap: 6px;
  padding: 10px;
  font-size: clamp(0.6rem, 1.1vw, 0.75rem);
  font-weight: 700;
  text-align: center;
  letter-spacing: -0.01em;
  color: var(--text);
  box-shadow: 0 8px 28px rgba(20, 20, 43, 0.08);
}

/* Variante "mint" para el módulo central (Core de Crédito). */
[data-section="oss"] .oss-module.is-mint {
  border-color: rgba(16, 244, 174, 0.6);
  box-shadow: 0 12px 40px rgba(16, 244, 174, 0.25);
}

/* Icono emoji dentro del module: 1.6em del font-size del module. */
[data-section="oss"] .oss-module .module-icon {
  font-size: 1.6em;
}

/* Posicionamiento absoluto de cada uno de los 5 módulos.
   pos=3 (Core) es más grande y se centra perfecto en el stage. */
[data-section="oss"] .oss-module[data-pos="1"] { top: 50%; left: 0%;  transform: translateY(-50%); }
[data-section="oss"] .oss-module[data-pos="2"] { top: 50%; left: 23%; transform: translateY(-50%); }
[data-section="oss"] .oss-module[data-pos="3"] {
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: clamp(95px, 13vw, 165px);
  aspect-ratio: 1;
}
[data-section="oss"] .oss-module[data-pos="4"] { top: 50%; right: 23%; transform: translateY(-50%); }
[data-section="oss"] .oss-module[data-pos="5"] { top: 50%; right: 0%;  transform: translateY(-50%); }

/* Conectores horizontales entre módulos: línea fina con gradiente mint.
   `transform: scaleX(0)` es el estado inicial; el motion-catalog
   `grow-x` anima a scaleX(1) en su delay. */
[data-section="oss"] .oss-link {
  position: absolute;
  top: 50%;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--mint), transparent);
  transform-origin: left center;
  transform: translateY(-50%) scaleX(0);
}
[data-section="oss"] .oss-link[data-link="1-2"] { left: 11%; width: 12%; }
[data-section="oss"] .oss-link[data-link="2-3"] { left: 34%; width: 14%; }
[data-section="oss"] .oss-link[data-link="3-4"] { left: 52%; width: 14%; }
[data-section="oss"] .oss-link[data-link="4-5"] { left: 78%; width: 12%; }

/* Sentinel pintado después del último módulo: no representa un
   conector real, solo es subproducto del {{#each}} sin condicional.
   Se oculta y no afecta layout (display:none lo saca del flujo). */
[data-section="oss"] .oss-link[data-link="end"] { display: none; }

/* Móvil: el stage cambia de 16:9 a 4:3 (más alto, mejor para 5 cards
   apretadas) y se baja el font-size del module. */
@media (max-width: 768px) {
  [data-section="oss"] .oss-diagram-stage { aspect-ratio: 4/3; }
  [data-section="oss"] .oss-module { font-size: 0.55rem; }
}


/* ===== sections/billetera/billetera.css ===== */
/* ============================================================
   billetera.css — CSS EXCLUSIVO de Billetera (data-section="billetera").
   Reglas portadas del monolito v2 (landing-v2.css, líneas 415–465
   + override móvil línea 747).

   Lo compartido (.scene/.scene-bg/.scene-content, h2 base, .kicker,
   .story-highlight) vive en v2/core/styles/. No duplicar acá.

   Notas de cascada:
   - El monolito tiene `.scene-content p { color: #42424f; weight: 500 }`.
     El <p> de copy de Billetera HEREDA esa regla y NO la sobreescribe acá
     (paridad con monolito).
   - `.bil-frame img` (es decir .bil-screen): el reset
     `img { max-width: 100% }` no estorba porque la regla
     `.bil-screen { width: 100%; height: 100% }` la cubre.
   - El @media móvil del monolito (línea 747) sobreescribe
     `.bil-phone { width: clamp(120px, 35vw, 180px) }` SIN el scope
     [data-section]. Replicamos con scope para mantener fronteras
     limpias entre secciones.
   ============================================================ */

/* Fondo transparente: hereda body claro con ambient particles. */
[data-section="billetera"] .billetera-bg {
  background: transparent;
}

/* Stage que contiene ambos phones. Se centra dentro del scene-content. */
[data-section="billetera"] .billetera-stage {
  width: 100%;
  max-width: 560px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

/* Wrapper: agrupa los dos teléfonos lado a lado. Su tamaño es la suma
   natural del contenido, así se centra perfecto dentro del stage. */
[data-section="billetera"] .bil-phones-wrap {
  display: flex;
  align-items: center;
  justify-content: center;
  /* gap negativo simulado con margin-right del primer hijo (--left) */
}

/* Cada phone: ancho responsive, ratio 9:19 (proporción iPhone). */
[data-section="billetera"] .bil-phone {
  position: relative;
  width: clamp(120px, 17vw, 190px);
  aspect-ratio: 9/19;
  flex-shrink: 0;
}

/* Rotación + overlap leve (cada uno tira un 8% del propio ancho hacia el otro)
   para que se sienta el cruce en V sin que se monten demasiado. */
[data-section="billetera"] .bil-phone--left {
  transform: rotate(-10deg);
  margin-right: -8%;
  z-index: 1;
}
[data-section="billetera"] .bil-phone--right {
  transform: rotate(10deg);
  z-index: 0;
}

/* Marco del phone: negro con borde sutil + sombra + halo morado. */
[data-section="billetera"] .bil-frame {
  width: 100%;
  height: 100%;
  background: #000;
  border-radius: 38px;
  padding: 8px;
  position: relative;
  border: 2px solid rgba(255, 255, 255, 0.15);
  box-shadow: 0 30px 70px rgba(0, 0, 0, 0.5), 0 0 60px rgba(126, 62, 255, 0.3);
  overflow: hidden;
}

/* Dynamic Island negra arriba del frame. */
[data-section="billetera"] .bil-island {
  position: absolute;
  top: 14px;
  left: 50%;
  transform: translateX(-50%);
  width: 38%;
  height: 22px;
  background: #000;
  border-radius: 99px;
  z-index: 2;
}

/* Pantalla del phone: cubre el frame completo, esquinas redondeadas. */
[data-section="billetera"] .bil-screen {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 30px;
}

/* Móvil: phones más pequeños (35vw del viewport). */
@media (max-width: 768px) {
  [data-section="billetera"] .bil-phone {
    width: clamp(120px, 35vw, 180px);
  }
}


/* ===== sections/metricas/metricas.css ===== */
/* ============================================================
   metricas.css — CSS EXCLUSIVO de métricas (data-section="metricas").
   Reglas portadas del monolito v2 (landing-v2.css, líneas 467–527).

   Lo compartido (.scene/.scene-bg/.scene-content, h2 base, .kicker)
   vive en v2/core/styles/. No duplicar acá.

   Notas de cascada:
   - .metrica-num es <span>, no <p>, así que NO choca con
     `.scene-content p { color: #42424f; weight: 500 }`. La regla
     `.metrica-num { color: var(--purple); weight: 900 }` aplica
     directo, sin batalla de especificidad.
   - .metrica-label idem (span, no p).
   - .why-logo (img dentro del h2): `img { max-width: 100% }` del
     reset no la afecta porque su tamaño viene de `height: 0.82em`
     (width queda implícito por aspect ratio).
   ============================================================ */

/* Fondo transparente: hereda body claro con ambient particles. */
[data-section="metricas"] .metricas-bg {
  background: transparent;
}

/* Logo OpenCard EMBEBIDO en el h2 "¿Por qué [logo]?".
   Tamaño relativo al em del título → escala con el clamp del h2. */
[data-section="metricas"] .why-logo {
  display: inline-block;
  height: 0.82em;
  vertical-align: -0.05em;
}

/* Grid de 4 métricas (1 fila × 4 col en desktop, 2×2 en móvil). */
[data-section="metricas"] .metricas-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 18px;
  width: min(1000px, 92vw);
  margin-top: 16px;
}

/* Card blanca con borde sutil + sombra suave. */
[data-section="metricas"] .metrica-card {
  background: #ffffff;
  border: 1px solid rgba(20, 20, 43, 0.08);
  border-radius: 18px;
  padding: 28px 16px;
  text-align: left;
  position: relative;
  box-shadow: 0 4px 16px rgba(20, 20, 43, 0.04);
  transition: transform 0.3s, box-shadow 0.3s;
}
[data-section="metricas"] .metrica-card:hover {
  transform: translateY(-6px);
  box-shadow: 0 20px 40px rgba(84, 45, 227, 0.15);
}

/* Número grande en morado, peso 900. */
[data-section="metricas"] .metrica-num {
  display: block;
  font-size: clamp(1.8rem, 3.5vw, 2.8rem);
  font-weight: 900;
  letter-spacing: -0.03em;
  color: var(--purple);
  line-height: 1;
  margin-bottom: 16px;
}
[data-section="metricas"] .metrica-unit {
  font-size: 0.5em;
  opacity: 0.6;
  font-weight: 600;
}

/* Label gris pequeño debajo del número. */
[data-section="metricas"] .metrica-label {
  display: block;
  font-size: 0.88rem;
  color: var(--text-soft, #6B6B80);
  line-height: 1.4;
}

/* Carrusel de logos de clientes (grayscale + opacidad base, full color en hover). */
[data-section="metricas"] .clientes-row {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: clamp(20px, 4vw, 50px);
  margin-top: 24px;
  width: min(900px, 92vw);
  flex-wrap: wrap;
}
[data-section="metricas"] .clientes-row img {
  height: clamp(28px, 4vh, 44px);
  width: auto;
  opacity: 0.55;
  filter: grayscale(0.6);
  transition: opacity 0.3s, filter 0.3s;
}
[data-section="metricas"] .clientes-row img:hover {
  opacity: 1;
  filter: grayscale(0);
}

/* Móvil: grid 2×2 (el monolito usa el mismo breakpoint). */
@media (max-width: 768px) {
  [data-section="metricas"] .metricas-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}


/* ===== sections/manifiesto/manifiesto.css ===== */
/* ============================================================
   manifiesto.css — CSS EXCLUSIVO del manifiesto (data-section="manifiesto").
   Reglas portadas del monolito v2 (landing-v2.css, líneas 329–542).

   Lo compartido (.scene/.scene-bg/.scene-content, .kicker, .story-char,
   .story-char-i.is-highlight, .story-highlight) vive en v2/core/styles/.
   ============================================================ */

/* Fondo de la escena manifiesto — transparente, hereda el body claro
   con ambient particles. Idéntico al monolito. */
[data-section="manifiesto"] .manifiesto-bg {
  background: transparent;
}

/* Slogan principal — MORADO, peso 900, MÁS GRANDE.
   Animación: arranca a la izquierda y escalado más grande, después
   se centra y vuelve al tamaño base mientras los chars terminan de
   aparecer. La animación de chars (text-reveal) sigue funcionando
   en paralelo dentro de cada slogan-line. */
[data-section="manifiesto"] .slogan-h1 {
  font-size: clamp(2.4rem, 7vw, 6rem) !important;
  font-weight: 900;
  letter-spacing: -0.03em;
  line-height: 1.05;
  max-width: 100%;
  color: var(--purple);
  width: 100%;
  text-align: center;
  transform-origin: left center;
  animation: sloganIntro 2.6s cubic-bezier(0.65, 0, 0.35, 1) forwards;
}

@keyframes sloganIntro {
  0%, 75% {
    /* Arranca recargado a la izquierda y más grande mientras carga */
    transform: translateX(-12%) scale(1.18);
  }
  100% {
    /* Se centra y vuelve al tamaño actual cuando ya cargaron todos los chars */
    transform: translateX(0) scale(1);
  }
}

/* Sin animación si reduced-motion */
@media (prefers-reduced-motion: reduce) {
  [data-section="manifiesto"] .slogan-h1 {
    animation: none;
    transform: none;
  }
}

[data-section="manifiesto"] .slogan-h1 .slogan-line {
  display: block;
  white-space: nowrap;
}

/* Todo el slogan en morado (sobreescribe el color heredado de
   .scene-content h1 que es var(--text) oscuro). */
[data-section="manifiesto"] .slogan-h1 .story-char-i {
  color: var(--purple) !important;
}

/* Móvil: clamp más chico, ajusta el desplazamiento del intro. */
@media (max-width: 768px) {
  [data-section="manifiesto"] .slogan-h1 {
    font-size: clamp(2.2rem, 10vw, 4rem) !important;
  }
  [data-section="manifiesto"] .slogan-h1 .slogan-line {
    white-space: normal;
  }
}


/* ===== sections/recursos/recursos.css ===== */
/* ============================================================
   recursos.css — CSS EXCLUSIVO de recursos (data-section="recursos").
   Reglas portadas del monolito v2 (landing-v2.css, líneas 544–601).

   Lo compartido (.scene/.scene-bg/.scene-content, .kicker, h2 base,
   .story-highlight) vive en v2/core/styles/. No duplicar acá.

   Notas de cascada:
   - .recurso-card es <a>. El reset hace `a { color: inherit }`;
     nuestra regla `color: var(--text)` lo fija explícitamente.
   - .recurso-card h3: el core tiene `h1, h2, h3 { font-weight: 800 }`
     (sin scope). Nuestra regla scoped tiene mayor especificidad y
     gana con `font-weight: 700`. Mismo resultado que el monolito.
   - .recurso-tag y .recurso-action son spans → sin chocar con
     `.scene-content p`.
   ============================================================ */

/* Fondo transparente: hereda body claro con ambient particles. */
[data-section="recursos"] .recursos-bg {
  background: transparent;
}

/* Grid 3 columnas en desktop, 1 en móvil. */
[data-section="recursos"] .recursos-cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
  width: min(1000px, 92vw);
  margin-top: 16px;
}

/* Card es un <a> — link a un PDF que abre en pestaña nueva. */
[data-section="recursos"] .recurso-card {
  background: #ffffff;
  border: 1px solid rgba(20, 20, 43, 0.08);
  border-radius: 20px;
  padding: 32px 24px;
  text-align: left;
  display: flex;
  flex-direction: column;
  gap: 14px;
  cursor: pointer;
  box-shadow: 0 4px 16px rgba(20, 20, 43, 0.04);
  transition: transform 0.3s, box-shadow 0.3s, background 0.3s;
  text-decoration: none;
  color: var(--text);
}
[data-section="recursos"] .recurso-card:hover {
  transform: translateY(-8px);
  box-shadow: 0 24px 50px rgba(126, 62, 255, 0.18);
}

/* Cuadro de ícono con gradiente morado→mint. El emoji va dentro. */
[data-section="recursos"] .recurso-icon {
  font-size: 2.2rem;
  width: 56px;
  height: 56px;
  background: linear-gradient(135deg, var(--purple), var(--mint));
  border-radius: 14px;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Tag mono mayúsculas (MANIFIESTO / BROCHURE). */
[data-section="recursos"] .recurso-tag {
  font-family: var(--font-mono);
  font-size: 0.65rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--purple);
  opacity: 0.8;
}

/* Título del documento (puede llevar <br> inline → ver decisión en .html). */
[data-section="recursos"] .recurso-card h3 {
  font-size: 1.2rem;
  font-weight: 700;
  flex: 1;
  color: var(--text);
}

/* "Descargar PDF →" en morado. */
[data-section="recursos"] .recurso-action {
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--purple);
  letter-spacing: -0.01em;
}

/* Móvil: 1 columna, ancho acotado para que no se vea estirado. */
@media (max-width: 768px) {
  [data-section="recursos"] .recursos-cards {
    grid-template-columns: 1fr;
    max-width: 400px;
  }
}


/* ===== sections/video/video.css ===== */
/* ============================================================
   video.css — CSS EXCLUSIVO de Video (data-section="video").
   Reglas portadas del monolito v2 (landing-v2.css, líneas 603–647).

   Lo compartido (.scene/.scene-bg/.scene-content, h2 base, .kicker,
   .story-highlight) vive en v2/core/styles/. No duplicar acá.

   Notas de cascada:
   - `.scene-content p { color: #42424f; weight: 500 }`: el <p> de copy
     del video hereda esa regla (paridad con monolito), no la
     sobreescribimos acá.
   - `.btn-primary`: solo lo usa esta sección en el monolito v2 actual.
     Lo PORTAMOS scope-ado para no contaminar el global. Si en F5
     otras secciones empiezan a usarlo, se promueve a v2/core/styles/
     como utilidad compartida (decisión de Vitruvio).
   - `.video-play-overlay`: en el monolito se oculta cuando el video
     reproduce vía toggle de clase desde JS. Mantenemos esa
     semántica con la clase `.is-playing` en el JS.
   ============================================================ */

/* Fondo transparente: hereda body claro con ambient particles. */
[data-section="video"] .video-bg {
  background: transparent;
}

/* Marco del video: aspect-ratio 16:9, sombra grande, cursor pointer
   (para invitar a click → toggle play/pause). */
[data-section="video"] .video-frame {
  position: relative;
  width: min(800px, 90vw);
  aspect-ratio: 16/9;
  border-radius: 20px;
  overflow: hidden;
  box-shadow: 0 30px 80px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.1) inset;
  cursor: pointer;
  background: #000;
}

/* El <video> ocupa todo el frame. */
[data-section="video"] .video-player {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Overlay con el ícono ▶ encima del video. pointer-events:none deja
   pasar el click al video debajo (que toggle play/pause via JS). */
[data-section="video"] .video-play-overlay {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 4rem;
  color: rgba(255, 255, 255, 0.85);
  background: rgba(0, 0, 0, 0.3);
  transition: opacity 0.3s;
  pointer-events: none;
}

/* Cuando el video está reproduciendo, JS le pone .is-playing al overlay
   → desaparece suavemente. Al pausar, vuelve a 1. */
[data-section="video"] .video-play-overlay.is-playing {
  opacity: 0;
}

/* Botón CTA "Ver en pantalla completa". Gradiente morado→mint.
   NOTE: si más secciones empiezan a usar .btn-primary, promover a
   core/styles/ (ver header del archivo). */
[data-section="video"] .btn-primary {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 14px 28px;
  background: linear-gradient(135deg, var(--purple), var(--mint));
  color: white;
  border-radius: 999px;
  font-weight: 700;
  font-size: 0.95rem;
  transition: transform 0.2s, box-shadow 0.3s;
  cursor: pointer;
  border: none;
}
[data-section="video"] .btn-primary:hover {
  transform: translateY(-3px);
  box-shadow: 0 16px 40px rgba(16, 244, 174, 0.4);
}


/* ===== sections/equipo/equipo.css ===== */
/* ============================================================
   equipo.css — CSS EXCLUSIVO de equipo (data-section="equipo").
   Reglas portadas del monolito v2 (landing-v2.css, líneas 650–691).

   Lo compartido (.scene/.scene-bg/.scene-content, .kicker, h2 base,
   .story-highlight) vive en v2/core/styles/. No duplicar acá.

   Notas de cascada:
   - .equipo-nombre y .equipo-rol son <span>, no <p> → sin batalla
     contra `.scene-content p { color: #42424f; weight: 500 }`.
   - .equipo-card img define width/height con clamp() → sobrescribe
     `img { max-width: 100% }` del reset sin conflicto.
   - .equipo-card es <div>, sin reset que pelee.
   ============================================================ */

/* Fondo transparente: hereda body claro con ambient particles. */
[data-section="equipo"] .equipo-bg {
  background: transparent;
}

/* Grid 5×2 desktop. En móvil se hace 3 columnas (override abajo). */
[data-section="equipo"] .equipo-grid {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 18px;
  width: min(1100px, 95vw);
  margin-top: 20px;
}

/* Card del miembro: blanca, sombra suave, lift en hover. */
[data-section="equipo"] .equipo-card {
  background: #ffffff;
  border: 1px solid rgba(20, 20, 43, 0.08);
  border-radius: 16px;
  padding: 16px 10px;
  text-align: center;
  box-shadow: 0 4px 16px rgba(20, 20, 43, 0.04);
  transition: transform 0.3s, box-shadow 0.3s;
}
[data-section="equipo"] .equipo-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 12px 30px rgba(126, 62, 255, 0.18);
}

/* Avatar circular con borde morado claro. */
[data-section="equipo"] .equipo-card img {
  width: clamp(54px, 7vw, 78px);
  height: clamp(54px, 7vw, 78px);
  border-radius: 50%;
  object-fit: cover;
  margin: 0 auto 10px;
  border: 2px solid var(--purple-light);
}

/* Nombre: una sola línea en el JSON; CSS deja que wrappee si no cabe. */
[data-section="equipo"] .equipo-nombre {
  display: block;
  font-size: 0.85rem;
  font-weight: 700;
  line-height: 1.1;
  margin-bottom: 4px;
  color: var(--text);
}

/* Rol: mono mayúsculas, tracking ancho, gris suave. */
[data-section="equipo"] .equipo-rol {
  display: block;
  font-family: var(--font-mono);
  font-size: 0.6rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--text-soft, #6B6B80);
  margin-bottom: 10px;
}

/* Contactos: fila de íconos circulares al pie de cada card.
   Se renderizan por tipo (.is-mail/.is-linkedin/.is-whatsapp/.is-phone)
   usando mask-image con un SVG inline (data URL). El color se controla
   con currentColor para que el hover lo invierta limpio. */
[data-section="equipo"] .equipo-contactos {
  display: flex;
  justify-content: center;
  gap: 6px;
  margin-top: 4px;
}
[data-section="equipo"] .equipo-ico {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: rgba(84, 45, 227, 0.08);
  color: var(--purple);
  text-decoration: none;
  transition: background 0.2s ease, color 0.2s ease, transform 0.2s ease;
}
[data-section="equipo"] .equipo-ico::before {
  content: "";
  width: 14px;
  height: 14px;
  background: currentColor;
  -webkit-mask: var(--ico) center / contain no-repeat;
          mask: var(--ico) center / contain no-repeat;
}
[data-section="equipo"] .equipo-ico:hover {
  background: var(--purple);
  color: #ffffff;
  transform: translateY(-2px);
}
/* Iconos por tipo (data URL SVG simple, currentColor para tint). */
[data-section="equipo"] .equipo-ico.is-mail {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='5' width='18' height='14' rx='2'/><path d='m3 7 9 6 9-6'/></svg>");
}
[data-section="equipo"] .equipo-ico.is-linkedin {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'><path d='M4.98 3.5a2 2 0 1 1-.02 4 2 2 0 0 1 .02-4ZM3.4 8.9h3.16V21H3.4V8.9Zm5.3 0h3.03v1.65h.04a3.32 3.32 0 0 1 2.99-1.64c3.2 0 3.79 2.1 3.79 4.84V21h-3.16v-5.36c0-1.28-.02-2.92-1.78-2.92-1.78 0-2.05 1.39-2.05 2.83V21H8.7V8.9Z'/></svg>");
}
[data-section="equipo"] .equipo-ico.is-whatsapp {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'><path d='M12.04 2a9.9 9.9 0 0 0-8.46 15.02L2 22l5.1-1.34A9.9 9.9 0 1 0 12.04 2Zm0 1.8a8.1 8.1 0 1 1-4.13 15.06l-.3-.18-3.02.8.8-2.95-.19-.31A8.1 8.1 0 0 1 12.04 3.8Zm-3.1 4.04c-.16 0-.42.06-.64.3-.22.24-.84.82-.84 2s.86 2.32.98 2.48c.12.16 1.7 2.7 4.18 3.68 2.06.82 2.48.66 2.93.62.45-.04 1.46-.6 1.66-1.18.2-.58.2-1.08.14-1.18-.06-.1-.22-.16-.46-.28-.24-.12-1.46-.72-1.68-.8-.22-.08-.38-.12-.54.12-.16.24-.62.8-.76.96-.14.16-.28.18-.52.06-.24-.12-1.02-.38-1.94-1.2-.72-.64-1.2-1.42-1.34-1.66-.14-.24-.02-.36.1-.48.1-.1.24-.28.36-.42.12-.14.16-.24.24-.4.08-.16.04-.3-.02-.42-.06-.12-.54-1.34-.74-1.84-.2-.48-.4-.42-.54-.42h-.06Z'/></svg>");
}
[data-section="equipo"] .equipo-ico.is-phone {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92Z'/></svg>");
}

/* Móvil: 3 columnas en vez de 5 (el monolito usa el mismo breakpoint). */
@media (max-width: 768px) {
  [data-section="equipo"] .equipo-grid {
    grid-template-columns: repeat(3, 1fr);
  }
  [data-section="equipo"] .equipo-ico {
    width: 26px;
    height: 26px;
  }
  [data-section="equipo"] .equipo-ico::before {
    width: 12px;
    height: 12px;
  }
}


/* ===== sections/footer/footer.css ===== */
/* ============================================================
   footer.css — CSS EXCLUSIVO del footer (data-section="footer").
   Reglas portadas del monolito v2 (landing-v2.css, líneas 693–747).

   Lo compartido (.scene/.scene-bg/.scene-content, h4 base si llega a
   existir, .kicker) vive en v2/core/styles/. Acá vive todo lo que
   solo aplica al cierre.
   ============================================================ */

/* Fondo transparente: hereda el body claro con ambient particles. */
[data-section="footer"] .footer-bg {
  background: transparent;
}

/* Layout vertical del footer: gap amplio entre bloques principales.
   El bloque principal (isotipo + tagline + cols) queda CENTRADO en el slide
   gracias al justify-content: center heredado del core. El copyright se
   pone position: absolute al fondo (regla más abajo) para que no robe
   espacio del centrado.
   Min-height: 100% asegura que el footer-content llene la altura del slide. */
[data-section="footer"] .footer-content {
  gap: clamp(32px, 5vw, 64px);
  min-height: 100%;
}

/* Isotipo del footer — cuadrado (≠ logo horizontal del hero).
   Tamaño compacto, leve drop-shadow morado para integrarlo al fondo claro. */
[data-section="footer"] .footer-logo {
  width: clamp(56px, 7vw, 88px);
  height: auto;
  object-fit: contain;
  filter: drop-shadow(0 6px 16px rgba(84, 45, 227, 0.18));
}

/* Tag debajo del logo: párrafo corto, peso 500.
   NOTA color: en el monolito `.footer-tag { color: var(--text-soft) }`
   PERDÍA contra `.scene-content p { color: #42424f }` por especificidad
   (clase 0,1,0 vs clase+tag 0,1,1) → el tagline se veía en #42424f.
   En v2 nuestro selector `[data-section="footer"] .footer-tag` tiene
   especificidad (0,2,0) y gana, así que omitimos `color` aquí para que
   herede `.scene-content p` (#42424f). Mismo resultado visual que el monolito. */
[data-section="footer"] .footer-tag {
  font-size: clamp(0.95rem, 1.4vw, 1.15rem);
  font-weight: 500;
}

/* Grid de 3 columnas. En móvil colapsa a 1 columna (override abajo). */
[data-section="footer"] .footer-cols {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(28px, 5vw, 80px);
  width: min(800px, 90vw);
  margin-top: 8px;
}

/* Columna: flex vertical centrada, gap pequeño entre items. */
[data-section="footer"] .footer-col {
  display: flex;
  flex-direction: column;
  gap: 10px;
  align-items: center;
}

/* Título de columna: mono, mayúsculas, tracking ancho, morado tenue. */
[data-section="footer"] .footer-col h4 {
  font-family: var(--font-mono);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--purple);
  opacity: 0.7;
  margin-bottom: 8px;
}

/* Links de la columna: flex con ícono a la izquierda + texto. */
[data-section="footer"] .footer-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 0.9rem;
  color: var(--text-soft, #6B6B80);
  transition: color 0.2s ease, transform 0.2s ease;
  text-decoration: none;
}
[data-section="footer"] .footer-link:hover {
  color: var(--purple);
  transform: translateX(2px);
}
[data-section="footer"] .footer-link-text {
  font-size: inherit;
  color: inherit;
}

/* Ícono inline: cuadrado 16px usando mask-image. Color via currentColor. */
[data-section="footer"] .footer-ico {
  display: inline-block;
  width: 16px;
  height: 16px;
  flex-shrink: 0;
  background: currentColor;
  -webkit-mask: var(--ico) center / contain no-repeat;
          mask: var(--ico) center / contain no-repeat;
}
/* Iconos por tipo. */
[data-section="footer"] .footer-ico.is-mail {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='5' width='18' height='14' rx='2'/><path d='m3 7 9 6 9-6'/></svg>");
}
[data-section="footer"] .footer-ico.is-location {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M12 22s-7-7-7-13a7 7 0 0 1 14 0c0 6-7 13-7 13Z'/><circle cx='12' cy='9' r='2.5'/></svg>");
}
[data-section="footer"] .footer-ico.is-phone {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92Z'/></svg>");
}
[data-section="footer"] .footer-ico.is-linkedin {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'><path d='M4.98 3.5a2 2 0 1 1-.02 4 2 2 0 0 1 .02-4ZM3.4 8.9h3.16V21H3.4V8.9Zm5.3 0h3.03v1.65h.04a3.32 3.32 0 0 1 2.99-1.64c3.2 0 3.79 2.1 3.79 4.84V21h-3.16v-5.36c0-1.28-.02-2.92-1.78-2.92-1.78 0-2.05 1.39-2.05 2.83V21H8.7V8.9Z'/></svg>");
}
[data-section="footer"] .footer-ico.is-instagram {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='3' width='18' height='18' rx='5'/><circle cx='12' cy='12' r='4'/><circle cx='17.5' cy='6.5' r='1' fill='black'/></svg>");
}
[data-section="footer"] .footer-ico.is-website {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><path d='M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18'/></svg>");
}
[data-section="footer"] .footer-ico.is-document {
  --ico: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z'/><polyline points='14 3 14 9 20 9'/><line x1='9' y1='13' x2='15' y2='13'/><line x1='9' y1='17' x2='13' y2='17'/></svg>");
}

/* Copyright al pie: position: absolute al borde inferior del slide.
   Se saca del flujo del flex para que NO afecte el centrado del bloque
   principal (isotipo + tagline + cols), y queda anclado al fondo. */
[data-section="footer"] .footer-copy {
  position: absolute;
  bottom: clamp(20px, 3.5vh, 40px);
  left: 50%;
  transform: translateX(-50%);
  margin: 0 !important;
  font-size: 0.78rem !important;
  color: var(--text-soft, #6B6B80) !important;
  opacity: 0.7 !important;
  white-space: nowrap;
}

/* Móvil: 1 columna apilada, texto centrado. */
@media (max-width: 768px) {
  [data-section="footer"] .footer-cols {
    grid-template-columns: 1fr;
    text-align: center;
    gap: 24px;
  }
}
