/* ==========================================================================
   Animations — scroll-reveal transitions only. No decorative motion.
   Respects prefers-reduced-motion throughout.
   ========================================================================== */

/* Scroll-reveal: content is visible by default (no-JS/SEO safe). Only when the
   `.js` class has been set by main.js do elements start hidden and get
   revealed via IntersectionObserver toggling .is-visible. */
.js [data-reveal] {
  opacity: 0;
  transform: translateY(var(--space-4));
  transition: opacity var(--motion-slow) var(--easing-standard),
    transform var(--motion-slow) var(--easing-standard);
}

.js [data-reveal].is-visible {
  opacity: 1;
  transform: translateY(0);
}

[data-reveal-group] > * {
  /* Stagger delay between sibling reveals; not a motion duration. */
  transition-delay: calc(var(--reveal-index, 0) * 70ms);
}

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