/* ===== assets/css/components/reveal.css ===== */
/* v45 — THE REVEAL, AND WHY IT IS NOT GSAP.
   `gsap.from(el, {autoAlpha: 0, scrollTrigger: …})` writes the hidden state the moment the
   tween is created and only undoes it when the trigger fires. If the trigger never fires the
   content is not un-animated, it is INVISIBLE — and it still takes up its space, so what the
   reader gets is a screen of blank page. That has now happened twice on this project: the
   figures' statement and paragraph in v34, and the whole footer in v44.
   The hidden state here exists only under `.js-reveal`, a class the reveal script puts on
   <html> itself. No script, no class, nothing hidden — the same shape as the hero's keyframe
   entrance in v30. It cannot fail closed. */
.js-reveal [data-reveal]:not([data-reveal="group"]),
.js-reveal .reveal-group > * {
  opacity: 0;
  transform: translate3d(0, 24px, 0);
}
.js-reveal [data-reveal].is-in:not([data-reveal="group"]),
.js-reveal .reveal-group.is-in > * {
  opacity: 1;
  transform: none;
  transition: opacity 0.75s cubic-bezier(0.215, 0.61, 0.355, 1) var(--rd, 0s),
              transform 0.75s cubic-bezier(0.215, 0.61, 0.355, 1) var(--rd, 0s);
}
@media (prefers-reduced-motion: reduce) {
  .js-reveal [data-reveal], .js-reveal .reveal-group > * { opacity: 1; transform: none; transition: none; }
}
