Skip to content

cmux-next: overlays are themed Liquid Glass, and tooltips let more through - #21785

Merged
teamleaderleo merged 9 commits into
feat-cmux-nextfrom
leo/next-overlay-glass
Oct 19, 2026
Merged

teamleaderleo merged 9 commits into
feat-cmux-nextfrom
leo/next-overlay-glass

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 18, 2026 •

Copy link
Copy Markdown
Collaborator

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.makeOverlayPanel now follows this Mac's material (OverlayMaterial.select):
    • macOS 26 and later: Liquid Glass (NSGlassEffectView), tinted with the theme's glassTint. Its rim refracts what is under it.
    • Before macOS 26: the frosted vibrancy material.
    • Under Reduce Transparency: the solid popup surface, as before.
  • Overlay tint strength (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.
  • Tooltips: TooltipSurface.minimumTintAlpha goes from 0.86 to 0.6.
    • The existing rule still decides above it: primary text keeps 4.5:1 over the tint laid on pure black and on pure white. That comes to about 0.70 in dark themes and 0.60 in light.
    • desktop.css gets the same fallback; tooltip-surface.test.ts checks the two stay in step.
  • Unchanged: CmuxToastView and ShareCmuxView, which pin .opaque themselves.
  • Not in this PR: in-page web popups such as the composer's model picker paint --surface-popup in CSS. A WKWebView can't blur the native art behind it, so those need the native-glass bridge from the composer work.
  • Tests: PopupSurfaceTests now checks that overlay panels follow this Mac's material, and that Reduce Transparency still gives the solid popup surface.
  • Tour: the glass tour now opens the command palette over the art.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with 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.

  • The overlay tint defaults to 1.25× the chrome glass tint since overlays sit over text.
  • Tooltips' least tint alpha drops from 0.86 to 0.6; the existing 4.5:1 contrast rule decides above it.
  • Rebuilding the material on a Reduce Transparency switch keeps caller-added views on top and restores a focused field it had dropped.
  • Dialog contrast tests pin Reduce Transparency since they check the solid card; pages get the same fallback in desktop.css, and tests keep the native and web tooltip surfaces in step.
  • Toasts and share sheets stay pinned to the opaque surface, and in-page web popups still need the native-glass bridge.
  • The glass tour now opens the command palette over the art.

Written for commit a8d15d3. Summary will update on new commits.

View guided diff Turn on auto-fix

teamleaderleo and others added 2 commits October 18, 2026 14:37
…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>
@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: c0c3afed-043d-448d-b84b-0716d2ad7eda

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Receipt for a8d15d3 (this PR's head; a new push replaces it)

  • Visual review: HQ feed card · gallery before/after runs
  • Checks: this head
  • 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=pr21785 -f ref=leo/next-overlay-glass -f platform=macos -f backend_mode=local

@teamleaderleo teamleaderleo added the media-tour Run the cmux-next UI tour (cmux-next-media.yml) on every push label Oct 18, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-96kpk created for this PR by the cmux coordinator.

@blacksmith-sh

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>
@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

red: web / Web status; do not merge until green; see lane-rules
red: web / react-apps-check; do not merge until green; see lane-rules
red: web / react-apps-check (1); do not merge until green; see lane-rules
red: web / react-apps-check (2); do not merge until green; see lane-rules

@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

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

Unclear: web / react-apps-check (1) failed: no known signature; failed step: Check diff viewer eager JS budget.

CI failed on a8d15d3c8a (run 39311826901 attempt 1): 3 unknown.
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped.

Job Verdict Why
web / react-apps-check (1) unknown no known signature; failed step: Check diff viewer eager JS budget
web / react-apps-check (2) unknown no known signature; failed step: Check diff viewer eager JS budget
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Not re-run automatically: web / react-apps-check (1), web / react-apps-check (2), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

CI fast guards failed on a8d15d3c8a (https://github.com/manaflow-ai/cmux/actions/runs/39311826901). It does not block the merge; a red guard merged into main breaks it for every open PR.
The log named no failed step; see the run.

Agents: python3 scripts/ci/guard_attribution.py fix applies the mechanical fixes locally.

Tour of a8d15d3c8a (run)

Path-selected interactions

Interaction Changed paths
glass Packages/macOS/CmuxNext/Sources/CmuxNextDesign/Glass.swift
scripts/cmux\-next/media/tours/glass.json
core Packages/macOS/CmuxNext/Sources/CmuxNextDesign/OverlaySurface.swift
Packages/macOS/CmuxNext/Sources/CmuxNextDesign/Tooltip/TooltipSurface.swift
Packages/macOS/CmuxNext/Sources/CmuxNextDesign/Tunables/ChromeTunables.swift
Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/SidebarUpdateNotesPanel.swift
Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/PopupSurfaceCallersTests.swift
Packages/macOS/CmuxNext/Tests/CmuxNextDesignTests/CmuxDialogLightContrastTests.swift
Packages/macOS/CmuxNext/Tests/CmuxNextDesignTests/PopupSurfaceTests.swift
webviews/src/pages/shared/desktop.css
webviews/src/ui/README.md

Core UI (before): PASS — 17 ok

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 New workspace ok cmux workspace new --name Tour
3 Type in the terminal ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "echo hello from the cmux-next tour\r"
4 A command reports progress: tab loading spinner ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "clear; printf '\\033]9;4;3\\007'; sleep 900\r"
5 Split right ok cmux action run splitRight
6 Split down ok cmux action run splitDown
7 New terminal tab ok cmux action run newSurface
8 Browser tab ok cmux tab new-browser --url https://example.com
9 Hide the sidebar ok cmux action run toggleSidebar
10 Show the sidebar ok cmux action run toggleSidebar
11 Notification ok cmux notify --title Tour --body "Hello from CI"
12 Notifications panel ok cmux action run showNotifications
13 Agent chat ok cmux agent new-chat
14 Agent workspace ok cmux workspace new --name Agent
15 Agent starts ok cmux workspace name:Agent screen current pane current tab current terminal current write --text "clear; printf '\\033]7501;state=working\\033\\\\'; sleep 8; printf '\\033]7501;state=done\\033\\\\'; sleep 900\r"
16 An agent works: row working spinner ok cmux workspace new --name Notes
17 The agent finishes: done mark in the spinner's place ok
Screenshots (14)

1. Launch
Launch

2. New workspace
New workspace

3. Type in the terminal
Type in the terminal

4. A command reports progress: tab loading spinner
A command reports progress: tab loading spinner

5. Split right
Split right

6. Split down
Split down

7. New terminal tab
New terminal tab

8. Browser tab
Browser tab

9. Hide the sidebar
Hide the sidebar

11. Notification
Notification

12. Notifications panel
Notifications panel

13. Agent chat
Agent chat

16. An agent works: row working spinner
An agent works: row working spinner

17. The agent finishes: done mark in the spinner's place
The agent finishes: done mark in the spinner's place

### Core UI \(after\): PASS — 17 ok

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 New workspace ok cmux workspace new --name Tour
3 Type in the terminal ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "echo hello from the cmux-next tour\r"
4 A command reports progress: tab loading spinner ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "clear; printf '\\033]9;4;3\\007'; sleep 900\r"
5 Split right ok cmux action run splitRight
6 Split down ok cmux action run splitDown
7 New terminal tab ok cmux action run newSurface
8 Browser tab ok cmux tab new-browser --url https://example.com
9 Hide the sidebar ok cmux action run toggleSidebar
10 Show the sidebar ok cmux action run toggleSidebar
11 Notification ok cmux notify --title Tour --body "Hello from CI"
12 Notifications panel ok cmux action run showNotifications
13 Agent chat ok cmux agent new-chat
14 Agent workspace ok cmux workspace new --name Agent
15 Agent starts ok cmux workspace name:Agent screen current pane current tab current terminal current write --text "clear; printf '\\033]7501;state=working\\033\\\\'; sleep 8; printf '\\033]7501;state=done\\033\\\\'; sleep 900\r"
16 An agent works: row working spinner ok cmux workspace new --name Notes
17 The agent finishes: done mark in the spinner's place ok
Screenshots (14)

1. Launch
Launch

2. New workspace
New workspace

3. Type in the terminal
Type in the terminal

4. A command reports progress: tab loading spinner
A command reports progress: tab loading spinner

5. Split right
Split right

6. Split down
Split down

7. New terminal tab
New terminal tab

8. Browser tab
Browser tab

9. Hide the sidebar
Hide the sidebar

11. Notification
Notification

12. Notifications panel
Notifications panel

13. Agent chat
Agent chat

16. An agent works: row working spinner
An agent works: row working spinner

17. The agent finishes: done mark in the spinner's place
The agent finishes: done mark in the spinner's place

### Glass and themes \(before\): PASS — 14 ok

tour

Video (mp4)

# Step Result Command
1 Launch over art ok
2 New workspace ok cmux workspace new --name Glass
3 Terminal text and ANSI colors over art ok cmux workspace name:Glass screen current pane current tab current terminal current write --text "clear; echo 'cmux glass tour: plain text stays readable over the art'; for c in 1 2 3 4 5 6 7; do printf '\\033[3%sm color %s \\033[1m bold \\033[0m' $c $c; done; echo\r"
4 Split right ok cmux action run splitRight
5 Agent chat beside the terminal ok cmux agent new-chat
6 Command palette on glass over art ok cmux action run commandPalette
7 Close the palette ok cmux action run commandPalette
8 Soft Blue over art ok cmux settings set appearance.theme "Soft Blue"
9 Soft Blue Light over art ok cmux settings set appearance.theme "Soft Blue Light"
10 Clay Orange Light over art ok cmux settings set appearance.theme "Clay Orange Light"
11 Art off: Clay Orange Light ok cmux settings unset appearance.background
12 Clay Orange ok cmux settings set appearance.theme "Clay Orange"
13 Soft Blue ok cmux settings set appearance.theme "Soft Blue"
14 Soft Blue Light ok cmux settings set appearance.theme "Soft Blue Light"
Screenshots (14)

1. Launch over art
Launch over art

2. New workspace
New workspace

3. Terminal text and ANSI colors over art
Terminal text and ANSI colors over art

4. Split right
Split right

5. Agent chat beside the terminal
Agent chat beside the terminal

6. Command palette on glass over art
Command palette on glass over art

7. Close the palette
Close the palette

8. Soft Blue over art
Soft Blue over art

9. Soft Blue Light over art
Soft Blue Light over art

10. Clay Orange Light over art
Clay Orange Light over art

11. Art off: Clay Orange Light
Art off: Clay Orange Light

12. Clay Orange
Clay Orange

13. Soft Blue
Soft Blue

14. Soft Blue Light
Soft Blue Light

### Glass and themes \(after\): PASS — 14 ok

tour

Video (mp4)

# Step Result Command
1 Launch over art ok
2 New workspace ok cmux workspace new --name Glass
3 Terminal text and ANSI colors over art ok cmux workspace name:Glass screen current pane current tab current terminal current write --text "clear; echo 'cmux glass tour: plain text stays readable over the art'; for c in 1 2 3 4 5 6 7; do printf '\\033[3%sm color %s \\033[1m bold \\033[0m' $c $c; done; echo\r"
4 Split right ok cmux action run splitRight
5 Agent chat beside the terminal ok cmux agent new-chat
6 Command palette on glass over art ok cmux action run commandPalette
7 Close the palette ok cmux action run commandPalette
8 Soft Blue over art ok cmux settings set appearance.theme "Soft Blue"
9 Soft Blue Light over art ok cmux settings set appearance.theme "Soft Blue Light"
10 Clay Orange Light over art ok cmux settings set appearance.theme "Clay Orange Light"
11 Art off: Clay Orange Light ok cmux settings unset appearance.background
12 Clay Orange ok cmux settings set appearance.theme "Clay Orange"
13 Soft Blue ok cmux settings set appearance.theme "Soft Blue"
14 Soft Blue Light ok cmux settings set appearance.theme "Soft Blue Light"
Screenshots (14)

1. Launch over art
Launch over art

2. New workspace
New workspace

3. Terminal text and ANSI colors over art
Terminal text and ANSI colors over art

4. Split right
Split right

5. Agent chat beside the terminal
Agent chat beside the terminal

6. Command palette on glass over art
Command palette on glass over art

7. Close the palette
Close the palette

8. Soft Blue over art
Soft Blue over art

9. Soft Blue Light over art
Soft Blue Light over art

10. Clay Orange Light over art
Clay Orange Light over art

11. Art off: Clay Orange Light
Art off: Clay Orange Light

12. Clay Orange
Clay Orange

13. Soft Blue
Soft Blue

14. Soft Blue Light
Soft Blue Light

Tours are data in scripts/cmux-next/media/tours: add a step or a tour file to show your feature.

@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

CI fast guards failed on 0e0808920c (https://github.com/manaflow-ai/cmux/actions/runs/39210211174). It does not block the merge; a red guard merged into main breaks it for every open PR.
The log named no failed step; see the run.

Agents: python3 scripts/ci/guard_attribution.py fix applies the mechanical fixes locally. This comment is updated in place on each push.

@cursor

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

cmux-autofix[bot] and others added 2 commits October 19, 2026 06:38
- 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
@cursor

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

cmux-autofix[bot] and others added 2 commits October 19, 2026 07:02
- 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
@greptile-apps

greptile-apps Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 3/5

[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.

Findings

  1. P1 Rebuilding drops field focus ▶
  2. P1 Fallback tooltips lose contrast ▶

Summary

Text overlays now follow the Mac’s material instead of always using the solid popup surface.

  • Native text overlays now show themed glass over the art.
  • Native and page tooltips let more of the backdrop show through.

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) }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Rebuilding drops field focus

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));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 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.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Base reds, not from this PR: cmux-next checks fails the same sub-checks on merged #22100 (job 118270825257), and its Motion tokens entry names only base files; build x86_64-pc-windows-gnu is the base cmux-tui-core error (crate::apps::routing not found). action export areas was cancelled during checkout, and this PR changes no settings. Fast tier, Tour the app and ios-tests are green. Merging under the land-fast rule.

@teamleaderleo
teamleaderleo merged commit 86efbba into feat-cmux-next Oct 19, 2026
@teamleaderleo
teamleaderleo deleted the leo/next-overlay-glass branch October 19, 2026 20:34
@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

teamleaderleo added a commit that referenced this pull request Oct 20, 2026
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>
teamleaderleo added a commit that referenced this pull request Oct 20, 2026
…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>
teamleaderleo added a commit that referenced this pull request Oct 20, 2026
…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>
teamleaderleo added a commit that referenced this pull request Oct 20, 2026
…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>
lawrencecchen added a commit that referenced this pull request Oct 20, 2026
…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>
lawrencecchen added a commit that referenced this pull request Oct 20, 2026
…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>
lawrencecchen added a commit that referenced this pull request Oct 20, 2026
…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>
lawrencecchen added a commit that referenced this pull request Oct 20, 2026
…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>
teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…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>
teamleaderleo added a commit that referenced this pull request Oct 22, 2026
…; 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>
teamleaderleo added a commit that referenced this pull request Oct 22, 2026
…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>
teamleaderleo added a commit that referenced this pull request Oct 23, 2026
* 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>

This branch was previously deployed

1 inactive deployment
artifacts — a8d15d3c Deployed Oct 19, 2026 by teamleaderleo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

media-tour Run the cmux-next UI tour (cmux-next-media.yml) on every push

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant