/* BeyondFest 2026 — motion layer: pre-animation states, grain, reduced-motion resets.
   Initial states only apply once JS confirms motion is available (html.has-motion),
   so the page still reads correctly with JS disabled or GSAP blocked. */

.has-motion [data-reveal] {
  opacity: 0;
  transform: translateY(28px);
}

.has-motion [data-reveal-word] > .word {
  display: inline-block;
  overflow: hidden;
  vertical-align: top;
}

.has-motion [data-reveal-word] .word > span {
  display: inline-block;
  transform: translateY(105%);
}

.has-motion .hero__stage { opacity: 0; }

/* The arc starts undrawn. Without JS or GSAP the line is simply already there,
   which is why these sit behind .has-motion like everything else. */
.has-motion .act__line { transform: scaleY(0); }
.has-motion .act__node { opacity: 0; transform: scale(0.2); }

/* Film grain and vignette, purely decorative — and decoration must not eat the
   controls. The vignette used to start darkening at 55% of the radius and reach
   55% black in the corners, which put a ~27% black wash over the hero CTA in the
   bottom-left and knocked the cream fill down to roughly #BEBAB2. It now holds
   off until 80% and tops out at 30%, so it still closes the frame without
   dulling anything anyone has to press. */
.grain {
  position: fixed;
  inset: 0;
  z-index: 100;
  pointer-events: none;
  opacity: 0.045;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/></filter><rect width='160' height='160' filter='url(%23n)'/></svg>");
}

.vignette {
  position: fixed;
  inset: 0;
  z-index: 99;
  pointer-events: none;
  background: radial-gradient(circle at 50% 45%, transparent 80%, rgba(0, 0, 0, 0.3));
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .has-motion [data-reveal],
  .has-motion [data-reveal-word] .word > span,
  .has-motion .hero__stage,
  .has-motion .act__line,
  .has-motion .act__node { opacity: 1; transform: none; }
  .grain { display: none; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}
