fix(web): Cool Darker glass reaches the surfaces it missed - #94
Conversation
PR #93 gave Cool Darker its wallpaper glass but only converted the surfaces in the chat column. Everything else in the inset kept painting an opaque fill, so the design-mode panel, the preview's browser bar and the right panel's cards each read as a rectangle of missing wallpaper. Each one missed for its own reason, and none were reachable by the existing `.bg-background` clear: - The design panel paints `bg-[var(--fork-design-surface)]`, an arbitrary value the class match cannot see. It now paints nothing at all — sitting on the 95% stage, alpha only compounds toward opaque, so transparent is the most glass available to it. Its fields become white washes. The layers rail was already transparent by accident of using the utility class. - `.surface-subheader` is `@apply ... bg-background`, which inlines the fill into its own rule so the element never carries the class. Named explicitly beside it, which also fixes the diff and file panel headers and the PR code tab. - `.bg-card` was never in the glass set at all. Washed to 5% white, matching the changed-files card, by class so the other ~30 users come along. The floating sidebar keeps its opaque fill — behind it is the transcript, not the desktop — but takes a neutral #1f1f1f instead of the palette's cool #181b1e. That is the docked panel's own resolved value, so only transparency changes when it lifts off the column. Its seam is ungated from overlay for a related reason: the tint asks what is behind the panel, the seam asks how loud its edge is, and only the first depends on overlay. Guards: the design chrome must stay washes, every `@apply`-ed fill must be named in the clear, cards must be washed by class, and the floating panel must be opaque and neutral. Two rules now target the v2 panel, so the tinted one is picked by its overlay gate rather than by source order. Written by Claude Opus 5 (1M context) in Claude Code. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
NoahHendrickson
left a comment
There was a problem hiding this comment.
Review result: changes requested
There is one blocking finding:
apps/web/src/theme.custom.palettes.css:502-506— The new unlayered, high-specificity.bg-cardrule fixesbackground-colorfor every exactbg-carddescendant of the inset. That also wins over Tailwind state utilities such ashover:bg-accent/60. For example, the available “Open a surface” buttons inRightPanelTabs.tsxcarry bothbg-cardandhover:bg-accent/60; under Cool Darker glass they will now remain at the 5% wash on hover, so this presentation change removes their existing interaction feedback. The same issue can affect other exactbg-cardcontrols in Settings. Please preserve the intended state backgrounds (for example with glass-aware state washes or narrower scoping) and add a guard that covers the state precedence.
Validation performed: git diff --check passed; vp test run apps/web/src/__fork_guards__ passed (41 files, 353 tests). I did not run browser-based visual verification because the repository instructions require explicit permission for browser/computer use.
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
The new `.bg-card` wash was written like every other rule in the glass set — unlayered and marker-scoped — so it outranked `hover:bg-accent/60` as well as the base fill. The "Open a surface" tiles stayed at the base wash under the pointer, and any focus or active background on an exact `bg-card` element went the same way. That is interaction feedback disappearing silently, not a tint being slightly wrong. The wash now joins Tailwind's cascade instead of sitting above it: `@layer utilities` puts it in the same layer as `.bg-card`, and `:where()` drops the marker to zero specificity so the selector is (0,1,0) — a tie with `.bg-card` that source order wins, and a loss to every (0,2,0) state variant. Hover, focus and active keep working without being enumerated. Redefining `--card` was the tidier-looking fix and is the same trap as `--background`: index.css derives --surface-raised, --code-background and a ring inset from it, so a 5% wash there would take the transcript's code blocks with it. Guards: the wash must sit in the utilities layer and use :where(), the tile must still carry both classes, and no inset-scoped glass rule may declare --card. Verified non-vacuous by restoring the unlayered form and confirming the failure. Written by Claude Opus 5 (1M context) in Claude Code. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Confirmed and fixed in c47948f — thanks, this was a real regression and the diagnosis was exact. Verified before fixing: The fix. The wash now joins Tailwind's cascade instead of sitting above it: On the alternative. I tried redefining Guards added, per your request for state-precedence coverage:
Verified non-vacuous by reverting the rule to its unlayered form and confirming the failure ( One thing I deliberately did not fix. The pre-existing |
PR #93 gave Cool Darker its wallpaper glass, but only the surfaces in the chat column were converted. Everything else inside the inset kept painting an opaque fill, so the design-mode panel, the preview's browser bar and the right panel's cards each read as a rectangle of missing wallpaper against a translucent window.
Each one missed for a different reason, and none of them were reachable by the existing
.bg-backgroundclear:bg-[var(--fork-design-surface)]— an arbitrary value the class match cannot see. It now paints nothing at all: it sits on the 95% stage, and alpha only compounds toward opaque, so transparent is the most glass available to it. A wash would have made it less glassy than the column it docks into. Its fields become white washes at the context chips' 12%, since with the surface painting nothing they sit on the bare stage. The layers rail beside it was already transparent, by accident of using thebg-backgroundutility..surface-subheaderis declared as@apply ... bg-background, which inlines the fill into its own rule so the element never carries the class. Naming it explicitly beside.bg-backgroundalso fixes the diff and file panel headers and the PR code tab, which share the utility..bg-cardwas never in the glass set at all. Washed to 5% white — matching the changed-files card so the two read as one kind of surface — and matched by class so the other ~30 users come along.The floating sidebar keeps its opaque fill, because what's behind it is the transcript rather than the desktop, but it takes a neutral
#1f1f1finstead of the palette's cool#181b1e. That value is the docked panel's own resolved colour (88% of the neutral tint over the material's ~99 sample), so only its transparency changes when it lifts off the column. Its seam is ungated from overlay for a related reason: the tint asks what is behind the panel, which overlay changes, while the seam asks how loud its edge is, which it does not.Guards
.surface-subheaderand.bg-cardare the third and fourth surfaces to be found opaque after the fact, so the new assertions derive their lists rather than hardcode them: the@apply-ed utilities are read back out ofindex.css, and cards are matched by class. Also added — the design chrome must stay washes with a field-above-accent ladder, and the floating panel must be opaque andR=G=B.Two rules now target the v2 panel, so a shared selector picks the tinted one by its overlay gate rather than by source order; three existing guards were relying on it happening to come first in the file. The overlay guard finds the translucent rule by having an alpha, since asserting the gate on a rule defined by that gate would be circular.
353 fork guards pass. The neutrality guard was verified non-vacuous by breaking the value to
#1f2022and confirming the failure before reverting.Not covered
Screenshots — the reviewer should pull this and look, since I could not capture the running window. Two known artifacts were left deliberately: the design-mode toggle's
variant="secondary"pill stays opaque in the browser bar, and the stage's 95%→85% ramp spans the full inset width so the design panel's lower third fades with it. Both are one-liners if wanted.This only neutralises the cool cast under glass. Cool Darker's base palette is still blue-tinted for web, Linux and any non-macOS window.
Written by Claude Opus 5 (1M context) in Claude Code.
🤖 Generated with Claude Code