/* ==========================================================================
   EFFECTS — scroll-reveal utilities
   (Ambient bubbles/motes are rendered on a single canvas by particles.js
   for performance — see js/particles.js — so no DOM-based effect classes
   are needed here.)
   ========================================================================== */

/* Section reveal helpers — used by smooth-scroll.js IntersectionObserver */
.reveal {
  opacity: 0;
  transform: translateY(32px);
  transition: opacity 0.9s var(--ease-out), transform 0.9s var(--ease-out);
}
.reveal.is-visible { opacity: 1; transform: translateY(0); }

.reveal--fade { transform: none; }

.reveal--scale { transform: scale(0.92); }
.reveal--scale.is-visible { transform: scale(1); }

.reveal--left { transform: translateX(-40px); }
.reveal--left.is-visible { transform: translateX(0); }

.reveal--right { transform: translateX(40px); }
.reveal--right.is-visible { transform: translateX(0); }

/* Stagger children utility (set --d on each child) */
.reveal-stagger > * {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 0.7s var(--ease-out), transform 0.7s var(--ease-out);
  transition-delay: var(--d, 0s);
}
.reveal-stagger.is-visible > * { opacity: 1; transform: translateY(0); }