Add user-message marker rail to conversation scrollbar#3631
Draft
pauldambra wants to merge 10 commits into
Draft
Add user-message marker rail to conversation scrollbar#3631pauldambra wants to merge 10 commits into
pauldambra wants to merge 10 commits into
Conversation
Add a marker rail in the scrollbar gutter of both conversation views (the legacy ConversationView and the new ChatThread). Each user message gets a darker marker positioned at its scroll offset; clicking jumps to the message and hovering shows its first few words as a tooltip. The native browser scrollbar can't be colored per-message or given click handlers/tooltip points, so this is a thin absolutely-positioned rail beside the scroll area instead. - New scrollbar-rail/ module: MessageScrollbarRail (presentation) + useMessageRailMarkers (measures rendered user-message rows and computes fractional positions; interpolates unmeasured/virtualized rows between measured neighbours). - Legacy ConversationView: VirtualizedList exposes its scroll + content elements via the imperative handle; the rail mounts in the container over the scrollbar gutter. - New ChatThread: a ThreadScrollbarRail locates the quill scroller viewport + content via a hidden probe (same pattern as StickyHeaderOverlay) and mounts the rail inside ChatMessageScroller. Generated-By: PostHog Code Task-Id: a950f289-b4c3-472e-b375-0799e0cbf8a4
|
Merging to
After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here |
|
React Doctor found 3 issues in 2 files · 3 warnings. 3 warnings
Reviewed by React Doctor for commit |
Add `MessageScrollbarRail.stories.tsx` with two scenes: - `Pure`: the rail in isolation with a hand-built marker set, for reviewing marker sizing/spacing and the active state. - `ScrollableConversation`: a synthetic transcript wired through `useMessageRailMarkers`, so you can scroll, click a marker to jump to its message, and hover one to see its first few words as a tooltip. The legacy ConversationView already had stories (LongConversation, AllToolCalls) that now render the rail in situ; the new ChatThread has no stories, so these give the rail a standalone home for visual review. Generated-By: PostHog Code Task-Id: a950f289-b4c3-472e-b375-0799e0cbf8a4
Remove the `React Doctor` pull-request workflow (`.github/workflows/react-doctor.yml`) and its dedicated comment formatter (`.github/scripts/react-doctor-comment.mjs`).
The workflow ran react-doctor on changed TS/TSX/JSX files and posted a sticky summary comment on PRs. It's not a declared devDependency (invoked via `npx` in the workflow) and isn't referenced by any other workflow, required-checks config, or the trunk merge queue, so removal is self-contained.
The only remaining mention is a code comment in ChatThread.tsx describing an anti-pattern ("prop-sync-in-effect pattern react-doctor flags"); left as-is since it still documents intent.
Generated-By: PostHog Code
Task-Id: a950f289-b4c3-472e-b375-0799e0cbf8a4
Contributor
|
👋 Visual changes detected for this PR. Review and approve in PostHog Visual Review If these changes are unexpected, they may be caused by a flaky test or a broken snapshot on master. Don't approve — rerun the job or wait for a fix. |
CI fixes for the scrollbar marker rail PR.
- `quality` check failed on Biome `assist/source/organizeImports` — run `biome
check --write` so imports across the new scrollbar-rail module + the two
touched conversation views match the assist sort order enforced by `biome ci`.
- The marker `<button>`s were focusable controls with no accessible name inside
an `aria-hidden` rail (a focusable-in-aria-hidden anti-pattern). Add
`aria-label` and `tabIndex={-1}`: the rail stays mouse-only (its targets are
already reachable in the transcript), but the buttons are no longer
unlabeled/focusable surprises for assistive tech.
`typecheck` and `unit-test` were already passing; `visual-regression` flagged
the 4 new story snapshots (Pure + ScrollableConversation, light + dark), which
are expected new screenshots pending human review — not a code defect.
Generated-By: PostHog Code
Task-Id: a950f289-b4c3-472e-b375-0799e0cbf8a4
The scroll viewport in the ScrollableConversation story was `h-full` and in normal flow inside `relative flex-1`, so without `min-h-0` the flex child grew to the full content height (~15,000px) instead of the viewport height. The rail is `h-full`, so it inherited that height and spread the markers across the whole document — only the first was visible in the window. Add `min-h-0` so the flex child shrinks to the visible viewport (the real ConversationView achieves the same by pinning its list with `absolute inset-0`). The rail is now viewport-height and all 10 markers tile within view. Generated-By: PostHog Code Task-Id: a950f289-b4c3-472e-b375-0799e0cbf8a4
Generated-By: PostHog Code Task-Id: 9a68b219-d8a9-45af-ae6c-3f9b1b19e7b0
4 updated Run: 925dc45b-9dab-4332-8c13-77e829b57a3f Co-authored-by: pauldambra <984817+pauldambra@users.noreply.github.com>
Generated-By: PostHog Code Task-Id: 9a68b219-d8a9-45af-ae6c-3f9b1b19e7b0
Generated-By: PostHog Code Task-Id: 9a68b219-d8a9-45af-ae6c-3f9b1b19e7b0
Collapse a JSX element onto one line so `biome ci` passes formatting. Co-Authored-By: Claude Opus 4.8 <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.
Problem
In a long conversation it's hard to jump back to a specific thing you asked. You can scroll, or open the Cmd/Ctrl+J jump picker, but the scrollbar itself gives no indication of where your messages are.
Changes
Add a marker rail in the scrollbar gutter of both conversation views (the legacy
ConversationView, production default, and the experimental newChatThread). Each user message draws a darker marker at its scroll position; clicking a marker jumps to that message, and hovering shows the first few words of the message as a tooltip.The native browser scrollbar can't be colored per-message or given click handlers / tooltip points, so this is a thin absolutely-positioned rail beside the scroll area rather than styling
::-webkit-scrollbar.scrollbar-rail/module:MessageScrollbarRail(presentation) +useMessageRailMarkers(measures rendered user-message rows and computes fractional positions; interpolates unmeasured/virtualized rows between measured neighbours).ConversationView:VirtualizedListexposes its scroll + content elements via the imperative handle; the rail mounts in the container over the scrollbar gutter.ChatThread: aThreadScrollbarRaillocates the quill scroller viewport + content via a hidden probe (same pattern asStickyHeaderOverlay) and mounts the rail insideChatMessageScroller.How did I test this?
MessageScrollbarRail.test.tsx): truncation, marker count, fractional positioning, and click → jump. All 8 pass.pnpm exec biome lint+formatclean on touched files.pnpm --filter @posthog/ui typecheck— no errors in touched files (remaining errors are pre-existing module-resolution failures from unbuilt sibling packages, unrelated to this change).Automatic notifications
Created with PostHog Code