/* ==========================================================================
   Keyframes, intro states and reduced-motion rules.
   Scroll-driven motion is handled by GSAP in js/animations.js; nothing here
   hides content unless JavaScript has confirmed it will reveal it again.
   ========================================================================== */

/* Hero copy is held back only until GSAP prepares the intro (see <head>). */
.intro-pending .intro__title .line__inner { transform: translateY(110%); }

.intro-pending .site-header__inner { opacity: 0; }

@keyframes scroll-cue {
  0%   { transform: translateY(-100%); }
  60%  { transform: translateY(300%); }
  100% { transform: translateY(300%); }
}
.scroll-cue__track span { animation: scroll-cue 2.4s var(--ease-inout) infinite; }

@keyframes fan-windmill { to { transform: rotate(360deg); } }
.fan-rotor {
  transform-box: view-box;
  transform-origin: 50% 50%;
  animation: fan-windmill 18s linear infinite;
}

@keyframes pulse-ring {
  0%   { box-shadow: 0 0 0 0 rgba(29, 78, 137, 0.35); }
  70%  { box-shadow: 0 0 0 10px rgba(29, 78, 137, 0); }
  100% { box-shadow: 0 0 0 0 rgba(29, 78, 137, 0); }
}
.status-pill__dot,
.tl-stage.is-current .tl-stage__node { animation: pulse-ring 2.6s var(--ease-out) infinite; }

@keyframes loader-sweep {
  from { transform: translateX(-100%); }
  to   { transform: translateX(100%); }
}

/* --------------------------------------------------------- Reduced motion */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  .fan-rotor, .scroll-cue__track span { animation: none !important; }
}
