5f9ae6b212
Per operator: Speed only controls the resting loop, so reduce-motion is still needed to turn off the morph/transition videos. Re-add a visible 'Reduce motion' toggle on BOTH the welcome screen and the panel (mirrored, default from OS prefers-reduced-motion, remembers the choice). When ON, altitude changes are instant cuts instead of an animated morph tween (autoScrub's reduced branch); the resting loop is unaffected — it follows the Speed slider (0x freezes it). Decouples the loop from reduce-motion (was: main froze both videos + disabled the slider under OS-reduced). playLoop()/landing/applyPlaySpeed no longer check isReduced(); isReduced() now only gates the morph tween. Welcome controls are now Language / Speed / Audio / Reduce motion. i18n: restore rm.label (4 langs), reword warn.body to point at the on-screen control. Tests: a11y Task 5 reworked (speed independent of reduce-motion; new instant-cut behavior test); welcome defaults assert reduce-motion off. node 35, e2e 32, static 2, pytest 301 (3 pre-existing ffmpeg/cv2 env fails). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>