/* ══════════════════════════════════════════════════════════════════════
   PORTAL COMUNA · SCROLL VIDEO INTRO
   ──────────────────────────────────────────────────────────────────────
   Hoja aditiva. No redefine ningun color, tipografia, layout ni breakpoint
   de landing.html: todo cuelga de selectores .sv-* o de clases que el JS
   pone en <html>. Si scroll-video.js no arranca, ninguna regla de estado
   aplica y la landing se ve exactamente como antes.

   Tres actos, todos gobernados por el scroll:
     I   el video scrubbeado (documentos flotando)
     II  el apagado: la escena se oscurece hasta negro absoluto
     III el sistema: horizonte, marca que vuela al nav, hero componiendose

   Clases de estado (las escribe scroll-video.js):
     html.sv-gsap      GSAP cargo y tomo el control del scroll
     html.sv-armed     la intro va a correr
     html.sv-revealed  el scroll ya paso el tramo final de la intro
   ══════════════════════════════════════════════════════════════════════ */


/* ══ 1 · SCROLL BEHAVIOR ═══════════════════════════════════════════════
   landing.html tenia html{scroll-behavior:smooth}, que rompe el manejo de
   posicion de ScrollTrigger (pin + scrub). Se quito de ahi y se repone aca
   SOLO cuando GSAP no esta disponible, para no perder el suavizado nativo
   en el camino de fallback. Con GSAP los anchors los maneja ScrollTo. */
html:not(.sv-gsap){scroll-behavior:smooth}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}


/* ══ 2 · #scroll-demo ══════════════════════════════════════════════════
   La CSS transition de .cs-header se sumaba al scrub de GSAP (doble
   suavizado = lag). Con GSAP activo la neutralizamos; el suavizado ahora
   lo da scrub. */
html.sv-gsap .cs-header{transition:none}


/* ══ 3 · ESTADO ARMADO ═════════════════════════════════════════════════
   Estado inicial de lo que la intro compone. Va en CSS y no en JS para que
   no haya flash: la hoja es bloqueante y se aplica antes del primer
   pintado. Solo toca opacity y transform. */

/* Canvas detras del body, para que el overscroll no muestre blanco. */
html.sv-armed{background:#04080f}

html.sv-armed nav{opacity:0;transform:translate3d(0,-101%,0);will-change:transform,opacity}
html.sv-armed .hero-bg{opacity:0;will-change:opacity,transform}
html.sv-armed .hero-badge,
html.sv-armed .hero h1,
html.sv-armed .hero-sub,
html.sv-armed .hero-actions,
html.sv-armed .hero-visual{opacity:0;will-change:transform,opacity}

/* Los flotantes fijos no pueden quedar sobre la escena. Se ocultan con
   opacity y los devuelve .sv-revealed usando la transicion propia de cada
   uno, sin que GSAP les toque el transform: asi su :hover sigue igual. */
html.sv-armed .wsp-float,
html.sv-armed #hx-chat-btn{opacity:0;pointer-events:none}
html.sv-armed .wsp-float{transition:transform .2s,opacity .45s ease}
html.sv-armed.sv-revealed .wsp-float,
html.sv-armed.sv-revealed #hx-chat-btn{opacity:1;pointer-events:auto}

/* Terminada la intro liberamos las capas de composicion. */
html.sv-revealed nav,
html.sv-revealed .hero-bg,
html.sv-revealed .hero-badge,
html.sv-revealed .hero h1,
html.sv-revealed .hero-sub,
html.sv-revealed .hero-actions,
html.sv-revealed .hero-visual{will-change:auto}


/* ══ 4 · CAPA DE INTRO ═════════════════════════════════════════════════
   La inyecta el JS dentro de .hero. z-index 4 la deja sobre .hero-content
   (z-2) y sobre .hero::before (z-1). Queda debajo de nav y flotantes, que
   son fixed y ya estan ocultos por el bloque anterior.
   Sin background propio: cuando .sv-dim se apaga, lo que asoma por detras
   es .hero-bg. Ese es el mecanismo del empalme. */
.sv-intro{
  position:absolute;top:0;left:0;width:100%;height:100vh;
  z-index:4;pointer-events:none;overflow:hidden;
}

/* ── ACTO I · el video ──
   .sv-stage existe aparte del <video> para poder escalar la escena sin
   pelear con object-fit. */
.sv-stage{position:absolute;inset:0;z-index:1;overflow:hidden;will-change:transform}
.sv-video{
  display:block;width:100%;height:100%;object-fit:cover;
  background:#e9ecef;
}

/* ── ACTO II · el apagado ──
   Del video al negro absoluto. Despues, al revertirse, es la puerta por la
   que aparece el hero. */
.sv-dim{position:absolute;inset:0;z-index:2;background:#04080f;opacity:0;will-change:opacity}

/* ── ACTO III · el sistema ── */

/* Horizonte: el primer destello. Centrado con margin auto (no con
   translate) para que GSAP disponga del transform completo. */
.sv-horizon{
  position:absolute;top:50%;left:0;right:0;
  margin:-1px auto 0;width:min(78vw,900px);height:2px;
  z-index:3;opacity:0;transform:scaleX(0);will-change:transform,opacity;
  background:linear-gradient(90deg,
    transparent,
    rgba(56,213,255,.85) 22%,
    #ffffff 50%,
    rgba(232,160,32,.85) 78%,
    transparent);
  box-shadow:0 0 30px 6px rgba(56,213,255,.30),0 0 90px 14px rgba(232,160,32,.15);
}

/* Bloom: el resplandor del que emerge la marca. */
.sv-bloom{
  position:absolute;inset:0;z-index:3;opacity:0;will-change:opacity,transform;
  background:radial-gradient(circle at 50% 46%,
    rgba(56,213,255,.30) 0%,
    rgba(232,160,32,.13) 26%,
    transparent 54%);
}

/* Marca: clon estructural exacto de .nav-logo (mismo gap, font-size,
   weight, letter-spacing y tamano de imagen) para que al aterrizar en
   escala 1 calce al pixel sobre el logo real del nav. */
.sv-mark{
  position:absolute;top:0;left:0;z-index:4;
  transform-origin:left top;will-change:transform,opacity,filter;
  display:flex;align-items:center;gap:10px;
  font-family:'Syne',sans-serif;font-weight:800;font-size:20px;letter-spacing:-.5px;
  color:#ffffff;white-space:nowrap;opacity:0;
}
.sv-mark img{height:42px;width:42px;object-fit:contain;display:block}
.sv-mark em{font-style:normal;color:#e8a020}

/* Lineas de arranque. */
.sv-boot{
  position:absolute;top:calc(50% + 78px);left:0;right:0;z-index:4;
  margin:0 auto;width:max-content;max-width:88vw;
  display:flex;flex-direction:column;gap:9px;
  font-family:ui-monospace,SFMono-Regular,'SF Mono',Menlo,Consolas,monospace;
  font-size:11px;letter-spacing:.16em;text-transform:uppercase;
  color:rgba(255,255,255,.48);
}
.sv-boot span{display:flex;align-items:center;gap:10px;opacity:0;will-change:transform,opacity}
.sv-boot b{
  width:14px;height:14px;border-radius:50%;flex-shrink:0;font-weight:400;font-size:8px;
  border:1px solid rgba(56,213,255,.45);color:#38d5ff;
  display:flex;align-items:center;justify-content:center;
}

/* Vineta: caida cinematografica en los bordes. */
.sv-vignette{
  position:absolute;inset:0;z-index:5;opacity:0;will-change:opacity;
  background:radial-gradient(ellipse at 50% 50%,
    transparent 38%,
    rgba(2,6,14,.55) 78%,
    rgba(2,6,14,.92) 100%);
}


/* ══ 5 · INDICADORES DE ACTO I ═════════════════════════════════════════
   Solo viven mientras se ve el video, que es una escena clara: por eso van
   en tinta oscura y no en blanco. */
.sv-rail{
  position:absolute;left:0;right:0;bottom:58px;z-index:4;opacity:0;
  margin:0 auto;width:min(240px,52vw);height:2px;border-radius:2px;
  background:rgba(15,39,68,.16);overflow:hidden;
}
.sv-rail i{
  display:block;height:100%;width:100%;border-radius:2px;
  transform:scaleX(0);transform-origin:left center;will-change:transform;
  background:linear-gradient(90deg,#38d5ff,#e8a020);
}

.sv-hint{
  position:absolute;left:0;right:0;bottom:22px;z-index:4;opacity:0;
  margin:0 auto;width:max-content;
  display:flex;flex-direction:column;align-items:center;gap:6px;
  font-family:'DM Sans',sans-serif;font-size:10px;font-weight:500;
  letter-spacing:.2em;text-transform:uppercase;color:rgba(15,39,68,.55);
}
.sv-hint svg{animation:svNudge 1.9s ease-in-out infinite}
@keyframes svNudge{0%,100%{transform:translateY(0);opacity:.45}50%{transform:translateY(5px);opacity:1}}


/* ══ 6 · BOTON DE SALTO ════════════════════════════════════════════════
   Fixed y fuera de .hero: es lo unico de la intro que recibe clicks.
   Pastilla oscura translucida para que se lea igual sobre la habitacion
   blanca del acto I y sobre el negro del acto III. */
.sv-skip{
  position:fixed;top:18px;right:18px;z-index:500;
  -webkit-appearance:none;appearance:none;cursor:pointer;
  border:1px solid rgba(255,255,255,.14);border-radius:999px;
  background:rgba(12,26,45,.55);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  color:rgba(255,255,255,.86);
  font-family:'DM Sans',sans-serif;font-size:10px;font-weight:500;
  letter-spacing:.16em;text-transform:uppercase;padding:9px 16px;
  transition:background .2s,color .2s,opacity .4s ease;
}
.sv-skip:hover{background:rgba(12,26,45,.78);color:#fff}
.sv-skip:focus-visible{outline:2px solid rgba(56,213,255,.7);outline-offset:3px}
html.sv-revealed .sv-skip{opacity:0;pointer-events:none}


/* ══ 7 · RESPONSIVE ════════════════════════════════════════════════════ */
@media(max-width:900px){
  .sv-boot{top:calc(50% + 62px);font-size:10px;letter-spacing:.12em;gap:8px}
  .sv-rail{bottom:50px}
  .sv-skip{top:14px;right:14px;padding:8px 14px}
  .sv-vignette{background:radial-gradient(ellipse at 50% 50%,transparent 30%,rgba(2,6,14,.60) 80%,rgba(2,6,14,.95) 100%)}
}


/* ══ 8 · ACCESIBILIDAD ═════════════════════════════════════════════════
   Con reduced-motion el JS ni arma la intro. Esto es la segunda linea de
   defensa por si la preferencia cambia con la pagina ya abierta. */
@media(prefers-reduced-motion:reduce){
  .sv-intro,.sv-skip{display:none!important}
  html.sv-armed nav,
  html.sv-armed .hero-bg,
  html.sv-armed .hero-badge,
  html.sv-armed .hero h1,
  html.sv-armed .hero-sub,
  html.sv-armed .hero-actions,
  html.sv-armed .hero-visual,
  html.sv-armed .wsp-float,
  html.sv-armed #hx-chat-btn{opacity:1!important;transform:none!important;pointer-events:auto!important}
}
