feat(activity): open mention threads in a side panel with scroll-to-message, pulse & slide#3561
Open
adamleithp wants to merge 7 commits into
Open
feat(activity): open mention threads in a side panel with scroll-to-message, pulse & slide#3561adamleithp wants to merge 7 commits into
adamleithp wants to merge 7 commits into
Conversation
…the message Clicking an Activity notification now opens the task thread in a right-hand ThreadSidebar instead of navigating away. The thread scrolls to the mentioned message (centered) and pulses it once, rather than jumping to the bottom. - ThreadPanel/ThreadSidebar take a focusMessageId; rows tag their ThreadItem with data-thread-message-id for targeting. - Bottom auto-scroll is suppressed while deep-linked; the mention is re-centered on timeline changes during the pulse so late-loading agent turns can't drift it off-screen. - Re-clicking the same settled message is a no-op (focusedRef guard). - Adds a thread-mention-highlight keyframe for the pulse. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K18PGBxVQy1fnC9ADbst3y
Floating scroll-to-bottom button matching the experimental ChatThread scroller: appears when the viewport is scrolled up off the bottom (gap below the fold > 100px), fades/scales in, and smooth-scrolls to the newest message on click. Especially useful for the deep-linked mention view, which lands mid-thread. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K18PGBxVQy1fnC9ADbst3y
A window keydown listener (active only while a thread is open) clears the selection on Esc, so focus needn't be inside the panel. Skips when the event was already handled (e.g. an open dropdown consuming Esc). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K18PGBxVQy1fnC9ADbst3y
Apply the pulse to a square (rounded-none) ThreadItem so the flash covers the whole row rather than an inset rounded box. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K18PGBxVQy1fnC9ADbst3y
Wrap the Activity thread mount in AnimatePresence and animate the wrapper width (auto <-> 0) plus opacity, so the mention list reflows in lockstep with the panel. Matches the docked sidebar's slide contract exactly: 200ms / cubic-bezier(0,0,0.2,1). width:auto once open keeps ThreadSidebar's resizable width intact; the wrapper is keyed stable so switching mentions swaps the inner panel without a close/reopen. Honors prefers-reduced-motion (opacity-only, instant). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K18PGBxVQy1fnC9ADbst3y
Apply the Activity thread's slide to the channel view's ThreadSidebar: wrap the mount in AnimatePresence, animate wrapper width (auto <-> 0) + opacity at 200ms / cubic-bezier(0,0,0.2,1) so the feed reflows in lockstep. Also add a window Esc listener (active while a thread is open) that closes it from anywhere in the channel, matching Activity. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K18PGBxVQy1fnC9ADbst3y
…+ a11y Address review findings on the thread slide-in: - Extract the duplicated AnimatePresence/width-slide wrapper (Activity + channel) into a shared AnimatedThreadDock. - Apply overflow-hidden only while animating, so the settled panel no longer clips the ResizableSidebar resize handle (it overhangs the inner edge). - Guard the mention-pulse and jump-pill transition with prefers-reduced-motion. - Give all highlighted thread rows rounded-none for a consistent full-bleed pulse. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K18PGBxVQy1fnC9ADbst3y
|
✨ Submitted to Merge by @adamleithp. It will be added to the merge queue once all branch protection rules pass, there are no merge conflicts with the target branch, and impacted targets for the current PR head commit have been uploaded. See more details here. |
|
React Doctor found 4 issues in 2 files · 1 error & 3 warnings. Errors
3 warnings
Reviewed by React Doctor for commit |
Contributor
|
Reviews (1): Last reviewed commit: "refactor(canvas): extract AnimatedThread..." | Re-trigger Greptile |
Comment on lines
+188
to
+190
| const onKeyDown = (event: KeyboardEvent) => { | ||
| // Let an open menu/popover consume Esc first (it preventDefaults). | ||
| if (event.key === "Escape" && !event.defaultPrevented) setSelected(null); |
Contributor
There was a problem hiding this comment.
Comment on lines
+133
to
+136
| const onKeyDown = (event: KeyboardEvent) => { | ||
| // Let an open menu/popover consume Esc first (it preventDefaults). | ||
| if (event.key === "Escape" && !event.defaultPrevented) | ||
| closeThread(channelId); |
Contributor
There was a problem hiding this comment.
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.
What
Reworks the Activity page (and aligns the channel feed) so opening a mention keeps you in place and takes you straight to the message.
ThreadSidebarinstead of routing to the task. The list stays put.data-thread-message-id) instead of jumping to the bottom, and re-centers while late-loading agent turns stream in so it can't drift off-screen. Re-clicking the same settled message is a no-op.thread-mention-highlight, reduced-motion aware).ThreadPanel, matching the experimental ChatThread scroller.auto ↔ 0) so the list/feed reflows in lockstep, at the docked sidebar's exact 200ms /cubic-bezier(0,0,0.2,1)contract. Extracted to a sharedAnimatedThreadDock;overflow-hiddenis applied only while animating so the resize handle isn't clipped once open. Reduced-motion → opacity-only.Testing
prefers-reduced-motionon → appears/disappears instantly, no pulse.🤖 Generated with Claude Code