Skip to content

fix(next): open native popovers and menus in one frame - #27136

Merged
cmux-bot[bot] merged 14 commits into
feat-cmux-nextfrom
native-popup-instant-open
Oct 31, 2026
Merged

cmux-bot[bot] merged 14 commits into
feat-cmux-nextfrom
native-popup-instant-open

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Native popovers and menus now appear at their final size and opacity in the opening frame. Closing behavior remains the existing fade/shrink toward the anchor, except for the server menu-bar NSPopover: AppKit's animates = false has no open-only switch, so that popover also closes without animation.

Leo exact brief (2026-10-24): “why the f*** would you fade in opening up a fing menu? Just open the menu... Every single fing instance.”

Scope:

  • Make the shared NSWindow.openPopup path commit the final card state immediately and remove the entrance: true caller from the corner panels (the sidebar and tab-group editors already open at once on base, fix(next): open sidebar and tab group editors instantly #27056).
  • Make NativePopupHost and page WebPopupHost menus instant on every open while retaining close fades. A page tooltip that does not ask for instant (outside New Tab) keeps its entrance (NSWindow.openTooltipWithEntrance).
  • Set the server menu-bar NSPopover.animates property to false (open and close: AppKit has one switch for both).
  • Add focused popup motion tests for no opening opacity/transform animations and retained close fade/shrink coverage.
  • Extend check-motion.sh to reject entrance: true and animates = true on native popovers.

Takes back #26400: Leo explicitly requires every menu and popover to open on click without fade or growth. This removes only its entrance animation; closing fade/shrink and card layout remain.

Reference: the private cmux design references README and topics/menus-and-palette.md, with Claude's compact menus opening directly on click. Keep: existing glass, layout, placement, content, colors, close behavior.

Captures

The same steps (launch, then action.run showNotifications, which opens the notifications corner panel through CornerPanelMotion, one of the popups this PR changes) on fleet capture minis, light and dark. A still shows the panel's resting state, which this PR leaves unchanged: before and after match by design. What changes is the open itself. Base fades and grows the panel in; head shows it whole in the click's frame. The tests below prove that first frame.

The sidebar group editor and tab-group editor already open at once on base (#27056), so the merge took base's code there, and this PR no longer changes them.

Before (base 8407795d9b563384b7c605876b3bd2b5502aaf48)

Capture steps-fef2766e28 at 8407795d9b56 (fleet build, capture mini, text checked for private data)

Light Dark
light dark
notifications light notifications dark

After (head 26e115e7b425a5d0aa9d161805a9e1c5cfa03731)

Capture steps-fef2766e28 at 26e115e7b425 (fleet build, capture mini, text checked for private data)

Light Dark
light dark
notifications light notifications dark

Viewed after image: yes
Visual verdict: The notifications panel at the head sits crisp and fully drawn in light and dark with its header actions and empty state aligned, and it matches the base still as intended since only the open animation changes.

First visible frame

  • PopupGrowMotionTests.anOpenHasNoEntranceAnimation: right after openPopup, the window's alpha is 1, the card layer's opacity is 1, its transform is identity, and it has no opacity or transform animation. The first frame drawn is the full card.
  • PagePopupMotionTests.aNativePopupDefaultsToAnInstantOpenAndFadesOnClose: NativePopupHost.show leaves the card at opacity 1 with no entrance animation, and its close still fades.
  • PagePopupMotionTests.aPageTooltipKeepsItsEntranceUnlessItAsksForNone (new, from review of be47ec43): a page tooltip that does not ask for instant (every tooltip outside New Tab, popupHost.ts) keeps its fade and grow in. An instant one shows at once. Menus and popovers always show at once.

Verification:

  • scripts/cmux-next/check-motion.sh — pass

  • bash scripts/cmux-next/tests/check-motion.test.sh — pass

  • python3 scripts/cmux-next/prepush-gate.py --base 61f3b828ec7e0e0597d486c0822cc564dcd11e92 --head 6c3b14f9323a20d7e16837a1ff04dfff54e425ae — PASS; repairs the prior CI failure from the missing Sidebar-Look trailer

  • python3 scripts/verify-local.py — localization check remains red from pre-existing debt (45,715 parity errors); all other selected checks pass

  • Focused fleet step at d7706ab67cf30b8a456296672cf8a13eea4fe476: b3e3ffe2d9d7ffd27cff8b24 — PASS, exit 0; all four focused suites passed and the census ended with zero windows open

  • Astra HIGH/FAST review of d7706ab67cf30b8a456296672cf8a13eea4fe476: SHIP, no findings; reviewer receipt 01a1856b-5434-7c21-854e-e88f4fa2939c.

  • Focused fleet step at head 26e115e7b425a5d0aa9d161805a9e1c5cfa03731 (CMUX_TEST_REQUIRE_GUI=1, gui-session-v1): 9c803ffbee76baaf1bdf6250. PASS: PagePopupMotionTests (7), PopupGrowMotionTests (4), PopupReduceMotionTests, MotionMasterSwitchSurfaceTests and WebPopupRowsTests all passed. The same suites at base 8407795d, step 5a4c6944ea64716a14af4d08: PASS (PagePopupMotionTests 6).

  • Merged feat-cmux-next at be47ec43, then updated with base at 776bc03e, 3514d682 and 2932ccb1 (base-red fixes; this PR's own 13-file diff is unchanged). The sidebar and tab-group editor conflicts took base's showPopupAtOnce() from fix(next): open sidebar and tab group editors instantly #27056.

Agent session: agent session

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-5wzg1f created for this PR by the cmux coordinator.

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 4f55d5e: 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=pr27136 -f ref=native-popup-instant-open -f platform=macos -f backend_mode=local

web and size checks: green

Shipped in:

Agent-Session: https://cmux.com/deeplink/agent?id=aid-51be7fae94eac5b657c1
Sidebar-Look: why the fuck would you fade in opening up a fucking menu? Just open the menu... Every single fucking instance.
@teamleaderleo
teamleaderleo force-pushed the native-popup-instant-open branch from d102381 to 6c3b14f Compare October 29, 2026 08:19
@cursor

cursor Bot commented Oct 29, 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.

@blacksmith-sh

blacksmith-sh Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Found 3 test failures on Blacksmith runners:

Failures

Test View Logs
test_a_picked_signing_label_has_a_rerun_alternative (main.RunsOnFallbackTests.test_
a_picked_signing_label_has_a_rerun_alternative)/
test_a_picked_signing_label_has_a_rerun_alternative (main.RunsOnFallbackTests.test_
a_picked_signing_label_has_a_rerun_alternative)
View Logs
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)/
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)
View Logs
test_no_runs_on_chain_ends_on_the_reserved_side_label (main.RunsOnFallbackTests.tes
t_no_runs_on_chain_ends_on_the_reserved_side_label)/
test_no_runs_on_chain_ends_on_the_reserved_side_label (main.RunsOnFallbackTests.tes
t_no_runs_on_chain_ends_on_the_reserved_side_label)
View Logs

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high fast, independent box review-27136-6c3b): SHIP at 6c3b14f

SHIP

  1. [P3] check-motion.sh:76: The replacement guard only rejects literal true, so popover.animates = flag now passes without a motion gate. Confirmed with a fixture. Preserve the previous gate check with an explicit exception for false.

Motion guard and shell tests pass. Swift/AppKit validation was unavailable in this box.

Preserve the continuation-aware popover Motion guard from #27494 alongside the popup entrance ban.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-d67683eca2ffed7eb61f
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

For awareness, from an audit against the aiforui course's popover rules (a popover inside another layer closes only itself; overflow fades at the edge, never a hard clip). This PR touches the same popup hosts, so these are yours to take or reject:

  1. NativePopupHost.swift:139-142: a click inside a child panel dismisses the outer popup host as well. Expected: an outside click, Escape or a pick closes only the innermost layer. A popover opened from inside another must leave its container open.
  2. WebPopupHost.swift:177-183: the native host has no edge mask where scrolling content is clipped. Expected: the clipped edge fades, matching the web ui-scroll-edge-fade that is in cmux NEXT: draggable Session Info cards and shared edge treatments #26720, and is never cut hard.

The audit is leaving both files alone while this PR is open, to avoid conflicts.

🤖 Generated with Claude Code

@teamleaderleo

teamleaderleo commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

Base #27056 already shows the sidebar and tab-group editors at once (showPopupAtOnce), so their openPopup calls are taken from base.

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

Review of be47ec4 (P1): WebPopupHost dropped Model.instant, so a page tooltip
outside New Tab (popupHost.ts leaves instant unset for those) lost its fade and
grow in. Menus and popovers still open in one frame whatever the page sends;
only a non-instant tooltip takes NSWindow.openTooltipWithEntrance(pivot:).
PagePopupMotionTests.aPageTooltipKeepsItsEntranceUnlessItAsksForNone covers both.

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

Copy link
Copy Markdown
Collaborator Author

Independent review (gpt-6.1-sol high) at ef1f390: SHIP. No correctness findings.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol high, review-router): SHIP at ef1f390

No P1/P2 findings. Popup open/close state, tooltip routing and the updated callers are consistent, and the motion checks pass.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol high, review-router): SHIP at d6ffd35

No P1/P2/P3. The popup transitions, tooltip exception, server popover behavior and motion checks stay correct on the merged head.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (next-review patch-id; carried): SHIP at 0ca0caf

The independent SHIP at d6ffd35 carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (b4c9c190d937a9e8) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@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
# Conflicts:
#	Packages/macOS/CmuxNext/Tests/CmuxNextDesignTests/PopupGrowMotionTests.swift
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, next-review): SHIP at 4f55d5e

SHIP at 4f55d5e

Visual verdict: After light/dark captures are crisp and aligned; no visual regressions observed.

Findings: none.

Follow-ups: none

@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

@cmux-bot cmux-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

cmux-bot approves 4f55d5e: an independent review passed this exact head (next-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

@cmux-bot
cmux-bot Bot merged commit 3c5aa2b into feat-cmux-next Oct 31, 2026
183 of 185 checks passed
@cmux-bot
cmux-bot Bot deleted the native-popup-instant-open branch October 31, 2026 16:15
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol high, review-router): SHIP at 4f55d5e

Delta review of the hand-resolved base merge (conflict in PopupGrowMotionTests.swift). No P1/P2: the resolution matches openPopup(pivot:), keeps base's test window cleanup (.closesItsWindows, closeAfterTest) and the close fade/shrink coverage, and opening stays immediate.

teamleaderleo added a commit that referenced this pull request Oct 31, 2026
Resolves NativePopupHost.show against #27136: popups open in one frame,
so the declarative host drops its `entrance: false` argument and keeps
`sideBySide`; the base's `tooltipEntrance` stays for page tooltips.

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

This branch was previously deployed

3 inactive (2 outdated) deployments
ci-routing-agent — 4f55d5e4 Deployed Oct 31, 2026 by teamleaderleo via cmux-tui tree preflight #90201
artifacts — ef1f3906 Deployed Oct 31, 2026 by teamleaderleo via publish tree-addressed cmux-tui #87706
sentry-dsyms — ef1f3906 Deployed Oct 31, 2026 by teamleaderleo via upload cmux-tui dSYMs to Sentry #87706
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