Repository navigation
cmux NEXT sidebar: rows take hover only inside their rounded pill, not the gap or corners - #22294
Conversation
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>
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>
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by web and size checks: green Tour of |
This comment has been minimized.
This comment has been minimized.
[Medium impact] The PR appears safe to merge, with the previously reported near-edge hover flicker remaining as a non-blocking issue. Findings
SummarySidebar workspace and tab rows now take hover only inside a smaller rounded pill.
Review was based on source inspection. Native AppKit tests and visual capture were not run in this Linux environment. Reviews (7) · Last reviewed commit: "Merge remote-tracking branch 'origin/fea..." · Reviewed by Greptile |
| let reach = rowSpacing + inset | ||
| guard point.x >= band.minX, point.x < band.maxX, | ||
| point.y >= band.minY - reach, point.y < band.maxY + reach else { return nil } |
There was a problem hiding this comment.
The current row stops keeping hover before the next rounded pill begins near either side. During a downward sweep at frame.minX + 1, reaching the next row's minY + inset fails both checks: the pointer is outside its rounded corner, but the previous row's hold has already ended. The highlight and buttons disappear until the pointer enters the curve.
Keep the current row hovered through the neighbor's rounded corner without giving hover to that neighbor early. Add near-edge sweeps in both directions; the new sweep test only checks the horizontal center.
- Packages/macOS/CmuxNext/ci-target-graph.json - schemas/defaults/cmux-next.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39358292621
|
Bead |
- Packages/macOS/CmuxNext/ci-target-graph.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39361446273
…ab-hover-inset # Conflicts: # Packages/macOS/CmuxNext/ci-target-graph.json
…-vtab-hover-inset
…y tests (review of #22294) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Correctness review (subagent, head
Red/green on the fleet ( |
|
Re-review (subagent, head Low, kept on purpose: a double-click just below a hovered last row now renames that row instead of creating a workspace in the empty space. This follows the same rule as the fix, that a click acts on the lit row. Once the pointer leaves the row's hover band, a double-click creates a workspace as before. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Orphaned: no activity for 14 h, and no lane holds a lease on it. The orphan sweep could not merge |
…ab-hover-inset # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/SidebarListView+ContextMenu.swift
|
|
|
Shipped in:
|
Leo, on the nightly: moving the pointer up and to the left out of a sidebar row, it crossed the gap and the rounded corner of the row above. That row took the hover and showed its "..." and close buttons in his way.
A workspace or tab row in the sidebar now takes the hover only inside its pill: its frame inset by
Metrics.space1top and bottom, with corners roundedMetrics.space1further in than the drawn ones. The gap between rows, the corners and the margin beside a row never hand the hover (or the workspace hover card) to a new row. The row already hovered keeps it across the gap up to its neighbor's pill, so a sweep down or up the list still never flickers (#20315). Clicks still split the gap between the two rows, as before. Headers, empty sections and blocks keep their whole tile.SidebarLayout.hoverRow(at:current:frame:cornerRadius:inset:)is the one rule;SidebarListView.updateHoverand the hover card'shoverCardWorkspace(at:)both use it.Changelog
Fixed: The sidebar's gaps and rounded row corners no longer light the row above and put its buttons under the pointer.
Testing
Red then green, on the fleet (
cmux-ci run --class light --script scripts/ci/package-test-lane.sh --arg=suite --arg=Packages/macOS/CmuxNext --arg=SidebarRowHoverInsetTests,SidebarRowHoverGapTests):SidebarRowHoverInsetTestsdrives the realSidebarListView.updateHoverin a window: the gap with nothing hovered hovers nothing; the row above's bottom-left corner doesn't take the hover from the row below; the margin beside a row doesn't hover it; a sweep up the list hovers each row once with no drop.SidebarRowHoverGapTests(the down sweep) now starts from the first row's middle, since a row's pill starts inside its frame.Observed / Not run
Observed: the fleet runs above. Not run: the full CmuxNext suite (PRs here skip it).
Proof
PROOF_PENDING
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Fixes the cmux NEXT sidebar hover so workspace and tab rows take the hover only inside their rounded pill, not in the gap, corners, or the margin beside them. Moving the pointer up and left out of a row no longer lights the row above and puts its buttons in the way.
SidebarLayout.hoverRowis the single rule behind the list's hover, the hover card's target, and click targeting, with pill geometry covered bySidebarRowHoverInsetTests.Written for commit a373d68. Summary will update on new commits.