cmux NEXT sidebar: workspace rows run full length; the hover close is a top-right dog-ear
Leo-ask: ask-c8936f0e52
Leo, on the dog-ear as it shipped in the sidebar-dogfood build:
"the dog ears you straihgt up didnt understand i wanted the hoverable area to just... not have it on the top right corner. a smaller top right corner not higlighitng bc the button itself chopped off that top right. tht's what i mean. anywyas current ismaybe "OK" but eh"
Before that (2026-10-21) he asked for the row's length back ("so we can have more content per sidebar row"), for the hover action to sit "like dog ears on a book on the top right", and for the title not to reshape on hover.
What changed (this round)
- The folded triangle is gone. The close (or the menu, on Home, which can't close) sits in a small square on the row's top-right corner, and the row's hover or selection fill leaves that square out. The highlight looks like the row with its corner cut away by the button. The x stays where it was.
- The cut is in the fill, not in the row. While the corner is cut, the row draws its fill as a shape layer under its content, clipped to the row's corner radius. Otherwise the fill stays on the backing layer as before. The row gets no mask. The button draws only its glyph (
textSecondary,textPrimaryunder the pointer): no fill, no box. The fill colors are the theme's translucent hover and selection fills, so it stays glass. No accent and no animation were added; the shaped fill shows and clears at once, like the hover fill. - Clicks: the close takes exactly the cut as drawn, including the rounded fillets that reach a few points past its square, in every look. A click on the fill, even right next to the cut, belongs to the row. Under a pointer that isn't moving, the x lights as soon as it appears. Changing the look in Debug Settings redraws the rows already on screen. The tabs chevron, the session tree's fold and the audio button still draw over the corner and keep their clicks.
- Unchanged from the earlier rounds: rows run to the list's inset (
rowTrailingTrim0). The title keeps its full width with or without hover. The unread badge and keycap keep their slots. An expanded row's Pin stays at the end of the name's line, clear of the badge and the corner.
Gallery versions
These are the real list views drawn offscreen on the fleet (WorkspaceRowCloseNotchGalleryTests, step 1ba69b92265428b3dca070a4 on aws-m4pro-3). Each sheet shows a hovered row under the selected row, and the selected row hovered, in dark and light (Soft Blue / Soft Blue Light). They are kept as Debug Settings choices under sidebar.closeNotch ("Row close corner"), the same pattern as sidebar.allChats.design.
- Snug rounded cut (default, the pick): about 0.6 of the old dog-ear's side, with the x centered and the cut's corners at half the row's radius.
- Snug square cut: same size, square corners.
- Rounded cut at the size of the old hit box (the dog-ear's full square).
- Snug rounded cut with a hairline (
Palette.separator) along its edge.
Why snug rounded: it is the "smaller top right corner" Leo described. The cut is barely larger than the x, so it reads as the button taking its own corner rather than as a new shape. Its rounded inner corners match the row's own radius family. The square cut looks like a rendering bug next to the rounded row. The hit-box cut takes noticeably more of the row and reads as a tab or notch. The hairline adds a border, and rows are fills-only.




Native capture (fleet capture mini)
This is a hovered row in the real app at the head (the x sits in the corner its fill leaves out):
Capture steps-318fcfd6cc at 90fc220e3655 (fleet build, capture mini, text checked for private data)
| Light | Dark |
|---|---|
![]() | ![]() |
Earlier rounds, still in this PR
- Rows run to the list's inset again.
SidebarStyle.rowTrailingTrimis 0. Pinned rows and list blocks read the same token, so every row still ends at one x. Takes back #22733: Leo asked for the row length back on 2026-10-21. Only itsrowTrailingTrimpart is taken back; its hover-follow and hover-card changes stay. - One hover action: the close on a row that can close, the menu on one that cannot (Home). The ⋮ menu no longer shows on hover for closable rows. It is still on right-click and on VoiceOver's custom action, opened under the corner. Identifiers are unchanged (
cmux.sidebar.workspace.<id>.close/.more).
Tests
WorkspaceRowDogEarTests, rewritten for the cut:- the close is the row's top-right snug square, smaller than the old dog-ear, takes a click in the corner and not beside or below it, and closes on press;
- the hover fill leaves the corner out (the backing layer is clear, the shaped fill keeps the row's radius and is translucent), and the row fills whole again after hover;
- every
sidebar.closeNotchlook cuts its own size, keeps the x at the same point, and draws the hairline only in the hairline look; - in every look, a point in the drawn cut outside the close's square closes, and a point just outside the cut selects (Codex review of 90fc220e);
- changing
sidebar.closeNotchrelays out a row already on screen throughSidebarTunablesWatch; - the close shows lit when it appears under a still pointer, and unlit when the pointer is off it;
- plus the existing row-length, title-width, controls-under-the-corner, Home menu and expanded-pin tests.
WorkspaceRowHoverMotionTestsexpects the one corner button.WorkspaceRowCloseNotchGalleryTestsrenders the gallery whenCMUX_TEST_REQUIRE_GUI=1(the fleet's opt-in); it is skipped otherwise.
Observed / Not run
- Fleet compile-check
--appat c80b62d9: passed (job35ad40b6f78c49c0088d2346). - Fleet suites at c80b62d9:
WorkspaceRowDogEarTests,WorkspaceRowHoverMotionTests,SidebarRowHoverGapTestsandSidebarRowBadgeStackCapTests(it sharesSidebarTunablesWatch), all passed (step137a4a1f79fb29b72aec0851). - The gallery and the native capture above were taken at 1bde45a7 and 90fc220e. The later commits change the hit area, the look watch and the pointer refresh, not the drawing.
python3 scripts/cmux-next/prepush-gate.py: no new violations.- Not run: the full CmuxNext suite.
Changelog
Changed: Sidebar workspace rows use their full width again. On hover, the close sits in the row's top-right corner, which the highlight leaves out.
Agent session: cosmic-gray
Takes back #22733: Leo explicitly asked for the row length back; this PR restores full-width rows while preserving the hover-follow and hover-card changes.

