Repository navigation
fix(next): open native popovers and menus in one frame - #27136
Conversation
|
Bead |
|
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)
web and size checks: green Shipped in:
|
d7706ab to
d102381
Compare
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.
d102381 to
6c3b14f
Compare
Bugbot needs on-demand usage enabledBugbot 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. |
|
Found 3 test failures on Blacksmith runners: Failures
|
|
Review (codex gpt-6-astra high fast, independent box review-27136-6c3b): SHIP at 6c3b14f SHIP
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
|
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:
The audit is leaving both files alone while this PR is open, to avoid conflicts. 🤖 Generated with Claude Code |
|
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
|
Independent review (gpt-6.1-sol high) at ef1f390: SHIP. No correctness findings. |
|
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. |
|
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. |
|
Review (next-review patch-id; carried): SHIP at 0ca0caf The independent SHIP at d6ffd35 carries to this head: the PR's own change ( |
# Conflicts: # Packages/macOS/CmuxNext/Tests/CmuxNextDesignTests/PopupGrowMotionTests.swift
|
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 |
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
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
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'sanimates = falsehas 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:
NSWindow.openPopuppath commit the final card state immediately and remove theentrance: truecaller 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).NativePopupHostand pageWebPopupHostmenus instant on every open while retaining close fades. A page tooltip that does not ask forinstant(outside New Tab) keeps its entrance (NSWindow.openTooltipWithEntrance).NSPopover.animatesproperty tofalse(open and close: AppKit has one switch for both).check-motion.shto rejectentrance: trueandanimates = trueon 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 throughCornerPanelMotion, 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-fef2766e28at8407795d9b56(fleet build, capture mini, text checked for private data)After (head
26e115e7b425a5d0aa9d161805a9e1c5cfa03731)Capture
steps-fef2766e28at26e115e7b425(fleet build, capture mini, text checked for private data)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 afteropenPopup, 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.showleaves the card at opacity 1 with no entrance animation, and its close still fades.PagePopupMotionTests.aPageTooltipKeepsItsEntranceUnlessItAsksForNone(new, from review ofbe47ec43): a page tooltip that does not ask forinstant(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— passbash scripts/cmux-next/tests/check-motion.test.sh— passpython3 scripts/cmux-next/prepush-gate.py --base 61f3b828ec7e0e0597d486c0822cc564dcd11e92 --head 6c3b14f9323a20d7e16837a1ff04dfff54e425ae— PASS; repairs the prior CI failure from the missing Sidebar-Look trailerpython3 scripts/verify-local.py— localization check remains red from pre-existing debt (45,715 parity errors); all other selected checks passFocused fleet step at
d7706ab67cf30b8a456296672cf8a13eea4fe476:b3e3ffe2d9d7ffd27cff8b24— PASS, exit 0; all four focused suites passed and the census ended with zero windows openAstra HIGH/FAST review of
d7706ab67cf30b8a456296672cf8a13eea4fe476: SHIP, no findings; reviewer receipt01a1856b-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 base8407795d, step5a4c6944ea64716a14af4d08: PASS (PagePopupMotionTests 6).Merged feat-cmux-next at
be47ec43, then updated with base at776bc03e,3514d682and2932ccb1(base-red fixes; this PR's own 13-file diff is unchanged). The sidebar and tab-group editor conflicts took base'sshowPopupAtOnce()from fix(next): open sidebar and tab group editors instantly #27056.Agent session: agent session