cmux NEXT: every popover, menu and panel is glass, never a solid card; a lint keeps it so

Merged
TE
15d ago
+313-37

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's cardFill now defaults to false. 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 with Palette.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 opaque CardMaterial fill (≥ 90%) on every overlay ("too liquid glassy"). Leo's order supersedes it. CardMaterial is 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 used elevatedBackground.

Invariant

  • scripts/cmux-next/check-overlay-glass.py names every solid surface fill in Packages/macOS/CmuxNext/Sources:

    • the popup surface or opaqueOverlayFill;
    • elevatedBackground used as a fill;
    • solid NSColor window or control backgrounds;
    • ReduceTransparency.alwaysOpaque;
    • cardFill: true;
    • solid SwiftUI .background(...) or .opacity(1).

    A hit passes only when ALLOWED lists 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.

  • Where it runs:

    • the cmux-next checks job (new step "Overlays are glass, never solid", in STYLE_CHECKS and 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.
  • FloatingSurfacesStayGlassTests.everyOverlayIsGlassByDefault checks 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) and bash scripts/cmux-next/tests/check-overlay-glass.test.sh (ok).
  • The prepush gate reported no new violations.
  • On the fleet: cmux-ci compile-check --app passed 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.py errored 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