Transparency and blur audit: every surface uses the shared glass at the owner's transparency #207

Closed
opened 2026-09-26 18:23:34 +00:00 by kayg · 7 comments
Owner

Owner 2026-09-26: 'we need to do a transparency/blur audit soon' (toasts are not transparent enough; earlier: dropdowns, sidebar and Settings cards, search palette, composer). After #157 (shared overlay glass) lands: inventory every translucent or blurred surface in apps/web and packages/ui (sidebar, Settings cards and dialog, menus and submenus, popovers/previews, palette, composer, toasts, tooltips, sheets, tray and pills, header capsules, calendar grid popovers, note header progressive blur, analytics cards), list its current background alpha, blur and saturation, and move each onto the shared glass tokens (one token set per role: chrome, card, overlay). No surface keeps its own ad-hoc rgba/backdrop-filter values (a lint or test fails on new ones). Check text contrast (4.5:1 body) over the worst background under each surface, and the one-blur-per-stack rule. Deliver a table plus screenshots over a busy photo background and the theme mesh, light and dark, for Claude's review.

Owner 2026-09-26: 'we need to do a transparency/blur audit soon' (toasts are not transparent enough; earlier: dropdowns, sidebar and Settings cards, search palette, composer). After #157 (shared overlay glass) lands: inventory every translucent or blurred surface in apps/web and packages/ui (sidebar, Settings cards and dialog, menus and submenus, popovers/previews, palette, composer, toasts, tooltips, sheets, tray and pills, header capsules, calendar grid popovers, note header progressive blur, analytics cards), list its current background alpha, blur and saturation, and move each onto the shared glass tokens (one token set per role: chrome, card, overlay). No surface keeps its own ad-hoc rgba/backdrop-filter values (a lint or test fails on new ones). Check text contrast (4.5:1 body) over the worst background under each surface, and the one-blur-per-stack rule. Deliver a table plus screenshots over a busy photo background and the theme mesh, light and dark, for Claude's review.
Author
Owner

Starting #207 on job/glass-audit, based on c82549b9a6 (dev). I’m inventorying every translucent or blurred surface before changing UI code.

Starting #207 on job/glass-audit, based on c82549b9a6271c504e42bfde07b42e9e1c96c4ad (dev). I’m inventorying every translucent or blurred surface before changing UI code.
Author
Owner

Finding (inventory commit ac6be7fc): packages/ui modeIsland uses a separate 70% tint and 10px blur; Pill has 18px/1.8 and 10px/1.5 variants; StatusPill uses 68%/72% tint and 22px blur; WeekBlob and media badges also define local glass recipes. The pre-change inventory is docs/audits/glass-audit-207.md.

Finding (inventory commit ac6be7fc): packages/ui modeIsland uses a separate 70% tint and 10px blur; Pill has 18px/1.8 and 10px/1.5 variants; StatusPill uses 68%/72% tint and 22px blur; WeekBlob and media badges also define local glass recipes. The pre-change inventory is docs/audits/glass-audit-207.md.
Author
Owner

The first all-theme media contrast run found a failing case: Ayu Light photo badge text over a white pixel measured 4.22:1 (required: 4.5:1). I raised the shared --glass-media-alpha from 84% to 90% in packages/ui/src/tokens.css; the focused suite is being rerun to confirm every theme passes.

The first all-theme media contrast run found a failing case: Ayu Light photo badge text over a white pixel measured 4.22:1 (required: 4.5:1). I raised the shared `--glass-media-alpha` from 84% to 90% in `packages/ui/src/tokens.css`; the focused suite is being rerun to confirm every theme passes.
Author
Owner

The source inventory found glass recipes with different local filters on Pills (18 px / 1.8), StatusPill (22 px / 1.8), WeekBlob (18 px / 2.0), PhotoTimeline labels (8 px), and Live Photo badges (12 px). The migration moves those surfaces to shared chrome, overlay, and inverse media tokens. It also removes selected/drop border rings from the mode segments and Files grid while retaining keyboard focus outlines. The new source check rejects blur recipes outside packages/ui/src/tokens.css and apps/web/src/lib/styles/scrim.css.

The source inventory found glass recipes with different local filters on Pills (18 px / 1.8), StatusPill (22 px / 1.8), WeekBlob (18 px / 2.0), PhotoTimeline labels (8 px), and Live Photo badges (12 px). The migration moves those surfaces to shared chrome, overlay, and inverse media tokens. It also removes selected/drop border rings from the mode segments and Files grid while retaining keyboard focus outlines. The new source check rejects blur recipes outside `packages/ui/src/tokens.css` and `apps/web/src/lib/styles/scrim.css`.
Author
Owner

The merged source scan found one remaining drop-state border treatment in apps/web/src/lib/photos/PhotosView.svelte: .drop-overlay paints a 3 px inset accent ring (box-shadow: inset 0 0 0 3px ...). I will remove that ring and retain the accent wash and drop message, in line with the issue's no-state-border rule.

The merged source scan found one remaining drop-state border treatment in `apps/web/src/lib/photos/PhotosView.svelte`: `.drop-overlay` paints a 3 px inset accent ring (`box-shadow: inset 0 0 0 3px ...`). I will remove that ring and retain the accent wash and drop message, in line with the issue's no-state-border rule.
Author
Owner

#207 — shared glass audit complete

Branch: job/glass-audit
Merged dev through 6f31788bdc31641dc8e2b58a5b6485a89a89b202.
Head: 50ffa9e1ab3b3ac08392d8f485c4defd6fc03052.

Built

  • Added the pre-change surface inventory and a supplemental scan in docs/audits/glass-audit-207.md.
  • Migrated 43 files to the shared glass role tokens. This covers the tab bar and mode controls, Files selection toolbar, pills, toast stack, menus, sidebars, settings, search, photo and video surfaces, calendar readouts, and chart tooltips.
  • Kept one blur owner per visual stack, removed state border highlights, retained keyboard focus indicators, and added theme checks for the 4.5:1 text contrast target.
  • Captured 140 production screenshots. The set covers light and dark themes, photo and mesh backgrounds, and 1440 px and 390 px viewports. Files toolbar captures are present at both widths.

Main files

  • packages/ui/src/tokens.css and the shared UI components in packages/ui/src/components/
  • apps/web/src/calternal-app.css, apps/web/src/routes/layout.css, and the audited surfaces under apps/web/src/lib/
  • apps/web/src/lib/themes.test.ts and related analytics component tests
  • apps/web/e2e/popover-screenshots.mjs
  • docs/audits/glass-audit-207.md

Screenshots and gate logs are in artifacts/glass-audit-207/; the screenshot index is manifest.txt.

Gates

cargo fmt --check exited 0 with empty output.

cargo clippy --all-targets -- -D warnings:

    Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/glass-audit/crates/calternal-server)
    Checking calternal-collab v0.0.1 (/home/kayg/Developer/calternal-wt/glass-audit/crates/calternal-collab)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 21.19s

cargo test: 1241 passed, 0 failed, 12 ignored across 69 test-result lines. Verbatim log is in gates/cargo-test-final.log; its build completion line was:

    Finished `test` profile [unoptimized + debuginfo] target(s) in 11m 10s

bun run check:

svelte-check found 0 errors and 0 warnings

bun run test:

 Test Files  80 passed (80)
      Tests  585 passed (585)

bun run build:

✓ built in 1m 10s
  Wrote site to "build"
  ✔ done

Production server build for screenshots:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 10m 48s

Known gaps

  • The production screenshots are attached for the orchestrator's visual review.
  • Vitest reports jsdom Window.scrollTo() notices; all 585 tests pass.
  • No API behavior changed, so this job did not add an adversarial endpoint probe.

Decisions outside the design doc

  • Set media glass tint to 90%. An 84% tint measured 4.2157:1 over a white photo pixel, below the 4.5:1 target.
  • The front toast owns blur in a toast stack; older toasts use the shared solid glass treatment.
  • File and photo selection state uses check fills and text feedback without a state border; keyboard focus indicators remain visible.
# #207 — shared glass audit complete Branch: `job/glass-audit` Merged `dev` through `6f31788bdc31641dc8e2b58a5b6485a89a89b202`. Head: `50ffa9e1ab3b3ac08392d8f485c4defd6fc03052`. ## Built - Added the pre-change surface inventory and a supplemental scan in `docs/audits/glass-audit-207.md`. - Migrated 43 files to the shared glass role tokens. This covers the tab bar and mode controls, Files selection toolbar, pills, toast stack, menus, sidebars, settings, search, photo and video surfaces, calendar readouts, and chart tooltips. - Kept one blur owner per visual stack, removed state border highlights, retained keyboard focus indicators, and added theme checks for the 4.5:1 text contrast target. - Captured 140 production screenshots. The set covers light and dark themes, photo and mesh backgrounds, and 1440 px and 390 px viewports. Files toolbar captures are present at both widths. ## Main files - `packages/ui/src/tokens.css` and the shared UI components in `packages/ui/src/components/` - `apps/web/src/calternal-app.css`, `apps/web/src/routes/layout.css`, and the audited surfaces under `apps/web/src/lib/` - `apps/web/src/lib/themes.test.ts` and related analytics component tests - `apps/web/e2e/popover-screenshots.mjs` - `docs/audits/glass-audit-207.md` Screenshots and gate logs are in `artifacts/glass-audit-207/`; the screenshot index is `manifest.txt`. ## Gates `cargo fmt --check` exited 0 with empty output. `cargo clippy --all-targets -- -D warnings`: ```text Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/glass-audit/crates/calternal-server) Checking calternal-collab v0.0.1 (/home/kayg/Developer/calternal-wt/glass-audit/crates/calternal-collab) Finished `dev` profile [unoptimized + debuginfo] target(s) in 21.19s ``` `cargo test`: 1241 passed, 0 failed, 12 ignored across 69 test-result lines. Verbatim log is in `gates/cargo-test-final.log`; its build completion line was: ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 11m 10s ``` `bun run check`: ```text svelte-check found 0 errors and 0 warnings ``` `bun run test`: ```text Test Files 80 passed (80) Tests 585 passed (585) ``` `bun run build`: ```text ✓ built in 1m 10s Wrote site to "build" ✔ done ``` Production server build for screenshots: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 10m 48s ``` ## Known gaps - The production screenshots are attached for the orchestrator's visual review. - Vitest reports jsdom `Window.scrollTo()` notices; all 585 tests pass. - No API behavior changed, so this job did not add an adversarial endpoint probe. ## Decisions outside the design doc - Set media glass tint to 90%. An 84% tint measured 4.2157:1 over a white photo pixel, below the 4.5:1 target. - The front toast owns blur in a toast stack; older toasts use the shared solid glass treatment. - File and photo selection state uses check fills and text feedback without a state border; keyboard focus indicators remain visible.
Author
Owner

Merged in 6495aaf7 after orchestrator review of the menu, toast and selection captures.

Merged in 6495aaf7 after orchestrator review of the menu, toast and selection captures.
kayg referenced this issue from a commit 2026-09-27 13:28:39 +00:00
kayg closed this issue 2026-09-27 13:28:40 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#207
No description provided.