Accessibility: Motion & Animation Safety
Accessibility: Motion & Animation Safety
Added in v1.0.471 — Control A11Y-27
The platform respects the prefers-reduced-motion operating system accessibility setting. When a user enables reduced motion on their device, all animations and transitions in the application are automatically suppressed — no configuration or opt-in is required.
Why This Matters
Vestibular disorders affect a significant portion of the population. Animations such as fading modals, spinning loaders, pulsing dots, and zooming dropdowns can trigger symptoms including nausea, dizziness, and disorientation in users who are sensitive to motion on screen. The prefers-reduced-motion CSS media feature provides a direct, OS-level signal that the application should minimise or eliminate non-essential motion.
How It Works
Global animation override
A global rule in globals.css collapses all animation and transition durations to 0.01ms when the user's OS reports a reduced-motion preference:
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
This is a catch-all that applies to every element in the application, including third-party UI components.
Tailwind motion-safe: variant
For animations that are purely decorative and do not convey any state (such as the urgency pulsing dot in the sidebar and compliance ribbon), the Tailwind motion-safe: prefix is used directly in the component markup:
<span className='motion-safe:animate-ping absolute inline-flex h-full w-full rounded-full ...' />
The motion-safe: variant means the animate-ping class is only active when the user has not requested reduced motion. This ensures the ping animation is completely absent from the DOM's applied styles for reduced-motion users, rather than simply collapsed to a short duration.
Affected Animations
| Animation | Component | Behaviour under reduced motion |
|---|---|---|
animate-in, fade-in, zoom-in-95 | Modals, dropdowns | Instant appearance (no fade or zoom) |
animate-pulse | Loading skeletons | Static skeleton shape, no shimmer |
animate-spin | Loading spinner | Instant or static indicator |
animate-ping | Sidebar urgency dot, compliance ribbon dot | Animation class not applied at all |
Enabling Reduced Motion
This feature activates automatically based on the OS accessibility setting. No action is required inside the application.
| Operating System | Where to enable |
|---|---|
| macOS | System Settings → Accessibility → Display → Reduce Motion |
| iOS / iPadOS | Settings → Accessibility → Motion → Reduce Motion |
| Windows 11 | Settings → Accessibility → Visual effects → Animation effects (off) |
| Android | Settings → Accessibility → Remove animations |
Standards Compliance
This implementation addresses:
- WCAG 2.1 Success Criterion 2.3.3 — Animation from Interactions (Level AAA): Motion animation triggered by interaction can be disabled, unless the animation is essential to the functionality or the information being conveyed.
- APCA / broader accessibility best practice for vestibular disorder accommodation.