Repository navigation
fix(web): restore arrow-key scrolling in chat after click or F6 - #654
Merged
Merged
Conversation
lastobelus
force-pushed
the
lastcode/fix-chat-arrow-key-scrolling
branch
from
November 8, 2026 23:10
8779a6e to
a3b0737
Compare
lastobelus
marked this pull request as ready for review
November 8, 2026 23:11
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Focus the conversation scrolling element after a click or F6, including when the first messages arrive. Preserve page-key overlap, focus visibility, and keyboard focus on window return. Restore the locally prepared repair from 7d9be906f9101d2dd452486da24b9e1482e260c6, which had not been published to LastCode. Carry-Group: incubator Carry-Upstream: https://redirect.github.com/pingdotgg/t3code/pull/27209 af39cb7 Carry-Observation: The focus repair is inseparable from the existing composer-aware paging and workspace focus changes in incubator; replay them together after those dependencies. Implemented with GPT-6.1-Sol in the Codex harness.
lastobelus
force-pushed
the
lastcode/fix-chat-arrow-key-scrolling
branch
from
November 8, 2026 23:16
a3b0737 to
2585695
Compare
Owner
Author
|
@codex review |
|
Codex Review: Didn't find any major issues. Keep them coming! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
lastobelus
added a commit
that referenced
this pull request
Nov 13, 2026
Upstream sends arrow and page keys to the focused element. Since the timeline scroller became focusable (upstream pingdotgg#27209), ArrowUp/ArrowDown with the pointer over the sidebar scrolled the conversation. LastCode's per-surface patches covered page keys only and kept regressing as upstream moved. One router, lastcodeScrollKeys.ts, now owns the rule: the pointer picks the pane, focus decides inside it. Text fields and keyboard widgets keep their keys over their own pane (the composer over its conversation keeps caret moves, prompt recall and its page handoff); any other key parks the pointer for arrows until the mouse moves; suggestion lists, the terminal, open menus, keybindings and modified keys are left alone. The timeline registers as an owner so routed scrolls release follow and page above the composer. It replaces the hover-card key handler and the timeline page fallback. docs/lastcode/keyboard-scrolling.md records the desired behaviour, the upstream seams it rests on, and when a checkpoint is fighting upstream. Carry-Group: incubator Carry-Observation: Inseparable from its tests and docs; the timeline owner registration and hover-card removal replace incubator code in the same mechanism. Carry-Supersedes: lastCode #654 timeline page fallback; thread hover scroll keys Carry-Applies-To: upstream 7e1a058 (focus-driven native scrolling, pingdotgg#27209) Co-Authored-By: Claude <[email protected]>
lastobelus
added a commit
that referenced
this pull request
Nov 14, 2026
Upstream sends arrow and page keys to the focused element. Since the timeline scroller became focusable (upstream pingdotgg#27209), ArrowUp/ArrowDown with the pointer over the sidebar scrolled the conversation. LastCode's per-surface patches covered page keys only and kept regressing as upstream moved. One router, lastcodeScrollKeys.ts, now owns the rule: the pointer picks the pane, focus decides inside it. Text fields and keyboard widgets keep their keys over their own pane (the composer over its conversation keeps caret moves, prompt recall and its page handoff); any other key parks the pointer for arrows until the mouse moves; suggestion lists, the terminal, open menus, keybindings and modified keys are left alone. The timeline registers as an owner so routed scrolls release follow and page above the composer. It replaces the hover-card key handler and the timeline page fallback. docs/lastcode/keyboard-scrolling.md records the desired behaviour, the upstream seams it rests on, and when a checkpoint is fighting upstream. Carry-Group: incubator Carry-Observation: Inseparable from its tests and docs; the timeline owner registration and hover-card removal replace incubator code in the same mechanism. Carry-Supersedes: lastCode #654 timeline page fallback; thread hover scroll keys Carry-Applies-To: upstream 7e1a058 (focus-driven native scrolling, pingdotgg#27209) Co-Authored-By: Claude <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🐛 Problem
After clicking the conversation or pressing F6 to move there, ArrowUp/ArrowDown did nothing. Focus landed on the outer
data-workspace-area="conversation"wrapper, which doesn't scroll. The timeline is inside that wrapper, so native keyboard scrolling cannot reach it. An earlier local repair (7d9be906f9101d2dd452486da24b9e1482e260c6) never shipped in LastCode.🔧 Fix
Focus the real scroller, the timeline, so native arrow-key scrolling works again.
MessagesTimeline.tsx): the scroll node getstabIndex={-1}anddata-workspace-focus-default, so clicks and F6 land on it. If an empty conversation held focus before the first list mounted, focus transfers to that list; focus elsewhere stays put.timelineViewport.ts): PageUp/PageDown now also fire when the key target is the timeline, not just the outer area. Paging stays composer-aware.workspaceFocus.ts): a remembered area is only a fallback. Controls mounted since now take precedence over it, so F6 reaches the timeline.index.css): the ring is drawn on the conversation area via:has(.messages-timeline-scroll:focus-visible). The timeline's own outline is off because its top fade mask would hide it.ChatView.logic.ts):shouldRefocusComposerOnWindowFocuskeeps a keyboard-focused timeline (:focus-visible) where it is. A clicked timeline still yields to the composer.✅ Proof
MessagesTimeline.browser.test.tsx), plus page keys, F6 target selection, and window-return cases.check:changed: passed, including 227 tests and 4 compiler checks.Evidence
Before: ArrowUp leaves the chat stationary.
After: ArrowUp moves the chat, and the keyboard focus ring remains visible.
Recording of arrow scrolling after a click and Shift+F6, followed by page keys:
897e07de-4dc0-4792-bef9-8a18bbbfaffd-c875b968-9595-4de1-a0ff-3b5d203c5db0-mp4.mp4
🚦 Status
975adada6dc0fc5bf11a556ef97ef88055d88746(base82a0d94aa92fced9dad13c12fa10277b47358945). The latest rebase only brings in unrelated tooling.Local review: 3 rounds with gpt-6.1-terra (xhigh), approved.
Source: https://redirect.github.com/pingdotgg/t3code/pull/27209
Pinned upstream head:
af39cb731be45f64815ae9bc792066170689b94b.Implemented with GPT-6.1-Sol in the Codex harness.