/* ============================================================
   BAIGR — keyframes, reveal states and motion preferences.
   ============================================================ */

/* Elements revealed by GSAP start hidden; a no-JS fallback
   (html:not(.js)) keeps everything visible without JavaScript. */
html.js .reveal,
html.js [data-hero-fade],
html.js .wr { opacity: 0; }
html.js .reveal { will-change: transform; }

/* SplitText word masks */
.wr-word { will-change: transform; }

/* ---------- Keyframes ---------- */
@keyframes sheen {
  0%, 100% { background-position: 0% 50%; }
  50% { background-position: 100% 50%; }
}

@keyframes marquee {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

@keyframes pulse-ring {
  0% { transform: scale(1); opacity: 0.55; }
  80%, 100% { transform: scale(1.9); opacity: 0; }
}

@keyframes float {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-14px); }
}

@keyframes scroll-line {
  0% { transform: translateY(-100%); }
  100% { transform: translateY(200%); }
}

@keyframes field-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes grain-shift {
  0% { transform: translate(0, 0); }
  20% { transform: translate(-4%, 3%); }
  40% { transform: translate(3%, -5%); }
  60% { transform: translate(-2%, -3%); }
  80% { transform: translate(4%, 2%); }
  100% { transform: translate(0, 0); }
}

.hero__field.is-ready { animation: field-in 1.6s ease-out; }

/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion: reduce) {
  .grain::after,
  .marquee__row,
  .text-gradient-ember,
  .scroll-hint__track span,
  .pulse-dot span:first-child,
  .wa-float__ring {
    animation: none !important;
  }
  html.js .reveal,
  html.js [data-hero-fade],
  html.js .wr {
    opacity: 1;
  }
  *, *::before, *::after {
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}
