cmux NEXT: every popover, menu and panel is glass, never a solid card; a lint keeps it so
Follow-up to #23740 (merged). Leo, 2026-10-21: "STOP DOING SOLID. WE HAVE GLASS, SO JUST USE GLASS."
What changes (Swift only; the webview side is a separate lane)
- Every overlay is glass by default.
Glass.makeOverlayPanel'scardFillnow defaults tofalse. The palette, popovers, menus, find and prompt bars, browser bubbles, page info, the icon picker, the downloads popup and the Chief settings popover draw the shared themed glass alone: Liquid Glass tinted withPalette.glassTint, or the frosted blur before macOS 26. Reduce Transparency stays solid.
Takes back ccde782cb51: it was a direct push with no PR, by lawrencecchen on 2026-10-20, and laid the mostly opaqueCardMaterialfill (≥ 90%) on every overlay ("too liquid glassy"). Leo's order supersedes it.CardMaterialis still there as an opt-in, and pages still read it as--cmux-card-tint. - Notifications panel now draws the shared overlay glass; it used
Palette.elevatedBackground, which is solid. - New Message recipient suggestions draw the shared overlay glass; they used
Palette.popupSurface, which is solid. - Sidebar edit bar draws the sidebar cards' veil (
FloatingGlassStyle.card); it usedelevatedBackground.
Invariant
-
scripts/cmux-next/check-overlay-glass.pynames every solid surface fill inPackages/macOS/CmuxNext/Sources:- the popup surface or
opaqueOverlayFill; elevatedBackgroundused as a fill;- solid
NSColorwindow or control backgrounds; ReduceTransparency.alwaysOpaque;cardFill: true;- solid SwiftUI
.background(...)or.opacity(1).
A hit passes only when
ALLOWEDlists the file with the reason it stays solid, or when the line carries// glass-opaque-allow: <reason>. An allowance that no longer matches anything fails as stale. At the base it would have named the notifications panel and the suggestions list. - the popup surface or
-
Where it runs:
- the cmux-next
checksjob (new step "Overlays are glass, never solid", inSTYLE_CHECKSand the outcome list); scripts/cmux-next/prepush-gate.py(SCANNERS), which the CI fast gate runs on every PR;- its own
scripts/cmux-next/tests/check-overlay-glass.test.sh, in the checks job's script tests.
- the cmux-next
-
FloatingSurfacesStayGlassTests.everyOverlayIsGlassByDefaultchecks that no default overlay is a card and that none paints denser than the shared glass, on both materials.
Allowlisted, with reasons in the script:
- Reduce Transparency paths, and the token definitions.
- The tooltip frost: already a blur under a tint at the least alpha that keeps 4.5:1.
- Home's sheets, which are sheet windows.
- The inline pending agent question card.
- Terminal in-pane badges and banners over terminal text.
- The drop overlay's label chip and the drag lift copy.
- The text box field fill.
Changelog
- Changed: Popovers, menus, the palette, find bars, the notifications panel and Home's suggestion list are glass instead of solid cards.
Observed / Not run
- Ran here:
check-overlay-glass.py .(ok on the merged tree) andbash scripts/cmux-next/tests/check-overlay-glass.test.sh(ok). - The prepush gate reported no new violations.
- On the fleet:
cmux-ci compile-check --apppassed at head 8a54ba000e73fdbc9eadf19e3f255a72345df60b (job c99abb7f20214f6662f4d344). The base deleted ImportCardsStripView in #23940; its replacement, ImportSuggestionRowView, already passes the lint. At the pre-merge head a04dcb7 the suites passed (step e1402a59a0fa2a5d1b09fcaa): FloatingSurfacesStayGlass, CardMaterialLegibility, PopupSurface, HomeSheetTheme, HomeNewMessage, ChiefPet, HoverCardGlass, WorkspaceHoverCardSurface and FloatingGlassStyle. tests/test_cmux_next_checks_workflow.pyerrored here only on 5 s subprocess timeouts on this loaded Mac; CI's "Checks job structure" step runs it.- No capture: the fleet capture client isn't installed on this host (#2713 isn't deployed).
Agent session: cosmic-gray
🤖 Generated with Claude Code