/* ==========================================================================
   HAVEN. — reveals, and the one global motion switch.

   The page has very little entrance animation on purpose: the window is the
   protagonist, and eleven things fading up around it would be noise. There is
   one reveal kind, `rise`, and it is used for section headings only.

   THE CLIP-PATH TRAP, WRITTEN DOWN SO IT IS NOT RE-DISCOVERED. core/reveal.js
   observes with threshold 0.08 and core/media.js lazily mounts photographs with
   an observer of its own. BOTH measure the element's VISUAL rectangle, so an
   element the stylesheet hides with clip-path or scaleX(0) never intersects,
   the observer never fires, and the reveal — or the photograph — silently never
   arrives. Nothing here hides by clipping: `rise` moves and fades, and every
   photograph in the lens is mounted by assets/js/site/lens.js itself rather
   than by the generic observer pass.
   ========================================================================== */
[data-reveal] {
  opacity: 0;
  transform: translateY(1.1rem);
  transition: opacity .8s var(--ease), transform .8s var(--ease);
  transition-delay: var(--delay, 0ms);
}
[data-reveal].is-in { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
  [data-reveal] { opacity: 1; transform: none; }
}
