Skip to content

Sidebar: a workspace hover preview lists its tabs, each one click away (carry #28139) - #28897

Merged
teamleaderleo merged 35 commits into
feat-cmux-nextfrom
carry/28139-hover-tabs
Oct 31, 2026
Merged

teamleaderleo merged 35 commits into
feat-cmux-nextfrom
carry/28139-hover-tabs

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

Carries #28139 (its owner lane went idle about six hours ago mid-step; all of its commits are kept with their authorship) onto current feat-cmux-next.

Leo, verbatim, 2026-10-30: “i still dont see the hover previews being like rex with multiple tabs being clickable”

Earlier asks this answers, verbatim: “and also why dont we have the rex thing yet of being abel to access the individual tabs in a workspace on its hover preview the best of both worlds thing” and (2026-10-24) “default just only show the inner tabs on hover and be able to go to and focus them when hovering ovre workspaces … wouldnt first prompt/input needing/whatever MAYBE be nice...? idk tho. we can tuck that behind toggle”.

Change

A workspace's hover preview in the sidebar lists that workspace's tabs, and each one is a click away: clicking a tab row focuses that workspace and that tab. The card opens tabs-first; status, prompts, history, usage and custom content stay available behind one "Show details" toggle. Overflowing tabs expand inside the same bounded scroll area with "Show more". Arrow keys move through tabs only while the pointer is on the card; keys on the workspace row still go to the focused terminal. Spec: leo-workspace design/sidebar.md (Hover previews; the tab list was listed there as cmux#24785, which this carries).

Carry work on top of #28139: merged feat-cmux-next; the conflicts were in HoverCardBody/HoverCardCoordinator (base added cornerRadius, this PR added interactive; both kept and passed through to HoverCardPanel.present) and plans/cmux-next/sidebar-owner.md (both sections kept).

Screenshots

Fleet captures (2x, cmux-mac-mini via capture-host, the hover-card gallery's synthetic data), cropped to the card. Before is base b93dcfbc826d, after is this head.

Before (base) After (this PR)
Light before light after light
Dark before dark after dark

Before, the card had no tabs at all: status, facts, PR and resources only. After, the chosen default opens tabs-first; each row is one tab (kind icon, name, folder, its status dot or spinner) and clicking it focuses that tab. "Show 3 more" expands the list in place; "Show details" brings back the status, facts, PR and resources.

The full gallery, with the three other placements we compared (tabs after status, tabs below title with details open, compact tabs below details): light, dark.

I viewed the after images (both crops and the full gallery, light and dark) before marking this ready. pr-media upload through cmux-ci capture --pr failed from this agent host (glaeda's broker refuses the contents API read, #28265), so the images went up with scripts/pr-media.py directly.

Validation

Pending at the head: fleet app compile, the hover-card suites (WorkspaceTabHoverCardTests and the nine adapted hover suites), independent review.

Risk: hover-card event routing. The card now takes mouse events, so the focused terminal must keep its keys while the pointer rests on the workspace row (covered by WorkspaceTabHoverCardTests).

Size: about 1,250 lines, most of it the 21-locale strings for the details toggle and the regression tests; the list, its click routing and the toggle are one interaction and don't land usefully apart.

Agent session: agent session

Leo, 2026-10-24: "default just only show the inner tabs on hover and be able to go to and focus them when hovering ovre workspaces."

Reuse the current tab state and folder projection, pinned-row lookup, and Lawrence's one-pixel sidebar hover placement. Preserve the richer card behind an off-default setting.

Sidebar-Look: default just only show the inner tabs on hover and be able to go to and focus them when hovering ovre workspaces.
Agent-Session: https://cmux.com/deeplink/agent?id=aid-585d2523f6018bb56480
Fleet settings export job 7d423c7c3850d3db326334ac at 64efd77 passed all 9 export tests. Includes the regenerated default snapshot requested for the hover setting; no generated files were hand-edited.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-585d2523f6018bb56480
Use the paired theme so the capture driver picks the matching light and dark palette instead of recording the last light step twice.

Sidebar-Look: no visual change
Agent-Session: https://cmux.com/deeplink/agent?id=aid-585d2523f6018bb56480
The keyboard fixture now establishes a real window, target hit and matching key event before checking consumption. The interaction tour focuses its created workspace before adding another tab.

Sidebar-Look: no visual change
Agent-Session: https://cmux.com/deeplink/agent?id=aid-585d2523f6018bb56480
The current default dwell is 1300 ms; give it two seconds before targeting the interactive card.

Sidebar-Look: no visual change
Agent-Session: https://cmux.com/deeplink/agent?id=aid-585d2523f6018bb56480
Bind release activation to the tab ID captured on mouse-down and clear that identity when a reusable row is configured for new content. Add a regression for press, replacement and release.

Sidebar-Look: no visual change
Agent-Session: https://cmux.com/deeplink/agent?id=aid-585d2523f6018bb56480
Carry the inner-tab interaction from #24785, preserving workspace status, prompts, timeline and custom content. Compare three combined-card variants and bound overflow within the tab list.

Sidebar-Look: Leo: "and also why dont we have the rex thing yet of being abel to access the individual tabs in a workspace on its hover preview the best of both worlds thing"
Agent-Session: https://cmux.com/deeplink/agent?id=aid-9d89b5685bb17a5e172b
Sidebar-Look: Leo: "and also why dont we have the rex thing yet of being abel to access the individual tabs in a workspace on its hover preview the best of both worlds thing"
Agent-Session: https://cmux.com/deeplink/agent?id=aid-9d89b5685bb17a5e172b
Sidebar-Look: Rex-style tabs first, details behind one click
Agent-Session: https://cmux.com/deeplink/agent?id=aid-9d89b5685bb17a5e172b
…-hover-tabs

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextDesign/HoverCards/HoverCardCoordinator.swift
#	Packages/macOS/CmuxNext/Sources/CmuxNextDesign/HoverCards/HoverCardSource.swift
#	plans/cmux-next/sidebar-owner.md
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@teamleaderleo
teamleaderleo marked this pull request as ready for review October 31, 2026 04:38
@cursor

cursor Bot commented Oct 31, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review f86a6ae: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr28897 -f ref=carry/28139-hover-tabs -f platform=macos -f backend_mode=local

Default changes

This pull request changes 3 defaults at f86a6aea2d52 (what everyone gets without configuring anything):

  • tunable-source.CmuxNextApp/Focus/DebugFocus.swift:window: "87ee3e2e0cec4980a2829d1e2474a3df7dc797b9bd8e768ca1f88ee38c00abb0" -> "b805a4c2b00844e7b2f0cb641f67940566dffb1e89e4aab687211bc6e25ffc3b"
  • tunable-source.CmuxNextApp/InputVerification/DebugMouse.swift:hoverCard: (none) -> "7175b7af653eecf98cab75e2650a10cd6b7449ab26c3c67bb1e3bc7688633a30"
  • tunable-source.CmuxNextApp/InputVerification/DebugMouse.swift:send: "109678464546150433b22506d4a396faaeefc8780735a38a07897e61c9bace43" -> "3b90069867380238edfa0db55dd00eb317e7688c6019d7ca37340f1f6c11adf0"

Signed off on this commit by review (codex, router-review).

Merge receipt: merged as c3a355cd57b9 with these defaults changed, signed off by review (codex, router-review).

Regenerate the snapshot with python3 scripts/ci/defaults_guard.py snapshot.

Shipped in:

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex, router-review): SHIP at a0430b2

Reviewer: codex gpt-6-astra high, fast tier.

Follow-ups: 2. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward.

SHIP at a0430b2

Visual verdict: Both supplied after screenshots pass in light and dark; no visible clipping or excessive controls.

  1. [P2] [follow-up] WorkspaceTabHoverCard.swift:155: Clicking the overflow scrollbar dismisses the card. The mouse allowlist accepts rows and “Show more,” but excludes NSScroller, so the coordinator treats a scrollbar press as dismissal. Accept the scrollbar so users can drag through expanded tabs.

  2. [P2] [follow-up] WorkspaceHoverCard.swift:146: “Hide details” does not persist on a card opened through “Show Resource Usage.” detailsRequested remains set until dismissal, so the next content refresh—or clicking “Show more”—reopens details and restarts sampling. Consume the request after initially expanding the card.

AppKit tests could not run on this Linux host. The changed localization and tour JSON files parse successfully.

Follow-ups:

  • Accept scrollbar clicks without dismissing the card.
  • Consume the resource-details request after its initial expansion.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
teamleaderleo and others added 2 commits October 31, 2026 04:58
Its key pass-through test skips without a window server.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 713358d

BLOCK at 713358d

Visual verdict: after images show the intended compact tabs-first card; no visual blocker.

  1. [P1][blocking] HoverCardCoordinator.handleMonitoredEvent only preserves interactive clicks for leftMouseDown (Packages/macOS/CmuxNext/Sources/CmuxNextDesign/HoverCards/HoverCardCoordinator.swift:395-401). The matching leftMouseUp falls through to dismiss(.click) at lines 412-417, so clicking “Show details” or “Show more” immediately starts dismissing the card and clears their callbacks. These controls therefore cannot expand the card in place as specified.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
…re never monitored

The card's event monitor matches presses only (now named monitoredEvents), so
an accepted press's mouse-up goes to the control's own tracking loop and
cannot dismiss the card. Pins that against the review finding at 713358d.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

On the BLOCK at 713358d (#28897 (comment)): the card's event monitor never sees a mouse-up. Its mask is [.keyDown, .leftMouseDown, .rightMouseDown, .otherMouseDown, .scrollWheel] (HoverCardCoordinator.updateMonitor), so a leftMouseUp cannot reach handleMonitoredEvent's dismiss. An accepted press goes to the control, and NSButton takes its own release in its tracking loop.

f86a6ae names that mask HoverCardCoordinator.monitoredEvents and adds WorkspaceHoverCardScrollTests.pressingShowDetailsKeepsTheCardAndItsReleaseIsNeverMonitored. The test checks that the mask has no .leftMouseUp, that a press on Show details is passed through and the card stays, and that the click then expands the card in place. It passed on the fleet at f86a6ae (WorkspaceHoverCardScrollTests 4/4, along with WorkspaceTabHoverCardTests 16/16 and four other hover suites).

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex, router-review): SHIP at f86a6ae

Reviewer: codex gpt-6-astra high, fast tier.

Follow-ups: 2. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward.

SHIP at f86a6ae

Visual verdict: Both light and dark after screenshots are readable, with no visible clipping or redundant controls.

  1. [P2] [follow-up] WorkspaceTabHoverCard.swift:155 — Dragging the overflow scrollbar dismisses the card. After “Show more,” clicking the scrollbar hits ThinScroller, but the allowlist accepts only tab rows and the more button. The coordinator therefore dismisses the card on mouse-down. Accept scrollbar interaction so users can drag through overflow tabs.

  2. [P2] [follow-up] WorkspaceHoverCard.swift:146 — Collapsed details reopen after a resource-card refresh. Open “Show Resource Usage,” click “Hide details,” then click “Show more.” Its refresh rebuilds the body, and the retained detailsRequested flag expands details and restarts sampling. Workspace updates trigger the same behavior. Consume the request after its initial expansion.

AppKit tests could not run in this Linux box. The changed JSON files parse successfully.

Follow-ups:

  • Accept overflow scrollbar clicks without dismissing the card.
  • Consume the initial details request so subsequent refreshes preserve the user’s collapse choice.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@teamleaderleo
teamleaderleo merged commit c3a355c into feat-cmux-next Oct 31, 2026
176 of 180 checks passed
@teamleaderleo
teamleaderleo deleted the carry/28139-hover-tabs branch October 31, 2026 12:56
teamleaderleo added a commit that referenced this pull request Nov 6, 2026
…rs its highlight or its card (#37201)

* test(sidebar): moving around the selected row and onto its card never hides, moves or unhovers it

Red on base: the interactive workspace card's window takes the mouse over
its clear band, which lies over the trailing part of the hovered row, so the
list sees the pointer leave its row and the card hides under a pointer still
on the row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a7568197607c3cdfb81

* fix(hover cards): an interactive card's window takes the mouse only on the card, not over the row beside it

Leo 2026-11-06: "when you're moving your cursor around the sort of highlighted
workspace, it flickers still. Like this was a problem from before."

Since #28897 the workspace card is interactive, and its window (the card plus
a ~50 pt clear band for the shadow and slide) took mouse events over the
trailing part of the hovered row and the rows beside it. The list's tracking
area saw the pointer leave while it moved over its row (the row hover went off
and on), and moves in the band reached no source, so the card hid after the
reshow window and reshowed when the pointer moved back. Off the card the
window now ignores the mouse; the move onto the card hands it over.

handleMonitoredEvent moves to HoverCardCoordinator+Pointer.swift with the new
updateCardMouse so the coordinator file does not grow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a7568197607c3cdfb81

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was previously deployed

1 inactive deployment
ci-routing-agent — f86a6aea Deployed Oct 31, 2026 by teamleaderleo via namespace autofix #9720
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant