Repository navigation
Description
Before submitting
- I searched existing issues and did not find a duplicate.
- I included enough detail to reproduce or investigate the problem.
Area
apps/web, apps/mobile (desktop runs the web client)
Steps to reproduce
Web / desktop
- Turn on Reduce Motion (macOS: System Settings → Accessibility → Display → Reduce motion; or emulate
prefers-reduced-motion: reducein Chrome DevTools). - Open a thread long enough to scroll, scroll up, and click Scroll to end.
- With the composer focused and the timeline scrolled up, press PageDown.
- Click a turn in the timeline minimap (the strip in the left gutter, or its next/previous buttons).
- Settings → Appearance → duplicate a theme → Inspect, then click an app element whose color row is out of view in the editor.
iOS
- Settings → Accessibility → Motion → Reduce Motion on.
- Open a long thread, scroll up, tap Scroll to end.
- Scroll up, type a message, send it.
Expected behavior
With Reduce Motion on, these programmatic scrolls jump straight to their destination. Normal motion is unchanged when the setting is off. Several web paths already do this (tab-strip scrolling, settings search reveal, citation reveal, streaming end-follow).
Actual behavior
Each of these still animates, whatever the setting says.
Measured on main a1d9d72aef. Web: headless Chrome for Testing, real prefers-reduced-motion emulation, per-frame scrollTop sampling. Counts are frames strictly between the start and end positions.
| Action | Reduce Motion on | Off |
|---|---|---|
| Scroll to end (5479 px) | 72 frames | 72 |
| PageDown from composer (602 px) | 9 | 8 |
| Minimap jump (392 px) | 18 | 18 |
| Theme editor inspect reveal (48 px) | 4 positions | 7 |
iOS 26.5 simulator with the real Settings toggle: Scroll to end glides through the whole thread (19 significant frame changes). After sending, the new message glides up as the keyboard closes.
Code: apps/web/src/components/ChatView.tsx (scrollToEnd), apps/web/src/components/chat/pageScrollController.ts (smoothScrollBy), apps/web/src/components/chat/MessagesTimeline.tsx (minimap onSelect), apps/web/src/components/settings/ThemeEditorPanel.tsx (selectThemeRole), apps/mobile/src/features/threads/ThreadDetailScreen.tsx (scrollMessageToEnd({ animated: true }) in the send effect and handleScrollToEnd).
Impact
Minor bug or occasional failure. It affects every user who relies on Reduce Motion, usually because motion makes them unwell.
Version or commit
main @ a1d9d72
Environment
macOS 26 host; Chrome for Testing (Playwright 1.60, chromium-1243) with media emulation; iOS 26.5 simulator (iPhone 17 Pro) running T3 Code Dev built from main; Codex provider for the test turns.
Screenshots, recordings, or supporting files
- Web, Reduce Motion on, Scroll to end, frames 100 ms apart (main):

- Web recordings: Reduce Motion on, off, plus a live flip to on, theme editor on
- iOS, Reduce Motion on, Scroll to end changed frames:

- iOS recordings: Scroll to end, send
Not verified: the macOS desktop app with the real system setting (the web client was checked in Chrome with media emulation; Electron uses the same matchMedia query), and Android.
Workaround
None.
Context: closed PR #12871 targeted this; it was closed for missing live motion proof. This report gives that proof on current main.
Activity
juliusmarminge commentedon Oct 5, 2026
Note
Grok responding on behalf of Julius.
Triage
Thanks @saphid for the thorough report. The frame counts, recordings, and simulator runs with the real setting make this easy to follow. Current
main(250e052f44) matches what you describe, and nothing sincea1d9d72aefhas touched these scroll paths.What I found
Each of these call sites always animates, whatever the setting:
apps/web/src/components/ChatView.tsx): the button callsscrollToEnd(true), which passesanimatedthrough tolegendListRef.scrollToEnd.apps/web/src/components/chat/pageScrollController.ts): the single step always runssmoothScrollBy, a 150 ms easedrequestAnimationFrameloop.apps/web/src/components/chat/MessagesTimeline.tsx):onSelectcallsscrollToIndex({ animated: true }).apps/web/src/components/settings/ThemeEditorPanel.tsx):selectThemeRolecallsscrollIntoView({ behavior: "smooth" }).apps/mobile/src/features/threads/ThreadDetailScreen.tsx): both callscrollMessageToEnd({ animated: true }).Streaming end-follow, citation reveal, settings search, and the right panel tab strip already jump when
(prefers-reduced-motion: reduce)matches.Two more paths may be worth covering in the same fix:
onTimelineAnchorReadycallsscrollToIndex({ animated: true }), and that path isn't in the measurement table.Android, and the macOS desktop app with the real system setting, are still unchecked. The desktop app runs this same web client and uses the same
matchMediaquery.Likely fix area
One option is to make each of these call sites check the existing reduced-motion preference and jump instead of animating, the way the paths above already do. Another is a small shared helper for programmatic scrolls on web and on mobile. The broader reduced-motion contract proposed in #12660 is a separate question.
A maintainer will decide on the fix direction.