/* ═══════════════════════════════════════════
   REVEAL — Scroll-triggered Entrance Utility
   Applied via [data-reveal] + js/reveal.js (IntersectionObserver).
   Gated behind .js-ready (set by the same inline head-script that
   sets the mood, before first paint) so that if JS never runs,
   content simply stays visible instead of being stuck hidden —
   progressive enhancement, never a hard dependency.
   ═══════════════════════════════════════════ */

.js-ready [data-reveal] {
    opacity: 0;
    transform: translateY(34px);
    transition: opacity 0.9s cubic-bezier(.16, 1, .3, 1),
                transform 0.9s cubic-bezier(.16, 1, .3, 1);
    transition-delay: calc(var(--reveal-i, 0) * 70ms);
    will-change: opacity, transform;
}
.js-ready [data-reveal].in-view {
    opacity: 1;
    transform: translateY(0);
}
