Repository navigation
CmuxNext: sidebar rows tile so hover moves row to row with no flicker - #20315
Conversation
…bead) Two behavior tests on SidebarListView: consecutive workspace rows' hit areas meet with no dead band, and a 1 pt pointer sweep down the list hovers exactly one row at every step, the fills cross-fading as it moves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The card waits for a native-tooltip dwell: a 1 pt / 2 ms sweep across five rows shows none, and a 1.2 s rest on one row shows exactly its card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (no bead) Hit testing gives the spacing between two rows to the rows on either side (half each), so consecutive rows' hit areas meet and the pointer is never between two rows: the hover moves from one row to the next in one step, and the two fills cross-fade (MotionFade.hover). The pill stays inset in the row. Section and group gaps and the drop gap still hit nothing. The workspace hover card waits for a native-tooltip dwell (motion.hoverCard.dwell, 1 s) instead of showing at once, so a sweep down the list shows no card and leaving a row cancels its pending card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bead) Workspace rows, selected or not, keep their text and trailing marks the same inset from the pill's edges as the pill is from the sidebar's; the pill lines up with the section header and the band divider; the count badge is as tall as the status glyph, with tabular digits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…adge (no bead) SidebarStyle.horizontalInset now sets the pill's inset from the sidebar's edges and the content's inset from the pill's, leading and trailing, selected or not: the title's text starts at it (label cells sit back by their cell padding) and the trailing marks end at it, so they no longer crowd the right edge. Section and region header names start where row titles do, and the band divider takes the same inset so its ends line up with the pills. The count badge stays a quiet small-radius rect on the theme's badge fill (no hairline), now as tall as the status glyph through one CmuxNextDesign token (Metrics.statusMarkSize), with tabular system digits optically centered instead of a monospaced face. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The title draws at its frame's edge, so it ends at the shared inset like the trailing marks do; a row without marks no longer stops its text 2 pt short of the pill's trailing inset. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by |
…well (no bead) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
#21543 made hover entry immediate (fadesNextFill = !isHovered) and rows clear with the hoverOut token, instant by default. SidebarRowHoverGapTests from #20315 still expected both fills to fade, so it failed on feat-cmux-next. The test now expects the new row's fill to show at once and the old row to animate only when hoverOut has a duration. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The gap between rows, a row's rounded corners and the margin beside it no longer hand the hover (and the "..." and close buttons, and the hover card) to a new row. The row hovered keeps it across the gap, so a sweep never flickers (#20315). Clicks still split the gap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t the gap or corners (#22294) * test(cmux-next): sidebar rows take hover only inside their rounded pill Leo 2026-10-19: moving up-left out of a row, the gap and the rounded corner of the row above took the hover and showed its controls in his way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(cmux-next): sidebar rows take hover only inside their rounded pill The gap between rows, a row's rounded corners and the margin beside it no longer hand the hover (and the "..." and close buttons, and the hover card) to a new row. The row hovered keeps it across the gap, so a sweep never flickers (#20315). Clicks still split the gap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at 6f74de6 - Packages/macOS/CmuxNext/ci-target-graph.json - schemas/defaults/cmux-next.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39358292621 * chore(next): PR autofix at b45db77 - Packages/macOS/CmuxNext/ci-target-graph.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39361446273 * fix(cmux-next): a sidebar click acts on the hovered row; pill geometry tests (review of #22294) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
Summary
Leo reported four sidebar workspace-row papercuts. This PR fixes all four:
rowSpacing(2 pt) apart, and that spacing hit nothing. Moving the pointer down the list dropped the hover in every gap, so it flickered row to row.SidebarLayout.row(at:)now splits the spacing between two consecutive rows, half to each, so their hit areas meet. The hover moves from one row to the next on the same pointer step, and the fills cross-fade (MotionFade.hover). The pill stays inset inside the row.motion.hoverCard.dwell(default 1 s, with the other Motion hover tunables).SidebarStyle.horizontalInsetnow sets four distances: the pill's inset from the list edges, the text's inset from the pill's leading edge, the trailing marks' inset from its trailing edge, and the band divider's inset. These match on selected and unselected rows.SidebarStyle.labelCellPadding), and it runs to the trailing inset.Metrics.chipCornerRadius, not a capsule) on the theme's badge fill, with no hairline.Metrics.statusMarkSize.The row's X and options controls are unchanged. They show with the row's hover fill, as in Edge and Codex.
Overlap with other lanes:
gh pr list --search "status glyph"and theop-next-icons/branches show only cmux-next: web popups cast the native popup shadow; classic New Tab suggestions are menu rows (coherence pass 2) #20213, which doesn't touch the sidebar orStatusIndicator*.SidebarStyle.indicatorSizenow readsMetrics.statusMarkSize, which has the same value as before (smallIconSize - space1), so the glyph keeps its size.SidebarSide+Pins.swiftandWindowRootView+SidebarSide.swiftare untouched. All inset changes are inside the sidebar row, list and band views.Testing
I added three behavior suites in
CmuxNextAppTeststhat drive a realSidebarListVieworSidebarViewin a window:SidebarRowHoverGapTests:SidebarHoverCardDwellTests:SidebarRowGutterTests:Fleet runs, each
cmux-ci run --class light --script scripts/ci/run-swift-testing-suites.sh --arg Packages/macOS/CmuxNext:7b2a4804111c(--red): both hover suites fail.aa4c0416d921(--red):SidebarRowGutterTestsfails.171d134c43d6: both hover suites pass.26961ff1d96d: all three suites pass.Every run also fails
CmuxNextDaemonTests.DaemonCapabilityExportTests/exportIsFresh, including the test-only red commits. This PR doesn't touch it, so it's a base red.Guards on the head (merge base
5f5eefbd72fc):check-concurrency.sh,check-motion.sh,check-theme-scope.shandcheck-system-blue.pypass.crash_ratchet.pypasses.lint-ios-package-conventions.shpasses.check-app-size.sh --basepasses: CmuxNextApp is untouched at 113798 lines.check-no-godfiles.sh --basepasses, with notes only for entries that were already over budget on the base and that this change didn't grow.WorkspaceRowView.swiftstays at 399 lines.Localization: the only new strings are the Debug Settings tunable's title and help text, which are English-only like every other tunable. No user-facing strings changed.
Proof: captures don't gate this change. What's visible: the hover moves row to row with no off frame; no hover card appears during a sweep; row text and trailing marks sit the same distance in from the pill; and the count badge is a glyph-height quiet rect.
Changelog
Fixed: Moving the pointer down the sidebar no longer flickers the hover highlight between rows.
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Fixes four sidebar workspace-row papercuts: hover no longer flickers between rows, the workspace hover card waits for a native-tooltip dwell, row content and marks share one gutter, and the count badge matches the status glyph.
Behavior changes
motion.hoverCard.dwell) before showing; sweeping the list shows no cards, and leaving a row cancels its pending card.Visual changes
SidebarStyle.horizontalInsetnow sets the pill, title, trailing marks, and band divider insets to one gutter; the divider is now inset (it was full width), and a title without marks runs to the trailing inset.Metrics.statusMarkSize), with tabular system digits instead of a taller monospaced chip.Three new test suites cover the hit-area tiling, hover-card dwell, and gutter/badge metrics.
Written for commit 55f860c. Summary will update on new commits.