/* =============================================================
   NETXA — Hoja de estilos compartida
   Manual de marca v1.0 · Solo HTML + CSS (cero JavaScript)
   Orden: tokens → base → layout → header/nav → footer →
          componentes → utilidades → media queries → motion →
          capa cyberpunk (efectos CRT/glitch, CSS puro) →
          fondos de hero temáticos (img/hero-*.svg)
   Proporción de color 70/20/10: negro / blanco / verde (señal)
   ============================================================= */

/* -------------------------------------------------------------
   1. TOKENS
   ------------------------------------------------------------- */
:root {
  /* Paleta del manual (canónica, en hex) */
  --negro:          #000000;
  --grafito:        #1A1A1A;
  --humo:           #2A2A2A;
  --gris-claro:     #C9C9C9;
  --blanco:         #FDFCFA;
  --verde:          #7ED957;
  --verde-claro:    #A8E889;
  --verde-profundo: #5FB23C;

  /* "Glitch only": micro-destellos cromáticos dentro de los glitches.
     JAMÁS usarlos como color estable de UI (regla de marca). */
  --glitch-rojo: #FF003C;
  --glitch-cian: #00F0FF;

  /* Tokens semánticos */
  --fondo:       var(--negro);
  --superficie:  var(--grafito);
  --borde:       var(--humo);
  --tinta:       var(--blanco);
  --tinta-suave: var(--gris-claro);
  --acento:      var(--verde);

  /* Tipografías (se cargan vía Google Fonts en el <head> de cada página) */
  --fuente-titular: "Space Grotesk", "Helvetica Neue", Arial, sans-serif;
  --fuente-texto:   "Inter", "Helvetica Neue", Arial, sans-serif;
  --fuente-mono:    "JetBrains Mono", "SFMono-Regular", Consolas, monospace;

  /* Escala tipográfica fluida */
  --t-hero: clamp(2.625rem, 1.2rem + 6.2vw, 5rem);       /* h1 de portada   */
  --t-1:    clamp(2rem, 1.1rem + 3.6vw, 3.25rem);        /* h1 interior/h2  */
  --t-2:    clamp(1.5rem, 1.15rem + 1.6vw, 2.125rem);    /* h2/h3           */
  --t-3:    clamp(1.125rem, 1rem + .6vw, 1.375rem);      /* h3/h4           */
  --t-lead: clamp(1.0625rem, 1rem + .5vw, 1.25rem);      /* párrafo destacado */
  --t-base: 1rem;
  --t-s:    .875rem;
  --t-xs:   .75rem;                                       /* kickers, tags   */

  /* Escala de espacio (ritmo modular) */
  --esp-xs:  .5rem;
  --esp-s:   1rem;
  --esp-m:   1.5rem;
  --esp-l:   2.5rem;
  --esp-xl:  4rem;
  --esp-2xl: clamp(4.5rem, 3rem + 6vw, 8rem);            /* respiración entre secciones */

  /* Layout */
  --ancho-max:   1160px;
  --alto-header: 76px;
  --radio:       6px;

  /* Movimiento */
  --curva: cubic-bezier(.22, .8, .3, 1);
  --rapido: .22s var(--curva);
  --medio:  .45s var(--curva);
}

/* -------------------------------------------------------------
   2. RESET + BASE
   ------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }

* { margin: 0; }

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
  scrollbar-color: var(--humo) var(--negro);
}

body {
  background: var(--fondo);
  color: var(--tinta);
  font-family: var(--fuente-texto);
  font-size: var(--t-base);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  padding-top: var(--alto-header); /* compensa el header fijo */
  min-height: 100vh;
  overflow-x: hidden; /* la marca de agua X sobresale a propósito */
}

img, svg, video { display: block; max-width: 100%; height: auto; }

a {
  color: inherit;
  text-decoration: none;
  transition: color var(--rapido);
}

/* Enlaces dentro de párrafos: subrayado sutil que se enciende en verde */
p a, li a:not([class]) {
  color: var(--tinta);
  text-decoration: underline;
  text-decoration-color: var(--humo);
  text-underline-offset: .25em;
}
p a:hover, li a:not([class]):hover {
  color: var(--acento);
  text-decoration-color: var(--acento);
}

/* Titulares: Space Grotesk, nunca bajo weight 500, tracking apretado */
h1, h2, h3, h4 {
  font-family: var(--fuente-titular);
  font-weight: 700;
  line-height: 1.08;
  letter-spacing: -0.02em;
  text-wrap: balance;
  color: var(--tinta);
}
h1 { font-size: var(--t-1); }
h2 { font-size: var(--t-2); }
h3 { font-size: var(--t-3); line-height: 1.25; }
h4 { font-size: var(--t-base); font-weight: 600; line-height: 1.3; }

p { text-wrap: pretty; }

strong { font-weight: 600; }

code, kbd {
  font-family: var(--fuente-mono);
  font-size: .9em;
  background: var(--grafito);
  border: 1px solid var(--borde);
  border-radius: 4px;
  padding: .1em .4em;
  color: var(--verde-claro);
}

hr, .separador {
  border: 0;
  border-top: 1px solid var(--borde);
  margin: 0;
}

::selection { background: var(--verde); color: var(--negro); }

/* Anclas: que el header fijo no tape el destino */
[id] { scroll-margin-top: calc(var(--alto-header) + 1rem); }

/* Foco visible: firma verde, innegociable */
:focus-visible {
  outline: 2px solid var(--verde);
  outline-offset: 3px;
  border-radius: 2px;
}

/* -------------------------------------------------------------
   3. LAYOUT
   ------------------------------------------------------------- */
.container {
  width: 100%;
  max-width: var(--ancho-max);
  margin-inline: auto;
  padding-inline: clamp(1.25rem, 4vw, 2.5rem);
}

.seccion { padding-block: var(--esp-2xl); }

/* Evita doble aire entre secciones contiguas SIN borde. Cuando la
   siguiente lleva .seccion-borde conserva su padding-top: la línea de
   1px queda con el mismo aire arriba y abajo (simetría respecto del borde). */
.seccion + .seccion:not(.seccion-borde) { padding-top: 0; }

.seccion-borde { border-top: 1px solid var(--borde); }

/* Encabezado de sección: kicker + título + lead */
.seccion-encabezado { margin-bottom: var(--esp-xl); max-width: 46rem; }
.seccion-encabezado .lead { margin-top: var(--esp-s); }

/* Grillas */
.grid { display: grid; gap: var(--esp-m); }
.grid-2 { grid-template-columns: repeat(2, 1fr); }
.grid-3 { grid-template-columns: repeat(3, 1fr); }
.grid-4 { grid-template-columns: repeat(4, 1fr); }

/* Dos columnas asimétricas para problema→solución, texto+specs */
.dos-columnas {
  display: grid;
  grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  gap: var(--esp-xl);
  align-items: start;
}

/* Medida de lectura cómoda */
.medida { max-width: 62ch; }

/* -------------------------------------------------------------
   4. HEADER / NAV (fijo, menú móvil CSS-only con checkbox hack)
   ------------------------------------------------------------- */
.site-header {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 100;
  height: var(--alto-header);
  background: rgba(0, 0, 0, .88);
  border-bottom: 1px solid var(--borde);
}
@supports (backdrop-filter: blur(1px)) {
  .site-header { backdrop-filter: blur(12px); }
}

.header-inner {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--esp-m);
  position: relative;
}

/* Wordmark: netxa en minúsculas, la x en verde */
.brand {
  font-family: var(--fuente-titular);
  font-weight: 700;
  font-size: 1.5rem;
  letter-spacing: -0.03em;
  line-height: 1;
  color: var(--tinta);
}
.brand .x { color: var(--verde); }
.brand:hover { color: var(--tinta); } /* el wordmark no cambia de color: es el logo */

/* Navegación */
.nav {
  display: flex;
  align-items: center;
  gap: var(--esp-l);
}
.nav a {
  font-family: var(--fuente-titular);
  font-weight: 500;
  font-size: .9375rem;
  color: var(--tinta-suave);
  padding-block: .25rem;
}
.nav a:hover { color: var(--tinta); }
.nav a[aria-current="page"] {
  color: var(--tinta);
  border-bottom: 2px solid var(--verde);
}

/* Checkbox del menú móvil: invisible pero accesible por teclado.
   Se superpone al botón hamburguesa para que el foco caiga donde se ve. */
.menu-check {
  position: absolute;
  top: 50%;
  right: 0;
  translate: 0 -50%;
  width: 44px;
  height: 44px;
  opacity: 0;
  cursor: pointer;
  display: none; /* solo existe en móvil */
  z-index: 2;
}
.menu-check:focus-visible ~ .menu-btn {
  outline: 2px solid var(--verde);
  outline-offset: 3px;
  border-radius: 2px;
}

/* Botón hamburguesa (solo móvil) */
.menu-btn {
  display: none;
  width: 44px;
  height: 44px;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}
.menu-btn .barras,
.menu-btn .barras::before,
.menu-btn .barras::after {
  content: "";
  display: block;
  width: 22px;
  height: 2px;
  background: var(--tinta);
  transition: transform var(--rapido), opacity var(--rapido), translate var(--rapido);
}
.menu-btn .barras { position: relative; }
.menu-btn .barras::before { position: absolute; translate: 0 -7px; }
.menu-btn .barras::after  { position: absolute; translate: 0 7px; }

/* -------------------------------------------------------------
   5. FOOTER
   ------------------------------------------------------------- */
.site-footer {
  border-top: 1px solid var(--borde);
  padding-block: var(--esp-xl) var(--esp-l);
  color: var(--tinta-suave);
  font-size: var(--t-s);
}

.footer-grid {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 3fr) minmax(0, 4fr);
  gap: var(--esp-xl);
  margin-bottom: var(--esp-xl);
}

.footer-marca .brand { font-size: 1.75rem; }
.footer-claim {
  font-family: var(--fuente-titular);
  font-weight: 500;
  color: var(--tinta);
  margin-top: var(--esp-s);
}
.footer-contacto { margin-top: var(--esp-m); display: grid; gap: .375rem; }
.footer-contacto a { color: var(--tinta-suave); }
.footer-contacto a:hover { color: var(--verde); }

.footer-col h4 {
  font-family: var(--fuente-mono);
  font-weight: 500;
  font-size: var(--t-xs);
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--verde);
  margin-bottom: var(--esp-s);
}
.footer-col ul { list-style: none; padding: 0; display: grid; gap: .5rem; }
.footer-col a { color: var(--tinta-suave); text-decoration: none; }
.footer-col a:hover { color: var(--tinta); }

.footer-legal {
  border-top: 1px solid var(--borde);
  padding-top: var(--esp-m);
  display: flex;
  justify-content: space-between;
  gap: var(--esp-s);
  flex-wrap: wrap;
  font-family: var(--fuente-mono);
  font-size: var(--t-xs);
  letter-spacing: .04em;
}

/* -------------------------------------------------------------
   6. COMPONENTES
   ------------------------------------------------------------- */

/* --- Kicker / eyebrow: JetBrains Mono verde, mayúsculas ---------
   Convención de texto: — 01 · ESENCIA  (guión largo, número, punto medio) */
.kicker {
  display: block;
  font-family: var(--fuente-mono);
  font-weight: 500;
  font-size: var(--t-xs);
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--verde);
  margin-bottom: var(--esp-s);
}

/* Palabra clave en verde dentro de un titular blanco */
.acento { color: var(--verde); }

/* Párrafo destacado bajo titulares */
.lead {
  font-size: var(--t-lead);
  color: var(--tinta-suave);
  max-width: 58ch;
  text-wrap: pretty;
}

/* --- Botones ---------------------------------------------------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .5em;
  font-family: var(--fuente-titular);
  font-weight: 600;
  font-size: .9375rem;
  letter-spacing: .01em;
  line-height: 1;
  padding: .9em 1.7em;
  border-radius: var(--radio);
  border: 1px solid transparent;
  cursor: pointer;
  transition: background-color var(--rapido), border-color var(--rapido),
              color var(--rapido), transform var(--rapido);
}
.btn:active { transform: translateY(1px); }

/* Primario: verde sobre negro — la señal más fuerte de la página, usar UNA vez por vista */
.btn-primario {
  background: var(--verde);
  color: var(--negro);
}
.btn-primario:hover { background: var(--verde-claro); }

/* Secundario: borde sutil que se enciende */
.btn-secundario {
  background: transparent;
  color: var(--tinta);
  border-color: var(--humo);
}
.btn-secundario:hover {
  border-color: var(--verde);
  color: var(--verde);
}

/* Enlace con flecha (para tarjetas y CTAs de texto) */
.enlace-flecha {
  display: inline-flex;
  align-items: center;
  gap: .5em;
  font-family: var(--fuente-titular);
  font-weight: 600;
  font-size: .9375rem;
  color: var(--tinta);
}
.enlace-flecha::after {
  content: "→";
  color: var(--verde);
  transition: translate var(--rapido);
}
.enlace-flecha:hover { color: var(--verde); }
.enlace-flecha:hover::after { translate: .35em 0; }

/* --- Tarjetas --------------------------------------------------- */
.card {
  background: var(--superficie);
  border: 1px solid var(--borde);
  border-radius: var(--radio);
  padding: var(--esp-l);
  display: flex;
  flex-direction: column;
  gap: var(--esp-s);
  transition: border-color var(--medio), transform var(--medio), background-color var(--medio);
}
.card:hover {
  border-color: var(--verde-profundo);
  transform: translateY(-4px);
}
.card > .kicker { margin-bottom: 0; }
.card p { color: var(--tinta-suave); font-size: var(--t-s); flex-grow: 1; }
.card .enlace-flecha { margin-top: auto; }

/* Tarjeta-enlace completa: envolver la card en <a class="card card-link"> */
.card-link { color: inherit; }
.card-link:hover h3 { color: var(--verde); }
.card-link h3 { transition: color var(--rapido); }

/* Numeración mono en tarjetas de pilares/servicios: P.01, S.02… */
.card-num {
  font-family: var(--fuente-mono);
  font-weight: 500;
  font-size: var(--t-xs);
  letter-spacing: .18em;
  color: var(--verde);
}

/* --- Etiqueta técnica mono (stack, métricas) -------------------- */
.tag-mono {
  display: inline-block;
  font-family: var(--fuente-mono);
  font-weight: 400;
  font-size: var(--t-xs);
  letter-spacing: .06em;
  color: var(--tinta-suave);
  border: 1px solid var(--borde);
  border-radius: 4px;
  padding: .35em .75em;
  white-space: nowrap;
}
.tags { display: flex; flex-wrap: wrap; gap: .5rem; }

/* --- Hero ------------------------------------------------------- */
.hero {
  padding-block: clamp(5rem, 4rem + 8vw, 10rem) var(--esp-2xl);
  position: relative;
}
.hero h1 {
  font-size: var(--t-hero);
  max-width: 15ch;
}
.hero .lead { margin-top: var(--esp-m); }
.hero-acciones {
  display: flex;
  flex-wrap: wrap;
  gap: var(--esp-s);
  margin-top: var(--esp-l);
}

/* Marca de agua: X gigante en la esquina, casi invisible. Un solo
   gesto audaz por página — usar en el hero o en la franja CTA, no en ambos. */
.marca-x { position: relative; }
.marca-x::after {
  content: "x";
  position: absolute;
  right: -.12em;
  bottom: -.42em;
  z-index: -1;
  font-family: var(--fuente-titular);
  font-weight: 700;
  font-size: clamp(16rem, 34vw, 30rem);
  line-height: 1;
  color: rgba(126, 217, 87, .05); /* verde al 5%: presencia, no ruido */
  pointer-events: none;
  user-select: none;
}

/* --- Franja CTA ------------------------------------------------- */
.cta-banda {
  border-top: 1px solid var(--borde);
  padding-block: var(--esp-2xl);
  text-align: center;
  position: relative;
  overflow: hidden;
}
.cta-banda h2 { font-size: var(--t-1); max-width: 20ch; margin-inline: auto; }
.cta-banda .lead { margin-inline: auto; margin-top: var(--esp-s); }
.cta-banda .hero-acciones { justify-content: center; }

/* --- Lista con guión verde (características, casos) ------------- */
.lista-check {
  list-style: none;
  padding: 0;
  display: grid;
  gap: var(--esp-s);
}
.lista-check li {
  padding-left: 1.75rem;
  position: relative;
  color: var(--tinta-suave);
}
.lista-check li::before {
  content: "—";
  position: absolute;
  left: 0;
  color: var(--verde);
  font-weight: 600;
}
.lista-check li strong { color: var(--tinta); }

/* --- Ficha de datos técnicos en mono ---------------------------- */
.specs {
  list-style: none;
  padding: 0;
  font-family: var(--fuente-mono);
  font-size: var(--t-s);
  font-variant-numeric: tabular-nums;
}
.specs li {
  display: flex;
  justify-content: space-between;
  gap: var(--esp-s);
  padding-block: .8rem;
  border-top: 1px solid var(--borde);
}
.specs li:last-child { border-bottom: 1px solid var(--borde); }
.specs .k { color: var(--tinta-suave); letter-spacing: .04em; text-transform: uppercase; font-size: var(--t-xs); }
.specs .v { color: var(--verde-claro); text-align: right; }

/* --- Acordeón sin JS (details/summary) -------------------------- */
.acordeon {
  border-top: 1px solid var(--borde);
}
.acordeon:last-of-type { border-bottom: 1px solid var(--borde); }
.acordeon summary {
  cursor: pointer;
  list-style: none;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--esp-s);
  padding-block: var(--esp-m);
  font-family: var(--fuente-titular);
  font-weight: 600;
  transition: color var(--rapido);
}
.acordeon summary::-webkit-details-marker { display: none; }
.acordeon summary::after {
  content: "+";
  font-family: var(--fuente-mono);
  color: var(--verde);
  font-size: 1.25rem;
  transition: rotate var(--rapido);
}
.acordeon[open] summary::after { rotate: 45deg; }
.acordeon summary:hover { color: var(--verde); }
.acordeon .acordeon-cuerpo { padding-bottom: var(--esp-m); color: var(--tinta-suave); max-width: 62ch; }

/* -------------------------------------------------------------
   7. UTILIDADES
   ------------------------------------------------------------- */
.visualmente-oculto {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Enlace "saltar al contenido": primera cosa dentro de <body> */
.saltar {
  position: fixed;
  top: .75rem; left: .75rem;
  z-index: 200;
  background: var(--verde);
  color: var(--negro);
  font-family: var(--fuente-titular);
  font-weight: 600;
  padding: .6em 1em;
  border-radius: var(--radio);
  translate: 0 -300%;
  transition: translate var(--rapido);
}
.saltar:focus-visible { translate: 0 0; }

.texto-verde  { color: var(--verde); }
.texto-suave  { color: var(--tinta-suave); }
.texto-centro { text-align: center; }
.mono         { font-family: var(--fuente-mono); }

.mt-s  { margin-top: var(--esp-s); }
.mt-m  { margin-top: var(--esp-m); }
.mt-l  { margin-top: var(--esp-l); }
.mt-xl { margin-top: var(--esp-xl); }

/* -------------------------------------------------------------
   8. MEDIA QUERIES
   ------------------------------------------------------------- */
@media (max-width: 960px) {
  .grid-4 { grid-template-columns: repeat(2, 1fr); }
  .grid-3 { grid-template-columns: repeat(2, 1fr); }
  .dos-columnas { grid-template-columns: 1fr; gap: var(--esp-l); }
  .footer-grid { grid-template-columns: 1fr 1fr; }
  .footer-marca { grid-column: 1 / -1; }
}

@media (max-width: 720px) {
  :root { --alto-header: 64px; }

  .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; }
  .card { padding: var(--esp-m); }

  /* Menú móvil: el checkbox y la hamburguesa aparecen,
     el nav se convierte en panel desplegable bajo el header */
  .menu-check { display: block; }
  .menu-btn { display: flex; }

  .nav {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    background: var(--negro);
    border-bottom: 1px solid var(--borde);
    padding: var(--esp-s) clamp(1.25rem, 4vw, 2.5rem) var(--esp-m);
    opacity: 0;
    visibility: hidden;
    translate: 0 -.5rem;
    transition: opacity var(--rapido), translate var(--rapido), visibility var(--rapido);
  }
  .nav a {
    padding-block: .9rem;
    font-size: 1.0625rem;
    border-bottom: 1px solid var(--grafito);
  }
  .nav a:last-child { border-bottom: 0; }
  .nav a[aria-current="page"] {
    border-bottom: 1px solid var(--grafito);
    color: var(--verde);
  }

  .menu-check:checked ~ .nav {
    opacity: 1;
    visibility: visible;
    translate: 0 0;
  }

  /* Hamburguesa → X */
  .menu-check:checked ~ .menu-btn .barras { background: transparent; }
  .menu-check:checked ~ .menu-btn .barras::before { translate: 0 0; transform: rotate(45deg); }
  .menu-check:checked ~ .menu-btn .barras::after  { translate: 0 0; transform: rotate(-45deg); }

  .footer-grid { grid-template-columns: 1fr; gap: var(--esp-l); }
  .footer-legal { flex-direction: column; }
}

/* Bloquear el scroll del fondo con el menú abierto (mejora progresiva) */
@supports selector(:has(a)) {
  @media (max-width: 720px) {
    body:has(.menu-check:checked) { overflow: hidden; }
  }
}

/* -------------------------------------------------------------
   9. MOVIMIENTO
   ------------------------------------------------------------- */

/* Entrada del hero al cargar (sin JS): un solo revelado orquestado */
@keyframes aparecer {
  from { opacity: 0; translate: 0 1.25rem; }
  to   { opacity: 1; translate: 0 0; }
}
.hero .kicker,
.hero h1,
.hero .lead,
.hero .hero-acciones {
  animation: aparecer .7s var(--curva) backwards;
}
.hero h1              { animation-delay: .08s; }
.hero .lead           { animation-delay: .16s; }
.hero .hero-acciones  { animation-delay: .24s; }

/* Revelado al scroll de tarjetas: solo donde el navegador lo soporte */
@supports (animation-timeline: view()) {
  .grid > .card {
    animation: aparecer linear both;
    animation-timeline: view();
    animation-range: entry 0% entry 40%;
  }
}

/* Reduced motion: experiencia digna, no vacía — todo visible, nada se mueve */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .01ms !important; /* anula animaciones sin romper estados finales */
    animation-delay: 0s !important;
    transition-duration: .01ms !important;
  }
  /* Las animaciones ligadas a scroll ignoran animation-duration (el
     progreso lo dicta el timeline), así que se apagan explícitamente:
     las tarjetas quedan estáticas y visibles (estado final de `both`). */
  .grid > .card {
    animation: none !important;
    animation-timeline: auto !important;
  }
  .card:hover { transform: none; }
}

/* -------------------------------------------------------------
   10. CAPA CYBERPUNK — atmósfera CRT (CSS puro, cero JS)
   Disciplina: el negro sigue dominando; esto es textura y destello,
   nunca protagonismo. Rojo/cian existen SOLO dentro de los glitches
   ("Glitch only", como el branding de netxa.cl). Solo se anima
   transform/opacity. Todo se apaga bajo prefers-reduced-motion
   (bloque al final de esta sección).
   ------------------------------------------------------------- */

/* --- Overlay CRT: scanlines + viñeta ----------------------------
   Markup: <div class="scanlines" aria-hidden="true"></div>
   justo después del enlace .saltar, en TODAS las páginas.
   Capa estática (sin animación): se nota al fijarse, no molesta.
   z-index 150: sobre contenido y header (el "vidrio" del tubo cubre
   todo), bajo .saltar (200) para no tapar el foco de teclado. */
.scanlines {
  position: fixed;
  inset: 0;
  z-index: 150;
  pointer-events: none;
  background:
    /* viñeta leve: hunde apenas las esquinas, como pantalla curva */
    radial-gradient(ellipse at center, transparent 58%, rgba(0, 0, 0, .24) 100%),
    /* línea oscura (se ve sobre grafito/verde/texto) + línea clara
       (se ve sobre el negro puro): fila CRT de 3px */
    repeating-linear-gradient(
      to bottom,
      rgba(0, 0, 0, .14)        0    1px,
      rgba(253, 252, 250, .022) 1px  2px,
      transparent               2px  3px
    );
}

/* --- Glitch periódico del wordmark ------------------------------
   Markup (solo el brand del HEADER, no el del footer):
   <a class="brand glitch-marca" data-texto="netxa" …>
   Dos copias del texto en pseudo-elementos, invisibles el 98% de un
   ciclo de 7s; el destello dura ~140ms con steps(1) — se percibe
   como interferencia periódica, no como loop. En :hover el mismo
   keyframe corre en ciclo corto: glitch evidente y continuo. */
.glitch-marca { position: relative; }
.glitch-marca::before,
.glitch-marca::after {
  content: attr(data-texto);
  position: absolute;
  inset: 0;
  opacity: 0;
  pointer-events: none;
  user-select: none;
}
.glitch-marca::before {
  color: var(--glitch-rojo);
  clip-path: inset(10% 0 52% 0); /* franja superior */
  animation: glitch-rojo 7s steps(1, end) infinite;
}
.glitch-marca::after {
  color: var(--glitch-cian);
  clip-path: inset(56% 0 6% 0);  /* franja inferior */
  animation: glitch-cian 7s steps(1, end) infinite;
}
.glitch-marca:hover::before { animation: glitch-rojo 1.4s steps(1, end) infinite; }
.glitch-marca:hover::after  { animation: glitch-cian 1.4s steps(1, end) infinite; }

@keyframes glitch-rojo {
  0%, 91.4%   { opacity: 0; transform: translate(0, 0); }
  91.5%       { opacity: .85; transform: translate(-3px, 1px); }
  92.3%       { opacity: .85; transform: translate(2px, -1px); }
  93.4%, 100% { opacity: 0; transform: translate(0, 0); }
}
@keyframes glitch-cian {
  0%, 91.6%   { opacity: 0; transform: translate(0, 0); }
  91.7%       { opacity: .85; transform: translate(3px, -1px); }
  92.5%       { opacity: .85; transform: translate(-2px, 1px); }
  93.6%, 100% { opacity: 0; transform: translate(0, 0); }
}

/* --- Cursor de terminal en el kicker del hero -------------------
   Markup: … kicker</p> → … kicker <span class="cursor-terminal"
   aria-hidden="true">▍</span></p>
   Parpadeo duro con steps(1): encendido/apagado, sin fundido. */
.cursor-terminal {
  display: inline-block;
  color: var(--verde);
  user-select: none;
  animation: parpadeo 1.1s steps(1, end) infinite;
}
@keyframes parpadeo {
  0%, 49%   { opacity: 1; }
  50%, 100% { opacity: 0; }
}

/* --- Línea de barrido (scan) en el hero -------------------------
   Markup: <div class="linea-scan" aria-hidden="true"></div> como
   primer hijo de <section class="hero marca-x">. MÁXIMO una zona
   con barrido por página. El wrapper recorta (overflow) y la línea
   solo se mueve con transform; si el hero es más bajo que el
   recorrido, la línea sale del encuadre y "descansa" — a propósito. */
.linea-scan {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}
.linea-scan::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 2px;
  background: linear-gradient(90deg,
    transparent,
    rgba(126, 217, 87, .28) 18%,
    rgba(126, 217, 87, .28) 82%,
    transparent);
  box-shadow: 0 0 14px rgba(126, 217, 87, .16);
  opacity: 0;
  animation: barrido 11s linear infinite;
  will-change: transform;
}
@keyframes barrido {
  0%        { transform: translateY(-4px); opacity: 0; }
  4%        { opacity: .8; }
  46%       { opacity: .8; }
  55%, 100% { transform: translateY(82vh); opacity: 0; }
}

/* --- Micro-flicker de la marca de agua X ------------------------
   Neón viejo: opacidad plena casi todo el ciclo, dos flutters
   breves. Se percibe apenas — la X ya vive al 5% de alfa. */
.marca-x::after { animation: neon-x 9s linear infinite; }
@keyframes neon-x {
  0%, 41%, 100% { opacity: 1; }
  41.5%         { opacity: .55; }
  42%           { opacity: .9; }
  42.6%         { opacity: .6; }
  43.4%, 68%    { opacity: 1; }
  68.6%         { opacity: .7; }
  69.4%         { opacity: 1; }
}

/* --- Hover "encendido" de tarjetas-enlace -----------------------
   Sin markup extra: al entrar el cursor, un destello cromático de
   300ms (una sola vez, no loop) y el título queda con halo verde. */
.card-link:hover h3 {
  text-shadow: 0 0 16px rgba(126, 217, 87, .35);
  animation: destello-rgb .3s steps(1, end) 1;
}
@keyframes destello-rgb {
  0%   { text-shadow: -2px 0 var(--glitch-rojo), 2px 0 var(--glitch-cian); }
  45%  { text-shadow: 2px 0 var(--glitch-rojo), -2px 0 var(--glitch-cian); }
  100% { text-shadow: 0 0 16px rgba(126, 217, 87, .35); }
}

/* --- Reduced motion: la capa cyberpunk se apaga ENTERA ----------
   No basta el bloque general de la sección 9: estas animaciones son
   infinitas y con duración .01ms reiniciarían en bucle (repintado
   constante). Se anulan explícitamente y el contenido queda íntegro:
   cursor fijo visible, wordmark limpio, sin overlay ni barrido. */
@media (prefers-reduced-motion: reduce) {
  .scanlines,
  .linea-scan { display: none; }
  .glitch-marca::before,
  .glitch-marca::after {
    animation: none !important;
    opacity: 0 !important;
  }
  .cursor-terminal,
  .marca-x::after { animation: none !important; }
  .card-link:hover h3 {
    animation: none !important;
    text-shadow: none;
  }
}

/* -------------------------------------------------------------
   11. FONDOS DE HERO TEMÁTICOS (img/hero-*.svg)
   Un "plano técnico" vectorial por página: trazo fino verde sobre
   negro, retícula y rótulos mono. La ilustración vive en el tercio
   derecho y emerge del negro; el texto del hero se apoya SIEMPRE
   sobre negro puro (proporción 70/20/10 intacta: el fondo es
   atmósfera, no protagonista).

   Markup: <section class="hero hero-tema-<pagina>"> — SIN .marca-x:
   el fondo temático ES el gesto audaz del hero (dos motivos
   competirían, y la X con z-index:-1 quedaría además oculta tras el
   background). La .marca-x sigue disponible para otras zonas.

   Legibilidad con doble red: cada SVG trae su propio fundido a negro
   horneado (izquierda + bordes) y aquí se suma un velo en gradiente
   sobre la zona del texto. --velo-hero se redefine en móvil para
   pasar de velo lateral a velo vertical sin repetir las URLs. */
[class*="hero-tema-"] {
  --velo-hero:
    linear-gradient(180deg, rgba(0, 0, 0, .55) 0%, rgba(0, 0, 0, 0) 18%,
                    rgba(0, 0, 0, 0) 72%, var(--negro) 100%),
    linear-gradient(97deg, var(--negro) 0%, var(--negro) 34%,
                    rgba(0, 0, 0, .8) 54%, rgba(0, 0, 0, .35) 74%,
                    rgba(0, 0, 0, .08) 100%);
  background-color: var(--negro);
  background-image: var(--velo-hero); /* fallback si falta el SVG */
  background-repeat: no-repeat;
  background-position: center, center, right center;
  background-size: auto, auto, cover;
}

/* Ojo con la ruta: url() se resuelve desde css/, por eso ../img/.
   No se usa var() para las url(): su base de resolución es ambigua
   entre navegadores (hoja vs documento) y aquí no se arriesga. */
.hero-tema-index          { background-image: var(--velo-hero), url("../img/hero-index.svg"); }
.hero-tema-productos      { background-image: var(--velo-hero), url("../img/hero-productos.svg"); }
.hero-tema-contacto       { background-image: var(--velo-hero), url("../img/hero-contacto.svg"); }
.hero-tema-reservas       { background-image: var(--velo-hero), url("../img/hero-plugin-reservas.svg"); }
.hero-tema-plugin-karin   { background-image: var(--velo-hero), url("../img/hero-plugin-ley-karin.svg"); }
.hero-tema-rendicuentas   { background-image: var(--velo-hero), url("../img/hero-rendicuentas.svg"); }
.hero-tema-celebra        { background-image: var(--velo-hero), url("../img/hero-celebraconmigo.svg"); }
.hero-tema-canal-karin    { background-image: var(--velo-hero), url("../img/hero-canal-ley-karin.svg"); }

/* Móvil: el texto ocupa todo el ancho, así que el velo lateral no
   basta. Se recorta la ilustración a su zona de motivo (abajo a la
   derecha) y el velo pasa a ser vertical: negro arriba donde vive el
   texto, atmósfera tenue abajo, y cierre a negro en el borde. */
@media (max-width: 720px) {
  [class*="hero-tema-"] {
    --velo-hero:
      linear-gradient(180deg, var(--negro) 0%, rgba(0, 0, 0, .94) 38%,
                      rgba(0, 0, 0, .74) 64%, rgba(0, 0, 0, .45) 84%,
                      var(--negro) 100%),
      linear-gradient(90deg, rgba(0, 0, 0, .55) 0%, rgba(0, 0, 0, 0) 45%);
    background-position: center, center, right bottom;
  }
}
