Repository navigation
cmux-next: glass over art keeps main text readable, like iOS, and shows the art - #21783
teamleaderleo wants to merge 30 commits into
Conversation
…ws the art The tint floor over background art held every text role at WCAG contrast over the art's darkest and lightest colors, so the window's glass sat at 0.82-1.0 and the art showed at a few percent. By default it now holds primary text at AA, as iOS glass does over a wallpaper, and the art shows through (about 0.43-0.63). appearance.glassLegibility "all" keeps the old dense glass. 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 |
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Pending: CI is running on Last result: Unclear: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base 4d7890f; does not block
Agents: Tour of The path-selected recorder failed for core-after; see the run artifact and failed manifests. Path-selected interactions
Core UI (before): DEGRADED — 17 ok, 1 unavailable
Screenshots (14)1. Launch
Failed steps: 5. Split right Screenshots (10)1. Launch
Screenshots (14)1. Launch over art
Screenshots (14)1. Launch over art Tours are data in |
…ot scope Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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. |
|
Bead |
…tches the floor The namespace lint rewrites an all-static enum. pageBase.css said the floor holds secondary text; by default it holds primary text only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This comment has been minimized.
This comment has been minimized.
- regenerated docs/mdm/com.manaflow.cmux.json - regenerated docs/mdm/com.manaflow.cmux.plist - regenerated docs/mdm/managed-preferences.md - regenerated schemas/settings-export/settings-schema.sources.sha256 - regenerated schemas/settings/settings-schema.json - regenerated webviews/src/pages/settings/generated/strings.json - regenerated schemas/defaults/cmux-next.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39200292974
…-glass-legibility # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Localizable.xcstrings # schemas/settings-export/settings-schema.sources.sha256 # schemas/settings/settings-schema.json
… base merge The exports and the source stamp regenerate on the autofix bot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-glass-legibility # Conflicts: # webviews/src/pages/settings/generated/strings.json
|
Agents: |
This comment has been minimized.
This comment has been minimized.
- regenerated Packages/macOS/CmuxNext/ci-target-graph.json - 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/39210339626
…-glass-legibility
…-glass-legibility # Conflicts: # schemas/defaults/cmux-next.json # schemas/settings/settings-schema.json # webviews/src/agent-session/acpmux/replyHref.ts # webviews/src/pages/markdown/links.ts
[Medium impact] The PR changes glass appearance across app windows and updates a notification default. Fix the graph’s disagreement with FindingsSummaryAdds a choice between glass that protects primary text and denser glass that protects every text role.
Diagram%%{init: {'theme': 'neutral'}}%%
flowchart LR
A["appearance.glassLegibility"] --> B["CmuxConfigSnapshot"]
B --> C["SettingsApplier"]
C --> D["ThemeScope.artLegibility"]
D --> E["WindowBackdrop"]
D --> F["shownWindowOpacity"]
E --> G["Window tint floor"]
Reviews (14) · Last reviewed commit: "chore(next): PR autofix at 3baba45398d5" · Reviewed by Greptile |
| selection: BackdropSelection? = nil, tuning: AppearanceTuning = .identity, | ||
| texture: BackdropTexture = .default, tintOpacity workspaceTint: Double? = nil) { | ||
| texture: BackdropTexture = .default, tintOpacity workspaceTint: Double? = nil, | ||
| legibility: ArtLegibility = .primary) { |
There was a problem hiding this comment.
Opacity slider understates window tint
shownWindowOpacity still calls WindowBackdrop without legibility: artLegibility. With All Text selected and the contrast floor setting the window’s tint, that call uses the new .primary default and reports a lower opacity than the window paints. Settings uses that result for the unset Opacity slider, so its automatic value can be misleading. Pass the scope’s choice through that call too.
|
|
- docs/mdm/com.manaflow.cmux.json - docs/mdm/com.manaflow.cmux.plist - docs/mdm/managed-preferences.md - schemas/defaults/cmux-next.json - schemas/settings-export/settings-schema.sources.sha256 - schemas/settings/settings-schema.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39359572922
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. |
…rescue/next-glass-legibility
|
Correctness review at 1dd9656 (base feat-cmux-next 1554e40, independent subagent) Verdict: NON-BLOCKING. No blocking findings. Checked: Findings
Greptile: "Glass settings lack scoped owners" is resolved at this head (the lock is gone, the value sits on the scope, and parsing uses an instance). "Glass warning ignores app language" is not valid as a blocker: every CmuxNextSettings value diagnostic uses the same English "expected one of" text with the literal config tokens. "Opacity slider understates window tint" is valid (finding 1). Read-only review: no build or test run. |
|
|
| func legibleTintOpacity(over art: BackdropArtRange = .any, requested: Double, | ||
| legibility: ArtLegibility) -> Double { | ||
| art.scrimOpacity(texts: backdropTexts(legibility), scrim: surfaceBackground.withAlpha(1), requested: requested) |
There was a problem hiding this comment.
Tint adjustments lower text contrast
With experimental appearance enabled, appearance.saturation: 0 and appearance.glassTransparency: 1, the new primary-only floor can leave primary text below its promised contrast. The floor uses the original surfaceBackground, but WindowMaterialView paints a tint with changed saturation.
For ghosttyDefault over Hokusai, the new floor is 0.63. The gray tint gives white primary text about 4.19:1 contrast over the lightest art color, below 4.5:1. The old all-text floor keeps it above 4.5:1.
Compute the floor from the tint color that will actually be painted, and cover this combination in a test.
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Failing test for the correctness review at 1dd9656 (finding 1): with "all" the slider showed the primary floor while the window painted the denser tint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… floor the window paints shownWindowOpacity built its WindowBackdrop without the scope's legibility, so with "all" the slider showed the primary floor. Pass artLegibility (correctness review at 1dd9656, finding 1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Packages/macOS/CmuxNext/ci-target-graph.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39366934644
| "CmuxNextDaemonRecovery", | ||
| "CmuxNextDaemonService", | ||
| "CmuxNextDiff", | ||
| "CmuxNextFeed", |
There was a problem hiding this comment.
ci-target-graph.json adds CmuxNextFeed as a direct dependency of CmuxNextAppTests, but Package.swift does not declare it. The generator copies only declared dependencies, so it will remove this entry. That makes ci-target-graph.py --check fail, and the workflow fails on stale generated files.
Regenerate the graph from this branch’s manifest, or add the dependency to the manifest first if it is needed.
…loor share one backdrop The size cap allows no source growth in CmuxNextApp, so derived_min comes from pageDerivedNumbers(floor:) instead of a second helper. In CmuxNextDesign, shownWindowOpacity and shownWindowOpacityFloor read the same backdrop, so a later change to how it is built (glass legibility, #21783) applies to both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… changes the window (#22378) * cmux-next settings: failing tests for an Opacity slider that moves nothing over a picture Over a background picture the window never paints below the legibility floor (0.82 to 1.0 for the bundled themes), so most of the Opacity slider's travel changed nothing. The tests pin that the app reports the floor and the slider starts there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux-next settings: the Opacity slider over a picture starts at the legibility floor Over a background picture the window's tint never drops below the floor that keeps text legible (0.82 to 1.0 for the bundled themes), so the slider's travel below it changed nothing. The app now reports that floor (host lists derived_min, from ThemeScope.shownWindowOpacityFloor) and the picker's Opacity slider starts there, on the step grid, with a summary saying why. Without a picture the slider keeps its whole range. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * cmux-next settings: keep CmuxNextApp's size flat; resting value and floor share one backdrop The size cap allows no source growth in CmuxNextApp, so derived_min comes from pageDerivedNumbers(floor:) instead of a second helper. In CmuxNextDesign, shownWindowOpacity and shownWindowOpacityFloor read the same backdrop, so a later change to how it is built (glass legibility, #21783) applies to both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at 004a6b7 - Packages/macOS/CmuxNext/ci-target-graph.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39380761122 * test(next): a picture whose floor reaches 95% disables the Opacity slider Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(next): the Opacity slider is disabled when the picture's floor leaves it no travel Greptile on #22378: a legibility floor above 90% rounds to the 95% cap, so min equals max and the thumb could not move while the slider looked enabled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(next): with no picture the Opacity slider ignores a reported floor Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at 6e16816 - schemas/defaults/cmux-next.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39399195408 * chore(next): PR autofix at f5b1e59 - schemas/defaults/cmux-next.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39406623039 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
|
Orphaned: no activity for 14 h, and no lane holds a lease on it. The orphan sweep could not merge |
|
Closing: superseded by #22566. Readability now comes from the tint, blur and glass you set over any picture, so there's no picture-dependent floor. |




























































Over background art, the window's glass held every text role (primary, secondary, tertiary) at WCAG contrast against the art's darkest and lightest colors (
BackdropArtRange.scrimOpacity). That pinned the tint at 0.82–1.0 for every theme, so a work's own 0.7 tint never applied and the art showed through at 6–14%.Leo asked for iOS-style glass ("IOS IOS", 2026-10-18). iOS keeps primary text readable over a wallpaper and lets secondary text ride on the material. This PR does the same by default, and adds a setting to go back.
ArtLegibility(CmuxNextDesign) has two cases:.primary(default) counts only primary text at AA in the floor..allis the old rule.appearance.glassLegibility(CmuxNextSettings) takes"primary"(Main Text) or"all"(All Text). It has a Settings choice under Window, with strings in all 21 languages; the non-English ones are markedneeds_review.SettingsApplierapplies it, so CmuxNextApp does not grow.Tests:
GlassLegibilityTests(the main-text floor is lower and keeps primary text at AA) andGlassLegibilitySettingTests(default,"all", a bad value plus its diagnostic). Before/after tour media will follow once #21655, which adds the glass tour, is on the base.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
The glass over background art now keeps only primary text at WCAG AA by default, like iOS glass over a wallpaper, so far more of the art shows (about 0.43–0.63 tint instead of 0.82–1.0).
appearance.glassLegibilitytakes"primary"(Main Text, the default) or"all"(All Text, the old dense glass); a bad value falls back to Main Text with a diagnostic.ThemeScopeand inherits like art:SettingsAppliersets it on the app scope, so changing it repaints every window and workspace scope from the root.WindowBackdroptakes it as a parameter from the scope that paints, and Settings' unset Opacity slider now rests on the same tint floor the window paints.needs_review).Tests
GlassLegibilityTestscovers the lower primary-only floor, the"all"floor holding every role, backdrop inheritance, the window backdrop floor, and the unset Opacity slider following the choice.GlassLegibilitySettingTestscovers the default,"all", and a bad value plus its diagnostic.Written for commit 22dbdc9. Summary will update on new commits.