/* Port of components/animations/scroll-reveal.tsx's whileInView behavior.
   Framer Motion drives that via JS + IntersectionObserver; here the same
   effect is a CSS transition gated by a `.is-revealed` class that
   assets/js/scroll-reveal.js adds once an element scrolls into view. */
[data-reveal] {
  opacity: 0;
  transition: opacity 0.65s cubic-bezier(0.22, 1, 0.36, 1), transform 0.65s cubic-bezier(0.22, 1, 0.36, 1);
}
[data-reveal="up"] { transform: translateY(35px); }
[data-reveal="scale"] { transform: scale(0.92); }
[data-reveal].is-revealed {
  opacity: 1;
  transform: translateY(0) scale(1);
}

[data-stagger-item] {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 0.6s cubic-bezier(0.22, 1, 0.36, 1), transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
}
[data-stagger-item].is-revealed {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  [data-reveal], [data-stagger-item] {
    transition: none;
    opacity: 1;
    transform: none;
  }
}
