/* ============================================================================
   LAYOUT — Contenedor, secciones, fondo dinámico, header y footer.
   Es el esqueleto: define dónde van las cosas, no cómo se ven por dentro.
   ========================================================================== */

/* ---- Contenedor y secciones -------------------------------------------- */

.container {
  width: 100%;
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.section {
  position: relative;
  z-index: var(--z-content);
  padding-block: var(--section-y);
}

/* Sección con fondo apenas más claro, para separar bloques sin usar líneas. */
.section--tinted { background: rgba(10, 20, 36, 0.55); }

/* Encabezado de sección: eyebrow + título + bajada. Patrón repetido en todas. */
.section-head {
  max-width: 62ch;
  margin-bottom: var(--sp-7);
}
.section-head__title { margin-top: var(--sp-3); }
.section-head__sub {
  margin-top: var(--sp-4);
  color: var(--text-secondary);
  font-size: var(--fs-lg);
}

/* Centrada (la usamos en contacto) */
.section-head--center {
  margin-inline: auto;
  text-align: center;
}

/* ============================================================================
   FONDO DINÁMICO — Tres capas apiladas, todas fixed y no interactivas.
   Capa 1: grid en perspectiva  ·  Capa 2: orbes de glow  ·  Capa 3: canvas
   ========================================================================== */

.bg {
  position: fixed;
  inset: 0;
  z-index: var(--z-bg);
  pointer-events: none;   /* nunca debe robar clicks */
  overflow: hidden;
}

/* --- Capa 1: grid --------------------------------------------------------
   Dos gradientes lineales cruzados = grilla. La máscara la desvanece hacia
   abajo para que no compita con el contenido. */
.bg__grid {
  position: absolute;
  inset: -50% 0 0;
  background-image:
    linear-gradient(rgba(28, 231, 242, 0.055) 1px, transparent 1px),
    linear-gradient(90deg, rgba(28, 231, 242, 0.055) 1px, transparent 1px);
  background-size: 56px 56px;
  -webkit-mask-image: radial-gradient(ellipse 90% 55% at 50% 32%, #000 0%, transparent 100%);
  mask-image: radial-gradient(ellipse 90% 55% at 50% 32%, #000 0%, transparent 100%);
  animation: grid-drift 24s linear infinite;
}

/* Desplazamiento de exactamente un tile: el loop es invisible. */
@keyframes grid-drift {
  to { background-position: 56px 56px, 56px 56px; }
}

/* --- Capa 2: orbes de glow -----------------------------------------------
   Círculos con blur enorme que van a la deriva. Dan profundidad y color
   sin costo de render (son gradientes, no imágenes). */
.bg__orb {
  position: absolute;
  border-radius: 50%;
  filter: blur(90px);
  opacity: 0.55;
  will-change: transform;
}

.bg__orb--1 {
  width: 46vw; height: 46vw;
  min-width: 320px; min-height: 320px;
  top: -14vw; right: -8vw;
  background: radial-gradient(circle, rgba(28, 231, 242, 0.30) 0%, transparent 68%);
  animation: orb-drift-a 26s ease-in-out infinite alternate;
}

.bg__orb--2 {
  width: 40vw; height: 40vw;
  min-width: 280px; min-height: 280px;
  top: 38vh; left: -14vw;
  background: radial-gradient(circle, rgba(12, 108, 132, 0.42) 0%, transparent 70%);
  animation: orb-drift-b 32s ease-in-out infinite alternate;
}

.bg__orb--3 {
  width: 34vw; height: 34vw;
  min-width: 240px; min-height: 240px;
  bottom: -10vh; right: 14vw;
  background: radial-gradient(circle, rgba(28, 231, 242, 0.16) 0%, transparent 70%);
  animation: orb-drift-a 38s ease-in-out infinite alternate-reverse;
}

@keyframes orb-drift-a {
  from { transform: translate3d(0, 0, 0)        scale(1);    }
  to   { transform: translate3d(-6vw, 7vh, 0)   scale(1.14); }
}
@keyframes orb-drift-b {
  from { transform: translate3d(0, 0, 0)        scale(1);    }
  to   { transform: translate3d(7vw, -6vh, 0)   scale(1.1);  }
}

/* --- Capa 3: canvas de nodos ---------------------------------------------
   Lo dibuja js/modules/background.js. Guiño al circuito del logo.
   Se apaga solo en mobile y con prefers-reduced-motion (ver el módulo). */
.bg__canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0.75;
}

/* Viñeta: oscurece los bordes para que el contenido central respire. */
.bg__vignette {
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse 120% 80% at 50% 40%, transparent 40%, rgba(5, 11, 22, 0.85) 100%);
}

/* Con movimiento reducido, el fondo queda estático pero sigue viéndose. */
@media (prefers-reduced-motion: reduce) {
  .bg__grid,
  .bg__orb { animation: none; }
}

/* ============================================================================
   HEADER
   ========================================================================== */

.header {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: var(--z-header);
  height: var(--header-h);
  display: flex;
  align-items: center;
  transition: background var(--dur-med) var(--ease-soft),
              border-color var(--dur-med) var(--ease-soft),
              backdrop-filter var(--dur-med) var(--ease-soft);
  border-bottom: 1px solid transparent;
}

/* Al scrollear aparece el vidrio. Lo activa js/modules/nav.js */
.header.is-scrolled {
  background: rgba(5, 11, 22, 0.72);
  backdrop-filter: blur(var(--glass-blur));
  -webkit-backdrop-filter: blur(var(--glass-blur));
  border-bottom-color: var(--border-subtle);
}

.header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  width: 100%;
}

.header__logo { display: flex; align-items: center; }

/* --- Navegación ----------------------------------------------------------
   Mobile-first: por defecto es un panel desplegable a pantalla completa.
   A partir de 900px se convierte en una fila horizontal. */
.nav {
  position: fixed;
  inset: var(--header-h) 0 auto 0;
  display: grid;
  gap: var(--sp-1);
  padding: var(--sp-5) var(--gutter) var(--sp-6);
  background: rgba(5, 11, 22, 0.96);
  backdrop-filter: blur(var(--glass-blur));
  -webkit-backdrop-filter: blur(var(--glass-blur));
  border-bottom: 1px solid var(--border-subtle);

  /* Oculto por defecto: colapsado y sin recibir foco de teclado. */
  visibility: hidden;
  opacity: 0;
  transform: translateY(-12px);
  transition: opacity var(--dur-med) var(--ease-out),
              transform var(--dur-med) var(--ease-out),
              visibility var(--dur-med);
}

.nav.is-open {
  visibility: visible;
  opacity: 1;
  transform: translateY(0);
}

.nav__link {
  padding: var(--sp-3) var(--sp-2);
  color: var(--text-secondary);
  font-size: var(--fs-base);
  font-weight: 500;
  border-radius: var(--radius-sm);
  transition: color var(--dur-fast) var(--ease-soft);
}
.nav__link:hover { color: var(--text-primary); }

/* Link de la sección que se está viendo. Lo marca js/modules/nav.js */
.nav__link.is-active { color: var(--brand-cyan); }

/* El CTA del header sólo existe en desktop; en mobile vive dentro del panel.
   Va calificado con .header porque .btn define `display` y se carga después. */
.header .header__cta { display: none; }

/* --- Botón hamburguesa ---------------------------------------------------
   Tres barras que se transforman en X. Sin librerías. */
.burger {
  display: grid;
  place-content: center;
  gap: 5px;
  width: 44px; height: 44px;   /* área táctil mínima recomendada */
  margin-right: -10px;
}
.burger__bar {
  width: 22px; height: 2px;
  background: var(--text-primary);
  border-radius: 2px;
  transition: transform var(--dur-med) var(--ease-out),
              opacity var(--dur-fast) var(--ease-soft);
}
.burger.is-open .burger__bar:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.burger.is-open .burger__bar:nth-child(2) { opacity: 0; }
.burger.is-open .burger__bar:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* --- Desktop -------------------------------------------------------------- */
@media (min-width: 900px) {
  .nav {
    position: static;
    visibility: visible;
    opacity: 1;
    transform: none;
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    padding: 0;
    background: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    border: 0;
  }
  .nav__link { padding: var(--sp-2) var(--sp-4); font-size: var(--fs-sm); }
  .nav .nav__cta-mobile { display: none; }
  .header .header__cta { display: inline-flex; }
  .burger { display: none; }
}

/* ============================================================================
   FOOTER
   ========================================================================== */

.footer {
  position: relative;
  z-index: var(--z-content);
  padding-block: var(--sp-7) var(--sp-6);
  border-top: 1px solid var(--border-subtle);
  background: rgba(5, 11, 22, 0.6);
}

.footer__inner {
  display: grid;
  gap: var(--sp-6);
}

.footer__brand { max-width: 34ch; }
.footer__tagline {
  margin-top: var(--sp-4);
  color: var(--text-secondary);
  font-size: var(--fs-sm);
}

.footer__cols {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: var(--sp-6);
}

.footer__title {
  font-family: var(--font-display);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: var(--ls-wide);
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: var(--sp-4);
}

.footer__list { display: grid; gap: var(--sp-3); }
.footer__list a {
  color: var(--text-secondary);
  font-size: var(--fs-sm);
  transition: color var(--dur-fast) var(--ease-soft);
}
.footer__list a:hover { color: var(--brand-cyan); }

.footer__bottom {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-3);
  justify-content: space-between;
  align-items: center;
  margin-top: var(--sp-7);
  padding-top: var(--sp-5);
  border-top: 1px solid var(--border-subtle);
  color: var(--text-muted);
  font-size: var(--fs-xs);
}

@media (min-width: 800px) {
  .footer__inner {
    grid-template-columns: 1.4fr 2fr;
    gap: var(--sp-8);
  }
}
