/* ============================================================
   BRAND JUNGLE — RONDA 40
   Responsive real (una sola escalera: phone ≤719 · tablet
   720–1023 · desktop ≥1024), hero con sendero medido por JS y
   menú a pantalla completa en tablet y móvil.

   Se carga la última en el <head>, después de round39.css.
   round36/37/38/39 quedan congelados. Gana por orden de cascada
   con especificidad igual o mayor; nada de !important salvo
   donde una capa anterior ya lo usaba.

   El JS de esta ronda vive en viewport40.js (se carga primero)
   y round40.js (se carga el último).
   ============================================================ */


/* ------------------------------------------------------------
   0 · TOKENS Y ESCALERA
   Los valores de --dvh / --header-h / --dock-h son defaults
   pre-JS: viewport40.js los reescribe con la medida real.
------------------------------------------------------------ */
:root {
  --dvh: 100vh;
  --dock-h: 64px;
  --hero-aurora-blur: 64px;
  --eco-ratio: 4.2;
  --eco-overlap: clamp(-6rem, -5.5vw, -2rem);
  --fs-poster-40: clamp(3.25rem, 1rem + 11.5vw, 10.5rem);
}

@supports (height: 100dvh) {
  :root { --dvh: 100dvh; }
}

@media (min-width: 720px) and (max-width: 1023px) {
  :root {
    --hero-aurora-blur: 40px;
    --eco-ratio: 1.85;
    --eco-overlap: -1.25rem;
  }
}

@media (max-width: 719px) {
  :root {
    --hero-aurora-blur: 28px;
    --eco-ratio: 0.72;
    --eco-overlap: clamp(1rem, 4vw, 2rem);
  }
}

/* Scroll lock compartido (lo pone/quita BJ.viewport.lockScroll) */
body.bj-locked {
  position: fixed;
  left: 0;
  right: 0;
  width: 100%;
  overflow: hidden;
}


/* ------------------------------------------------------------
   1 · HEADER — la píldora, una sola escalera
------------------------------------------------------------ */
@media (max-width: 1023px) {
  /* Antes: calc(100% - 100px) repetido en tres hojas */
  .site-header .nav {
    width: min(var(--container), 100% - 2 * var(--gutter));
    padding-right: 0.75rem;
  }

  /* El CTA vive dentro del panel: el burger es lo último de la barra */
  .site-header .nav-toggle {
    display: flex;
    margin-left: auto;
    margin-right: 0;
  }

  /* Mientras el menú está abierto, el header se clava arriba: con el
     body bloqueado (position:fixed) un sticky se iría fuera de pantalla */
  .site-header.menu-open {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 120; /* por encima del dock (90) y del chat (91) */
    background: transparent;
    border-bottom-color: transparent;
  }

  /* backdrop-filter crea contexto de contención para position:fixed:
     con él puesto, el panel quedaría recortado a la píldora. Se quita
     mientras el menú está abierto o cerrándose (.menu-anim). Si otra
     capa vuelve a poner filter/transform en .nav o .site-header, el
     panel se recorta: esta es la regla que hay que respetar. */
  .site-header.menu-open .nav,
  .site-header.menu-anim .nav {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    background: rgba(12, 15, 1, 0.62);
    border-color: rgba(250, 251, 248, 0.16);
  }

  /* El panel viene después del burger en el DOM: sin esto lo taparía */
  .site-header.menu-open .wordmark,
  .site-header.menu-open .nav-toggle {
    position: relative;
    z-index: 2;
  }
}


/* ------------------------------------------------------------
   2 · MENÚ RAÍZ — pantalla completa en tablet y móvil
   Nace del burger (clip-path circular) y las raíces se dibujan
   desde esa esquina. En desktop no aplica nada de esto: la
   píldora conserva los enlaces en línea.
------------------------------------------------------------ */
@media (max-width: 1023px) {
  .site-header .nav-menu {
    position: fixed;
    inset: 0;
    top: 0;
    left: 0;
    right: 0;
    bottom: auto;
    height: var(--dvh);
    z-index: 1;
    display: flex;
    flex: none;
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    gap: 0;
    margin: 0;
    padding: calc(var(--header-h) + 1.25rem) var(--gutter) calc(1.5rem + env(safe-area-inset-bottom, 0px));
    border: 0;
    border-radius: 0;
    box-shadow: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    overflow-y: auto;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
    color: var(--c-platinum);
    background:
      radial-gradient(56% 36% at 88% 6%, rgba(169, 220, 92, 0.30) 0%, rgba(169, 220, 92, 0) 72%),
      radial-gradient(70% 48% at 8% 100%, rgba(156, 176, 1, 0.20) 0%, rgba(156, 176, 1, 0) 70%),
      linear-gradient(180deg, #151a02 0%, #0c0f01 100%);
    clip-path: circle(0px at var(--menu-x, calc(100% - 2.75rem)) var(--menu-y, 2.75rem));
    visibility: hidden;
    pointer-events: none;
    transition: clip-path 480ms cubic-bezier(0.4, 0, 0.2, 1), visibility 0s linear 480ms;
  }

  .site-header.menu-open .nav-menu {
    clip-path: circle(150% at var(--menu-x, calc(100% - 2.75rem)) var(--menu-y, 2.75rem));
    visibility: visible;
    pointer-events: auto;
    transition: clip-path 780ms cubic-bezier(0.2, 0.8, 0.2, 1), visibility 0s;
  }

  /* Raíces: trazos que nacen en la esquina del burger */
  .nav-roots {
    position: absolute;
    inset: 0;
    z-index: 0;
    overflow: hidden;
    pointer-events: none;
  }

  .nav-roots svg {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    display: block;
  }

  .nav-roots path {
    fill: none;
    stroke: rgba(169, 220, 92, 0.30);
    stroke-width: 1.2;
    stroke-linecap: round;
    vector-effect: non-scaling-stroke;
    stroke-dasharray: 1;
    stroke-dashoffset: 1;
    transition: stroke-dashoffset 1200ms var(--ease-out) calc(160ms + var(--i, 0) * 90ms);
  }

  .nav-roots path.nav-root--soft {
    stroke: rgba(169, 220, 92, 0.07);
    stroke-width: 7;
  }

  .site-header.menu-open .nav-roots path { stroke-dashoffset: 0; }

  /* Enlaces: itálica editorial numerada, escalonada */
  .site-header .nav-menu .nav-links {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    gap: 0;
    margin: auto 0 0;
    padding: 0;
    list-style: none;
    counter-reset: navidx;
  }

  .site-header .nav-menu .nav-links li {
    counter-increment: navidx;
    opacity: 0;
    transform: translateY(18px);
    transition: opacity 420ms ease calc(180ms + var(--i, 0) * 60ms),
                transform 640ms var(--ease-out) calc(180ms + var(--i, 0) * 60ms);
  }

  .site-header .nav-menu .nav-links li:nth-child(1) { --i: 0; }
  .site-header .nav-menu .nav-links li:nth-child(2) { --i: 1; }
  .site-header .nav-menu .nav-links li:nth-child(3) { --i: 2; }
  .site-header .nav-menu .nav-links li:nth-child(4) { --i: 3; }
  .site-header .nav-menu .nav-links li:nth-child(5) { --i: 4; }

  .site-header.menu-open .nav-menu .nav-links li {
    opacity: 1;
    transform: none;
  }

  .site-header .nav-menu .nav-links a {
    display: flex;
    align-items: baseline;
    gap: 0.875rem;
    padding: clamp(0.5rem, 1.5vh, 0.85rem) 0;
    font-family: var(--f-display);
    font-style: italic;
    font-weight: 400;
    font-size: clamp(2rem, 1.1rem + 4vw, 3.25rem);
    line-height: 1.1;
    color: var(--c-platinum);
    text-decoration: none;
    border-bottom: 1px solid rgba(250, 251, 248, 0.10);
    transition: color 200ms ease, transform 320ms var(--ease-out);
  }

  .site-header .nav-menu .nav-links a::before {
    content: counter(navidx, decimal-leading-zero);
    flex: none;
    font-family: var(--f-ui);
    font-style: normal;
    font-weight: 500;
    font-size: 0.6875rem;
    letter-spacing: 0.16em;
    color: var(--c-litoria-hi, #a9dc5c);
    opacity: 0.85;
    transform: translateY(-0.35em);
  }

  .site-header .nav-menu .nav-links a::after { content: none; }

  .site-header .nav-menu .nav-links a:hover,
  .site-header .nav-menu .nav-links a:focus-visible {
    color: var(--c-chartreuse);
    transform: translateX(6px);
    outline: none;
  }

  .site-header .nav-menu .nav-links li:last-child a { border-bottom: 1px solid rgba(250, 251, 248, 0.10); }

  /* CTA */
  .site-header .nav-menu .btn-nav {
    position: relative;
    z-index: 1;
    align-self: stretch;
    justify-content: center;
    margin: 1.5rem 0 auto;
    padding: 1rem 1.5rem;
    font-size: 1rem;
    border-radius: var(--radius-pill);
    opacity: 0;
    transform: translateY(18px);
    transition: opacity 420ms ease 520ms, transform 640ms var(--ease-out) 520ms;
  }

  .site-header.menu-open .nav-menu .btn-nav {
    opacity: 1;
    transform: none;
  }

  .site-header .nav-menu .btn-nav .btn-icon { width: 18px; height: 18px; }

  /* Pie: lema + idioma */
  .nav-menu-foot {
    position: relative;
    z-index: 1;
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 1rem;
    margin: 1.5rem 0 0;
    padding-top: 1rem;
    border-top: 1px solid rgba(250, 251, 248, 0.10);
    font-family: var(--f-ui);
    font-size: 0.6875rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--tx-3, rgba(250, 251, 248, 0.52));
    opacity: 0;
    transition: opacity 420ms ease 640ms;
  }

  .site-header.menu-open .nav-menu-foot { opacity: 1; }

  .nav-menu-foot a {
    color: var(--c-platinum);
    text-decoration: none;
    border-bottom: 1px solid rgba(250, 251, 248, 0.28);
    padding-bottom: 2px;
  }

  .nav-menu-foot a:hover { color: var(--c-chartreuse); border-color: var(--c-chartreuse); }
}

/* Tablet: el panel se lee mejor en una columna centrada */
@media (min-width: 720px) and (max-width: 1023px) {
  .site-header .nav-menu > .nav-links,
  .site-header .nav-menu > .btn-nav,
  .site-header .nav-menu > .nav-menu-foot {
    width: min(100%, 680px);
    margin-inline: auto;
  }

  .site-header .nav-menu .btn-nav { align-self: center; min-width: 320px; }
}

/* Desktop: nada de esto existe */
@media (min-width: 1024px) {
  .nav-roots,
  .nav-menu-foot { display: none; }
}

/* Desktop estrecho (1024–1199): cinco enlaces + CTA en una píldora de
   ~950px se partían en dos líneas */
@media (min-width: 1024px) and (max-width: 1199px) {
  .site-header .nav { gap: 1rem; }
  .site-header .nav-menu { gap: 1rem; }
  .site-header .nav-links { gap: 1.125rem; margin-inline: 0 auto; }
  .site-header .nav-links a { white-space: nowrap; font-size: 0.8125rem; }
  .site-header .btn-nav { white-space: nowrap; }
}

@media (prefers-reduced-motion: reduce) {
  .site-header .nav-menu {
    clip-path: none;
    opacity: 0;
    transition: opacity 160ms ease, visibility 0s linear 160ms;
  }
  .site-header.menu-open .nav-menu { opacity: 1; transition: opacity 160ms ease, visibility 0s; }
  .nav-roots path { stroke-dashoffset: 0; transition: none; }
  .site-header .nav-menu .nav-links li,
  .site-header .nav-menu .btn-nav,
  .nav-menu-foot { transition: none; }
}


/* ------------------------------------------------------------
   3 · HERO — póster + sendero medido
   La geometría (curva, nodos, etiquetas) la escribe round40.js
   a partir del tamaño real de .eco-map. Aquí sólo vive lo que
   no depende de medir: proporción de la caja por tier,
   tipografía y la máquina de estados.
------------------------------------------------------------ */
.hero { --hero-ink-mute: rgba(250, 251, 248, 0.90); }

.hero .hero-stage { margin-top: clamp(0.75rem, 2vh, 1.5rem); }

/* Póster: grotesk arriba, itálica serif en chartreuse abajo — el mismo
   gesto editorial de los h2 ("Human judgement. Machine speed.") */
.hero .poster-item {
  font-size: var(--fs-poster-40);
  line-height: 0.9;
  letter-spacing: -0.035em;
}

.hero .poster-line:nth-child(2) {
  text-transform: none;
  padding-bottom: 0.2em;
  margin-bottom: -0.2em;
}

.hero .poster-line:nth-child(2) .poster-line-inner {
  font-family: var(--f-display);
  font-style: italic;
  font-weight: 400;
  font-size: 0.94em;
  letter-spacing: -0.015em;
  color: var(--c-chartreuse);
  padding-right: 0.08em;
}

/* ---- La caja del mapa: proporción por tier, altura conocida sin JS ---- */
.hero .eco-map {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: 100%;
  margin: var(--eco-overlap) 0 0;
  padding: 0;
  aspect-ratio: var(--eco-ratio);
  min-height: 0;
  overflow: visible;
}

.hero .eco-map .eco-map-svg {
  display: block;
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  overflow: visible;
}

/* Antes del primer cálculo el SVG trae la curva vieja: no se enseña */
html.js .hero .eco-map .eco-map-svg,
html.js .hero .eco-map .eco-list {
  opacity: 0;
  transition: opacity 320ms ease;
}

html.js .hero .eco-map.is-laid .eco-map-svg,
html.js .hero .eco-map.is-laid .eco-list { opacity: 1; }

/* ---- Trazo ---- */
.hero .eco-curve-casing { stroke: rgba(12, 15, 1, 0.55); stroke-width: 10; }
.hero .eco-curve { stroke: rgba(250, 251, 248, 0.22); stroke-width: 2; }
.hero .eco-glow-mid { stroke: var(--c-litoria-hi, #a9dc5c); stroke-width: 3; }
.hero .eco-glow-wide { stroke: var(--c-chartreuse); stroke-width: 9; }

/* La curva del JS termina en el último nodo: se dibuja entera (antes se
   truncaba a 0.881 para no pasar bajo ANALYTICS) */
.hero .eco-curve,
.hero .eco-curve-casing { stroke-dasharray: 1 1; }

html.js .hero .eco-curve,
html.js .hero .eco-curve-casing {
  stroke-dasharray: 1 1;
  stroke-dashoffset: 1;
}

html.js .hero .eco-map.is-drawn .eco-curve,
html.js .hero .eco-map.is-drawn .eco-curve-casing { stroke-dashoffset: 0; }

/* ---- Máquina de estados sobre fracciones medidas ----
   --f0..--f3 las escribe round40.js. Los defaults son la geometría vieja
   para que el fallback sin JS siga animando. --tip = 0.07 − f: la luz
   llega al nodo y se acaba (criterio de luxe.css §8). */
.hero .eco-map { --f0: 0.122; --f1: 0.375; --f2: 0.627; --f3: 0.880; }

.hero .eco-map[data-active="zero"] {
  --grow: calc(1 - var(--f0));
  --tip: calc(0.07 - var(--f0));
  --pf: calc(var(--f0) * 100%);
}
.hero .eco-map[data-active="unseen"] {
  --grow: calc(1 - var(--f1));
  --tip: calc(0.07 - var(--f1));
  --pf: calc(var(--f1) * 100%);
}
.hero .eco-map[data-active="activate"] {
  --grow: calc(1 - var(--f2));
  --tip: calc(0.07 - var(--f2));
  --pf: calc(var(--f2) * 100%);
}
.hero .eco-map[data-active="chaos"] {
  --grow: calc(1 - var(--f3));
  --tip: calc(0.07 - var(--f3));
  --pf: calc(var(--f3) * 100%);
}

/* ---- Nodos: sin cadenas de drop-shadow (re-rasterizaban cada frame) ---- */
.hero .eco-node .node-dot,
.hero .eco-map[data-active] .eco-node[data-situation] .node-dot { filter: none; }

.hero .node-halo { fill: rgba(12, 15, 1, 0.72); }
.hero .node-dot { fill: rgba(250, 251, 248, 0.62); stroke: rgba(12, 15, 1, 0.9); stroke-width: 2; }

/* El nodo activo: anillo más grande y más luz, dot en verde vivo */
.hero .eco-map[data-active="zero"] .eco-node[data-situation="zero"] .node-ring,
.hero .eco-map[data-active="unseen"] .eco-node[data-situation="unseen"] .node-ring,
.hero .eco-map[data-active="activate"] .eco-node[data-situation="activate"] .node-ring,
.hero .eco-map[data-active="chaos"] .eco-node[data-situation="chaos"] .node-ring {
  opacity: 0.85;
  transform: scale(1.3);
}

/* Glow del trazo: un solo filtro SVG y sólo en desktop */
html.js .hero .eco-map.is-drawn .eco-glow-mid { filter: none; opacity: 1; }
html[data-tier="desktop"].js .hero .eco-map.is-drawn .eco-glow-mid { filter: url(#bj-trail-glow); }
html.js .hero .eco-map.is-drawn .eco-glow-wide { opacity: 0.55; }

/* ---- Etiquetas: HTML real, las coloca el JS junto a su nodo ---- */
.hero .eco-map .eco-list {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: block;
  width: auto;
  height: auto;
  min-height: 0;
  margin: 0;
  padding: 0;
  overflow: visible;
  clip: auto;
  white-space: normal;
  list-style: none;
  border: 0;
}

.hero .eco-map .eco-list::before,
.hero .eco-map .eco-list > li::before {
  content: none;
  display: none;
}

.hero .eco-map .eco-list > li {
  position: absolute;
  margin: 0;
  padding: 0;
  max-width: min(46%, 15rem);
  text-align: left;
  cursor: pointer;
  opacity: 0;
  transform: translateY(6px);
  transition: opacity 520ms var(--ease-out) var(--pop-delay, 0s),
              transform 520ms var(--ease-out) var(--pop-delay, 0s);
}

html:not(.js) .hero .eco-map .eco-list > li { opacity: 1; transform: none; }
.hero .eco-map.is-drawn .eco-list > li { opacity: 1; transform: none; }

.hero .eco-map .eco-list > li[data-situation="zero"]     { --pop-delay: 0.30s; }
.hero .eco-map .eco-list > li[data-situation="unseen"]   { --pop-delay: 0.60s; }
.hero .eco-map .eco-list > li[data-situation="activate"] { --pop-delay: 0.90s; }
.hero .eco-map .eco-list > li[data-situation="chaos"]    { --pop-delay: 1.20s; }

.hero .eco-map .eco-list > li.is-left { text-align: right; }
.hero .eco-map .eco-list > li.is-right { text-align: left; }
.hero .eco-map .eco-list > li.is-below { text-align: center; }

.hero .eco-map .eco-list > li b {
  display: block;
  font-family: var(--f-ui);
  font-size: clamp(0.6875rem, 0.62rem + 0.3vw, 0.8125rem);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  line-height: 1.25;
  color: var(--hero-ink-mute);
  text-shadow: none;
  transition: color var(--dur-fast) ease;
}

.hero .eco-map .eco-list > li > span {
  display: block;
  margin-top: 0.2rem;
  font-family: var(--f-display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(0.9375rem, 0.85rem + 0.4vw, 1.125rem);
  line-height: 1.25;
  color: rgba(250, 251, 248, 0.72);
  text-shadow: none;
}

.hero .eco-map[data-active="zero"] .eco-list > li[data-situation="zero"] b,
.hero .eco-map[data-active="unseen"] .eco-list > li[data-situation="unseen"] b,
.hero .eco-map[data-active="activate"] .eco-list > li[data-situation="activate"] b,
.hero .eco-map[data-active="chaos"] .eco-list > li[data-situation="chaos"] b { color: var(--c-chartreuse); }

/* La línea de satélites sólo existe en texto fuera de desktop, y sólo
   en la etapa del ecosistema (en desktop la dibuja el SVG) */
.hero .eco-map .eco-list li .eco-sats { display: none; }

@media (max-width: 1023px) {
  .hero .eco-map[data-active="chaos"] .eco-list li .eco-sats {
    display: block;
    position: static;
    margin-top: 0.4rem;
    font-family: var(--f-ui);
    font-style: normal;
    font-size: 0.5625rem;
    letter-spacing: 0.06em;
    line-height: 1.35;
    text-transform: uppercase;
    color: rgba(250, 251, 248, 0.62);
  }

  .hero .eco-sats-svg { display: none; }

  html.js .hero .eco-map.is-drawn .eco-pulse { display: none; }
}

/* El caption de satélites (desktop) se cuelga fuera del flujo para que
   la caja del mapa sólo dependa de su proporción */
.hero .eco-sats-caption {
  position: absolute;
  right: 0;
  top: 100%;
  margin: 0.5rem 0 0;
}

/* ---- Contador + subtítulo ---- */
.hero .hero-meta {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  gap: 1.25rem;
  max-width: 640px;
  margin: clamp(1.25rem, 3vh, 2rem) auto 0;
}

.hero .hero-counter {
  flex: none;
  font-family: var(--f-display);
  font-style: italic;
  font-size: 1rem;
  line-height: 1;
  color: rgba(250, 251, 248, 0.6);
}

.hero .hero-counter em {
  display: inline-flex;
  align-items: baseline;
  gap: 0.1em;
  font-style: italic;
}

.hero .hero-counter #hero-counter-num {
  font-size: 2.6em;
  line-height: 0.85;
  color: var(--c-chartreuse);
}

/* ---- Chips: sin cristal fuera de desktop ---- */
@media (max-width: 1023px) {
  .hero .qualifier-chip {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    background: rgba(12, 15, 1, 0.55);
  }

  .hero .qualifier { --journey-glass-bg: rgba(18, 22, 3, 0.95); }
  .hero .journey-panel {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}

@media (min-width: 720px) and (max-width: 1023px) {
  .hero .qualifier:not(.is-split) .qualifier-chips { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 719px) {
  .hero .hero-meta {
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    text-align: center;
  }
}

/* ---- Aurora del hero: menos desenfoque fuera de desktop y pausa
   cuando el hero sale de pantalla (round40.js pone .is-offscreen) ---- */
.bj-topfield > .hero::before { filter: blur(var(--hero-aurora-blur)) saturate(1.3); }

.bj-topfield > .hero.is-offscreen::before,
.bj-topfield > .hero.is-offscreen::after { animation-play-state: paused; }

@media (prefers-reduced-motion: reduce) {
  .hero .eco-map .eco-list > li { transition: none; }
  html.js .hero .eco-map .eco-map-svg,
  html.js .hero .eco-map .eco-list { transition: none; }
}
