/* =====================================================================
   OSE · motion helpers · styles/base/motion.css
   ---------------------------------------------------------------------
   Load after base.css, on pages that load /js/motion/motion.js.
   Semantic tokens only.

   Nothing here hides content unless <html> carries a class set by
   motion.js, so JS off, ?motion=off or a CDN failure leave the page whole:
     html.motion          full path. CSS hides NOTHING: GSAP sets every
                          start state itself (immediateRender).
     html.motion-reduced  reduced path (prefers-reduced-motion or
                          ?motion=reduced). Headers and scene roots fade in
                          once they get .is-revealed (js/motion/reduced.js,
                          which marks everything already on screen before
                          the class is added). Opacity only, no travel.
   Lenis (html.lenis, desktop smooth wheel) helpers follow its own CSS.
   ===================================================================== */

@layer base {
  html.motion-reduced [data-reveal] > *,
  html.motion-reduced [data-scene] {
    transition: opacity var(--motion-slow) var(--ease-standard);
  }

  html.motion-reduced [data-reveal]:not(.is-revealed) > *,
  html.motion-reduced [data-scene]:not(.is-revealed) {
    opacity: var(--opacity-hidden);
  }

  /* Nested scrollers keep their own wheel scrolling under Lenis. */
  html.lenis [data-lenis-prevent] {
    overscroll-behavior: contain;
  }

  /* An iframe under the pointer would swallow wheel events mid-glide. */
  html.lenis.lenis-scrolling iframe {
    pointer-events: none;
  }
}
