fix(web): keep the timeline minimap off the chat column at wide chat widths - #1
Merged
otavio merged 2 commits intoSep 23, 2026
Conversation
The minimap gutter and hover-strip helpers assumed the chat column is capped at 768px. With the Wide or Full chat width, the real gutter is narrower or gone, so the 40px hover strip sat on top of the message text and swallowed its pointer events. Measure the rendered column instead and re-measure when the Chat width setting changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ters The previous and next turn buttons hang above and below the minimap strip and stayed clickable regardless of the strip's width cap. With Full chat width and overlay scrollbars they covered the first few pixels of message text. Make them inert to the pointer unless the gutter can hold them; keyboard focus still reaches them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Follow-up for pingdotgg#11594, addressing the minimap gap @v1b3coder reported there.
Problem
The timeline minimap sizes its hover strip from
TIMELINE_CONTENT_MAX_WIDTH = 768, assuming the chat column is capped at 48rem. With Full chat width the real gutter is only the list padding (about 20 to 26px), but the helpers still computed a ~770px gutter and kept the full 40px strip. That invisible strip sat on top of the first 20 or so pixels of every message and swallowed clicks and text selection there. The minimap's prev/next turn buttons had the same problem independently: they stay clickable whatever the strip width, and their hitbox reaches 26px from the viewport edge.Fix
MessagesTimelinemeasures the first mounted[data-timeline-root]row (every row type uses that wrapper) and re-measures whenchatWidthchanges. If no row is mounted, it treats the column as full width, so the strip stays inert.Comfortable behaves as before. Wide at typical window sizes still has a full gutter, so nothing changes there either.
Verification
apps/web:vp test run src/components/chat/MessagesTimeline.test.tsx: 51 passed. The helper tests now cover Comfortable, Wide, and Full column widths, plus the button guard.packages/contracts:vp test run src/settings.test.ts: 126 passed.tsc --noEmit -p apps/web: clean.Real client:
vp run devweb build in headless Chrome with a 2560px window (2304px timeline) on a thread with 763 messages. I measured the strip and buttons against the first row's bounding box, switched Chat width through Settings → Appearance, then reopened the thread:feat/chat-width-settinghead), Full: the column starts at 26px, the strip is 40px wide and overlaps the column by 26px, and a click on the column's left edge lands on the minimap strip.Not exercised in a real client: overlay scrollbars, where the Full column starts about 20px from the edge. The unit tests cover that geometry (8px strip, buttons inert). I also didn't live-switch the setting while a thread stays mounted, because Settings is its own route. The
chatWidtheffect dependency covers that case.Audited by GPT-6 Astra (high) in T3 Code. Round 1 found the prev/next button overlap. Round 2 caught that a keyboard-opened preview re-armed those buttons, and the final commit fixes both.
Made with Claude Opus 5.5 in Claude Code, running inside T3 Code.
🤖 Generated with Claude Code