/* =========================================================================
   Orange Bill — Estilos del sitio (Fase 1: HTML+CSS estático)
   Énfasis: división NOTORIA entre secciones — bandas full-bleed de color
   alternado (blanco / mist / navy oscuro / azul de marca), bordes rectos.
   Inspirado en materiales/capturas ejemplos/.
   ========================================================================= */

/* ---------- 1. Tokens ---------------------------------------------------- */
:root {
  /* Marca */
  --color-azul-oscuro: #0045be;
  --color-azul-claro: #007ee9;
  --color-naranja-oscuro: #ff6e00;
  --color-naranja-claro: #ffaf00;

  /* Semántico */
  --color-primary: var(--color-azul-oscuro);
  --color-primary-light: var(--color-azul-claro);
  --color-accent: var(--color-naranja-oscuro);
  --color-accent-light: var(--color-naranja-claro);
  --color-success: #16a34a;

  /* Variantes con contraste garantizado (AA) para texto/bordes sobre fondos claros u oscuros */
  --color-accent-onlight: #e66300;   /* naranja-oscuro no llega a 3:1 sobre blanco; esta variante sí */
  --color-azul-gradient-end: #0058c9; /* extremo "claro" seguro para degradados con texto blanco encima */

  /* Neutros (tinte frío, coherente con el azul primario) */
  --color-ink: #0b1524;
  --color-body: #37455a;
  --color-muted: #6b7688;
  --color-paper: #ffffff;
  --color-mist: #f4f7fc;
  --color-mist-2: #eaf1fb;
  --color-line: #dde5f1;

  /* Fondos de banda oscura: derivados de los tonos de marca (no un navy genérico).
     -dark = familia azul-oscuro (secciones .band--dark). */
  --color-bg-dark: #002972;
  --color-bg-dark-2: var(--color-azul-oscuro);

  /* .band--surface = esquema CLARO "plomo": degradado gris suave, texto oscuro,
     tarjetas blancas y acento naranja corporativo en iconos/números para
     resaltar (según referencia del cliente). El acento naranja se oscurece a
     #d65b00 para mantener >=3:1 (elementos gráficos / display) en todo el
     degradado plomo; texto de cuerpo en --color-body / #55617a (>=5:1) y
     titulares en --color-ink (>=13:1). Valores verificados por cálculo de
     contraste real en ambos extremos del degradado (#eff2f6 -> #e2e7ee). */
  --color-plomo-1: #eef3f7;   /* claro (arriba del degradado) */
  --color-plomo-2: #d7e0ec;   /* oscuro (abajo del degradado) */
  --color-surface-accent: #d65b00;
  --color-surface-text: var(--color-body);
  --color-surface-lede: var(--color-body);
  --color-surface-muted: #55617a;

  /* Tipografía */
  --font-display: 'Barlow Condensed', 'Barlow Semi Condensed', sans-serif;
  --font-ui: 'Barlow Semi Condensed', 'Barlow', sans-serif;
  --font-body: 'Barlow', 'Barlow Semi Condensed', sans-serif;

  /* Escala tipográfica */
  --step-xs: 0.8125rem;
  --step-sm: 0.9375rem;
  --step-base: 1rem;
  --step-md: 1.125rem;
  --step-lg: 1.375rem;
  --step-xl: 1.75rem;
  --step-2xl: clamp(1.8rem, 1.3rem + 2.2vw, 2.6rem);
  --step-3xl: clamp(2.3rem, 1.3rem + 4.4vw, 4.2rem);

  /* Espaciado (ritmo de 8px) */
  --space-1: 0.5rem;
  --space-2: 1rem;
  --space-3: 1.5rem;
  --space-4: 2rem;
  --space-5: 3rem;
  --space-6: 4rem;
  --space-7: 5.5rem;
  --space-8: 7.5rem;

  --radius-sm: 8px;
  --radius-md: 14px;
  --radius-lg: 24px;
  --radius-pill: 999px;

  --shadow-sm: 0 1px 2px rgba(11, 21, 36, 0.07), 0 1px 1px rgba(11, 21, 36, 0.04);
  --shadow-md: 0 10px 30px -12px rgba(11, 21, 36, 0.22);
  --shadow-lg: 0 30px 60px -20px rgba(0, 69, 190, 0.28);
  --shadow-accent: 0 14px 30px -10px rgba(255, 110, 0, 0.4);

  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --dur-fast: 150ms;
  --dur-base: 250ms;
  --dur-slow: 450ms;

  --container: 1600px;
  --container-narrow: 760px;
  --header-h: 80px;
}

/* ---------- 2. Reset ------------------------------------------------------ */
*, *::before, *::after { box-sizing: border-box; }
/* overflow-x:hidden va también en <html>, no solo en <body>: en varios
   navegadores móviles el ancho de scroll horizontal de la página lo decide el
   elemento raíz, no <body>. Si algo se desborda (la barra del carrusel Owl con
   sus 11 slides en fila, aunque su propio contenedor ya la recorte con
   overflow:hidden), el navegador igual puede ensanchar el "layout viewport" al
   ancho de ese contenido — y como el header es position:fixed con left:0;
   right:0, se estira a ese ancho ensanchado en vez de al ancho real de
   pantalla, empujando literalmente el botón hamburguesa fuera de la pantalla.
   Con overflow-x:hidden en ambos, el ancho de layout queda anclado al viewport
   real y el header no puede desbordarse. */
html { scroll-behavior: smooth; scroll-padding-top: calc(var(--header-h) + 12px); overflow-x: hidden; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

body, h1, h2, h3, h4, p, figure, blockquote, dl, dd, ul, ol {
  margin: 0;
}

ul, ol { padding: 0; list-style: none; }

img, picture, svg { display: block; max-width: 100%; }

a { color: inherit; text-decoration: none; }

button { font: inherit; color: inherit; background: none; border: none; cursor: pointer; }

input, textarea, select { font: inherit; }

body {
  font-family: var(--font-body);
  font-size: var(--step-base);
  line-height: 1.6;
  color: var(--color-body);
  /* Sitio en modo oscuro: cada sección pinta su propia banda (.band--dark /
     .band--surface / .band--brand); esto es solo el fondo base/fallback. */
  background: var(--color-bg-dark);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

h1, h2, h3, h4 {
  font-family: var(--font-display);
  color: var(--color-ink);
  font-weight: 600;
  line-height: 1.08;
  letter-spacing: 0.2px;
}

:focus-visible {
  outline: 3px solid var(--color-primary-light);
  outline-offset: 3px;
  border-radius: 4px;
}

::selection { background: var(--color-accent-light); color: var(--color-ink); }

/* ---------- 3. Utilidades de layout --------------------------------------- */
.container {
  width: 100%;
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--space-3);
}

.container--narrow { max-width: var(--container-narrow); }

.section {
  padding-block: var(--space-6);
}

/* ---------- Bandas full-bleed con división NOTORIA ------------------------ */
/*
   .band envuelve una <section> y le pinta un fondo de borde a borde.
   Sitio en modo oscuro: dos tonalidades de navy que alternan (.band--dark,
   más profunda; .band--surface, más elevada) puntuadas por el azul de marca
   (.band--brand), con bordes rectos entre secciones.
*/
.band {
  position: relative;
  z-index: 0;
}

.band--dark {
  background:
    radial-gradient(680px 320px at 85% -10%, rgba(0, 126, 233, 0.25), transparent 60%),
    linear-gradient(160deg, var(--color-bg-dark-2) 0%, var(--color-bg-dark) 70%);
  color: #eaf1fb;
}

.band--surface {
  /* Esquema plomo claro. El degradado vertical visible lo pinta .section-plomo
     sobre la <section> interior (full-bleed); aquí queda un color plano de
     respaldo por si la banda se usara sin esa clase. */
  background: var(--color-plomo-1);
  color: var(--color-surface-text);
}

/* Degradado vertical plomo (claro arriba -> oscuro abajo) aplicado a la
   <section> interna: class="section section-plomo". */
.section-plomo {
  background: linear-gradient(180deg, var(--color-plomo-1) 0%, var(--color-plomo-2) 100%);
}

.band--brand {
  background:
    radial-gradient(520px 300px at 12% 0%, rgba(255, 175, 0, 0.22), transparent 55%),
    linear-gradient(135deg, var(--color-azul-oscuro) 0%, var(--color-azul-gradient-end) 100%);
  color: #eef4ff;
}

/* Banda clara: los defaults (h1-h4 en --color-ink, section-lede en --color-muted,
   section-index en naranja) ya están pensados para fondo claro — no hace falta
   ningún override de texto, solo el fondo. */
.band--light {
  background:
    radial-gradient(680px 360px at 88% -12%, rgba(0, 126, 233, 0.07), transparent 60%),
    var(--color-mist);
}

/* Texto sobre bandas oscuras / de superficie / de marca */
.band--dark .section-lede,
.band--brand .section-lede { color: #c6d5ee; }
.band--surface .section-lede { color: var(--color-surface-lede); }
.band--dark h1, .band--dark h2, .band--dark h3, .band--dark h4,
.band--brand h1, .band--brand h2, .band--brand h3, .band--brand h4 { color: #fff; }
.band--dark .kicker,
.band--brand .kicker { color: #fff; }
.band--dark .kicker::before,
.band--brand .kicker::before { background: var(--color-accent-light); }
.band--surface .kicker::before { background: var(--color-surface-accent); }

/* Etiqueta de número de sección (divisor notorio tipo "01 / 02") */
.section-index {
  display: inline-block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--step-sm);
  letter-spacing: 0.05em;
  color: var(--color-accent-onlight);
  margin-bottom: var(--space-1);
}
.band--dark .section-index,
.band--brand .section-index { color: var(--color-accent-light); }
.band--surface .section-index { color: var(--color-surface-accent); }

.section-head {
  max-width: 640px;
  margin-bottom: var(--space-4);
}

.section-head--center {
  margin-inline: auto;
  text-align: center;
}

.kicker {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-xs);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-primary);
  margin-bottom: var(--space-2);
}

.kicker::before {
  content: "";
  width: 22px;
  height: 2px;
  background: var(--color-accent);
  border-radius: 2px;
}

h2.section-title {
  font-size: var(--step-2xl);
  font-weight: 600;
}

/* Firma visual repetida en los títulos de sección: una palabra clave con un
   trazo naranja fino debajo (no cambia tipografía, mismo peso/familia). */
.title-accent {
  position: relative;
  display: inline-block;
}
.title-accent::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -0.08em;
  height: 3px;
  background: var(--color-accent);
  border-radius: 2px;
}

/* Link discreto dentro de un párrafo/etiqueta (p. ej. menciones a "API REST"
   que apuntan a /api/): hereda el color del texto que lo rodea vía
   currentColor, así funciona igual sobre banda clara, oscura o de marca. */
.inline-link {
  text-decoration: underline;
  text-decoration-color: currentColor;
  text-underline-offset: 2px;
  transition: opacity var(--dur-fast) var(--ease-out);
}
.inline-link:hover, .inline-link:focus-visible { opacity: 0.7; }

.section-lede {
  margin-top: var(--space-2);
  font-size: var(--step-md);
  color: var(--color-muted);
}

/* Encabezado simple para subpáginas sin hero-slider (p. ej. quienes-somos.php):
   mismo patrón kicker + h1 + lede que el hero de home, con el padding-top
   necesario para no quedar bajo el header fijo. */
.page-hero {
  position: relative;
  overflow: hidden;
  padding-top: calc(var(--header-h) + var(--space-6));
  padding-bottom: var(--space-6);
  text-align: center;
}
.page-hero .kicker { justify-content: center; }
.page-hero h1 {
  font-size: var(--step-3xl);
  font-weight: 700;
}
.page-hero p {
  margin: var(--space-3) auto 0;
  max-width: 56ch;
  font-size: var(--step-md);
}

/* Halo + textura sutil (mismo lenguaje del hero-slider) para que la esquina
   superior de la banda de marca no quede completamente lisa/vacía. */
.page-hero::before {
  content: "";
  position: absolute;
  inset: -20% -10% auto auto;
  width: 45%;
  height: 70%;
  background: radial-gradient(circle at 70% 30%, rgba(255, 175, 0, 0.25), transparent 65%);
  filter: blur(30px);
  pointer-events: none;
}
.page-hero::after {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255, 255, 255, 0.06) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, 0.06) 1px, transparent 1px);
  background-size: 46px 46px;
  mask-image: radial-gradient(120% 90% at 82% 10%, #000 35%, transparent 78%);
  -webkit-mask-image: radial-gradient(120% 90% at 82% 10%, #000 35%, transparent 78%);
  pointer-events: none;
}
.page-hero .container { position: relative; z-index: 1; }

/* Variante de dos columnas (texto + visual) para el hero de subpáginas que lo
   necesiten (p. ej. quienes-somos.php), en vez del bloque centrado por defecto. */
.page-hero--split { text-align: left; }
.page-hero--split .kicker { justify-content: flex-start; }
.page-hero--split p { margin-inline: 0; }
.page-hero--split::after { display: none; }
.page-hero--split p a {
  color: var(--color-accent-light);
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.page-hero--split p a:hover { text-decoration-color: transparent; }

.about-hero-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-5);
  align-items: center;
}

.about-hero-visual {
  position: relative;
  display: flex;
  justify-content: center;
  padding: var(--space-3) var(--space-4);
}
.about-hero-visual img {
  width: 100%;
  max-width: 460px;
  height: auto;
  filter: drop-shadow(0 30px 50px rgba(1, 12, 40, 0.45));
}

.about-hero-badge {
  position: absolute;
  z-index: 2;
  width: 60px;
  height: 60px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.4rem;
  color: #fff;
  border-radius: var(--radius-md);
  background: rgba(255, 255, 255, 0.1);
  border: 1px solid rgba(255, 255, 255, 0.28);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  box-shadow: var(--shadow-md);
}
.about-hero-badge--cloud { top: 6%; left: 6%; }
.about-hero-badge--chart { top: 46%; left: -2%; }
.about-hero-badge--lock { top: 12%; right: 4%; }
.about-hero-badge--doc { top: 56%; right: -2%; }

.visually-hidden {
  position: absolute;
  width: 1px; height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

.skip-link {
  position: absolute;
  left: var(--space-2);
  top: -60px;
  background: var(--color-bg-dark);
  color: #fff;
  padding: 0.75rem 1.25rem;
  border-radius: var(--radius-sm);
  z-index: 1000;
  transition: top var(--dur-base) var(--ease-out);
}
.skip-link:focus { top: var(--space-2); }

/* ---------- 4. Botones ---------------------------------------------------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-sm);
  letter-spacing: 0.01em;
  padding: 0.9rem 1.6rem;
  border-radius: var(--radius-pill);
  min-height: 48px;
  transition: transform var(--dur-fast) var(--ease-out), box-shadow var(--dur-base) var(--ease-out), background var(--dur-base) var(--ease-out);
  white-space: nowrap;
}
.btn:active { transform: translateY(1px); }

.btn--primary {
  background: var(--color-accent);
  color: var(--color-paper);
  box-shadow: var(--shadow-accent); 
}
.btn--primary:hover { background: var(--color-accent-light); box-shadow: 0 18px 34px -10px rgba(255, 175, 0, 0.5); }

.btn--outline {
  background: transparent;
  color: var(--color-primary);
  border: 1.5px solid var(--color-line);
}
.btn--outline:hover { border-color: var(--color-primary); background: var(--color-mist); }

.btn--ghost {
  background: rgba(255, 255, 255, 0.08);
  color: #fff;
  border: 1px solid rgba(255, 255, 255, 0.28);
}

.btn--sm { padding: 0.6rem 1.15rem; min-height: 40px; font-size: var(--step-xs); }
.btn--block { width: 100%; }

/* Botón blanco sólido, para usar sobre tarjetas/paneles claros (p. ej. .cta-panel). */
.btn--white {
  background: var(--color-paper);
  color: var(--color-primary);
  box-shadow: var(--shadow-sm);
}
.btn--white:hover { background: #fff; box-shadow: var(--shadow-md); transform: translateY(-1px); }

/* ---------- 5. Header ------------------------------------------------------ */
/* Sitio en modo oscuro: el header es SIEMPRE oscuro (logo/texto blancos).
   El único estado especial es la cima exacta del hero (sin scroll todavía),
   donde queda transparente para fundirse con el banner. JS alterna
   .is-over-hero / .is-scrolled según el scroll (ver setupHeaderScroll). */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  height: var(--header-h);
  display: flex;
  align-items: center;
  background: rgba(6, 15, 30, 0.55);
  backdrop-filter: blur(14px) saturate(160%);
  -webkit-backdrop-filter: blur(14px) saturate(160%);
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  transition: background var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out);
}

/* Cima exacta del hero: transparente, se funde con el banner. */
.site-header.is-over-hero:not(.is-scrolled) {
  background: transparent;
  border-bottom-color: transparent;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

/* Apenas se empieza a deslizar: borde algo más visible para separar el
   header del contenido que pasa debajo. */
.site-header.is-scrolled {
  border-bottom-color: rgba(255, 255, 255, 0.3);
}

.site-header .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
}

.brand {
  display: flex;
  align-items: center;
  gap: 0.6rem;
}

.brand-logo { display: block; }
.brand-logo img { height: 50px; width: auto; }

/* Sitio 100% oscuro: el logo blanco es el único que se usa. */
.brand-logo--white { display: block; }
.brand-logo--color { display: none; }

.nav-primary {
  display: none;
}

.nav-primary ul {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-sm);
}

.nav-primary a {
  position: relative;
  color: #fff;
  padding-block: 0.4rem;
  transition: color var(--dur-fast) var(--ease-out);
}

.nav-primary a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -2px;
  height: 2px;
  background: var(--color-accent);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--dur-base) var(--ease-out);
}
.nav-primary a:hover,
.nav-primary a.is-active { color: var(--color-accent-light); }
.nav-primary a:hover::after,
.nav-primary a.is-active::after { transform: scaleX(1); }

/* Submenú desplegable de "Herramientas" (solo CSS: :hover / :focus-within,
   sin JS — en mobile no aplica, ver .mobile-nav .submenu más abajo). */
.nav-primary .has-submenu { position: relative; }

.nav-primary .has-submenu > a {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  /* Ocupa todo el alto del header: el trigger queda hoverable hasta el borde
     inferior real de la barra de navegación, sin "zona muerta" antes del
     submenú (evita que el dropdown se cierre al bajar el mouse). */
  height: var(--header-h);
}

.submenu-caret { font-size: 0.7em; transition: transform var(--dur-fast) var(--ease-out); }
.nav-primary .has-submenu:hover .submenu-caret,
.nav-primary .has-submenu:focus-within .submenu-caret { transform: rotate(180deg); }

.nav-primary .submenu {
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%) translateY(6px);
  min-width: 260px;
  padding: 0.5rem;
  display: grid;
  gap: 0.15rem;
  background: var(--color-paper);
  border-radius: var(--radius-md);
  border: 1px solid var(--color-line);
  box-shadow: var(--shadow-lg);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out), visibility var(--dur-fast);
  z-index: 10;
}

.nav-primary .has-submenu:hover .submenu,
.nav-primary .has-submenu:focus-within .submenu {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(-50%) translateY(0);
}

.nav-primary .submenu a {
  display: flex;
  align-items: center;
  gap: 0.65rem;
  padding: 0.7rem 0.8rem;
  border-radius: var(--radius-sm);
  color: var(--color-ink);
  font-weight: 600;
}
.nav-primary .submenu a::after { display: none; }
.nav-primary .submenu a:hover,
.nav-primary .submenu a.is-active { background: var(--color-mist); color: var(--color-primary); }
.nav-primary .submenu a i { color: var(--color-primary); width: 18px; text-align: center; flex-shrink: 0; }

/* Etiqueta que agrupa un subconjunto del desplegable (p. ej. "Herramientas"
   bajo Recursos). No es un enlace: solo separa visualmente. */
.submenu-label {
  font-family: var(--font-ui);
  font-size: 0.7rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.07em;
  color: var(--color-muted);
  padding: 0.6rem 0.8rem 0.25rem;
  border-top: 1px solid var(--color-line);
  margin-top: 0.3rem;
}

.header-actions {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}

.nav-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: var(--radius-sm);
  font-size: 1.3rem;
  color: #fff;
}
.nav-toggle:hover { background: rgba(255, 255, 255, 0.1); }

/* Páginas internas con .page-hero (sin hero-slider, ej. quienes-somos.php,
   contacto.php): el header arranca oscuro/translúcido como en el resto del
   sitio y, apenas se termina de scrollear el hero, pasa a fondo blanco con
   el logo a color — mejor lectura sobre el contenido claro que sigue.
   JS alterna .is-light según la posición del scroll (ver setupHeaderScroll). */
.site-header.is-light {
  background: rgba(255, 255, 255, 0.92);
  border-bottom-color: var(--color-line);
}

.site-header.is-light .brand-logo--white { display: none; }
.site-header.is-light .brand-logo--color { display: block; }

.site-header.is-light .nav-primary a { color: var(--color-ink); }
.site-header.is-light .nav-primary a:hover,
.site-header.is-light .nav-primary a.is-active { color: var(--color-primary); }

.site-header.is-light .nav-toggle { color: var(--color-ink); }
.site-header.is-light .nav-toggle:hover { background: var(--color-mist); }

/* El menú móvil tenía 12 filas (3 enlaces + "Recursos" + su submenú de 6 filas
   + 2 enlaces + botón) con el espaciado pensado para un menú corto de 4-5
   ítems: no entraba en una pantalla de celular típica y obligaba a hacer
   scroll para ver "Quiénes somos", "Contacto" y el botón "Comenzar". Los
   valores de acá están recortados a propósito (menos padding, tipografía más
   chica, sin gap entre filas —el borde inferior ya separa—) para que las 12
   filas quepan sin scroll en un alto de pantalla típico (~660px de área útil
   en un teléfono de gama media). Igual se deja overflow-y:auto por si un
   teléfono muy bajo (o con letra del sistema agrandada) todavía no alcanza. */
.mobile-nav {
  position: fixed;
  inset: var(--header-h) 0 0 0;
  background: var(--color-bg-dark);
  z-index: 99;
  padding: var(--space-2) var(--space-3);
  transform: translateY(-8px);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out);
  overflow-y: auto;
}

.mobile-nav.is-open {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

.mobile-nav ul {
  display: flex;
  flex-direction: column;
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-md);
}

.mobile-nav ul a {
  display: block;
  padding: 0.5rem 0.25rem;
  line-height: 1.25;
  color: #fff;
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  border-left: 3px solid transparent;
  transition: color var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
}
.mobile-nav ul a.is-active {
  color: var(--color-accent-light);
  border-left-color: var(--color-accent);
  padding-left: 0.6rem;
}

.mobile-nav .btn { margin-top: var(--space-1); min-height: 42px; padding-block: 0.65rem; }

/* Submenú de "Herramientas" en mobile: sin acordeón (sin JS extra), la lista
   de herramientas queda siempre visible, indentada bajo el enlace padre. */
.mobile-nav .submenu {
  gap: 0;
  padding-left: var(--space-2);
}
.mobile-nav .submenu a {
  padding: 0.4rem 0.25rem;
  line-height: 1.25;
  font-size: var(--step-sm);
  font-weight: 500;
  color: #c6d5ee;
  border-bottom-color: rgba(255, 255, 255, 0.06);
}
.mobile-nav .submenu a i { margin-right: 0.5rem; color: var(--color-accent-light); width: 1.1em; text-align: center; }
.mobile-nav .submenu a.is-active { color: var(--color-accent-light); }
.mobile-nav .submenu-label {
  display: block;
  padding: 0.35rem 0.25rem 0.15rem;
  margin-top: 0.15rem;
  color: #7f8fb0;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
}

body.nav-open { overflow: hidden; }

/* ---------- 6. Hero — slider (Owl Carousel) -------------------------------- */
.hero-slider {
  position: relative;
  color: #fff;
  overflow: hidden;
  background:
    radial-gradient(900px 520px at 84% -12%, rgba(0, 126, 233, 0.55), transparent 60%),
    radial-gradient(760px 520px at 6% 116%, rgba(255, 175, 0, 0.16), transparent 55%),
    linear-gradient(150deg, var(--color-azul-oscuro) 0%, #012a72 52%, var(--color-bg-dark) 120%);
}

/* Halo de luz estático (efecto de luz sobre el gradiente azul) */
.hero-slider::before {
  content: "";
  position: absolute;
  inset: -20% -10% auto auto;
  width: 55%;
  height: 70%;
  background: radial-gradient(circle at 70% 30%, rgba(0, 126, 233, 0.35), transparent 65%);
  filter: blur(30px);
  opacity: 0.8;
  pointer-events: none;
}

/* Textura sutil de grilla técnica (profundidad/carácter técnico, atenuada con máscara) */
.hero-slider::after {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255, 255, 255, 0.06) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, 0.06) 1px, transparent 1px);
  background-size: 46px 46px;
  mask-image: radial-gradient(120% 90% at 18% 15%, #000 35%, transparent 78%);
  -webkit-mask-image: radial-gradient(120% 90% at 18% 15%, #000 35%, transparent 78%);
  pointer-events: none;
}

.hero-owl { position: relative; z-index: 1; }

.hero-slide-inner {
  min-height: min(90vh, 780px);
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-5);
  align-items: center;
  padding-top: calc(var(--header-h) + var(--space-5));
  padding-bottom: calc(var(--space-7) + var(--space-3));
}

.hero-slide-text { max-width: 58ch; text-align: left; min-width: 0; }
.hero-slide-visual { min-width: 0; }

/* Colores del contenido sobre el banner oscuro */
.hero-slider .hero-title { color: #fff; }
.hero-slider .hero-lede { color: #d7e4fb; max-width: 46ch; }

/* Kicker como badge tipo píldora (como en la referencia) */
.hero-slider .kicker {
  display: inline-flex;
  color: #fff;
  background: rgba(255, 255, 255, 0.1);
  border: 1px solid rgba(255, 255, 255, 0.22);
  padding: 0.5rem 1rem;
  border-radius: var(--radius-pill);
  margin-bottom: var(--space-3);
}
.hero-slider .kicker::before { display: none; }

.hero-slider .btn--outline {
  color: #fff;
  border-color: rgba(255, 255, 255, 0.5);
}
.hero-slider .btn--outline:hover {
  background: rgba(255, 255, 255, 0.14);
  border-color: #fff;
}

/* Texto animado al descubrir cada slide.
   El gate .owl-ready mantiene el texto visible si el JS/slider no cargó. */
.hero-slider.owl-ready [data-anim] { opacity: 0; }

/* Dots de navegación: centrados en la parte inferior, color de marca en el activo */
.hero-owl .owl-dots {
  position: absolute;
  left: 0;
  right: 0;
  bottom: var(--space-4);
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 0.65rem;
  z-index: 5;
  line-height: 0;
}
.hero-owl .owl-dots .owl-dot {
  line-height: 0;
}
.hero-owl .owl-dots .owl-dot span {
  display: block;
  width: 9px;
  height: 9px;
  margin: 0;
  border-radius: var(--radius-pill);
  background: rgba(255, 255, 255, 0.32);
  border: 1px solid rgba(255, 255, 255, 0.5);
  transition: width var(--dur-base) var(--ease-out),
              background var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out);
}
.hero-owl .owl-dots .owl-dot.active span {
  width: 32px;
  border-color: transparent;
  background: linear-gradient(90deg, var(--color-accent), var(--color-accent-light));
  box-shadow: 0 2px 10px -2px rgba(255, 110, 0, 0.6);
}
.hero-owl .owl-dots .owl-dot:hover span { border-color: #fff; }

.hero-title {
  font-size: var(--step-3xl);
  font-weight: 600;
}

.hero-title .accent-underline {
  position: relative;
  white-space: nowrap;
}
/* El subrayado se "dibuja" (scaleX) recién cuando las letras de la frase ya
   terminaron de aparecer — setupCursorGlow/wrapTitleLetters en main.js calcula
   --underline-delay por slide. Si se dibujara de una, se ve "flotando" solo,
   separado del texto que todavía está aaresando. */
.hero-title .accent-underline::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0.06em;
  height: 0.22em;
  background: var(--color-accent-light);
  z-index: -1;
  border-radius: 3px;
  opacity: 0;
  transform: scaleX(0);
  transform-origin: left;
  animation: underlineDraw 0.5s var(--ease-out) both;
  animation-play-state: paused;
  animation-delay: var(--underline-delay, 0ms);
}
.hero-title.is-animating .accent-underline::after { animation-play-state: running; }

@keyframes underlineDraw {
  to { opacity: var(--underline-target-opacity, 0.55); transform: scaleX(1); }
}

/* Énfasis del titular sobre el banner: tipografía Barlow Bold Italic + color
   de acento (según CLAUDE.md, uso recomendado para banners/CTA/destacados),
   con un subrayado fino en vez del resaltado sólido (mejor contraste en oscuro). */
.hero-slider .hero-title .accent-underline {
  font-family: 'Barlow', sans-serif;
  font-weight: 700;
  font-style: italic;
  color: var(--color-accent-light);
  white-space: normal;
}
.hero-slider .hero-title .accent-underline::after {
  height: 0.07em;
  bottom: -0.04em;
  --underline-target-opacity: 0.9;
}

/* ---------- Animación del titular: reveal letra por letra ------------------ */
.hero-title .word {
  display: inline-block;
  white-space: nowrap;
}
.hero-title .letter {
  display: inline-block;
  opacity: 0;
  transform: translateY(0.3em);
  animation: heroLetterIn 0.5s var(--ease-out) both;
  animation-play-state: paused;
}
.hero-title.is-animating .letter { animation-play-state: running; }

@keyframes heroLetterIn {
  to { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .hero-title .letter {
    animation: none;
    opacity: 1;
    transform: none;
  }
  .hero-title .accent-underline::after {
    animation: none;
    opacity: var(--underline-target-opacity, 0.55);
    transform: none;
  }
}

.hero-lede {
  margin-top: var(--space-3);
  font-size: var(--step-md);
  max-width: 46ch;
  color: var(--color-body);
}

.hero-actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
  margin-top: var(--space-4);
}

/* Imagen que acompaña el texto de cada slide: capturas reales del sistema
   dentro de un marco tipo "ventana", con sello de certificación opcional
   (solo en el slide de certificación). */
.hero-slide-visual {
  position: relative;
  justify-self: center;
  width: min(100%, 640px);
}

/* Banners PNG con fondo transparente: se fusionan con el azul del hero (sin
   tarjeta blanca). La sombra sigue la silueta de la ilustración (drop-shadow
   respeta el canal alfa) para darle profundidad sin recuadro. */
.hero-slide-visual-frame {
  filter: drop-shadow(0 22px 34px rgba(0, 14, 46, 0.4));
}

.hero-slide-visual-frame img {
  width: 100%;
  height: auto;
  display: block;
}

/* Es un <a> (enlace directo a la certificación): mismo look que antes, con
   una pequeña reacción al pasar el mouse para dar la pista de que es clicable. */
.hero-stamp {
  position: absolute;
  top: -22px;
  right: -18px;
  z-index: 2;
  width: 132px;
  height: 132px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  border-radius: 50%;
  background: var(--color-paper);
  border: 2px dashed var(--color-accent-onlight);
  box-shadow: var(--shadow-md);
  transform: rotate(-9deg);
  font-family: var(--font-ui);
  transition: transform var(--dur-fast) var(--ease-out), box-shadow var(--dur-base) var(--ease-out);
}
.hero-stamp:hover,
.hero-stamp:focus-visible {
  transform: rotate(-9deg) scale(1.06);
  box-shadow: var(--shadow-lg);
}

.hero-stamp .stamp-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.15rem;
  color: var(--color-accent-onlight);
}
.hero-stamp i { font-size: 1.4rem; }
.hero-stamp strong {
  font-size: var(--step-xs);
  font-weight: 700;
  letter-spacing: 0.04em;
  line-height: 1.15;
  color: var(--color-ink);
}
.hero-stamp small {
  font-size: 0.6rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--color-muted);
}

/* ---------- 7. Barra de confianza + métricas (dos bloques separados) ------ */
/* Etiqueta pequeña que encabeza cada bloque, para que se lean como dos
   secciones distintas y no como una sola lista corrida. */
.panel-label {
  display: block;
  font-family: var(--font-ui);
  font-weight: 700;
  font-size: var(--step-xs);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--color-muted);
  margin-bottom: var(--space-3);
}
.band--dark .panel-label { color: #7f8fb0; }
.band--surface .panel-label { color: var(--color-surface-muted); }

.trust-panel + .stats-panel { margin-top: var(--space-3); }

/* Insignia "Un producto de" con el logo de la empresa matriz (Orange Group SRL). */
.backed-by {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  margin: 0 auto var(--space-4);
}
.backed-by-label {
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--color-muted);
}
.backed-by img { height: 40px; width: auto; }

/* Tarjeta única (en vez de 3 tarjetas separadas) con el primer ítem como
   estadística destacada y divisores verticales entre columnas en desktop. */
.history-stats-card {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-3);
  background: var(--color-paper);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
  padding: var(--space-4) var(--space-3);
}

.history-stat-item {
  display: flex;
  align-items: flex-start;
  gap: 0.85rem;
}

.history-stat-number {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--step-2xl);
  line-height: 1;
  color: var(--color-ink);
}
.history-stat-label {
  display: block;
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-sm);
  color: var(--color-ink);
  margin-top: 0.2rem;
}
.history-stat-caption {
  display: block;
  font-size: var(--step-xs);
  color: var(--color-muted);
  margin-top: 0.2rem;
}

.history-stat-item h3 {
  font-family: var(--font-ui);
  font-size: var(--step-sm);
  font-weight: 700;
  color: var(--color-ink);
}
.history-stat-item p {
  font-size: var(--step-xs);
  color: var(--color-muted);
  margin-top: 0.2rem;
}

.trust-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: var(--space-3);
}

.trust-item {
  display: flex;
  align-items: flex-start;
  gap: 0.85rem;
  height: 100%;
  padding: var(--space-3);
  border-radius: var(--radius-md);
  background: var(--color-paper);
  border: 1px solid var(--color-line);
  transition: transform var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out),
              background var(--dur-base) var(--ease-out);
}
.trust-item:hover { transform: translateY(-3px); border-color: transparent; box-shadow: var(--shadow-sm); }

.trust-item .icon-badge { flex-shrink: 0; }

.trust-item h3 {
  font-family: var(--font-ui);
  font-size: var(--step-sm);
  font-weight: 700;
  color: var(--color-ink);
}

.trust-item p {
  font-size: var(--step-xs);
  color: var(--color-muted);
  margin-top: 0.2rem;
}

.trust-item a { color: var(--color-primary); font-weight: 600; }
.trust-item a:hover { text-decoration: underline; }

/* Tarjetas de confianza sobre banda oscura: vidrio esmerilado sutil.
   Sobre .band--surface (plomo claro) las tarjetas quedan blancas (defaults)
   y solo el ícono se resalta en naranja corporativo. */
.band--dark .trust-item {
  background: rgba(255, 255, 255, 0.045);
  border-color: rgba(255, 255, 255, 0.09);
}
.band--dark .trust-item:hover { background: rgba(255, 255, 255, 0.075); }
.band--dark .trust-item h3 { color: #fff; }
.band--dark .trust-item p { color: #a9bad6; }
.band--surface .trust-item p { color: var(--color-surface-lede); }
.band--dark .trust-item a { color: var(--color-accent-light); }
.band--dark .icon-badge { background: rgba(255,255,255,0.1); color: #fff; }
.band--dark .icon-badge--accent { background: rgba(255,175,0,0.18); color: var(--color-accent-light); }
/* Iconos en naranja corporativo para resaltar sobre el plomo claro */
.band--surface .icon-badge { background: rgba(255,110,0,0.12); color: var(--color-surface-accent); }
.band--surface .icon-badge--accent { background: rgba(255,110,0,0.16); color: var(--color-surface-accent); }

/* ---------- Panel de métricas (stats) -------------------------------------- */
/* Panel propio (fondo + borde) para que se lea como un bloque aparte de las
   tarjetas de confianza de arriba, no solo una fila más. */
.stats-panel {
  border-radius: var(--radius-lg);
  padding: var(--space-4) var(--space-3);
  background: rgba(255, 255, 255, 0.035);
  border: 1px solid rgba(255, 255, 255, 0.08);
}

.stats-band {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--space-4) var(--space-3);
}
@media (min-width: 720px) {
  .stats-band { grid-template-columns: repeat(4, 1fr); }
}

.stat {
  text-align: center;
}
.stat strong {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2rem, 1.3rem + 2.8vw, 3.2rem);
  line-height: 1;
  color: #fff;
  font-variant-numeric: tabular-nums;
}
.stat strong .stat-accent { color: var(--color-accent-light); font-size: 0.7em; }
.band--surface .stat strong .stat-accent { color: var(--color-surface-accent); }
.stat > span {
  display: block;
  margin-top: 0.4rem;
  font-family: var(--font-ui);
  font-size: var(--step-xs);
  letter-spacing: 0.04em;
  color: #b7c6e0;
}
/* Panel de métricas sobre plomo claro: fondo blanco translúcido y texto oscuro */
.band--surface .stats-panel { background: rgba(255, 255, 255, 0.55); border-color: var(--color-line); }
.band--surface .stat strong { color: var(--color-ink); }
.band--surface .stat > span { color: var(--color-surface-muted); }

.icon-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: var(--radius-sm);
  background: var(--color-mist-2);
  color: var(--color-primary);
  font-size: 1.15rem;
}

.icon-badge--accent { background: rgba(255, 110, 0, 0.14); color: var(--color-accent-onlight); }

/* ---------- 8. Pilares ------------------------------------------------------ */
.pillars-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: var(--space-3);
}

.pillar-card {
  background: var(--color-paper);
  border: 1px solid var(--color-line);
  border-radius: var(--radius-md);
  padding: var(--space-4);
  transition: transform var(--dur-base) var(--ease-out), box-shadow var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out);
}

.pillar-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-md);
  border-color: transparent;
}

/* Ícono circular sólido (distinto del icon-badge cuadrado que usan las demás
   secciones), tal como la referencia de diseño para esta sección puntual. */
.pillar-card .icon-badge {
  margin-bottom: var(--space-2);
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--color-primary);
  color: #fff;
  font-size: 1.35rem;
}

.pillar-card h3 {
  font-family: var(--font-ui);
  font-size: var(--step-md);
  font-weight: 700;
  margin-bottom: 0.5rem;
}

.pillar-card p { font-size: var(--step-sm); color: var(--color-muted); }

/* ---------- 9. Funcionalidades --------------------------------------------- */
.features-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: var(--space-3);
}

.feature-card {
  padding: var(--space-3);
  border-radius: var(--radius-md);
  background: var(--color-paper);
  box-shadow: var(--shadow-sm);
  display: flex;
  gap: var(--space-2);
  align-items: flex-start;
}

.feature-card .icon-badge { flex-shrink: 0; }

.feature-card h3 {
  font-family: var(--font-ui);
  font-size: var(--step-base);
  font-weight: 700;
  margin-bottom: 0.25rem;
}

.feature-card p { font-size: var(--step-xs); color: var(--color-muted); }

/* Funcionalidades sobre banda oscura o de superficie: tarjeta de vidrio
   esmerilado + ícono cuadrado con relleno degradado azul (en vez del vidrio genérico). */
.band--dark .feature-card {
  background: rgba(255, 255, 255, 0.045);
  border: 1px solid rgba(255, 255, 255, 0.09);
  box-shadow: none;
}
.band--dark .feature-card h3 { color: #fff; }
.band--dark .feature-card p { color: #a9bad6; }
.band--surface .feature-card p { color: var(--color-surface-lede); }
.band--dark .feature-card .icon-badge {
  background: linear-gradient(135deg, var(--color-azul-oscuro), var(--color-azul-gradient-end));
  color: #fff;
}

.feature-card--api {
  grid-column: 1 / -1;
  background: linear-gradient(120deg, var(--color-azul-oscuro), var(--color-azul-gradient-end));
  color: #fff;
}
.feature-card--api .icon-badge { background: rgba(255, 255, 255, 0.18); color: #fff; }
.feature-card--api h3 { color: #fff; }
.feature-card--api p { color: #d7e4fb; }
.feature-card--api code {
  font-family: var(--font-ui);
  background: rgba(255, 255, 255, 0.15);
  padding: 0.15rem 0.5rem;
  border-radius: 6px;
  font-size: 0.75em;
}

.feature-card--api-link {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin-top: var(--space-2);
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-xs);
  color: #fff;
}
.feature-card--api-link:hover { text-decoration: underline; }

/* ---------- 10. Cómo funciona + requisitos ---------------------------------- */
/* Fila horizontal de pasos con círculos numerados y una línea punteada que
   los conecta por detrás (banda azul de marca). */
.steps-row {
  position: relative;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-4) var(--space-3);
  text-align: center;
  margin-bottom: var(--space-5);
}

.steps-row::before {
  content: "";
  position: absolute;
  top: 32px;
  left: calc(100% / 6);
  right: calc(100% / 6);
  border-top: 2px dotted rgba(255, 255, 255, 0.4);
  z-index: 0;
}

.step-item {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.step-num {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 64px;
  height: 64px;
  flex-shrink: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.14);
  border: 2px solid rgba(255, 255, 255, 0.4);
  font-family: var(--font-display);
  font-size: var(--step-lg);
  font-weight: 700;
  color: #fff;
  margin-bottom: var(--space-2);
  font-variant-numeric: tabular-nums;
}

/* El paso del medio se destaca en naranja: mismo recurso visual que usa la
   referencia para dar variedad a la fila sin agregar más información. */
.step-item:nth-child(2) .step-num {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: var(--color-ink);
}
/* Sobre banda surface (plomo claro): círculos en azul claro con número blanco;
   el paso del medio se resalta en naranja corporativo. */
.band--surface .step-num {
  background: var(--color-azul-claro);
  border-color: var(--color-azul-claro);
  color: #fff;
}
.band--surface .step-item:nth-child(2) .step-num {
  background: var(--color-surface-accent);
  border-color: var(--color-surface-accent);
  color: #fff;
}

.step-item h3 {
  font-family: var(--font-ui);
  font-size: var(--step-md);
  font-weight: 700;
  color: #fff;
  margin-bottom: 0.25rem;
}
.band--surface .step-item h3 { color: var(--color-ink); }
.step-item p {
  font-size: var(--step-sm);
  color: #d7e4fb;
  max-width: 30ch;
}
.band--surface .step-item p { color: var(--color-surface-lede); }

.requisitos-card {
  max-width: var(--container-narrow);
  margin-inline: auto;
  background: var(--color-bg-dark);
  color: #fff;
  border-radius: var(--radius-lg);
  padding: var(--space-4);
  position: relative;
}

.requisitos-card h3 {
  color: #fff;
  font-family: var(--font-ui);
  font-size: var(--step-lg);
  margin-bottom: var(--space-2);
}

.requisitos-list { display: grid; gap: 0.85rem; }

.requisitos-list li {
  display: flex;
  gap: 0.7rem;
  align-items: flex-start;
  font-size: var(--step-sm);
  color: #cfd8e6;
}

.requisitos-list i {
  color: var(--color-accent-light);
  margin-top: 0.2rem;
}

.requisitos-card-link {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin-top: var(--space-3);
  padding-top: var(--space-3);
  border-top: 1px solid rgba(255, 255, 255, 0.12);
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-xs);
  color: var(--color-accent-light);
}
.requisitos-card-link:hover { text-decoration: underline; }

/* ---------- 11. Modalidades -------------------------------------------------- */
.modalidades-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: var(--space-3);
}

/* Las dos modalidades son alternativas equivalentes, así que pesan igual en la
   página: mismo fondo, mismo tamaño, misma estructura. Lo único que las
   distingue es el color de acento, que cada tarjeta declara en --mod-accent y
   heredan el filete superior, el ícono, el chip y el enlace. */
.modalidad-card {
  --mod-accent: var(--color-accent-onlight);
  --mod-accent-soft: rgba(255, 110, 0, 0.12);
  --mod-glow: transparent;

  position: relative;
  overflow: hidden;
  border-radius: var(--radius-lg);
  padding: var(--space-4);
  border: 1px solid var(--color-line);
  background: var(--color-paper);
  color: var(--color-body);            /* evita heredar el texto claro de una banda de color */
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  transition: transform var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}

/* Filete de acento pegado al borde superior: identifica la modalidad de un
   vistazo sin recurrir a un fondo distinto para cada tarjeta. */
.modalidad-card::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 3px;
  background: var(--mod-accent);
}

.modalidad-card--api {
  --mod-accent: var(--color-primary);
  --mod-accent-soft: rgba(0, 126, 233, 0.12);
}

.modalidad-head {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2);
}

.modalidad-icon {
  flex-shrink: 0;
  display: grid;
  place-items: center;
  width: 52px;
  height: 52px;
  border-radius: var(--radius-md);
  background: var(--mod-accent-soft);
  color: var(--mod-accent);
  font-size: 1.3rem;
}

.modalidad-tag {
  display: block;
  font-family: var(--font-ui);
  font-size: var(--step-xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--mod-accent);
}

.modalidad-card p { color: var(--color-body); }

.modalidad-card h3 {
  font-size: var(--step-lg);
  font-family: var(--font-display);
  color: var(--color-ink);
  line-height: 1.2;
}

.modalidad-list {
  display: grid;
  gap: 0.6rem;
  padding-top: var(--space-2);
  border-top: 1px solid var(--color-line);
}
.modalidad-list li {
  display: flex;
  gap: 0.6rem;
  font-size: var(--step-sm);
  color: var(--color-body);
}
.modalidad-list i { color: var(--color-success); margin-top: 0.25rem; }

/* margin-top:auto ancla el enlace al pie para que ambas tarjetas cierren a la
   misma altura aunque los textos tengan distinto largo. */
.modalidad-link {
  margin-top: auto;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-family: var(--font-ui);
  font-weight: 700;
  font-size: var(--step-sm);
  color: var(--mod-accent);
}
.modalidad-link i { transition: transform var(--dur-fast) var(--ease-out); }
.modalidad-link:hover i,
.modalidad-link:focus-visible i { transform: translateX(4px); }

/* Modalidades sobre banda oscura ---------------------------------------------
   Antes la tarjeta 1 heredaba la tarjeta blanca de banda clara y la 2 usaba un
   degradado azul de marca (#0045be -> #002d80) que sobre el navy de la banda
   (#002972) quedaba prácticamente del mismo valor que el fondo: se perdía. Las
   dos pasan al vidrio esmerilado que ya usan el resto de tarjetas de banda
   oscura, con un halo tenue del color de acento para dar profundidad. */
.band--dark .modalidad-card {
  /* Un punto más de relleno y de borde que las tarjetas chicas de la banda
     (.feature-card, .trust-item): estas dos son las piezas grandes de la
     sección y deben despegarse del fondo sin volverse un bloque opaco. */
  background:
    radial-gradient(420px 220px at 100% 0%, var(--mod-glow), transparent 70%),
    rgba(255, 255, 255, 0.075);
  border-color: rgba(255, 255, 255, 0.16);
  box-shadow: none;
}
.band--dark .modalidad-card:hover {
  transform: translateY(-4px);
  border-color: rgba(255, 255, 255, 0.24);
  box-shadow: var(--shadow-lg);
}

/* Acentos recalculados para fondo oscuro: el naranja y el azul de marca no
   llegan a 4.5:1 sobre el navy en textos pequeños (chip y enlace). */
.band--dark .modalidad-card {
  --mod-accent: var(--color-accent-light);
  --mod-accent-soft: rgba(255, 175, 0, 0.16);
  --mod-glow: rgba(255, 175, 0, 0.10);
}
.band--dark .modalidad-card--api {
  --mod-accent: #5aaeff;
  --mod-accent-soft: rgba(0, 126, 233, 0.22);
  --mod-glow: rgba(0, 126, 233, 0.16);
}

.band--dark .modalidad-card h3 { color: #fff; }
.band--dark .modalidad-card p { color: #a9bad6; }
.band--dark .modalidad-list { border-top-color: rgba(255, 255, 255, 0.1); }
.band--dark .modalidad-list li { color: #dbe6f7; }
.band--dark .modalidad-list i { color: #4ade80; }

/* ---------- 12. Precios ------------------------------------------------------ */
.pricing-table-wrap {
  overflow: hidden;
  border-radius: var(--radius-lg);
  border: 1px solid var(--color-line);
  background: var(--color-paper);
}

/* Las 8 filas se reparten en 2 tablas de 4: misma información, la mitad de
   alto. En mobile se apilan (ver breakpoint más abajo). */
.pricing-table-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
}
.pricing-table-split table:last-child {
  border-left: 1px solid var(--color-line);
}

table.pricing-table {
  width: 100%;
  border-collapse: collapse;
}

.pricing-table caption { display: none; }

.pricing-table thead th {
  text-align: left;
  font-family: var(--font-ui);
  font-size: var(--step-xs);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--color-muted);
  padding: 0.6rem var(--space-3);
  border-bottom: 1px solid var(--color-line);
}

.pricing-table tbody td {
  padding: 0.6rem var(--space-3);
  border-bottom: 1px solid var(--color-line);
  font-family: var(--font-ui);
  font-size: var(--step-sm);
}

.pricing-table tbody tr:last-child td { border-bottom: none; }

.pricing-table tbody tr.is-featured { background: var(--color-mist-2); }

.pricing-table .price-cell {
  font-family: var(--font-display);
  font-size: var(--step-lg);
  font-weight: 700;
  color: var(--color-primary);
  font-variant-numeric: tabular-nums;
}

.pricing-table .badge-featured {
  display: inline-block;
  margin-left: 0.6rem;
  font-size: 0.65rem;
  font-family: var(--font-ui);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  background: var(--color-accent);
  color: var(--color-ink);
  padding: 0.2rem 0.55rem;
  border-radius: var(--radius-pill);
  vertical-align: middle;
}

/* Layout de dos columnas: tabla + barra lateral con las tarjetas extra
   (referencia: tabla ancha a la izquierda, tarjetas apiladas a la derecha). */
.pricing-layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-3);
  align-items: start;
}

.pricing-sidebar {
  display: grid;
  gap: var(--space-3);
}

.pricing-extra-card {
  display: flex;
  align-items: flex-start;
  gap: 0.85rem;
  border-radius: var(--radius-lg);
  padding: var(--space-1);
  background: var(--color-paper);
  box-shadow: var(--shadow-md);
}

.pricing-extra-icon {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background: var(--color-mist-2);
  color: var(--color-primary);
  font-size: 1.3rem;
}

.pricing-extra-card strong {
  display: block;
  font-family: var(--font-display);
  font-size: var(--step-xl);
  color: var(--color-ink);
}

.pricing-extra-card span {
  font-size: var(--step-xs);
  color: var(--color-muted);
}

.pricing-extra-card--cta {
  background: linear-gradient(135deg, var(--color-naranja-oscuro), var(--color-naranja-claro));
  color: var(--color-ink);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.5rem;
  justify-content: center;
}
.pricing-extra-icon--cta { background: rgba(255, 255, 255, 0.3); color: #fff; }
.pricing-extra-card--cta strong { color: var(--color-ink); font-family: var(--font-ui); font-size: var(--step-md); }
.pricing-extra-card--cta span { color: rgba(11, 21, 36, 0.75); }
.pricing-extra-card--cta .btn--ghost {
  margin-top: 0.3rem;
  color: var(--color-ink);
  background: var(--color-paper);
  border-color: transparent;
  box-shadow: var(--shadow-sm);
}
.pricing-extra-card--cta .btn--ghost:hover { background: #fff; transform: translateY(-1px); }
.pricing-extra-card--cta .btn--ghost i { color: #25d366; }

/* En pantallas anchas: las dos tarjetas chicas apiladas a la izquierda,
   la tarjeta naranja ocupa toda la altura a la derecha (referencia). */
@media (min-width: 1200px) {
  .pricing-sidebar {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: 1fr 1fr;
  }
  .pricing-extra-card:nth-child(1) { grid-column: 1; grid-row: 1; }
  .pricing-extra-card:nth-child(2) { grid-column: 1; grid-row: 2; }
  .pricing-extra-card--cta {
    grid-column: 2;
    grid-row: 1 / 3;
  }
}

/* ---------- 13. Prueba social / carrusel -------------------------------------- */
/* Panel de logos de clientes (carrusel Owl). Cada logo va en una tarjeta blanca
   uniforme porque los logotipos vienen con fondos distintos (blanco, cian,
   naranja, amarillo): la tarjeta los normaliza sobre la banda oscura. */
.clients-panel {
  border-radius: var(--radius-lg);
  padding: var(--space-4) var(--space-3);
  background: rgba(255, 255, 255, 0.035);
  border: 1px solid rgba(255, 255, 255, 0.08);
}
.clients-panel .panel-label { text-align: center; color: #9fb0cf; }

/* "Por qué confían": acercar el panel de logos al encabezado. El panel es
   vidrio casi invisible sobre el plomo claro, así que su padding superior solo
   sumaba aire; se reduce junto al margen del section-head (~4rem -> ~2rem). */
#confianza .section-head { margin-bottom: var(--space-2); }
#confianza .clients-panel { padding-top: var(--space-2); }

.clients-carousel.owl-carousel { display: block; }

.client-logo {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 96px;
  padding: var(--space-2) var(--space-3);
  background: var(--color-paper);
  border-radius: var(--radius-md);
}
.client-logo img {
  max-height: 64px;
  width: auto;
  object-fit: contain;
}

.proof-grid.owl-carousel { display: block; }

.proof-card {
  background: var(--color-paper);
  border: 1px solid var(--color-line);
  border-radius: var(--radius-md);
  padding: var(--space-4);
  height: 100%;
  margin-inline: 0.6rem;
}

.proof-card i.quote-icon {
  color: var(--color-accent-light);
  font-size: 1.4rem;
  margin-bottom: var(--space-2);
}

.proof-card p {
  font-size: var(--step-sm);
  color: var(--color-body);
}

.proof-card footer {
  margin-top: var(--space-2);
  display: flex;
  align-items: center;
  gap: 0.6rem;
  font-family: var(--font-ui);
  font-size: var(--step-xs);
  color: var(--color-muted);
}

/* Sobre .band--surface (plomo claro) las tarjetas de prueba social usan los
   defaults blancos; no hace falta override. */

.owl-dots .owl-dot span {
  background: var(--color-line);
}
.owl-dots .owl-dot.active span,
.owl-dots .owl-dot:hover span {
  background: var(--color-primary);
}

/* ---------- 14. CTA final ----------------------------------------------------- */
.cta-final {
  border-radius: var(--radius-lg);
  background: linear-gradient(135deg, var(--color-azul-oscuro), var(--color-azul-gradient-end));
  color: #fff;
  padding: var(--space-6) var(--space-4);
  text-align: center;
  position: relative;
  overflow: hidden;
}

.cta-final::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(420px 220px at 90% 0%, rgba(255,175,0,0.28), transparent 60%);
}

.cta-final > * { position: relative; z-index: 1; }

/* Dentro de una banda full-bleed el CTA no necesita su propia tarjeta */
.band .cta-final {
  background: transparent;
  border-radius: 0;
  padding: 0;
  overflow: visible;
}
.band .cta-final::before { display: none; }

.cta-final .kicker { color: #fff; }
.cta-final .kicker::before { background: var(--color-accent-light); }
.cta-final h2 { color: #fff; font-size: var(--step-2xl); }
.cta-final p { color: #dceafe; margin-top: var(--space-2); font-size: var(--step-md); }

.cta-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-2);
  margin-top: var(--space-4);
}

.cta-contact {
  margin-top: var(--space-5);
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-4);
  font-family: var(--font-ui);
  font-size: var(--step-sm);
}
.cta-contact a { display: inline-flex; align-items: center; gap: 0.5rem; }
.cta-contact a:hover { text-decoration: underline; }

/* Panel claro flotando sobre una banda de marca (en vez del CTA transparente
   de .band .cta-final): texto, botones apilados e ícono decorativo en una
   sola fila en desktop (referencia: materiales/capturas ejemplos/quienes_somos.jpg). */
.cta-panel {
  display: grid;
  grid-template-columns: 1fr;
  align-items: center;
  gap: var(--space-3);
  background: var(--color-mist);
  border-radius: var(--radius-lg);
  padding: var(--space-4);
  box-shadow: var(--shadow-lg);
  text-align: center;
}
.cta-panel .kicker { color: var(--color-primary); justify-content: center; }
.cta-panel .kicker::before { background: var(--color-accent); }
.cta-panel h2 { color: var(--color-ink); font-size: var(--step-2xl); }
.cta-panel p { color: var(--color-body); margin-top: var(--space-2); font-size: var(--step-md); }

.cta-panel-actions {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: var(--space-2);
  margin-top: var(--space-4);
}

.cta-panel-visual {
  display: none;
  align-items: center;
  justify-content: center;
  width: 140px;
  height: 140px;
  font-size: 4.5rem;
  color: var(--color-primary-light);
  opacity: 0.8;
}

/* ---------- 15. Footer --------------------------------------------------------- */
.site-footer {
  background: var(--color-bg-dark);
  color: #b9c3d4;
  padding-block: var(--space-6) var(--space-4);
}

.footer-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-5);
}

/* Versión blanca y más grande que en la cabecera: el pie es azul oscuro y el
   logo es el único elemento de marca de la columna. */
.footer-brand img { height: 50px; width: auto; margin-bottom: var(--space-3); }
.footer-brand p { font-size: var(--step-sm); max-width: 34ch; color: #93a0b8; }

/* Direccion y horario, movidos aqui desde su propia columna para que las 4
   columnas de enlaces entren en una sola fila. */
.footer-address {
  display: flex;
  gap: 0.55rem;
  margin-top: var(--space-2);
  font-size: var(--step-xs) !important;
  line-height: 1.5;
}
.footer-address i { color: var(--color-accent); margin-top: 0.2rem; flex-shrink: 0; }

.footer-cols {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: var(--space-4);
}

.footer-col h4 {
  font-family: var(--font-ui);
  color: #fff;
  font-size: var(--step-sm);
  margin-bottom: var(--space-2);
  text-transform: uppercase;
  letter-spacing: 0.06em;
}

.footer-col ul { display: grid; gap: 0.6rem; font-size: var(--step-sm); }
.footer-col a:hover { color: #fff; }

.footer-col p { font-size: var(--step-sm); color: #93a0b8; }
.footer-col p + p { margin-top: 0.5rem; }

.footer-bottom {
  margin-top: var(--space-5);
  padding-top: var(--space-3);
  border-top: 1px solid rgba(255,255,255,0.1);
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
  justify-content: space-between;
  font-size: var(--step-xs);
  color: #7a869e;
}

.footer-bottom .siat-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
}
.footer-bottom .siat-badge img { height: 20px; width: auto; border-radius: 3px; }

/* ---------- 16. WhatsApp flotante ------------------------------------------------ */
.whatsapp-float {
  position: fixed;
  right: var(--space-3);
  bottom: var(--space-3);
  z-index: 200;
  width: 58px;
  height: 58px;
  border-radius: 50%;
  background: #25d366;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.6rem;
  box-shadow: 0 12px 28px -8px rgba(37, 211, 102, 0.55);
  transition: transform var(--dur-fast) var(--ease-out);
}
.whatsapp-float:hover { transform: scale(1.08); }
.whatsapp-float:active { transform: scale(0.97); }

/* ---------- 16b. Halo que sigue al cursor (toda la página) ------------------------ */
/* Suave y sutil, con "lag" (inercia vía requestAnimationFrame, ver setupCursorGlow
   en main.js). Fijo al viewport: sigue al mouse en cualquier sección, no solo el
   hero. mix-blend-mode: soft-light lo hace ver bien tanto sobre fondos claros
   como oscuros sin tapar el texto. Solo con mouse real y sin prefers-reduced-motion. */
.cursor-glow {
  position: fixed;
  top: 0;
  left: 0;
  width: 640px;
  height: 640px;
  margin: -320px 0 0 -320px;
  border-radius: 50%;
  background: radial-gradient(
    circle,
    rgba(0, 126, 233, 0.55) 0%,
    rgba(255, 175, 0, 0.28) 45%,
    transparent 72%
  );
  filter: blur(20px);
  mix-blend-mode: soft-light;
  opacity: 0;
  transition: opacity 0.5s var(--ease-out);
  pointer-events: none;
  z-index: 50;
  will-change: transform;
}
.cursor-glow.is-active { opacity: 1; }

@media (prefers-reduced-motion: reduce), (pointer: coarse) {
  .cursor-glow { display: none; }
}

/* ---------- 17. Reveal on scroll (Animate.css) ------------------------------------ */
/* [data-reveal] arranca oculto; setupReveal() (main.js) agrega las clases de
   Animate.css cuando el elemento entra en viewport y el propio keyframe se
   encarga de la opacidad/transform. --animate-duration más corto que el
   default (1s) para que se sienta sutil, no un efecto llamativo.
   .is-visible es el fallback sin animación (reduced-motion / sin JS). */
[data-reveal] {
  opacity: 0;
}
[data-reveal].is-visible {
  opacity: 1;
}
[data-reveal].animate__animated {
  --animate-duration: 0.6s;
}
@media (prefers-reduced-motion: reduce) {
  [data-reveal] { opacity: 1; }
}

/* ---------- 17b. Formulario de contacto ------------------------------------------
   Fase 1: solo maquetación, sin envío real (ver comentario en contacto.php).
   El layout reutiliza el mismo patrón de 2 columnas que .pricing-layout
   (contenido ancho + sidebar), pero con clases propias porque el contenido
   es distinto (formulario vs. tabla). */
.contact-layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-4);
  align-items: start;
}

.contact-card {
  background: var(--color-paper);
  border-radius: var(--radius-lg);
  border: 1px solid var(--color-line);
  box-shadow: var(--shadow-md);
  padding: var(--space-4);
}

.form-row {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-2);
}

.form-group {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  margin-bottom: var(--space-2);
}

.form-group label {
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-xs);
  color: var(--color-ink);
}

.form-group .optional {
  font-weight: 400;
  color: var(--color-muted);
  text-transform: none;
}

.form-group input,
.form-group select,
.form-group textarea {
  width: 100%;
  padding: 0.8rem 1rem;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--color-line);
  background: var(--color-mist);
  color: var(--color-ink);
  font-size: var(--step-sm);
  transition: border-color var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out);
}

.form-group textarea { resize: vertical; min-height: 120px; }

.form-group input::placeholder,
.form-group textarea::placeholder { color: var(--color-muted); }

.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
  outline: none;
  border-color: var(--color-primary-light);
  background: var(--color-paper);
}

/* ---------- CAPTCHA estático del formulario de contacto ----------------------
   Dos columnas desde 560px: a la izquierda la imagen del código con su botón de
   refresco, a la derecha el campo donde se escribe. La versión anterior mostraba
   el código sin ofrecer dónde copiarlo, que era el motivo real para quitarlo. */
/* Una sola fila en todos los anchos, móvil incluido: el código y el campo donde
   se copia tienen que verse a la vez, sin desplazar la pantalla entre mirar uno
   y escribir en el otro. La columna izquierda ocupa lo que necesite la imagen y
   la derecha se queda con el resto (minmax(0,…) evita que el input se niegue a
   encogerse por su ancho por defecto).
   align-items: end alinea la imagen con el input aunque las etiquetas envuelvan
   en distinta cantidad de líneas, que es lo que pasa en pantallas angostas. */
.form-row--captcha {
  grid-template-columns: auto minmax(0, 1fr);
  align-items: end;
  gap: 0.6rem;
}

/* Cruza las dos columnas: es una aclaración de todo el bloque, no del campo. */
.captcha-help {
  grid-column: 1 / -1;
}

/* Ocupa el lugar de un <label> pero no lo es: la imagen del CAPTCHA no es un
   control de formulario, así que etiquetarla como tal sería mentirle al lector
   de pantalla. */
.form-label {
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-xs);
  color: var(--color-ink);
}

.captcha-row {
  display: flex;
  align-items: center;
  gap: 0.75rem;
}

.captcha-image {
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--color-line);
  /* La imagen la genera el backend y puede variar de tamaño; el alto manda y el
     ancho se acomoda, para que nunca se deforme el texto del código. */
  height: 54px;
  width: auto;
  max-width: 100%;
  background: var(--color-mist);
}

.captcha-refresh {
  flex-shrink: 0;
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  border-radius: var(--radius-pill);
  border: 1.5px solid var(--color-line);
  background: var(--color-paper);
  color: var(--color-accent-onlight);
  font-size: 1rem;
  transition: border-color var(--dur-fast) var(--ease-out),
              background var(--dur-fast) var(--ease-out),
              transform var(--dur-base) var(--ease-out);
}
.captcha-refresh:hover,
.captcha-refresh:focus-visible {
  border-color: var(--color-accent-onlight);
  background: var(--color-mist);
}
/* Media vuelta al pedir un código nuevo: confirma que el clic hizo algo aunque
   la imagen nueva tarde en llegar. */
.captcha-refresh.is-spinning { transform: rotate(180deg); }

#contact-captcha {
  padding-inline: 0.7rem;
  text-align: center;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-family: var(--font-ui);
  font-weight: 600;
}

.captcha-help {
  font-size: var(--step-xs);
  color: var(--color-muted);
  line-height: 1.4;
}
.captcha-help a { color: var(--color-primary); font-weight: 600; }
.captcha-help a:hover { text-decoration: underline; }

.form-note {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  margin-top: var(--space-3);
  padding: var(--space-2);
  border-radius: var(--radius-sm);
  background: var(--color-mist-2);
  color: var(--color-body);
  font-size: var(--step-xs);
}

.form-note i { color: var(--color-primary); margin-top: 0.15rem; }
.form-note a { color: var(--color-primary); font-weight: 600; }
.form-note a:hover { text-decoration: underline; }

/* Sidebar de contacto: mismas tarjetas "paper" que .pricing-extra-card,
   con una variante destacada (naranja) para el CTA de WhatsApp. */
.contact-sidebar {
  display: grid;
  gap: var(--space-2);
}

/* Tarjetas más bajas (menos padding, tipografía más chica) para que el
   sidebar completo no se vea tan largo frente al formulario. */
.contact-info-card {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  border-radius: var(--radius-lg);
  padding: var(--space-2) var(--space-3);
  background: var(--color-paper);
  box-shadow: var(--shadow-md);
}

.contact-info-card .icon-badge { flex-shrink: 0; width: 38px; height: 38px; font-size: 1rem; }

.contact-info-card h3 {
  font-family: var(--font-ui);
  font-size: var(--step-sm);
  margin-bottom: 0.15rem;
}

.contact-info-card p { font-size: var(--step-xs); color: var(--color-muted); }

.contact-info-card ul { display: grid; gap: 0.3rem; margin-top: 0.3rem; }
.contact-info-card a { color: var(--color-primary); font-weight: 600; }
.contact-info-card a:hover { text-decoration: underline; }

/* Variante "lista": varios datos (teléfono, correo, dirección, horario) en
   una sola tarjeta, con filas separadas por una línea fina en vez de una
   tarjeta por dato — mismo contenido, mucho menos alto. */
.contact-info-card--list { padding: var(--space-1) var(--space-3); }
.contact-info-list li {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  padding-block: var(--space-2);
  border-bottom: 1px solid var(--color-line);
}
.contact-info-list li:last-child { border-bottom: none; }

.contact-directions-btn { margin-top: 0.5rem; }

.contact-info-card--whatsapp {
  background: linear-gradient(135deg, var(--color-naranja-oscuro), var(--color-naranja-claro));
  color: var(--color-ink);
  flex-direction: column;
  align-items: flex-start;
  gap: 0.6rem;
}
.contact-info-card--whatsapp .icon-badge { background: rgba(255, 255, 255, 0.3); color: #fff; }
.contact-info-card--whatsapp h3 { color: var(--color-ink); }
.contact-info-card--whatsapp p { color: rgba(11, 21, 36, 0.75); }
.contact-info-card--whatsapp .btn--ghost {
  color: var(--color-ink);
  background: var(--color-paper);
  border-color: transparent;
  box-shadow: var(--shadow-sm);
}
.contact-info-card--whatsapp .btn--ghost:hover { background: #fff; transform: translateY(-1px); }
.contact-info-card--whatsapp .btn--ghost i { color: #25d366; }

.contact-info-card--certified img { border-radius: var(--radius-sm); flex-shrink: 0; }

/* ---------- 17c. Contenido legal (Términos) -------------------------------------- */
/* Texto corrido (prosa): el reset global quita márgenes y viñetas de listas,
   así que esta clase los reinstaura solo dentro del contenido legal. */
.legal-content {
  max-width: var(--container-narrow);
  margin-inline: auto;
}

.legal-updated {
  display: block;
  font-family: var(--font-ui);
  font-size: var(--step-xs);
  color: var(--color-muted);
  margin-bottom: var(--space-4);
}

.legal-content h2 {
  font-family: var(--font-display);
  font-size: var(--step-xl);
  margin-top: var(--space-5);
  margin-bottom: var(--space-1);
}
.legal-content h2:first-child { margin-top: 0; }

.legal-content p {
  margin-top: var(--space-2);
  color: var(--color-body);
}

.legal-content ul,
.legal-content ol {
  list-style: revert;
  padding-left: 1.25rem;
  margin-top: var(--space-2);
  display: grid;
  gap: 0.4rem;
}
.legal-content li { color: var(--color-body); }

.legal-content a { color: var(--color-primary); font-weight: 600; }
.legal-content a:hover { text-decoration: underline; }

/* ---------- 17d. Certificación --------------------------------------------------- */
.cert-badge {
  display: block;
  height: 88px;
  width: auto;
  margin: 0 auto var(--space-4);
  border-radius: var(--radius-sm);
}

/* Aviso para que el visitante verifique la certificación por su cuenta en el
   portal oficial del SIN (listado de proveedores de sistemas de facturación). */
.verify-callout {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  max-width: var(--container-narrow);
  margin: var(--space-4) auto 0;
  padding: var(--space-4);
  background: var(--color-mist-2);
  border: 1px solid var(--color-line);
  border-radius: var(--radius-lg);
}

.verify-callout-icon {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background: rgba(0, 69, 190, 0.1);
  color: var(--color-primary);
  font-size: 1.3rem;
}

.verify-callout h3 {
  font-family: var(--font-ui);
  font-size: var(--step-md);
  margin-bottom: 0.3rem;
}
.verify-callout p {
  color: var(--color-body);
  font-size: var(--step-sm);
  margin-bottom: var(--space-2);
}
.verify-callout strong { color: var(--color-ink); }

/* ---------- 17e. Preguntas frecuentes (acordeón nativo <details>) --------------- */
.faq-list {
  max-width: var(--container-narrow);
  margin-inline: auto;
  display: grid;
  gap: var(--space-2);
}

.faq-item {
  background: var(--color-paper);
  border-radius: var(--radius-md);
  border: 1px solid var(--color-line);
  overflow: hidden;
}

.faq-item summary {
  cursor: pointer;
  list-style: none;
  padding: var(--space-3);
  font-family: var(--font-ui);
  font-weight: 600;
  color: var(--color-ink);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
}
.faq-item summary::-webkit-details-marker { display: none; }

.faq-item summary::after {
  content: "\f078";
  font: var(--fa-font-solid);
  font-size: 0.85em;
  color: var(--color-primary);
  flex-shrink: 0;
  transition: transform var(--dur-fast) var(--ease-out);
}
.faq-item[open] summary::after { transform: rotate(180deg); }

.faq-item p {
  padding: 0 var(--space-3) var(--space-3);
  margin: 0;
  color: var(--color-body);
}
.faq-item p a { color: var(--color-primary); font-weight: 600; }
.faq-item p a:hover { text-decoration: underline; }

/* ---------- 17f. Herramientas (calculadoras) -------------------------------------
   Páginas de /herramientas/. Reutiliza .trust-item (índice de herramientas),
   .contact-card/.form-group (formularios) y agrega solo lo propio: la caja de
   resultado, la comparación "sin factura / con factura" del RC-IVA y la nota
   de disclaimer. */
.tool-hub-item { cursor: pointer; }
.tool-hub-go {
  margin-left: auto;
  align-self: center;
  color: var(--color-muted);
  transition: transform var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
}
.tool-hub-item:hover .tool-hub-go { transform: translateX(3px); color: var(--color-primary); }
.band--dark .tool-hub-go, .band--brand .tool-hub-go { color: #a9bad6; }

.tool-card { max-width: var(--container-narrow); margin-inline: auto; }

/* .tool-card (= .contact-card) tiene fondo blanco fijo sin importar la banda
   que la envuelve (clara, plomo u oscura): sus icon-badge deben verse en azul
   corporativo siempre, no heredar los overrides claros/blancos de .band--dark. */
.tool-card .icon-badge {
  background: rgba(0, 69, 190, 0.1);
  color: var(--color-primary);
}

.tool-form .btn { margin-top: var(--space-1); }

.tool-result {
  margin-top: var(--space-3);
  padding: var(--space-3);
  border-radius: var(--radius-md);
  background: var(--color-mist);
  border: 1px solid var(--color-line);
  display: grid;
  gap: 0.65rem;
}

.tool-result-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-2);
}
.tool-result-row span { font-size: var(--step-sm); color: var(--color-body); }
.tool-result-row strong { font-family: var(--font-ui); font-size: var(--step-md); font-weight: 700; color: var(--color-ink); white-space: nowrap; }

.tool-result-row--total {
  padding-top: 0.65rem;
  border-top: 1.5px dashed var(--color-line);
}
.tool-result-row--total strong { font-size: var(--step-lg); color: var(--color-primary); }

.tool-result-row--accent strong { color: var(--color-accent-onlight); }

.tool-result-split {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-2);
  margin-top: 0.35rem;
  padding-top: var(--space-2);
  border-top: 1.5px dashed var(--color-line);
}

.tool-result-split-item {
  padding: var(--space-2);
  border-radius: var(--radius-sm);
  background: var(--color-paper);
  border: 1px solid var(--color-line);
  text-align: center;
}
.tool-result-split-item span { display: block; font-size: var(--step-xs); color: var(--color-muted); margin-bottom: 0.3rem; }
.tool-result-split-item strong { font-family: var(--font-ui); font-size: var(--step-lg); font-weight: 700; color: var(--color-ink); }

.tool-result-split-item--accent { border-color: var(--color-primary-light); background: var(--color-mist-2); }
.tool-result-split-item--accent strong { color: var(--color-primary); }

.tool-note {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  max-width: var(--container-narrow);
  margin: var(--space-3) auto 0;
  font-size: var(--step-xs);
  color: var(--color-muted);
}
.tool-note i { color: var(--color-primary); margin-top: 0.15rem; flex-shrink: 0; }
.tool-note a { color: var(--color-primary); font-weight: 600; }
.tool-note a:hover { text-decoration: underline; }
.band--dark .tool-note, .band--brand .tool-note { color: #a9bad6; }
.band--dark .tool-note i, .band--brand .tool-note i { color: var(--color-accent-light); }
.band--dark .tool-note a, .band--brand .tool-note a { color: #fff; }
.band--surface .tool-note { color: var(--color-surface-muted); }

/* Ficha "qué necesitas" del verificador: mismo patrón que .contact-info-list */
.tool-checklist { display: grid; gap: 0.3rem; margin-bottom: var(--space-3); }
.tool-checklist li {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  padding-block: 0.6rem;
}
.tool-checklist li + li { border-top: 1px solid var(--color-line); }
.tool-checklist .icon-badge { flex-shrink: 0; width: 34px; height: 34px; font-size: 0.9rem; }
.tool-checklist span { font-size: var(--step-sm); color: var(--color-body); padding-top: 0.35rem; }

/* ---------- 17f-bis. Galería 3D del panel (modalidad "Panel independiente") ----
   Carrusel tipo "coverflow": la captura activa al frente y las vecinas giradas
   y retrasadas en Z. Sin librería: transformaciones CSS + JS mínimo.
   El pie de foto vive fuera del escenario 3D para que el texto no se deforme. */
/* --shot-h = alto objetivo de la captura; el ancho sale de su proporción (--ar,
   que pone el JS). Así todas ocupan un alto parecido aunque los formularios
   sean apaisados y los listados verticales. --fan = separación de las vecinas. */
.panel-gallery {
  margin-top: var(--space-5);
  --shot-h: clamp(120px, 34vw, 500px);
  --fan: clamp(110px, 22vw, 330px);
}

/* La altura la fija el JS a partir de la captura activa (setupPanelGallery);
   este min-height solo evita el salto antes de que corra o si no hay JS. */
.panel-stage {
  position: relative;
  min-height: clamp(210px, 44vw, 560px);
  perspective: 1600px;
  transform-style: preserve-3d;
}

/* Centradas verticalmente: las capturas no comparten proporción (los formularios
   son más apaisados que los listados), así que el escenario toma el alto de la
   más alta y cada una se centra en él en vez de deformarse o rellenarse. */
.panel-slide {
  position: absolute;
  top: 50%;
  left: 50%;
  /* El ancho depende de la proporción de cada captura, así que el centrado va
     por transform (translate(-50%,-50%)) y no por un margin-left fijo. */
  width: min(calc(var(--shot-h) * var(--ar, 1.5)), 94%);
  transition: transform var(--dur-slow) var(--ease-out),
              opacity var(--dur-slow) var(--ease-out);
  will-change: transform;
  opacity: 0;
  pointer-events: none;
  z-index: 0;
}

/* Posición activa / vecinas / ocultas */
.panel-slide.is-active {
  transform: translate(-50%, -50%) translateZ(0) rotateY(0deg);
  opacity: 1;
  pointer-events: auto;
  z-index: 3;
}
.panel-slide.is-prev {
  transform: translate(-50%, -50%) translateX(calc(-1 * var(--fan))) translateZ(-260px) rotateY(34deg) scale(0.96);
  opacity: 0.45;
  z-index: 2;
}
.panel-slide.is-next {
  transform: translate(-50%, -50%) translateX(var(--fan)) translateZ(-260px) rotateY(-34deg) scale(0.96);
  opacity: 0.45;
  z-index: 2;
}
.panel-slide.is-prev:hover, .panel-slide.is-next:hover { opacity: 0.7; }
.panel-slide.is-prev, .panel-slide.is-next { pointer-events: auto; cursor: pointer; }

/* Marco tipo ventana de navegador, para que la captura se lea como app */
.panel-frame {
  border-radius: var(--radius-md);
  overflow: hidden;
  background: #0f1b30;
  border: 1px solid rgba(255, 255, 255, 0.14);
  box-shadow: 0 40px 70px -28px rgba(0, 0, 0, 0.75);
}

.panel-frame-bar {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 0.55rem 0.8rem;
  background: #16233c;
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.panel-frame-bar i {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.22);
}
.panel-frame-bar i:first-child { background: #ff5f57; }
.panel-frame-bar i:nth-child(2) { background: #febc2e; }
.panel-frame-bar i:nth-child(3) { background: #28c840; }

.panel-frame img { width: 100%; height: auto; display: block; }

/* Controles */
.panel-controls {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  margin-top: var(--space-3);
}

.panel-nav {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  flex-shrink: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.1);
  border: 1px solid rgba(255, 255, 255, 0.24);
  color: #fff;
  transition: background var(--dur-fast) var(--ease-out);
}
.panel-nav:hover { background: rgba(255, 255, 255, 0.22); }

.panel-dots { display: flex; gap: 0.5rem; }
.panel-dots button {
  width: 9px;
  height: 9px;
  padding: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.28);
  transition: background var(--dur-fast) var(--ease-out), width var(--dur-base) var(--ease-out);
}
.panel-dots button[aria-current="true"] {
  width: 26px;
  border-radius: var(--radius-pill);
  background: var(--color-accent);
}

.panel-caption {
  text-align: center;
  max-width: 52ch;
  margin: var(--space-3) auto 0;
  min-height: 4.2rem;
}
.panel-caption h3 {
  font-family: var(--font-ui);
  font-size: var(--step-md);
  color: #fff;
  margin-bottom: 0.25rem;
}
.panel-caption p { font-size: var(--step-sm); color: #a9bad6; }

/* Sin 3D cuando el usuario pide menos movimiento: las vecinas solo se atenúan */
@media (prefers-reduced-motion: reduce) {
  .panel-slide.is-prev { transform: translate(-50%, -50%) translateX(calc(-1 * var(--fan))) scale(0.96); }
  .panel-slide.is-next { transform: translate(-50%, -50%) translateX(var(--fan)) scale(0.96); }
}

@media (max-width: 640px) {
  /* La fila del CAPTCHA se mantiene, pero la imagen y el botón ceden ancho para
     que el campo no quede reducido a un par de caracteres: en 390px llegaba a
     66px, insuficiente para los 6 del código. El alto sigue al ancho de
     pantalla con un mínimo de 38px, que es el límite en que el código todavía
     se lee. La imagen no se deforma: solo se fija el alto y el ancho lo sigue. */
  .captcha-image { height: clamp(38px, 11vw, 54px); }
  .captcha-refresh { width: 36px; height: 36px; font-size: 0.9rem; }
  .captcha-row { gap: 0.5rem; }
  #contact-captcha { padding-inline: 0.5rem; letter-spacing: 0.08em; }

  /* La cabecera solo tiene logo + "Comenzar" + hamburguesa, pero a 50px el
     logo mide 150px de ancho y en pantallas de 360px no entraba todo. */
  .brand-logo img { height: 42px; }

  /* En móvil manda el ancho disponible, no el alto: si no, las capturas
     verticales quedarían diminutas. */
  .panel-gallery { --shot-h: 52vw; --fan: 46vw; }
  .panel-frame-bar { padding: 0.4rem 0.6rem; }
  .panel-frame-bar i { width: 7px; height: 7px; }
}

/* ---------- 17g. Documentación API --------------------------------------------
   Página /api/index.php. Método (GET/POST), tabla de parámetros, bloques de
   código con selector de lenguaje (curl/php/react/python) y botón de copiar. */
.api-hero-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin-top: var(--space-3);
}
.api-pill {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.45rem 0.95rem;
  border-radius: var(--radius-pill);
  background: rgba(255, 255, 255, 0.1);
  border: 1px solid rgba(255, 255, 255, 0.22);
  color: #fff;
  font-family: var(--font-ui);
  font-size: var(--step-xs);
  font-weight: 600;
}
.api-pill code {
  font-family: ui-monospace, "Courier New", monospace;
  background: rgba(255, 255, 255, 0.14);
  padding: 0.1rem 0.4rem;
  border-radius: 4px;
}

/* Layout de dos columnas: sidebar de secciones + contenido. En mobile el
   sidebar se convierte en una barra horizontal de píldoras con scroll,
   ubicada arriba del contenido (evita el long-scroll para saltar de sección). */
/* Sección más compacta que el resto del sitio: es referencia técnica, no
   contenido de scroll largo — menos padding vertical que .section por defecto. */
.section.docs-section { padding-block: var(--space-4); }

.docs-layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-3);
  align-items: start;
}

.docs-content { min-width: 0; }

.docs-content .contact-card { padding: var(--space-3); }

.docs-block { padding-block: var(--space-3); }
.docs-block:first-child { padding-top: 0; }
.docs-block + .docs-block { border-top: 1px solid var(--color-line); }

.docs-block-title {
  font-family: var(--font-ui);
  font-size: var(--step-md);
  color: var(--color-ink);
  margin-bottom: var(--space-1);
}

/* Sin .section-head no queda margen bajo el h2 (ni bajo el trazo naranja de
   .title-accent): el contenido de abajo (tarjeta/callout) quedaba pegado o
   se solapaba con el subrayado. */
.docs-block h2.section-title { margin-bottom: var(--space-3); }

.docs-sidebar nav {
  display: flex;
  gap: 0.5rem;
  overflow-x: auto;
  padding-bottom: 0.4rem;
}
.docs-sidebar ul { display: flex; gap: 0.5rem; }
.docs-sidebar li { flex-shrink: 0; }
.docs-sidebar-label { display: none; }

.docs-sidebar a {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.5rem 0.95rem;
  border-radius: var(--radius-pill);
  background: var(--color-mist);
  color: var(--color-body);
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-xs);
  white-space: nowrap;
  transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
}
.docs-sidebar a:hover { background: var(--color-mist-2); }
.docs-sidebar a.is-active { background: var(--color-primary); color: #fff; }
.docs-sidebar a.is-active .method-dot { background: #fff; }

.method-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  flex-shrink: 0;
  background: #16a34a;
}
.method-dot--post { background: var(--color-accent-onlight); }

@media (min-width: 860px) {
  .docs-layout { grid-template-columns: 220px 1fr; gap: var(--space-5); }

  .docs-sidebar {
    position: sticky;
    top: calc(var(--header-h) + var(--space-3));
    max-height: calc(100vh - var(--header-h) - var(--space-4));
    overflow-y: auto;
  }
  .docs-sidebar nav { display: block; overflow-x: visible; }
  .docs-sidebar ul { display: block; }
  .docs-sidebar li { margin-bottom: 0.1rem; }

  .docs-sidebar-label {
    display: block;
    font-family: var(--font-ui);
    font-size: var(--step-xs);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--color-muted);
    margin: var(--space-3) 0 var(--space-1);
  }
  .docs-sidebar-label:first-child { margin-top: 0; }

  .docs-sidebar a {
    display: flex;
    background: none;
    padding: 0.45rem 0.65rem;
    border-radius: var(--radius-sm);
    border-left: 2px solid transparent;
    font-weight: 500;
    color: var(--color-body);
  }
  .docs-sidebar a:hover { background: var(--color-mist); color: var(--color-ink); }
  .docs-sidebar a.is-active {
    background: var(--color-mist-2);
    color: var(--color-primary);
    border-left-color: var(--color-primary);
    font-weight: 700;
  }
  .docs-sidebar a.is-active .method-dot { background: currentColor; }
}

.api-callout {
  display: flex;
  gap: 0.75rem;
  padding: var(--space-2) var(--space-3);
  border-radius: var(--radius-md);
  border: 1px solid var(--color-line);
  background: var(--color-mist);
  font-size: var(--step-sm);
  color: var(--color-body);
  margin-bottom: var(--space-2);
}
.api-callout i { color: var(--color-primary); margin-top: 0.2rem; flex-shrink: 0; }
.api-callout strong { color: var(--color-ink); }
.api-callout--warn { border-color: rgba(255, 110, 0, 0.35); background: rgba(255, 110, 0, 0.07); }
.api-callout--warn i { color: var(--color-accent-onlight); }
.band--dark .api-callout, .band--brand .api-callout {
  background: rgba(255, 255, 255, 0.05);
  border-color: rgba(255, 255, 255, 0.12);
  color: #c6d5ee;
}
.band--dark .api-callout strong, .band--brand .api-callout strong { color: #fff; }

.endpoint-card { margin-bottom: var(--space-2); }
.endpoint-head {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.7rem;
  margin-bottom: var(--space-1);
}
.endpoint-head h3 { font-size: var(--step-md); }
.endpoint-path {
  font-family: ui-monospace, "Courier New", monospace;
  font-size: var(--step-xs);
  color: var(--color-ink);
  background: var(--color-mist);
  padding: 0.3rem 0.65rem;
  border-radius: var(--radius-sm);
  word-break: break-all;
}
.endpoint-desc { color: var(--color-muted); margin-bottom: var(--space-2); }
.endpoint-card h4 {
  font-family: var(--font-ui);
  font-size: var(--step-sm);
  color: var(--color-ink);
  margin: var(--space-2) 0 var(--space-1);
}

.method-badge {
  display: inline-flex;
  align-items: center;
  padding: 0.3rem 0.75rem;
  border-radius: var(--radius-sm);
  font-family: var(--font-ui);
  font-weight: 700;
  font-size: var(--step-xs);
  letter-spacing: 0.04em;
}
.method-badge--get { background: rgba(22, 163, 74, 0.14); color: #16a34a; }
.method-badge--post { background: rgba(255, 110, 0, 0.14); color: var(--color-accent-onlight); }

table.api-table {
  width: 100%;
  border-collapse: collapse;
  margin-bottom: var(--space-2);
  font-size: var(--step-sm);
}
.api-table caption { display: none; }
.api-table thead th {
  text-align: left;
  font-family: var(--font-ui);
  font-size: var(--step-xs);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--color-muted);
  padding: 0.6rem var(--space-2);
  border-bottom: 1px solid var(--color-line);
}
.api-table tbody td {
  padding: 0.6rem var(--space-2);
  border-bottom: 1px solid var(--color-line);
  vertical-align: top;
}
.api-table tbody tr:last-child td { border-bottom: none; }
.api-table code {
  font-family: ui-monospace, "Courier New", monospace;
  background: var(--color-mist);
  padding: 0.1rem 0.4rem;
  border-radius: 4px;
  font-size: 0.9em;
}
.api-table .col-note { color: var(--color-muted); font-size: var(--step-xs); }

.code-tabs-nav {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin-bottom: var(--space-2);
}
.code-tabs-nav button {
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: var(--step-xs);
  padding: 0.55rem 1.1rem;
  border-radius: var(--radius-pill);
  background: var(--color-mist);
  color: var(--color-body);
  transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
}
.code-tabs-nav button:hover { background: var(--color-mist-2); }
.code-tabs-nav button.is-active { background: var(--color-primary); color: #fff; }

.code-block {
  position: relative;
  background: var(--color-bg-dark);
  border-radius: var(--radius-md);
  border: 1px solid rgba(255, 255, 255, 0.08);
}
.code-block pre {
  margin: 0;
  padding: var(--space-2) var(--space-3);
  padding-right: 3.2rem;
  overflow-x: auto;
  color: #dce6f7;
  font-family: ui-monospace, "Courier New", monospace;
  font-size: var(--step-xs);
  line-height: 1.65;
}
.code-block code { white-space: pre; }
.code-block + .code-block { margin-top: var(--space-2); }

.code-copy {
  position: absolute;
  top: 0.6rem;
  right: 0.6rem;
  width: 34px;
  height: 34px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-sm);
  background: rgba(255, 255, 255, 0.08);
  color: #dce6f7;
  transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
}
.code-copy:hover { background: rgba(255, 255, 255, 0.18); }
.code-copy.is-copied { background: var(--color-success); color: #fff; }

/* ---------- 18. Responsive ------------------------------------------------------- */
@media (min-width: 640px) {
  .cta-final { padding: var(--space-7) var(--space-6); }

  .tool-result-split { grid-template-columns: 1fr 1fr; }
}

@media (min-width: 860px) {
  .nav-primary { display: block; }
  .nav-toggle { display: none; }

  .hero-slide-inner {
    grid-template-columns: 1fr 1fr;
  }

  .pricing-layout {
    grid-template-columns: 1.7fr 1fr;
    gap: var(--space-4);
  }

  .contact-layout {
    grid-template-columns: 1.6fr 1fr;
    gap: var(--space-4);
  }

  .form-row {
    grid-template-columns: 1fr 1fr;
    gap: var(--space-3);
  }

  .about-hero-grid {
    grid-template-columns: 1fr 0.9fr;
  }

  .history-stats-card {
    grid-template-columns: repeat(3, 1fr);
  }
  .history-stat-item:not(:last-child) {
    position: relative;
    padding-right: var(--space-3);
  }
  .history-stat-item:not(:last-child)::after {
    content: "";
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    width: 1px;
    background: var(--color-line);
  }

  .cta-panel {
    grid-template-columns: 1fr auto auto;
    gap: var(--space-5);
    padding: var(--space-5) var(--space-6);
    text-align: left;
  }
  .cta-panel .kicker { justify-content: flex-start; }
  .cta-panel-actions {
    flex-direction: column;
    align-items: stretch;
    margin-top: 0;
  }
  .cta-panel-visual { display: flex; }

  .footer-grid {
    grid-template-columns: 1.2fr 2fr;
  }
}

@media (min-width: 1024px) {
  .pillars-grid { grid-template-columns: repeat(3, 1fr); }
  .features-grid { grid-template-columns: repeat(3, 1fr); }
  .modalidades-grid { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 859.98px) {
  .hero-slide-visual { order: -1; width: min(100%, 440px); }
  .hero-stamp { width: 104px; height: 104px; top: -16px; right: -8px; }
}

@media (max-width: 639.98px) {
  .steps-row { grid-template-columns: 1fr; gap: var(--space-5); }
  .steps-row::before { display: none; }

  .pricing-table-split { grid-template-columns: 1fr; }
  .pricing-table-split table:last-child {
    border-left: none;
    border-top: 1px solid var(--color-line);
  }
}

/* ---------- 19. Escalado para pantallas muy anchas (contenedor 1600px) ----------
   El contenedor pasó de 1200 a 1600px. Sobre esa base, subir el font-size raíz
   escala PROPORCIONALMENTE toda medida en rem (tipografía, espaciado, radios de
   tarjetas) sin tocar cada regla una por una. Se complementa con ajustes puntuales
   a elementos medidos en px (badges de ícono, techo de los titulares fluidos). */
@media (min-width: 1440px) {
  html { font-size: 17px; }

  /* El logo y la barra van en px, así que no los alcanza el escalado del
     font-size raíz: en pantallas 2K quedaban visiblemente pequeños frente al
     resto. Se suben a mano manteniendo el mismo aire arriba y abajo. */
  :root { --header-h: 94px; }
  .brand-logo img { height: 62px; }

  .icon-badge { width: 48px; height: 48px; font-size: 1.25rem; }
  .pillar-card .icon-badge { width: 58px; height: 58px; font-size: 1.5rem; }

  .pillars-grid,
  .features-grid,
  .modalidades-grid { gap: var(--space-4); }
}

@media (min-width: 1800px) {
  html { font-size: 18px; }
}

/* ---------- 20. Utilidades de espaciado ---------------------------------------
   El sitio se sirve con un CSP estricto (`style-src 'self'`, ver .htaccess), que
   bloquea los atributos `style="..."` del HTML. Los pocos ajustes puntuales que
   antes iban en línea viven acá como clases. Si hace falta un ajuste nuevo,
   agregar una clase — no un atributo style. */
.u-mt-2 { margin-top: var(--space-2); }
.u-mt-6 { margin-top: var(--space-6); }
.u-mb-2 { margin-bottom: var(--space-2); }

/* Escalonado de entrada de los elementos del hero. Va en CSS y no en JS a
   propósito: Owl Carousel clona los slides para el loop infinito, y un
   animation-delay escrito por JS queda reflejado en el atributo style, que el
   navegador re-parsea al insertar el clon — y ahí el CSP lo rechaza. Como regla
   CSS sobrevive al clonado sin tocar ningún atributo. 110ms por posición. */
[data-anim][data-anim-order="1"] { animation-delay: 110ms; }
[data-anim][data-anim-order="2"] { animation-delay: 220ms; }
[data-anim][data-anim-order="3"] { animation-delay: 330ms; }
[data-anim][data-anim-order="4"] { animation-delay: 440ms; }
[data-anim][data-anim-order="5"] { animation-delay: 550ms; }
[data-anim][data-anim-order="6"] { animation-delay: 660ms; }

/* Subtítulo dentro de las tarjetas de herramientas: más chico y en la fuente de
   UI, para no competir con el <h2> de la sección. */
.tool-subhead {
  font-family: var(--font-ui);
  font-size: var(--step-md);
  margin-bottom: var(--space-2);
}
