/* scroll-reveal.css
   Subtle, professional on-scroll reveal animations.
   Styles apply ONLY when JS is active (html.js-reveal), so if JavaScript is
   disabled or fails, all content stays fully visible — nothing is ever hidden.

   Usage: add class="reveal" to any element. Optional direction modifiers:
     reveal reveal-up      (default: rises from below)
     reveal reveal-down    (drops from above)
     reveal reveal-left    (slides in from the left)
     reveal reveal-right   (slides in from the right)
     reveal reveal-zoom    (gentle scale-up)
   Stagger a group: put class="reveal-stagger" on a parent; its .reveal
   children animate in sequence.
   Tune per element with inline vars, e.g. style="--reveal-distance:28px"
*/

.js-reveal .reveal {
  opacity: 0;
  transform: translateY(var(--reveal-distance, 18px));
  transition:
    opacity   var(--reveal-duration, 0.6s) cubic-bezier(0.22, 0.61, 0.36, 1),
    transform var(--reveal-duration, 0.6s) cubic-bezier(0.22, 0.61, 0.36, 1);
  will-change: opacity, transform;
}

/* Direction modifiers (use alongside .reveal) */
.js-reveal .reveal.reveal-up    { transform: translateY(var(--reveal-distance, 18px)); }
.js-reveal .reveal.reveal-down  { transform: translateY(calc(-1 * var(--reveal-distance, 18px))); }
.js-reveal .reveal.reveal-left  { transform: translateX(calc(-1 * var(--reveal-distance, 24px))); }
.js-reveal .reveal.reveal-right { transform: translateX(var(--reveal-distance, 24px)); }
.js-reveal .reveal.reveal-zoom  { transform: scale(0.96); }

/* Revealed state */
.js-reveal .reveal.is-visible {
  opacity: 1;
  transform: none;
}

/* Respect visitors who prefer reduced motion: show everything, no movement. */
@media (prefers-reduced-motion: reduce) {
  .js-reveal .reveal {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
}
