/* ==========================================================================
   GSAP.CSS — pre-animation states
   These classes hide elements before GSAP takes over. A `.no-js` fallback
   on <html> guarantees content is visible if scripts fail.
   ========================================================================== */

.js .anim-up    { opacity: 0; transform: translateY(38px); }
.js .anim-fade  { opacity: 0; }
.js .anim-scale { opacity: 0; transform: scale(.94); }
.js .anim-blur  { opacity: 0; filter: blur(14px); }
.js .anim-clip  { clip-path: inset(0 0 100% 0); }
.js .anim-line  { transform: scaleX(0); transform-origin: left; }
.js .split-line { overflow: hidden; }

/* Once GSAP has run, it writes inline styles; these are just the resting states. */
.js .is-revealed { opacity: 1 !important; transform: none !important; filter: none !important; clip-path: none !important; }

/* No-JS and reduced-motion safety net */
.no-js .anim-up, .no-js .anim-fade, .no-js .anim-scale, .no-js .anim-blur,
.no-js .anim-clip, .no-js .anim-line { opacity: 1; transform: none; filter: none; clip-path: none; }
.no-js .intro { display: none; }

@media (prefers-reduced-motion: reduce) {
  .js .anim-up, .js .anim-fade, .js .anim-scale, .js .anim-blur, .js .anim-clip, .js .anim-line {
    opacity: 1 !important; transform: none !important; filter: none !important; clip-path: none !important;
  }
}
