Overlays: one shared glass surface for menus, dropdowns, popovers, sheets and the composer; more transparent #157

Closed
opened 2026-09-26 09:35:04 +00:00 by kayg · 18 comments
Owner

Owner 2026-09-26: 'the non-transparency is a problem for almost all overlays'; dropdowns/context menus in light mode don't let enough background through (e.g. the Files ⋯ menu: View as / Sort by / Show hidden files / Copy link is near-opaque white). DESIGN §34/§35: glass material for sidebar, Settings and menus.

  • Audit every overlay: dropdown menus, context menus, submenus, popovers/previews, the search palette, the composer capsule, sheets, toasts, tooltips. Each must use ONE shared surface primitive/token set (find the glass material from #108 and extend it; duplicated overlay CSS is a defect: delete the copies).
  • Make the material noticeably more transparent in BOTH light and dark: lower surface alpha, keep backdrop blur + saturation so text stays readable (4.5:1 for body text against the worst background under it, a themes.test.ts-style check). Light mode needs the biggest change.
  • The one-blur-per-stack rule stays (no nested backdrop-filters).
  • This job also continues the unfinished popovers work of #100 (shared popover interface, #102-#104) whose uncommitted diff is in this worktree: review it, finish or drop parts, commit atomically.
  • Screenshots: each overlay over a busy background (photo background and theme mesh), light + dark, 1440 and 390, attached for Claude's review.
Owner 2026-09-26: 'the non-transparency is a problem for almost all overlays'; dropdowns/context menus in light mode don't let enough background through (e.g. the Files ⋯ menu: View as / Sort by / Show hidden files / Copy link is near-opaque white). DESIGN §34/§35: glass material for sidebar, Settings and menus. - Audit every overlay: dropdown menus, context menus, submenus, popovers/previews, the search palette, the composer capsule, sheets, toasts, tooltips. Each must use ONE shared surface primitive/token set (find the glass material from #108 and extend it; duplicated overlay CSS is a defect: delete the copies). - Make the material noticeably more transparent in BOTH light and dark: lower surface alpha, keep backdrop blur + saturation so text stays readable (4.5:1 for body text against the worst background under it, a themes.test.ts-style check). Light mode needs the biggest change. - The one-blur-per-stack rule stays (no nested backdrop-filters). - This job also continues the unfinished popovers work of #100 (shared popover interface, #102-#104) whose uncommitted diff is in this worktree: review it, finish or drop parts, commit atomically. - Screenshots: each overlay over a busy background (photo background and theme mesh), light + dark, 1440 and 390, attached for Claude's review.
Author
Owner

Starting continuation on branch job/popovers at HEAD 5011ca16ca8daed193b72ed1a62d7ad620c80e25, based on dev merge-base 7c1d6c82ea98ac3772117a534fbb923825a60bab. I am reviewing the inherited uncommitted #100 changes before finishing them, then I will implement the shared overlay glass material and capture the requested production-build screenshots.

Starting continuation on branch `job/popovers` at HEAD `5011ca16ca8daed193b72ed1a62d7ad620c80e25`, based on `dev` merge-base `7c1d6c82ea98ac3772117a534fbb923825a60bab`. I am reviewing the inherited uncommitted #100 changes before finishing them, then I will implement the shared overlay glass material and capture the requested production-build screenshots.
Author
Owner

The material audit found several separate opacity recipes. themes.css sets page glass to 55% in light and 50% in dark. tokens.css sets clear glass to 78% / 60% and glass over a scrim to 90% / 74%. OverlaySurface.svelte sets full sheets to 92% / 97%. The toast uses a separate 70% island tint and 94% no-blur tint. TooltipLayer.svelte uses a 92% ink fill. The existing contrast test does not cover the no-blur Tooltip or stacked-toast tint. I am bringing these onto the shared glass tokens and extending the contrast check before lowering the alphas.

The material audit found several separate opacity recipes. `themes.css` sets page glass to 55% in light and 50% in dark. `tokens.css` sets clear glass to 78% / 60% and glass over a scrim to 90% / 74%. `OverlaySurface.svelte` sets full sheets to 92% / 97%. The toast uses a separate 70% island tint and 94% no-blur tint. `TooltipLayer.svelte` uses a 92% ink fill. The existing contrast test does not cover the no-blur Tooltip or stacked-toast tint. I am bringing these onto the shared glass tokens and extending the contrast check before lowering the alphas.
Author
Owner

Progress on #157:

  • Contrast coverage now includes no-blur tooltips, clear previews, front and stacked toasts, and floats above scrims. The filtered 29-theme glass contrast test passed. Its grid takes longer than Vitest's default 5-second timeout on the shared host, so the test now has a scoped 30-second limit.
  • Found a second live blur when a submenu opened over its parent. The parent now switches to the shared dense tint while the topmost submenu keeps the stack's one blur. The real-app E2E check will pin this behavior.
  • Current tint decisions: page glass 42% light / 44% dark; over-scrim glass 85% light / 68% dark; clear glass 71% light / 50% dark. The test measures body and secondary text at 4.5:1 and control boundaries at 3:1.
Progress on #157: - Contrast coverage now includes no-blur tooltips, clear previews, front and stacked toasts, and floats above scrims. The filtered 29-theme glass contrast test passed. Its grid takes longer than Vitest's default 5-second timeout on the shared host, so the test now has a scoped 30-second limit. - Found a second live blur when a submenu opened over its parent. The parent now switches to the shared dense tint while the topmost submenu keeps the stack's one blur. The real-app E2E check will pin this behavior. - Current tint decisions: page glass 42% light / 44% dark; over-scrim glass 85% light / 68% dark; clear glass 71% light / 50% dark. The test measures body and secondary text at 4.5:1 and control boundaries at 3:1.
Author
Owner

The expanded Files menu E2E reproduced a page error on Escape. FloatingSurface.onWindowKeydown called onclose() for the top-level surface, then continued into Menu.onkeydown; closing had already cleared the parent state, so the menu's items prop getter read .items from null. The browser stack pointed to the getter in the Files menu and was triggered by the new two-Escape submenu dismissal flow. I will return after the top-level Escape close so the stale handler cannot run.

The expanded Files menu E2E reproduced a page error on Escape. `FloatingSurface.onWindowKeydown` called `onclose()` for the top-level surface, then continued into `Menu.onkeydown`; closing had already cleared the parent state, so the menu's `items` prop getter read `.items` from null. The browser stack pointed to the getter in the Files menu and was triggered by the new two-Escape submenu dismissal flow. I will return after the top-level Escape close so the stale handler cannot run.
Author
Owner

The overlay CSS sweep found two active copies of the same Files/Photos drag-drop card paint (86% surface tint, blur(16px) saturate(1.5), local shadow), plus the moving Photos timeline labels' local blur and tint. These are real overlay surfaces in the app. I am switching them to the shared paint; the moving labels will use the no-blur shared surface to avoid filtering a surface that moves during scrubbing.

The overlay CSS sweep found two active copies of the same Files/Photos drag-drop card paint (86% surface tint, blur(16px) saturate(1.5), local shadow), plus the moving Photos timeline labels' local blur and tint. These are real overlay surfaces in the app. I am switching them to the shared paint; the moving labels will use the no-blur shared surface to avoid filtering a surface that moves during scrubbing.
Author
Owner

Continuation after the planned VM restart. Branch: job/popovers. Current HEAD: 176f6feb9b93b1dc6fb473756f84dd6e4b259c0a. Current dev base for the required pre-gate merge: 44b15bec4f4e78e788c85b7ec60d54892a293b84 (the branch forked from merge-base 7c1d6c82ea98ac3772117a534fbb923825a60bab). The checkpoint is committed and the worktree is clean. I reviewed all prior #157 progress comments and am continuing the overlay audit, production screenshot capture, and final verification.

Continuation after the planned VM restart. Branch: `job/popovers`. Current HEAD: `176f6feb9b93b1dc6fb473756f84dd6e4b259c0a`. Current `dev` base for the required pre-gate merge: `44b15bec4f4e78e788c85b7ec60d54892a293b84` (the branch forked from merge-base `7c1d6c82ea98ac3772117a534fbb923825a60bab`). The checkpoint is committed and the worktree is clean. I reviewed all prior #157 progress comments and am continuing the overlay audit, production screenshot capture, and final verification.
Author
Owner

Post-merge adversarial finding: the 24-request Task create storm (12 workers, 60 s request timeout) returned no response for requests 14–19 and 23. The single-request baseline was 4.047 s (5/5 successful); the probe's computed SLOW threshold was 101.18 s. The probe classifies timeouts as NO RESPONSE, separately from SLOW, so I am treating this as a non-SLOW finding and investigating it. The server remained up; no 5xx was reported in this section.

Post-merge adversarial finding: the 24-request Task create storm (12 workers, 60 s request timeout) returned no response for requests 14–19 and 23. The single-request baseline was 4.047 s (5/5 successful); the probe's computed SLOW threshold was 101.18 s. The probe classifies timeouts as `NO RESPONSE`, separately from `SLOW`, so I am treating this as a non-SLOW finding and investigating it. The server remained up; no 5xx was reported in this section.
Author
Owner

Post-merge adversarial result for this branch:

  • The real-server probe completed its two API rounds, hostile-byte checks, and TERM/KILL restart checks. The server stayed alive at the end; hostile-byte checks reported 0 findings and the restart probe reported 0 findings.
  • Most probe messages were marked SLOW while multiple builds, servers, browser runs, and other adversarial probes were active on the shared host.
  • Task create storm: baseline p50 was 4.047s; 7 of 24 requests exceeded the 60s client timeout. A count-only check found all 24 Task files and 24 distinct Index sources afterward.
  • Template create storm: 1 of 16 responses timed out. A count-only check found all 16 Notes and all 16 distinct Index IDs afterward.
  • Shared Photos: the recipient timeline returned an empty page for the 12s probe window. The recipient projection existed by a post-check, but the cause is not isolated.
  • User purge: an upload for another User returned 201 in 2.89s against the probe's under-2s target. The purge completed within its 120s bound.
  • Journal race: 6 seeds, 32 creates returned 201, 8 timed out (2 later appeared), 10 conditional uploads, and 40 entries total; the probe found no duplicate or lost Log lines.

I filed the non-SLOW follow-ups with evidence in #171 (Task create latency), #172 (template Note create latency), #173 (shared Photos timeline), and #174 (write latency during Home purge). No API changes were made for these findings in the overlay-glass job. The adversarial runner exited 1 because it counts SLOW findings as nonzero, despite no crash or data-integrity finding.

Post-merge adversarial result for this branch: - The real-server probe completed its two API rounds, hostile-byte checks, and TERM/KILL restart checks. The server stayed alive at the end; hostile-byte checks reported 0 findings and the restart probe reported 0 findings. - Most probe messages were marked SLOW while multiple builds, servers, browser runs, and other adversarial probes were active on the shared host. - Task create storm: baseline p50 was 4.047s; 7 of 24 requests exceeded the 60s client timeout. A count-only check found all 24 Task files and 24 distinct Index sources afterward. - Template create storm: 1 of 16 responses timed out. A count-only check found all 16 Notes and all 16 distinct Index IDs afterward. - Shared Photos: the recipient timeline returned an empty page for the 12s probe window. The recipient projection existed by a post-check, but the cause is not isolated. - User purge: an upload for another User returned 201 in 2.89s against the probe's under-2s target. The purge completed within its 120s bound. - Journal race: 6 seeds, 32 creates returned 201, 8 timed out (2 later appeared), 10 conditional uploads, and 40 entries total; the probe found no duplicate or lost Log lines. I filed the non-SLOW follow-ups with evidence in #171 (Task create latency), #172 (template Note create latency), #173 (shared Photos timeline), and #174 (write latency during Home purge). No API changes were made for these findings in the overlay-glass job. The adversarial runner exited 1 because it counts SLOW findings as nonzero, despite no crash or data-integrity finding.
Author
Owner

Merge finding from the newer dev integration (e976bff6): crates/plugins/files/src/index.rs::record_once retained return Ok(()) in a function that returns Result<bool, Failure>. The merged-tree Clippy gate reported E0308 at line 620 (expected bool, found ()). The dev parent defines an unchanged Index row as a successful record, so I restored Ok(true) with that invariant documented in commit 324a501f.

Evidence after the fix: cargo test -p calternal-plugin-files finished with 88 passed; 0 failed; 0 ignored, doc-tests 0 passed; 0 failed, exit code 0.

Merge finding from the newer `dev` integration (`e976bff6`): `crates/plugins/files/src/index.rs::record_once` retained `return Ok(())` in a function that returns `Result<bool, Failure>`. The merged-tree Clippy gate reported E0308 at line 620 (`expected bool, found ()`). The `dev` parent defines an unchanged Index row as a successful record, so I restored `Ok(true)` with that invariant documented in commit `324a501f`. Evidence after the fix: `cargo test -p calternal-plugin-files` finished with `88 passed; 0 failed; 0 ignored`, doc-tests `0 passed; 0 failed`, exit code 0.
Author
Owner

Resuming issue #157 after the planned VM restart. Branch: job/popovers. Current HEAD: 324a501fd7. Current dev: 2527f0d07e. Merge base before the required pre-gate merge: e976bff6c7. Worktree is clean; I am finishing the requested production screenshot set and then will merge dev and run final gates.

Resuming issue #157 after the planned VM restart. Branch: job/popovers. Current HEAD: 324a501fd727c8e82aa43f34f5f3dcba0d6cd271. Current dev: 2527f0d07e111a8717e986f57e1ca3c51242c486. Merge base before the required pre-gate merge: e976bff6c74b3131266b3baeb33ab318edccd46e. Worktree is clean; I am finishing the requested production screenshot set and then will merge dev and run final gates.
Author
Owner

Finding from the merged production screenshot run: apps/web/e2e/popover-screenshots.mjs still opens the Inspector with Control+i, but the current app.inspector shortcut in apps/web/src/lib/shortcuts/registry.ts is Mod+Shift+.. The run refreshed the first six 1440 px, light, theme-mesh screenshots, then timed out waiting for the Inspector. The other 94 PNGs have earlier timestamps. The same stale shortcut remains in apps/web/e2e/popovers.mjs. I am updating both E2E flows to match the registry and will rerun them.

Finding from the merged production screenshot run: `apps/web/e2e/popover-screenshots.mjs` still opens the Inspector with `Control+i`, but the current `app.inspector` shortcut in `apps/web/src/lib/shortcuts/registry.ts` is `Mod+Shift+.`. The run refreshed the first six 1440 px, light, theme-mesh screenshots, then timed out waiting for the Inspector. The other 94 PNGs have earlier timestamps. The same stale shortcut remains in `apps/web/e2e/popovers.mjs`. I am updating both E2E flows to match the registry and will rerun them.
Author
Owner

The focused test:e2e:popovers run now passes Calendar preview and Files Inspector with the updated Inspector chord, then fails in Search: it still sends Control+k, so .surface.search-window never appears. The current app.search registry entry is Mod+/ (Ctrl+/ on this runner). The screenshot flow has the same stale Search chord. I am updating both #157 flows to use the merged shortcut.

The focused `test:e2e:popovers` run now passes Calendar preview and Files Inspector with the updated Inspector chord, then fails in Search: it still sends `Control+k`, so `.surface.search-window` never appears. The current `app.search` registry entry is `Mod+/` (Ctrl+/ on this runner). The screenshot flow has the same stale Search chord. I am updating both #157 flows to use the merged shortcut.
Author
Owner

After updating both flows to the current shortcut registry, the focused desktop popover E2E passes Calendar, Inspector and Search. The clean production screenshot run then advances through the desktop states and fails only on the 390 px pass at the Inspector step: the keyboard shortcut does not produce a visible Info dialog on the phone viewport. I am checking the touch action path and will capture the phone sheet through its UI control.

After updating both flows to the current shortcut registry, the focused desktop popover E2E passes Calendar, Inspector and Search. The clean production screenshot run then advances through the desktop states and fails only on the 390 px pass at the Inspector step: the keyboard shortcut does not produce a visible `Info` dialog on the phone viewport. I am checking the touch action path and will capture the phone sheet through its UI control.
Author
Owner

Root cause confirmed in a real 390 px touch run: the screenshot flow's file-row click opens the modal Quick Look: overlay-debug.txt sheet. The app correctly suppresses the Inspector shortcut while a modal is open, so Control+Shift+. leaves Quick Look in place; the scrim also blocks the header Info control. When the phone flow skips the row tap, tapping the real Show info header action opens the Info sheet. Tapping Search from the phone sidebar sheet opens the Search palette. I am changing the mobile screenshots to use those touch controls; desktop keeps the shortcut path.

Root cause confirmed in a real 390 px touch run: the screenshot flow's file-row click opens the modal `Quick Look: overlay-debug.txt` sheet. The app correctly suppresses the Inspector shortcut while a modal is open, so `Control+Shift+.` leaves Quick Look in place; the scrim also blocks the header Info control. When the phone flow skips the row tap, tapping the real `Show info` header action opens the Info sheet. Tapping Search from the phone sidebar sheet opens the Search palette. I am changing the mobile screenshots to use those touch controls; desktop keeps the shortcut path.
Author
Owner

Post-merge adversarial progress: the appearance concurrent PUT storm reported only SLOW responses: requests 5–31 took 5.3–20.0 s and returned HTTP 200. The search storm reported 0 failures with p50 295.5 ms and p95 401.5 ms. The repository rule classifies SLOW-only findings as shared-host load. The adversarial round is still running; I am watching for any non-SLOW finding.

Post-merge adversarial progress: the appearance concurrent PUT storm reported only `SLOW` responses: requests 5–31 took 5.3–20.0 s and returned HTTP 200. The search storm reported 0 failures with p50 295.5 ms and p95 401.5 ms. The repository rule classifies SLOW-only findings as shared-host load. The adversarial round is still running; I am watching for any non-SLOW finding.
Author
Owner

Non-SLOW post-merge adversarial finding in share-options: setup found no thumbnail for the shared photo after 30 s; the view-only thumbnail routes returned 404 for 256 px and 1024 px; thumbnail revalidation also returned 404 with no ETag/cache headers; and the password gallery burst returned 404. I am tracing whether the file was indexed, the media worker produced a thumbnail, and the share projection resolves it before deciding on a fix or follow-up issue.

Non-SLOW post-merge adversarial finding in `share-options`: setup found no thumbnail for the shared photo after 30 s; the view-only thumbnail routes returned 404 for 256 px and 1024 px; thumbnail revalidation also returned 404 with no ETag/cache headers; and the password gallery burst returned 404. I am tracing whether the file was indexed, the media worker produced a thumbnail, and the share projection resolves it before deciding on a fix or follow-up issue.
Author
Owner

Completed overlay-glass on job/popovers.

Head: 789d38b5e4709f0c4b20f93b226d6100876a3627

Commits: merged current dev in 2d842d39; updated popover shortcut coverage in 302ab743; fixed touch-path screenshot capture in 789d38b5.

Built

  • Unified overlay paint and behavior across menus, popovers, previews, Inspector, composer, sheets, toasts, tooltips and Files/Photos cards. Shared PopoverSurface and glass tokens now own tint, hairline, shadow and blur. Contrast checks cover the 29 themes and overlay variants; submenu and stacked toast surfaces keep one live blur per stack.
  • Completed the shared popover interface work, removed duplicated floating/surface paint, and fixed submenu Escape handling.
  • Added app E2E coverage and a production-build screenshot harness. The clean capture contains 100 PNGs over photo and theme-mesh backgrounds, in light and dark themes at 1440 and 390 widths. Local artifacts and manifest: artifacts/overlay-glass-screens/.
  • The mobile capture opens Info and Search through touch controls; selecting a file first opens modal Quick Look, which correctly blocks the Inspector shortcut.

Final gates

  • cargo fmt --check: exit 0; no output.
  • cargo clippy --all-targets -- -D warnings:
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 7m 34s
    
  • cargo test: exit 0. Workspace suites passed; representative verbatim summaries:
    • test result: ok. 476 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.46s
    • test result: ok. 99 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 41.28s
  • Web bun run check: svelte-check found 0 errors and 0 warnings
  • Web bun run test:
    • Test Files 55 passed (55)
    • Tests 433 passed (433)
  • Focused production-app E2E: PASS Calendar hover, selection, drag, Escape and long-title clamp; PASS Files Inspector selection and Escape; PASS Search preview selection and Escape.

Adversarial round

tests/adversarial/run.sh exited 1 because its runner reports findings, including SLOW results. Round 1 had 36 findings, all SLOW. Round 2 had 15 missing-thumbnail 404 findings and 5 SLOW Unicode writes. Hostile-byte checks reported 0 findings, the restart probe reported 0 findings, and the server remained alive. The thumbnail results are tracked in existing #209: this host has bwrap, vips and vipsheader, but no calternal-media-sandbox wrapper. This run does not establish packaged-runtime thumbnail behavior. No API changes were made for this finding.

Decisions where DESIGN had no exact value

  • Set page glass to 42% in light themes and 44% in dark themes; set scrim tint to 85%/68% and clear preview tint to 71%/50% (light/dark). The contrast test verifies body text at 4.5:1 over the theme meshes and glass tints. DESIGN now records the page tint and shared material rules.
  • For 390 px screenshot capture, use the real touch Info and Search controls because the file-row action opens a modal Quick Look first.

cargo clean removed 22,850 files (295.7 MiB); apps/web/build and apps/web/.svelte-kit were removed. Worktree is clean. No push, deploy, merge into dev, or issue closure was performed.

Completed overlay-glass on `job/popovers`. **Head:** `789d38b5e4709f0c4b20f93b226d6100876a3627` **Commits:** merged current `dev` in `2d842d39`; updated popover shortcut coverage in `302ab743`; fixed touch-path screenshot capture in `789d38b5`. **Built** - Unified overlay paint and behavior across menus, popovers, previews, Inspector, composer, sheets, toasts, tooltips and Files/Photos cards. Shared `PopoverSurface` and glass tokens now own tint, hairline, shadow and blur. Contrast checks cover the 29 themes and overlay variants; submenu and stacked toast surfaces keep one live blur per stack. - Completed the shared popover interface work, removed duplicated floating/surface paint, and fixed submenu Escape handling. - Added app E2E coverage and a production-build screenshot harness. The clean capture contains 100 PNGs over photo and theme-mesh backgrounds, in light and dark themes at 1440 and 390 widths. Local artifacts and manifest: `artifacts/overlay-glass-screens/`. - The mobile capture opens Info and Search through touch controls; selecting a file first opens modal Quick Look, which correctly blocks the Inspector shortcut. **Final gates** - `cargo fmt --check`: exit 0; no output. - `cargo clippy --all-targets -- -D warnings`: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 7m 34s ``` - `cargo test`: exit 0. Workspace suites passed; representative verbatim summaries: - `test result: ok. 476 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.46s` - `test result: ok. 99 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 41.28s` - Web `bun run check`: `svelte-check found 0 errors and 0 warnings` - Web `bun run test`: - `Test Files 55 passed (55)` - ` Tests 433 passed (433)` - Focused production-app E2E: `PASS Calendar hover, selection, drag, Escape and long-title clamp`; `PASS Files Inspector selection and Escape`; `PASS Search preview selection and Escape`. **Adversarial round** `tests/adversarial/run.sh` exited 1 because its runner reports findings, including SLOW results. Round 1 had 36 findings, all SLOW. Round 2 had 15 missing-thumbnail 404 findings and 5 SLOW Unicode writes. Hostile-byte checks reported 0 findings, the restart probe reported 0 findings, and the server remained alive. The thumbnail results are tracked in existing #209: this host has `bwrap`, vips and vipsheader, but no `calternal-media-sandbox` wrapper. This run does not establish packaged-runtime thumbnail behavior. No API changes were made for this finding. **Decisions where DESIGN had no exact value** - Set page glass to 42% in light themes and 44% in dark themes; set scrim tint to 85%/68% and clear preview tint to 71%/50% (light/dark). The contrast test verifies body text at 4.5:1 over the theme meshes and glass tints. DESIGN now records the page tint and shared material rules. - For 390 px screenshot capture, use the real touch Info and Search controls because the file-row action opens a modal Quick Look first. `cargo clean` removed 22,850 files (295.7 MiB); `apps/web/build` and `apps/web/.svelte-kit` were removed. Worktree is clean. No push, deploy, merge into `dev`, or issue closure was performed.
Author
Owner

Merged into dev at 19676b44 after Claude's screenshot review (shared overlay glass, lighter in both themes). Deploy status on #203.

Merged into dev at 19676b44 after Claude's screenshot review (shared overlay glass, lighter in both themes). Deploy status on #203.
kayg closed this issue 2026-09-26 20:39:05 +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#157
No description provided.