Skip to content

ui: compact shared tooltip previews - #35205

Merged
teamleaderleo merged 8 commits into
feat-cmux-nextfrom
lane/ui-tooltip-system
Nov 4, 2026
Merged

teamleaderleo merged 8 commits into
feat-cmux-nextfrom
lane/ui-tooltip-system

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

Leo: “i think our hover previews are generally pretty ass” and “there's just tons of design systems related stuff for spacing guttters icons etc whatever like we don't yet feel "designed" yet nawmean”.

Tooltips now prefer a compact bubble above their control, with caption text, an emphasized title and a dimmer second-line description. A truncated label still appears in full, wrapping within the same 320px maximum instead of forcing the source row's width. The 4px anchor gap, viewport inset, padding and maximum width follow the shared grid and interface scale. Explicit side choices, shortcuts, rich React content, colors, glass, and existing hover delay/fade behavior remain available.

Spec: leo-workspace design/overlay-surfaces.md; mapped in .github/design-surfaces.json.
References: cmux/live/transcript-hover-preview-fork-tooltip, cmux/live/transcript-hover-preview-copy-response, claude/live/transcript-fork-from-here-tooltip.

Gallery: ui.tooltip/above-compact, below-compact, and title-detail; selected above-first title/detail. Final fleet matrix run 41815709481 captured 24 Chromium cases (dark/light, compact/comfortable, interface scales 1 and 1.25); all cases rendered with ready=1. The gallery play now waits for the tooltip to become visible before capture.

Validation:

  • Run 41815709481: full webviews check, 20/20 focused tooltip tests, and 24/24 gallery cases passed at tested head 48c6df2.
  • Both lint lists regenerated (UI allowlist 64, design-token baseline 2132).
  • Rail harness run 41815751911 used exact refs: before 9c5d3c4, before-wave 0d247b5, after 756c019. Target-painted p50/p95/max ms: before 3000 4.50/6.58/17.80, after 4.20/5.90/9.40; before 100 4.50/6.60/13.90, after 3.70/5.48/10.00. After had zero dropped frames versus one in the before-wave run; artifact 13314433515.
  • No new timer, observer or animation loop. Geometry reads occur while placing an open bubble. Risk: long truncated labels wrap more than before; their text is preserved.

Follow-ups: #35268 tracks unused tooltipWidth arguments, popup-document scale handling, and a long-title gallery state.

🤖 Generated with Codex

Agent session: https://cmux.com/deeplink/agent?id=aid-b605b496e2aad0871fdf

Co-authored-by: Codex <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-0e9f3e645685b2cfca3a
@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 48c6df2: 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=pr35205 -f ref=lane/ui-tooltip-system -f platform=macos -f backend_mode=local

Gallery before/after for 48c6df2: the capture produced no images (run).

Probably yours: popup-surface.test.ts, popup-surface.test.ts fails here but not on main's latest full suite. Seen on other PRs too (likely flaky): SentMessageGroup.test.tsx, agent-pane-reply-actions-frame.test.tsx, thread-rail-foot-card.test.ts and 1 more. This PR merged before its CI finished: fix forward on main.

CI failed on 48c6df26a1 (run 41815895970 attempt 1): 1 code, 1 unknown.

Job Verdict Why
web / react-apps-base-check (8) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs SentMessageGroup.test.tsx a finished Claude turn of the loop draws the group's line, not 8 rows: failed (job)
  • seen on other PRs agent-pane-reply-actions-frame.test.tsx a personal steer keeps reply A and final reply B expanded while other chatter collapses: failed (job)
  • seen on other PRs thread-rail-foot-card.test.ts a pane with a tab row band: the rail ends above the stack and each card centers on its tick, at rest...: failed (job)
  • seen on other PRs thread-rail-foot-card.test.ts a one-tab pane: the rail ends above the stack and each card centers on its tick, at rest and over a ...: failed (job)
  • new in this PR popup-surface.test.ts popup surfaces in chromium > the web tooltips match the native tooltip: failed (job)
  • new in this PR popup-surface.test.ts popup surfaces in webkit > the web tooltips match the native tooltip: failed (job)
Matched log lines
web / react-apps-base-check (8): (fail) a finished Claude turn of the loop draws the group's line, not 8 rows [2.08ms]

Not re-run automatically: web / react-apps-base-check (8), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: red check: Base-red classifier (per test) (+2 more) is not red on the base a0fd4e7; do not merge until green; see lane-rules
red: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules
red: web / react-apps-base-check (8); NEW webview test reds: test/popup-surface.test.ts > popup surfaces in webkit > the web tooltips match the native tooltip; test/popup-surface.test.ts > popup surfaces in chromium > the web tooltips match the native tooltip; test/composer-menu-dismiss.test.ts > webkit: agent-pane.new-tab reasoning-chip at 760 px: a press outside an open menu only closes it; nothing under it is clicked (+4 more); do not merge until green; see lane-rules
red: web / react-apps-check; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules

Shipped in:

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 4, 2026
@teamleaderleo teamleaderleo added the leo-named-fix An obvious fix to something Leo named: lands on push, review runs in parallel label Nov 4, 2026
@blacksmith-sh

blacksmith-sh Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Found 10 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmphsb9y3rc/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpw4462gzv/summary-missing.json (live):/summary-missing.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
imported web bundle inputs are not routed:/imported web bundle inputs are not routed: View Logs
nightly cmux-tui resolve/nightly cmux-tui resolve View Logs
test_the_committed_contract_is_the_workflows (main.RollupsFromNeeds.test_the_commit
ted_contract_is_the_workflows)/
test_the_committed_contract_is_the_workflows (main.RollupsFromNeeds.test_the_commit
ted_contract_is_the_workflows)
View Logs
the short nightly decide gate must use the pooled Linux route with a Blacksmith fallbac
k/
the short nightly decide gate must use the pooled Linux route with a Blacksmith fallbac
k
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

Co-authored-by: Codex <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-0e9f3e645685b2cfca3a

@teamleaderleo teamleaderleo left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review (codex primary integration review): BLOCK at 3199e00

Review (codex primary integration): BLOCK at 3199e00

[blocking] F1 correctness outcome:pending — webviews/src/ui/titleTooltips.ts:76 still references EDGE after the constant was renamed to UI_TOOLTIP_EDGE. This fails type checking and throws when positioning title tooltips. Replace the remaining vertical-position references and verify the focused positioning tests at the new head.

Visual verdict: no captures inspected at this head. The owner is already fixing F1.

Co-authored-by: Codex <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b605b496e2aad0871fdf
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Finding outcome: review-5766551425/F1 fixed 275dfbd

Co-authored-by: Codex <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b605b496e2aad0871fdf
@cursor

cursor Bot commented Nov 4, 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.

teamleaderleo and others added 2 commits November 4, 2026 10:24
Co-authored-by: Codex <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b605b496e2aad0871fdf
… lint) (#35155)

#34523's test used /^button\.cv-worked/.test(lit); oxlint's
prefer-string-starts-ends-with fails web lint (fast) on it.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 174b2f8)
Co-authored-by: Codex <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b605b496e2aad0871fdf
Co-authored-by: Codex <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b605b496e2aad0871fdf
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent, correctness, Claude Opus 5.5 medium): SHIP at f7dcf6f

Scope: ui/titleTooltips.ts, ui/Tooltip.tsx, ui/tooltipTokens.ts, pages/shared/desktop.css, and their tests (titleTooltips.test.ts, tooltip-surface.test.ts, the inbox anchor comment). I read the full diff and the head copies of titleTooltips.ts, Tooltip.tsx, popupHost.ts, desktop.css and design-scale.json.

I found no blocking correctness bugs. What I checked:

  1. titleTooltips.ts no longer refers to the removed EDGE/GAP/MAX_WIDTH/TRUNCATED_MIN_MAX anywhere. clips() is still used by the label-equals-text check (line 94), so nothing is left dead.
  2. tooltipWidth / tooltipPosition math matches every updated assertion. With an anchor at top 300, height 22 and gap 4, top is 274. At the top edge it falls back below, so top is 38. A 200px view gives max 192, and scale 1.25 gives max 400. The scaled-gap assertion checks the real distance and is not a tautology.
  3. tooltipTokens.ts imports schemas/design-scale/design-scale.json relative to the file. This follows the existing pattern (transcriptGrid.ts, composerDraft.ts). spacing.steps[0].px is 4.
  4. Tooltip.tsx now passes ref={setPopup} with no condition. useEscapingPopup returns early when host is null, so a page without a host only gets one extra state set. gap is page CSS px in fitsInPage, so scaling it by --cmux-interface-scale is correct and does not double-scale. gap is in the effect's dependencies.
  5. CSS: .ui-tooltip padding is now 2px 8px. .ui-card is later in the file at the same specificity, so it wins and keeps 4px 8px, which matches the old value for hover cards. --tooltip-max-width and --tooltip-edge resolve from --grid-base at :root, in line with the inline maxWidth that titleTooltips sets.
  6. The new browser test (tooltip-surface.test.ts) checks real geometry at scales 1 and 1.25: width at most 320scale and less than the 450px anchor, a gap of 4scale within 0.5, and title weight greater than detail weight. It would fail if any of these regressed.

Notes that do not block:

  • The default side changes from bottom to top in both Tooltip and title tooltips. The PR body states this as intended ("prefer a compact bubble above"). Base UI collision flip and tooltipPosition's fallback still put a tooltip below when there is no room above.
  • Every string label (Base UI Tooltip and title tooltips through .ui-tooltip-text) now renders at --weight-emphasis. That includes a Tooltip className="ui-card" given a plain string label. This is a visual change that comes with the hierarchy work, not a bug.
  • tooltipWidth still takes width/truncated/text but ignores them. This is harmless; they could be dropped later.

Not verified: the webview typecheck and the react-apps-check shards were still pending when I reviewed.

Co-authored-by: Codex <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b605b496e2aad0871fdf
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent, correctness, Claude Opus 5.5 medium): SHIP at 48c6df2

Delta review of f7dcf6f..48c6df2 (2 commits, 2 files, +7 -2). No production code changed: only webviews/src/ui/Tooltip.gallery.tsx and webviews/src/ui/titleTooltips.test.ts. My earlier SHIP findings at f7dcf6f still apply.

  1. titleTooltips.test.ts:306: the new centering assertion is correct. Centered gives 940 + 13 - 42 = 911. The right clamp is 1000 - 4 - 84 = 912, so min keeps 911. The test still guards the "Chat summar / y" regression. If the tooltip were measured at the last tooltip's place (left 961), its width would be 39, and it would land at 934 instead of 911. So the assertion would fail.
  2. Tooltip.gallery.tsx:48: the hover play now waits for a [role="tooltip"] popup at opacity 1. This affects the gallery only. Not verified here: that Base UI's Tooltip.Popup actually puts role="tooltip" on the element. If it doesn't, the wait times out in the gallery capture, not in the product.

@teamleaderleo
teamleaderleo merged commit 8dd1c86 into feat-cmux-next Nov 4, 2026
185 of 190 checks passed
@teamleaderleo
teamleaderleo deleted the lane/ui-tooltip-system branch November 4, 2026 11:10
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
…me table (#35440)

Two cmux-next checks have been red on feat-cmux-next since this morning:

- Web bundle key inputs: #35205 made webviews/src/ui/tooltipTokens.ts import
  schemas/design-scale/design-scale.json, which the bundle key hashes but the
  publish workflow's push paths and cmux_next_route.py BUNDLE_INPUTS did not
  list. Both lists now name it.
- Default cursor: #34589 added NSCursor+DebugName.swift, a DEBUG-only table
  that names the standard cursors (pointingHand among them) for debug.cursor.
  It sets no cursor; it goes on the allowlist with that reason, like
  DebugTerminalLinks.swift.


Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
… build (#35450)

* try-pr.sh: try a pull request the cheapest way, live when it needs no build

scripts/cmux-next/try-pr.sh PR reads the PR's diff with git and sorts it with
live_apply.py (the rules from the 8,315-PR live-apply study). A web-only PR goes
straight to web-overlay.sh follow, so the running app hot-reloads it with no
build; a CI/tests/docs PR is nothing to try; a daemon, Swift or resource change
says why it needs a new binary and, with --build, requests the fleet dev build
tagged pr-N.

Tests: python3 -m unittest scripts/cmux-next/tests/test_live_apply.py (10 pass);
dry runs on #35314 (rebuild), #35408 (no-app), #35206 and #35205 (web-live).

Leo-ask: ask-ffdcb76e34

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

* try-pr.sh: lockfiles, bundled scripts and web config are not no-app; honest doc numbers

Review follow-ups on #35450: the extension rule now runs after the web, resource
and Rust rules, the doc no longer counts swift-live as needing no binary, and
--port with no value prints usage.

Leo-ask: ask-ffdcb76e34

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

---------

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

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 48c6df26 Deployed Nov 4, 2026 by teamleaderleo via cmux-tui tree preflight #111195
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

leo-named-fix An obvious fix to something Leo named: lands on push, review runs in parallel risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant