/* ===================================================================
   ANIMATION UTILITIES — used by animations.js (GSAP ScrollTrigger)
   Base state is set here; JS animates to revealed state.
   =================================================================== */

.reveal{
  opacity: 0;
  transform: translateY(36px);
}
.reveal.is-ready{
  transition: opacity var(--dur-cinematic) var(--ease-cinematic), transform var(--dur-cinematic) var(--ease-cinematic);
}
.reveal.is-visible{
  opacity: 1;
  transform: none;
}

.reveal-clip{
  clip-path: inset(0 0 100% 0);
}
.reveal-clip.is-ready{ transition: clip-path 950ms var(--ease-cinematic); }
.reveal-clip.is-visible{ clip-path: inset(0 0 0% 0); }

.reveal-scale img{
  transform: scale(1.14);
  transition: transform 1200ms var(--ease-cinematic);
}
.reveal-scale.is-visible img{ transform: scale(1); }

.no-js .reveal, .no-js .reveal-clip{ opacity:1; transform:none; clip-path:none; }

@media (prefers-reduced-motion: reduce){
  .reveal, .reveal-clip, .reveal-scale img{ opacity:1 !important; transform:none !important; clip-path:none !important; transition:none !important; }
  .hero-headline .line span{ transform:none !important; }
}
