From 722af873824e3fe8598bf1bc1589de95a84a40c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Thu, 18 Jun 2026 15:15:14 +0200 Subject: [PATCH] fix(a11y): add a global prefers-reduced-motion backstop Per-component motion-reduce gating stays in place with its tailored static fallbacks; this adds a defensive catch-all so any animation or transition that misses a per-component guard still collapses to near- instant under reduced motion. Near-zero rather than zero keeps animation/transition-end listeners firing so state machines don't stall. --- src/app/globals.css | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/app/globals.css b/src/app/globals.css index 417fb9536..e7892e703 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -889,3 +889,21 @@ animation: none; } } + +/* ── Global reduced-motion backstop ────────────────────────────────── + * Defensive catch-all so any animation/transition we forget to gate + * per-component still collapses to near-instant when the user has asked + * for reduced motion. The per-component blocks above stay — they carry + * tailored static fallbacks (static dots, full-height bars). This is the + * floor, not a replacement. Near-zero (not 0) keeps JS animation-end / + * transition-end listeners firing so state machines don't stall. */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +}