/* ==========================================================================
   motion-guard.css — one global prefers-reduced-motion guard.
   Added 2026-08-26.

   WHY THIS FILE EXISTS
   --------------------
   A sweep of the tree on 2026-08-26 found 69 files carrying motion and
   63 of them with NO prefers-reduced-motion guard at all: 55 animation
   declarations, 25 of them infinite, and 625 transitions. Guarding those by
   hand would mean 63 edits and 63 chances to miss one. This is one file,
   linked last.

   WHY NOT `animation: none`
   -------------------------
   Because it makes content disappear, and that was measured, not assumed.

   A reveal pattern declares `opacity: 0` on the rule itself and relies on the
   animation to bring the element in. `animation: none` cancels the animation
   but does NOT touch that `opacity: 0`, so the element stays permanently
   invisible — for precisely the users this guard is supposed to help.
   Verified in a browser: an element with `.x { opacity:0; animation: fade .6s
   forwards }` reports computed opacity `0` when `animation: none` is applied.

   The near-zero-duration pattern below avoids that. The animation still runs,
   completes in 0.01ms, and lands on its final state. Nothing is cancelled, so
   nothing is stranded at its start state.

   WHY animation-fill-mode IS NOT FORCED
   -------------------------------------
   This was checked before writing the rule rather than after.

   All six reveal patterns in the tree already declare `forwards`
   (smart_catch_game ×3, index .stat-item, ai-solutions-demo, and
   css/about-video-intro.css), so none of them needs help holding its end
   state. Nothing is at risk.

   Forcing `animation-fill-mode: forwards` globally would actively cause
   damage, because three keyframes in this tree deliberately END below full
   opacity:
     - showcase.html          100% { opacity: 0.7; transform: scale(1.05) }
     - ai-solutions-demo.html 0%,100% { opacity: 0.8 }
     - index.html edc-beam    100% { opacity: 0.35 }
   Forcing `forwards` would freeze those elements dimmed and scaled up, for
   good. So fill-mode is left exactly as each rule declares it.

   SCOPE
   -----
   This is a guard, not a removal. Users who have not asked for reduced motion
   get every animation as authored, including the 25 infinite ones.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    animation-delay: 0s !important;
    transition-duration: 0.01ms !important;
    transition-delay: 0s !important;
    scroll-behavior: auto !important;
  }
}
