Repository navigation
cmux-next: overlays are themed Liquid Glass, and tooltips let more through - #21785
Conversation
…rough Overlays that carry text (palette, hover cards, popovers, find and prompt bars, web popups) were pinned to the solid popup surface (Leo 2026-10-12). Leo, 2026-10-18: tooltips are too opaque and menus warrant themed glass. They now follow this Mac's material: Liquid Glass tinted with the theme (its refracting rim included), vibrancy before macOS 26, and the solid surface under Reduce Transparency. The overlay tint is 1.25x the chrome glass tint since overlays sit over text. Tooltips' least tint drops from 0.86 to 0.6; the 4.5:1 rule over black and white decides above it (about 0.7 dark, 0.6 light). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Receipt for
|
|
Bead |
This comment has been minimized.
This comment has been minimized.
…ield A Reduce Transparency switch rebuilt the material view over the floating chat grip and dropped a focused field in the panel. The dialog contrast tests check the solid card, so they pin Reduce Transparency; docs that still said every text overlay is solid now say it follows the material. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
red: web / Web status; do not merge until green; see lane-rules |
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Unclear: CI failed on
Not re-run automatically: Written by
Agents: Tour of Path-selected interactions
Core UI (before): PASS — 17 ok
Screenshots (14)1. Launch
Screenshots (14)1. Launch
Screenshots (14)1. Launch over art
Screenshots (14)1. Launch over art Tours are data in |
|
Agents: |
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. |
- vp fmt webviews/src/agent-session/acpmux/replyHref.ts - vp fmt webviews/src/pages/markdown/README.md - vp fmt webviews/src/pages/markdown/links.ts - vp fmt webviews/test/markdown-cmux-app-links.test.ts Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39210210960
…-overlay-glass # Conflicts: # webviews/src/pages/markdown/README.md
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. |
- regenerated Packages/macOS/CmuxNext/ci-target-graph.json - vp fmt webviews/src/pages/markdown/README.md Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39212629328
…-overlay-glass # Conflicts: # webviews/src/agent-session/acpmux/replyHref.ts # webviews/src/pages/markdown/links.ts
[Medium impact] The changes reach native overlays across the app and page tooltips. Fix text-field focus restoration and the web tooltip fallback contrast before merging. FindingsSummaryText overlays now follow the Mac’s material instead of always using the solid popup surface.
Native rendering and keyboard behavior were not run on this Linux host. Browser tests and visual captures were not run. Reviews (1) · Last reviewed commit: "Merge remote-tracking branch 'origin/fea..." · Reviewed by Greptile |
| // Below any view a caller added on the surface itself (the floating chat's grip). | ||
| addSubview(view, positioned: .below, relativeTo: nil) | ||
| materialView = view | ||
| if let focused, let window = focused.window { window.makeFirstResponder(focused) } |
There was a problem hiding this comment.
When Reduce Transparency changes during an NSTextField edit, window.firstResponder is the shared field editor, not the field. Removing the content ends editing and can detach that editor. This makes focused.window nil, so this line skips restoring focus and typing stops until the user clicks the field again.
Save the editor’s owning field and selection before removal, then restore them through the original window, as WindowOverlayHost already does.
| (--cmux-hairline); elevation 1. It fades in with the popup open and out with the popup close (the native | ||
| fadeIn and fadeOut tokens), rising 2px. Reduce Transparency: the opaque popup surface. */ | ||
| --tooltip-tint: var(--cmux-tooltip-tint, color-mix(in srgb, var(--surface-popup) 86%, transparent)); | ||
| --tooltip-tint: var(--cmux-tooltip-tint, color-mix(in srgb, var(--surface-popup) 60%, transparent)); |
There was a problem hiding this comment.
Fallback tooltips lose contrast
Without --cmux-tooltip-tint, the page now uses a fixed 60% tint. Unlike TooltipSurface.tintAlpha, it never raises that alpha to keep the text readable. The existing dark fixture’s light text over a white backdrop falls below 4.5:1, breaking the fallback contrast test in tooltip-surface.test.ts.
Keep a safe fallback alpha separate from the native minimum, or calculate the fallback tint from the page’s colors.
|
Base reds, not from this PR: |
|
Shipped in:
|
With check:browser-lanes green, react-apps-check runs the suites and shows reds that were already on feat-cmux-next: - settings categories: two Settings layouts both placed the Markdown Viewer group (General beside Diff Viewer, and Code Editor), and Agent Input (browser.showAgentCursor) had no home. Markdown Viewer stays in General; Agent Input joins Browser after Bookmarks (Swift layout and export). - settings editors: editor.rulers is the first page-visible number_list row. The page now draws a number token field (in range, Return or comma adds). - tooltip contrast: #21785 dropped the pages' fallback tint to 60% (the floor); the host sends the per-theme tint (about 0.7 dark). The test draws with the host's tint, computed as TooltipSurface.tintAlpha does. - static status loops: the agent notice's harness spinner had no Static rule. - composer plain footer / mode keys: plain is the default since #22050; the tests turn it off where they check the chip look. - hairline rims: the four raw 0.5px rims in files this PR touches use var(--cmux-hairline). - markdown wide tables: gfm leaves out columnResizing, so no table ever had the .tableWrapper the scroll CSS targets; the editor installs TableView itself. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…shared glass (#22223) * cmux-next: the session hover card reads like Claude desktop's on the shared glass Leo 2026-10-19 on the sidebar session's hover card: "the styling, I'm not entirely sure that's the best, it's solid gray?" The card already sits on the shared overlay surface (themed Liquid Glass since #21785; the solid popup surface only under Reduce Transparency) and its body paints no fill. Its text now has the hierarchy of Claude desktop's session card: the title, muted metadata (harness and model, folder, branch, machine, status), then the last reply in the primary ink, two lines at most, a step apart, as the card's last line. Tests hold the surface to the theme's overlay tokens and the body to no fill, in light, dark and over art. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux-next media: a hover-card tour shows the workspace card dark, light and over art Changes to WorkspaceHoverCard or HoverCardPanel map to it (path_map.py). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…reds (#22118) * fix(next): clear the webviews type-scale and text-focus base reds - syncMotion.gallery.css (c611de1) set three raw font sizes; they use the type scale tokens (body, heading, title). - CookieImportConsentPanel (60807d3) made a selectable label without focusRingType = .none. Both checks (bun run check:type-scale, check:text-focus) fail at the feat-cmux-next tip and pass here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * style(webviews): format settings icons.tsx (vp fmt base red from 91424a7) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(next): clear the webviews theme-colors, elevation, ui-rules and system-blue base reds - theme-colors: the markdown.theme paper colors (bb58f0f) are fixed by design and marked theme-fixed; prototypes/ is skipped as the comment says (the pattern only matched a prototype/ folder). - subtle-elevation: the subagents prototype sheet casts --elevation-2. - ui-rules: the code editor's keydown listener only reads Monaco's chord state (91424a7), marked ui-allow. - check-system-blue: the cookie consent panel's requester link uses Palette.accent, not .controlAccentColor (60807d3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(next): re-resolve the cookie consent requester tint in the theme hook Review of #22118: reading Palette.accent once at build time froze the tint across theme changes (check-theme-scope rule 1). ThemeChangeView runs the hook on window attach and on appearance change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(webviews): warm the older-rows-fade dev server before the first load check:browser-lanes has been red on feat-cmux-next since 4b5c7ad (#20633): the new test starts an in-process Vite server without warming it, so its first page.goto pays for the cold module graph. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(webviews): clear the sync-motion lint warnings that fail vp check react-apps-check has been red on feat-cmux-next since c611de1 (sync motion): vp check fails on warnings, and syncMotion.ts used new Array(n) while useSyncListMotion's exhaustive-deps suppression sat on the useMemo call instead of the dependency array it reports on. Same behavior; bun run check passes on Huge Blue. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(next): clear the webviews test reds the lint red hid With check:browser-lanes green, react-apps-check runs the suites and shows reds that were already on feat-cmux-next: - settings categories: two Settings layouts both placed the Markdown Viewer group (General beside Diff Viewer, and Code Editor), and Agent Input (browser.showAgentCursor) had no home. Markdown Viewer stays in General; Agent Input joins Browser after Bookmarks (Swift layout and export). - settings editors: editor.rulers is the first page-visible number_list row. The page now draws a number token field (in range, Return or comma adds). - tooltip contrast: #21785 dropped the pages' fallback tint to 60% (the floor); the host sends the per-theme tint (about 0.7 dark). The test draws with the host's tint, computed as TooltipSurface.tintAlpha does. - static status loops: the agent notice's harness spinner had no Static rule. - composer plain footer / mode keys: plain is the default since #22050; the tests turn it off where they check the chip look. - hairline rims: the four raw 0.5px rims in files this PR touches use var(--cmux-hairline). - markdown wide tables: gfm leaves out columnResizing, so no table ever had the .tableWrapper the scroll CSS targets; the editor installs TableView itself. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(next): wide markdown tables scroll sideways on the first wheel step The TableView wrapper is the scroller, and scrollers.ts marks a scrolling element with data-cmux-scrolling. ProseMirror read that attribute change on the table node view's dom as an edit and redrew the table, resetting scrollLeft to 0, so a sideways wheel never moved it. The table view now ignores attribute changes on its wrapper. The code-line test scrolls the code block into view first: it sits below the 14-column table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * style(webviews): vp fmt the #20297 update-card files (base fmt red) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at 62a0f5b - regenerated schemas/settings-export/settings-schema.sources.sha256 - regenerated cmux-tui/crates/cmux-app-host/generated/scopes.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39348548509 * fix(webviews): clear the markdown WidthField lint warnings that fail vp check (base red from 7d0f57d) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
…22162) * cmux-tui tree key: test that only crates the published binaries link need their embeds covered (failing) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux-tui tree key: cover only the crates the published binaries link check_cmux_tui_tree_inputs.py now checks embeds only in the dependency closure (cmux-tui/Cargo.lock) of the packages the tree publishes or daemon-tests. design-tokens.json leaves the key: only cmux-theme-tokens and cmux-motion read it, and no tree binary links either, yet every Swift design change rebuilt all six tree targets (#21785, about 35 min). Adds schemas/settings/source/subsessions.json, which acpmux embeds and the key did not cover (the check was red on the base). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux-tui tree key: test that crates the Cloud server or agent detector link stay covered (failing) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux-tui tree key: count the Cloud server and agent detector lockfiles as published roots Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…dMaterial) Lawrence 2026-10-20: hover cards were too liquid-glassy to read. Since #21785 every text overlay was bare themed glass (theme tint ~0.4 alpha), so a busy wallpaper or bright page showed through the text. Every Glass.makeOverlayPanel surface (hover cards, update card, popovers, palette, dialogs, find/prompt bars) now lays CardMaterial on its glass or blur: the popup surface at the least opacity from glass.cardOpacity (0.9) where primary and secondary text keep 4.5:1 over black and white, plus a 1pt rim. Reduce Transparency stays fully opaque. Overlays without text (drop target, dock backdrop) keep the bare glass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dMaterial) Lawrence 2026-10-20: hover cards were too liquid-glassy to read. Since #21785 every text overlay was bare themed glass (theme tint ~0.4 alpha), so a busy wallpaper or bright page showed through the text. Every Glass.makeOverlayPanel surface (hover cards, update card, popovers, palette, dialogs, find/prompt bars) now lays CardMaterial on its glass or blur: the popup surface at the least opacity from glass.cardOpacity (0.9) where primary and secondary text keep 4.5:1 over black and white, plus a 1pt rim. Reduce Transparency stays fully opaque. Overlays without text (drop target, dock backdrop) keep the bare glass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dMaterial) Lawrence 2026-10-20: hover cards were too liquid-glassy to read. Since #21785 every text overlay was bare themed glass (theme tint ~0.4 alpha), so a busy wallpaper or bright page showed through the text. Every Glass.makeOverlayPanel surface (hover cards, update card, popovers, palette, dialogs, find/prompt bars) now lays CardMaterial on its glass or blur: the popup surface at the least opacity from glass.cardOpacity (0.9) where primary and secondary text keep 4.5:1 over black and white, plus a 1pt rim. Reduce Transparency stays fully opaque. Overlays without text (drop target, dock backdrop) keep the bare glass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dMaterial) Lawrence 2026-10-20: hover cards were too liquid-glassy to read. Since #21785 every text overlay was bare themed glass (theme tint ~0.4 alpha), so a busy wallpaper or bright page showed through the text. Every Glass.makeOverlayPanel surface (hover cards, update card, popovers, palette, dialogs, find/prompt bars) now lays CardMaterial on its glass or blur: the popup surface at the least opacity from glass.cardOpacity (0.9) where primary and secondary text keep 4.5:1 over black and white, plus a 1pt rim. Reduce Transparency stays fully opaque. Overlays without text (drop target, dock backdrop) keep the bare glass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gain, not solid (#23740) * cmux NEXT: hover cards and the What's New popover are glass again, not a solid card Leo 2026-10-21 on his nightly: "WHY IS THIS SOLID COLOR AGAIN". The app's one hover card window (session and tab hover cards, and the Update Ready card's What's New highlights popover) was themed Liquid Glass after #21785; ccde782 then laid the mostly opaque CardMaterial fill (at least 90%) over every theme-tone overlay, this window included, so these cards read as solid again. Glass.makeOverlayPanel takes cardFill (default true, so the palette, popovers and bars keep the card fill); HoverCardPanel and the hover card gallery host pass false and draw the shared themed overlay glass alone. Reduce Transparency stays solid. FloatingSurfacesStayGlassTests fails when a fill between the hover card's or the Update Ready card's material and its content is denser than the shared glass (FloatingGlassStyle veils, the themed overlay tint), on Liquid Glass and on the pre-26 blur, and proves the check catches the card fill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray * test(next): read the hover card's fills the way CardMaterialLegibilityTests does Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…; a lint keeps it so (#23801) * cmux NEXT: hover cards and the What's New popover are glass again, not a solid card Leo 2026-10-21 on his nightly: "WHY IS THIS SOLID COLOR AGAIN". The app's one hover card window (session and tab hover cards, and the Update Ready card's What's New highlights popover) was themed Liquid Glass after #21785; ccde782 then laid the mostly opaque CardMaterial fill (at least 90%) over every theme-tone overlay, this window included, so these cards read as solid again. Glass.makeOverlayPanel takes cardFill (default true, so the palette, popovers and bars keep the card fill); HoverCardPanel and the hover card gallery host pass false and draw the shared themed overlay glass alone. Reduce Transparency stays solid. FloatingSurfacesStayGlassTests fails when a fill between the hover card's or the Update Ready card's material and its content is denser than the shared glass (FloatingGlassStyle veils, the themed overlay tint), on Liquid Glass and on the pre-26 blur, and proves the check catches the card fill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray * test(next): read the hover card's fills the way CardMaterialLegibilityTests does Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray * cmux NEXT: every overlay is glass, never a solid card; a lint keeps it so Leo 2026-10-21: "STOP DOING SOLID. WE HAVE GLASS, SO JUST USE GLASS." - Glass.makeOverlayPanel's card fill is opt-in (cardFill defaults to false): the palette, popovers, menus, find and prompt bars, browser bubbles and page info draw the shared themed glass alone. Takes back ccde782 (no PR), which laid the mostly opaque CardMaterial fill (90% or more) on every overlay. Reduce Transparency stays solid. - The notifications panel and New Message's recipient suggestions sit on the shared overlay glass instead of the elevated / popup surface. - Home's import cards are real glass with the dialogs' neutral veil and rim, not ReduceTransparency.alwaysOpaque. - The sidebar's edit bar draws the sidebar cards' veil, solid only under Reduce Transparency. - check-overlay-glass.py (cmux-next checks job, the prepush gate, and its own test) names every solid surface fill in CmuxNext: the popup surface, elevated fills, solid system colors, alwaysOpaque, cardFill: true and solid SwiftUI backgrounds. A hit passes only with a listed reason or a `glass-opaque-allow:` comment, and a stale allowance fails. - FloatingSurfacesStayGlassTests: every default overlay is glass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…dow (stacked on #23801) (#24022) * cmux NEXT: hover cards and the What's New popover are glass again, not a solid card Leo 2026-10-21 on his nightly: "WHY IS THIS SOLID COLOR AGAIN". The app's one hover card window (session and tab hover cards, and the Update Ready card's What's New highlights popover) was themed Liquid Glass after #21785; ccde782 then laid the mostly opaque CardMaterial fill (at least 90%) over every theme-tone overlay, this window included, so these cards read as solid again. Glass.makeOverlayPanel takes cardFill (default true, so the palette, popovers and bars keep the card fill); HoverCardPanel and the hover card gallery host pass false and draw the shared themed overlay glass alone. Reduce Transparency stays solid. FloatingSurfacesStayGlassTests fails when a fill between the hover card's or the Update Ready card's material and its content is denser than the shared glass (FloatingGlassStyle veils, the themed overlay tint), on Liquid Glass and on the pre-26 blur, and proves the check catches the card fill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray * test(next): read the hover card's fills the way CardMaterialLegibilityTests does Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray * cmux NEXT: every overlay is glass, never a solid card; a lint keeps it so Leo 2026-10-21: "STOP DOING SOLID. WE HAVE GLASS, SO JUST USE GLASS." - Glass.makeOverlayPanel's card fill is opt-in (cardFill defaults to false): the palette, popovers, menus, find and prompt bars, browser bubbles and page info draw the shared themed glass alone. Takes back ccde782 (no PR), which laid the mostly opaque CardMaterial fill (90% or more) on every overlay. Reduce Transparency stays solid. - The notifications panel and New Message's recipient suggestions sit on the shared overlay glass instead of the elevated / popup surface. - Home's import cards are real glass with the dialogs' neutral veil and rim, not ReduceTransparency.alwaysOpaque. - The sidebar's edit bar draws the sidebar cards' veil, solid only under Reduce Transparency. - check-overlay-glass.py (cmux-next checks job, the prepush gate, and its own test) names every solid surface fill in CmuxNext: the popup surface, elevated fills, solid system colors, alwaysOpaque, cardFill: true and solid SwiftUI backgrounds. A hit passes only with a listed reason or a `glass-opaque-allow:` comment, and a stale allowance fails. - FloatingSurfacesStayGlassTests: every default overlay is glass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray * check-overlay-glass: hover card bodies draw only on the one glass hover card window Every native hover card (tab, link chip, sidebar workspace and group, pull request, What's New) shows in HoverCardPanel, the bare themed glass (#23740, #23801). Each body is glass today, but nothing stopped one from building its own window or material or laying a solid fill over the panel's glass. The lint now finds hover card bodies (files with HoverCardBody(...) or HoverCardTextReporting) and flags: hover-own-window NSPanel / NSPopover / NSWindow / NSVisualEffectView / OverlaySurfaceView / makeOverlayPanel in a body; hover-body-fill a backgroundColor / fillColor / .background(...) that isn't Palette.hoverFill, clear, nil or a color under 0.6 alpha (each ternary branch is checked). The existing glass-opaque-allow escape and ALLOWED table apply. The shell test adds fixtures for each form and the passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* cmux NEXT: hover cards and the What's New popover are glass again, not a solid card Leo 2026-10-21 on his nightly: "WHY IS THIS SOLID COLOR AGAIN". The app's one hover card window (session and tab hover cards, and the Update Ready card's What's New highlights popover) was themed Liquid Glass after #21785; ccde782 then laid the mostly opaque CardMaterial fill (at least 90%) over every theme-tone overlay, this window included, so these cards read as solid again. Glass.makeOverlayPanel takes cardFill (default true, so the palette, popovers and bars keep the card fill); HoverCardPanel and the hover card gallery host pass false and draw the shared themed overlay glass alone. Reduce Transparency stays solid. FloatingSurfacesStayGlassTests fails when a fill between the hover card's or the Update Ready card's material and its content is denser than the shared glass (FloatingGlassStyle veils, the themed overlay tint), on Liquid Glass and on the pre-26 blur, and proves the check catches the card fill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray * test(next): read the hover card's fills the way CardMaterialLegibilityTests does Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray * cmux NEXT: every overlay is glass, never a solid card; a lint keeps it so Leo 2026-10-21: "STOP DOING SOLID. WE HAVE GLASS, SO JUST USE GLASS." - Glass.makeOverlayPanel's card fill is opt-in (cardFill defaults to false): the palette, popovers, menus, find and prompt bars, browser bubbles and page info draw the shared themed glass alone. Takes back ccde782 (no PR), which laid the mostly opaque CardMaterial fill (90% or more) on every overlay. Reduce Transparency stays solid. - The notifications panel and New Message's recipient suggestions sit on the shared overlay glass instead of the elevated / popup surface. - Home's import cards are real glass with the dialogs' neutral veil and rim, not ReduceTransparency.alwaysOpaque. - The sidebar's edit bar draws the sidebar cards' veil, solid only under Reduce Transparency. - check-overlay-glass.py (cmux-next checks job, the prepush gate, and its own test) names every solid surface fill in CmuxNext: the popup surface, elevated fills, solid system colors, alwaysOpaque, cardFill: true and solid SwiftUI backgrounds. A hit passes only with a listed reason or a `glass-opaque-allow:` comment, and a stale allowance fails. - FloatingSurfacesStayGlassTests: every default overlay is glass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-a80b-79c0-ab31-500e58883d27&host=cosmic-gray * cmux NEXT: the native tooltip is the shared overlay glass Leo: "WHERE IS THE GLASS EVERYWHERE, all these hover tooltips and hover previews." The themed tooltip (TooltipPanel) drew AppKit's .toolTip blur under a dense popup-surface tint, which reads as a solid bubble. It now draws Glass.makeOverlayPanel, the glass the hover cards draw: Liquid Glass in the hovered view's theme (the themed blur before macOS 26), the opaque popup surface only under Reduce Transparency, with its small tight shadow. check-overlay-glass.py (from #23801) gains two rules: tooltip-material (NSVisualEffectView's .toolTip material) and hover-window (a tooltip, hover card or hover preview NSPanel/NSWindow whose file never makes the shared glass). TooltipPanel's popup-surface allowance is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT tooltip: a legibility tint over the glass, recolored on theme change Codex review of #23970 (BLOCK at b55f49a): the overlay glass's own theme tint (Palette.glassTint, 0.30-0.40 x 1.25) let the tooltip's ink fall below 4.5:1 over a pure white or black backdrop, and a theme change while the tooltip showed left the labels in the old theme's ink. - TooltipPanel lays TooltipSurface.tint (the popup surface at the least alpha that keeps the primary ink at 4.5:1 over black and white, alpha < 1) over the glass, under the labels; clear on the opaque Reduce Transparency material. - The tint is a ThemeChangeView whose hook recolors it and the labels from the panel's adopted scope, so a theme change or a Reduce Transparency switch while shown recolors both. The presenter no longer hands in frozen ink. - TooltipSurfaceTests read the tint the panel draws: the text keeps 4.5:1 over it on black and white in every test theme, switched while the tooltip shows, and the labels take the new theme's ink. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT tooltip: glass in every theme, the tint walked before it goes solid Codex review of #23970 (BLOCK at dff6156): TooltipSurface.tintAlpha returned 1 when no alpha in 0.60...0.99 kept the text at 4.5:1 (Solarized dark, #002B36 under #839496), so the panel laid the full-alpha tint over the glass and the tooltip became an opaque card. - TooltipSurface.legible: the tint is the popup surface at the least alpha from 0.60 up to the new maximumTintAlpha (0.9) that keeps the ink at 4.5:1 over pure black and pure white. A theme with no such alpha walks the tint's color away from the ink (toward black under light ink, white under dark) in 1% steps, then the ink toward its own extreme; white ink over black reads at 0.60, so the walk always ends translucent. No alpha-1 sentinel is left. - TooltipSurface.ink is what the labels draw (the theme's text unless the walk moved it), and pages get it as --cmux-tooltip-ink beside --cmux-tooltip-tint; the pages' tooltip color reads it, falling back to --cmux-text. - Tests: every test theme's tint is within 0.60...0.90 with its own text at 4.5:1 over black and white and over the opaque fill; a new test covers Solarized dark and the raw review colors plus near-zero-contrast fills (translucent, >= 4.5:1 over black and white); the live theme-change test also checks the shortcut hint's color and the ink the surface picks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux NEXT tooltip: the tint keeps 4.5:1 as pages get it too Codex review of #23970 (BLOCK at d551517): with Solarized light (#FDF6E3 under #657B83) the native ink kept 4.500:1 over the tint at 0.9, but pages read `--cmux-tooltip-ink` and `--cmux-tooltip-tint` with 8-bit channels (`WebTheme.css`), and those rounded colors read 4.485:1 over black. - WebTheme.cssRounded: a color as pages read it from `css` (8-bit channels, the alpha to 3 decimals). - TooltipSurface.tintAlpha takes an alpha only when the ink keeps 4.5:1 over the tint on black and on white both as drawn natively and as rounded for pages; a theme that misses walks its tint as before. - Test: every theme's exported ink and tint equal the rounded colors and keep 4.5:1 over black and white. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=Air-Blue * cmux NEXT tooltip: the ink reads on the Reduce Transparency fill too; the tint sizes once Codex review of #23970 (glass-regressions lane, BLOCK): with fill #0A333E under ink #839496, `legible` found a glass tint and kept the ink, but Reduce Transparency draws that same ink over the opaque fill, where it read 4.27:1 (pages the same, `--surface-popup` under `--cmux-tooltip-ink`). - TooltipSurface.legible walks an ink that misses 4.5:1 over `fill` (as drawn and as rounded for pages) toward its own extreme first, then finds the tint as before. A fill no walked ink reads on takes the extreme ink that reads best on it, over the opposite extreme's tint. - Test: every low-contrast pair keeps 4.5:1 over its opaque fill, natively and page-rounded; the review's pair moves its ink lighter, its fill kept. Fleet run of TooltipSurfaceTests at 28cf011 (step 6baf09e1cee648f42123c156): the legibility tint came out at twice the surface (90x42 vs 45x21). Its autoresizing mask added the Liquid Glass contentView's later constraint layout on top of the frame `show` set. The tint now has no mask; `show` alone sizes it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=Air-Blue --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>




























































Overlays that carry text were pinned to the solid popup surface by Leo's 2026-10-12 call: the palette, hover cards, popovers, find and prompt bars, and natively hosted web popups. On 2026-10-18 Leo said tooltips are too opaque, menus warrant themed glass, and he loves Liquid Glass's edge distortion. This PR reverses the 10-12 call.
Glass.makeOverlayPanelnow follows this Mac's material (OverlayMaterial.select):NSGlassEffectView), tinted with the theme'sglassTint. Its rim refracts what is under it.glass.overlayTintStrength) defaults to 1.25× the chrome glass tint: dark themes get 0.40 → 0.50, light themes 0.30 → 0.375. Overlays sit over text and need a bit more body than the tab strip.TooltipSurface.minimumTintAlphagoes from 0.86 to 0.6.desktop.cssgets the same fallback;tooltip-surface.test.tschecks the two stay in step.CmuxToastViewandShareCmuxView, which pin.opaquethemselves.--surface-popupin CSS. A WKWebView can't blur the native art behind it, so those need the native-glass bridge from the composer work.PopupSurfaceTestsnow checks that overlay panels follow this Mac's material, and that Reduce Transparency still gives the solid popup surface.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Reverses the 2026-10-12 call that pinned text-carrying overlays to the solid popup surface: they now follow this Mac's material, so macOS 26 gets themed Liquid Glass with its refracting rim, earlier macOS gets the frosted vibrancy material, and Reduce Transparency keeps the solid surface.
desktop.css, and tests keep the native and web tooltip surfaces in step.Written for commit a8d15d3. Summary will update on new commits.