Epic: #170
Depends on: #173 (UI-A1)
Source: docs/motion-and-high-refresh.md §4.3
Goal
Honor OS "reduce motion" and add an in-app motion preference in Preferences → Appearance.
Files
lib/core/motion/querya_motion.dart — extend effectiveDuration with in-app override
lib/core/storage/app_settings.dart — persist motion preference
lib/features/settings/preferences_appearance_section.dart — UI control
test/core/motion/querya_motion_test.dart
test/features/settings/preferences_appearance_section_test.dart
Implementation
- OS level:
MediaQuery.disableAnimationsOf(context) → collapse durations to instant (or minimal cross-fade).
- In-app toggle: Motion —
Full / Reduced / Off (stored in AppSettings).
Full — use token durations.
Reduced — shorten all durations (~50%) or single short cross-fade.
Off — instant (0 ms) except essential feedback.
- Wire through
QueryaMotion.effectiveDuration / curve helper used by A2/A3 widgets.
- Respect OS reduce-motion even when app setting is Full (OS wins).
Acceptance Criteria
Epic: #170
Depends on: #173 (UI-A1)
Source:
docs/motion-and-high-refresh.md§4.3Goal
Honor OS "reduce motion" and add an in-app motion preference in Preferences → Appearance.
Files
lib/core/motion/querya_motion.dart— extendeffectiveDurationwith in-app overridelib/core/storage/app_settings.dart— persist motion preferencelib/features/settings/preferences_appearance_section.dart— UI controltest/core/motion/querya_motion_test.darttest/features/settings/preferences_appearance_section_test.dartImplementation
MediaQuery.disableAnimationsOf(context)→ collapse durations toinstant(or minimal cross-fade).Full/Reduced/Off(stored inAppSettings).Full— use token durations.Reduced— shorten all durations (~50%) or single short cross-fade.Off—instant(0 ms) except essential feedback.QueryaMotion.effectiveDuration/ curve helper used by A2/A3 widgets.Acceptance Criteria
disableAnimations: true→ 0 ms effective duration.flutter analyzeclean.