Phone chrome: sticky sheet handle + progressive-blur section header; contextual bars replace the tab bar #219

Closed
opened 2026-09-27 07:59:41 +00:00 by kayg · 29 comments
Owner

Owner 2026-09-27 (phone screenshots of Settings → Appearance as a presentation sheet, and Files with one item selected).

  1. Presentation sheets (Settings and every other sheet, one shared sheet component): the drag handle and a header are sticky. The header uses the progressive blur (same technique as the note header, DESIGN §35) over the scrolling content. As the user scrolls, the header title changes to the section currently at the top (Appearance → Theme → Color theme …), with a short crossfade (reduced motion: instant). Only the content scrolls: the handle and header never overscroll/rubber-band with it (overscroll-behavior: contain on the scroller; the sheet frame is fixed). Drag-to-dismiss still works from the handle and from the header area.
  2. Contextual bottom bars replace the tab bar: when items are selected in Files (the selection toolbar: link, share, download, delete, ⋯, Done) or in Photos or lists, that toolbar takes the tab bar's place (one bottom bar rule, DESIGN §34); leaving selection brings the tab bar back with a short transition. Same shared mechanism as the block bar (#191).
  3. These bars use the shared glass (#157, audit #207): the selection toolbar and the tab bar must be translucent with blur, not opaque white.
    Screenshots at 390 light and dark: sheet scrolled to three different sections (header text changes), sheet over-scrolled (handle/header stay put), Files selection with the toolbar in place of the tab bar.
Owner 2026-09-27 (phone screenshots of Settings → Appearance as a presentation sheet, and Files with one item selected). 1. Presentation sheets (Settings and every other sheet, one shared sheet component): the drag handle and a header are sticky. The header uses the progressive blur (same technique as the note header, DESIGN §35) over the scrolling content. As the user scrolls, the header title changes to the section currently at the top (Appearance → Theme → Color theme …), with a short crossfade (reduced motion: instant). Only the content scrolls: the handle and header never overscroll/rubber-band with it (overscroll-behavior: contain on the scroller; the sheet frame is fixed). Drag-to-dismiss still works from the handle and from the header area. 2. Contextual bottom bars replace the tab bar: when items are selected in Files (the selection toolbar: link, share, download, delete, ⋯, Done) or in Photos or lists, that toolbar takes the tab bar's place (one bottom bar rule, DESIGN §34); leaving selection brings the tab bar back with a short transition. Same shared mechanism as the block bar (#191). 3. These bars use the shared glass (#157, audit #207): the selection toolbar and the tab bar must be translucent with blur, not opaque white. Screenshots at 390 light and dark: sheet scrolled to three different sections (header text changes), sheet over-scrolled (handle/header stay put), Files selection with the toolbar in place of the tab bar.
Author
Owner

Owner 2026-09-27: the sidebar open/close on phones is instant and jarring (no animation). Fix in the same shared drawer/sheet code:

  • Open/close slides the sidebar in from the left edge (transform only, GPU-composited), with the scrim fading in/out in step. Ease: a measured iOS-like curve (about 300-350 ms, ease-out on open, slightly faster on close), no overshoot.
  • The edge-swipe gesture drives the drawer 1:1 with the finger; releasing settles open or closed based on position and velocity; interruptible at any point (a tap during the animation reverses it smoothly).
  • The page behind does not jump; focus moves into the drawer on open and back to the toggle on close.
  • prefers-reduced-motion: a short crossfade instead of a slide.
  • Same for the sidebar toggle on desktop if it also snaps (check both).
    Add an e2e that samples the drawer transform mid-transition (not just the start and end states).
Owner 2026-09-27: the sidebar open/close on phones is instant and jarring (no animation). Fix in the same shared drawer/sheet code: - Open/close slides the sidebar in from the left edge (transform only, GPU-composited), with the scrim fading in/out in step. Ease: a measured iOS-like curve (about 300-350 ms, ease-out on open, slightly faster on close), no overshoot. - The edge-swipe gesture drives the drawer 1:1 with the finger; releasing settles open or closed based on position and velocity; interruptible at any point (a tap during the animation reverses it smoothly). - The page behind does not jump; focus moves into the drawer on open and back to the toggle on close. - prefers-reduced-motion: a short crossfade instead of a slide. - Same for the sidebar toggle on desktop if it also snaps (check both). Add an e2e that samples the drawer transform mid-transition (not just the start and end states).
Author
Owner

Starting #219 on branch job/phone-chrome, based on dev at c82549b9a6271c504e42bfde07b42e9e1c96c4ad. I am implementing the phone drawer, shared sticky section header for presentation sheets, and contextual bottom-bar replacement. I will capture rendered phone states and drawer transition frames.

Starting #219 on branch `job/phone-chrome`, based on `dev` at `c82549b9a6271c504e42bfde07b42e9e1c96c4ad`. I am implementing the phone drawer, shared sticky section header for presentation sheets, and contextual bottom-bar replacement. I will capture rendered phone states and drawer transition frames.
Author
Owner

Production phone capture for #219 found a sticky-title edge case. At 390×844 on /settings/appearance, the production sheet title followed “Theme” and “Color theme”, but the “Mode tray” heading could not reach the sticky header at the scroll limit, so the header kept the previous title and the capture timed out waiting for “Mode tray”. I am changing the shared sheet tracker to select the final heading when the content reaches its bottom, with a regression test.

Production phone capture for #219 found a sticky-title edge case. At 390×844 on `/settings/appearance`, the production sheet title followed “Theme” and “Color theme”, but the “Mode tray” heading could not reach the sticky header at the scroll limit, so the header kept the previous title and the capture timed out waiting for “Mode tray”. I am changing the shared sheet tracker to select the final heading when the content reaches its bottom, with a regression test.
Author
Owner

The post-merge production E2E run exposed an accessibility timing issue in the bottom-bar swap. Immediately after the Files contextual bar appeared, the outgoing App modes tablist remained in the DOM during its 80 ms fade-out, so both toolbars were exposed. I am removing the outgoing branch immediately and fading in the replacement, then I will rerun the production flow.

The post-merge production E2E run exposed an accessibility timing issue in the bottom-bar swap. Immediately after the Files contextual bar appeared, the outgoing App modes `tablist` remained in the DOM during its 80 ms fade-out, so both toolbars were exposed. I am removing the outgoing branch immediately and fading in the replacement, then I will rerun the production flow.
Author
Owner

Final bun run check exposed a type error in the new contextual bottom-bar slot: Svelte's bare Component type defaults to {} props, so the Files, Photos, and test-fixture components with required props were rejected. I changed ContextualBar.component to Component<any> while keeping each page's props object typed at its concrete usePageChrome call site. The final check now reports svelte-check found 0 errors and 0 warnings; the full web suite passes 550 tests.

Final `bun run check` exposed a type error in the new contextual bottom-bar slot: Svelte's bare `Component` type defaults to `{}` props, so the Files, Photos, and test-fixture components with required props were rejected. I changed `ContextualBar.component` to `Component<any>` while keeping each page's props object typed at its concrete `usePageChrome` call site. The final check now reports `svelte-check found 0 errors and 0 warnings`; the full web suite passes 550 tests.
Author
Owner

Finished Forgejo #219 on job/phone-chrome.

Head SHA: 0db401590da4336fd073e78910b53792cd913b31.

Built

  • Fixed phone presentation sheets with a shared sticky handle/header, inner contained scrolling, section-aware title updates, drag dismissal, and reduced-motion/transparency handling.
  • Added the shared PageChrome.contextualBar slot and action bar. Files and Photos selection now replace the phone mode tray and restore it when selection ends. The outgoing tray is removed from the accessibility tree immediately.
  • Kept the existing edge-swipe sidebar drawer, which already tracks touch progress and settles by distance/velocity. Added production E2E coverage for opening and closing it.
  • Added a production-server E2E for real API-backed Files selection, sheet scrolling and headings, 390x844 light/dark states, overscroll containment, tray replacement/restoration, and drawer gestures.

Files

  • packages/ui/src/components/OverlaySurface.svelte, ProgressiveBlur.svelte, ModeHeader.svelte, SelectionBar.svelte, TabBar.svelte, pageChrome.ts, packages/ui/src/index.ts
  • apps/web/src/routes/+layout.svelte, layout.css, settings/[...path]/+page.svelte
  • apps/web/src/lib/components/OverlaySurface.svelte.test.ts, SelectionBar.svelte.test.ts, TagEditor.svelte, files/ShareDialog.svelte, files/FilesBrowser.svelte, notifications/InboxPanel.svelte, photos/PhotosView.svelte, tray.svelte.test.ts, test-fixtures/BottomBarFixture.svelte
  • apps/web/e2e/phone-chrome.mjs, apps/web/package.json

Gates

cargo fmt --check exited 0 with no output.

Verbatim completion output:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 13m 23s

svelte-check found 0 errors and 0 warnings

 Test Files  73 passed (73)
      Tests  550 passed (550)
   Start at  12:04:09
   Duration  83.07s (transform 68%, environment 12%, import 11%, tests 6%, setup 2%)

cargo test exited 0. Its 69 suite result lines total 1,237 passed, 0 failed, and 12 ignored. Example output:

test result: ok. 477 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.37s

The production build completed:

✓ built in 23.97s
✓ built in 106ms
✓ built in 50.53s
  Wrote site to "build"
  ✔ done

Production E2E completed:

PASS Files selection replaces and restores the phone mode tray
PASS edge swipe opens and closes the phone navigation drawer
PHONE CHROME E2E PASSED; screenshots in /home/kayg/Developer/calternal-wt/phone-chrome/artifacts/phone-chrome

Evidence and decisions

Screenshot states and drawer transition frames are in artifacts/phone-chrome/; these are local, untracked review artifacts. Visual review remains with Claude/orchestrator.

The design docs do not define the type for a slot that hosts unrelated Svelte components. ContextualBar.component uses Component<any> at that heterogeneous boundary; each producer still type-checks its props against its concrete component. I retained the existing drawer gesture and settle behavior because it already met the animated, gesture-driven requirement; this job verifies it in production E2E.

No API behavior changed, so the API adversarial probe did not apply. The web test log contains jsdom Window's scrollTo() warnings; all 550 tests passed.

Finished Forgejo #219 on `job/phone-chrome`. Head SHA: `0db401590da4336fd073e78910b53792cd913b31`. ## Built - Fixed phone presentation sheets with a shared sticky handle/header, inner contained scrolling, section-aware title updates, drag dismissal, and reduced-motion/transparency handling. - Added the shared `PageChrome.contextualBar` slot and action bar. Files and Photos selection now replace the phone mode tray and restore it when selection ends. The outgoing tray is removed from the accessibility tree immediately. - Kept the existing edge-swipe sidebar drawer, which already tracks touch progress and settles by distance/velocity. Added production E2E coverage for opening and closing it. - Added a production-server E2E for real API-backed Files selection, sheet scrolling and headings, 390x844 light/dark states, overscroll containment, tray replacement/restoration, and drawer gestures. ## Files - `packages/ui/src/components/OverlaySurface.svelte`, `ProgressiveBlur.svelte`, `ModeHeader.svelte`, `SelectionBar.svelte`, `TabBar.svelte`, `pageChrome.ts`, `packages/ui/src/index.ts` - `apps/web/src/routes/+layout.svelte`, `layout.css`, `settings/[...path]/+page.svelte` - `apps/web/src/lib/components/OverlaySurface.svelte.test.ts`, `SelectionBar.svelte.test.ts`, `TagEditor.svelte`, `files/ShareDialog.svelte`, `files/FilesBrowser.svelte`, `notifications/InboxPanel.svelte`, `photos/PhotosView.svelte`, `tray.svelte.test.ts`, `test-fixtures/BottomBarFixture.svelte` - `apps/web/e2e/phone-chrome.mjs`, `apps/web/package.json` ## Gates `cargo fmt --check` exited 0 with no output. Verbatim completion output: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 13m 23s svelte-check found 0 errors and 0 warnings Test Files 73 passed (73) Tests 550 passed (550) Start at 12:04:09 Duration 83.07s (transform 68%, environment 12%, import 11%, tests 6%, setup 2%) ``` `cargo test` exited 0. Its 69 suite result lines total 1,237 passed, 0 failed, and 12 ignored. Example output: ```text test result: ok. 477 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.37s ``` The production build completed: ```text ✓ built in 23.97s ✓ built in 106ms ✓ built in 50.53s Wrote site to "build" ✔ done ``` Production E2E completed: ```text PASS Files selection replaces and restores the phone mode tray PASS edge swipe opens and closes the phone navigation drawer PHONE CHROME E2E PASSED; screenshots in /home/kayg/Developer/calternal-wt/phone-chrome/artifacts/phone-chrome ``` ## Evidence and decisions Screenshot states and drawer transition frames are in `artifacts/phone-chrome/`; these are local, untracked review artifacts. Visual review remains with Claude/orchestrator. The design docs do not define the type for a slot that hosts unrelated Svelte components. `ContextualBar.component` uses `Component<any>` at that heterogeneous boundary; each producer still type-checks its props against its concrete component. I retained the existing drawer gesture and settle behavior because it already met the animated, gesture-driven requirement; this job verifies it in production E2E. No API behavior changed, so the API adversarial probe did not apply. The web test log contains jsdom `Window's scrollTo()` warnings; all 550 tests passed.
Author
Owner

Claude review (sheet-light-theme.png, files-selection-light.png, drawer-open-01.png). Drawer animation and the selection bar replacing the tab bar are right. Fix the sheet header before merge:

  1. BUG: the large page title 'Appearance' overlaps the Settings back pill and the pinned section title 'Theme' (three layers collide at the top). Layout: row 1 = drag handle (sticky); row 2 (sticky, progressive blur under it) = back pill left, the CURRENT section title centred (single line, truncates), the section's link icon right. The large page title is part of the scrolling content: it scrolls up and fades/moves under row 2, it never sits on top of row 2. Before scrolling, row 2 shows the page title ('Appearance'); after a section header passes under row 2, it crossfades to that section ('Theme', 'Background', …).
  2. git merge dev first: this branch predates the Appearance redesign (#183 merged 9cc5ab1b), so the sheet still shows the old Color theme chips.
  3. Add e2e assertions: at three scroll positions, row 2's text equals the expected section and no two text boxes in the header area intersect (bounding-rect check).
    Re-take the sheet screenshots (top, mid, deep scroll; light and dark) and the over-scroll shot.
Claude review (sheet-light-theme.png, files-selection-light.png, drawer-open-01.png). Drawer animation and the selection bar replacing the tab bar are right. Fix the sheet header before merge: 1. BUG: the large page title 'Appearance' overlaps the Settings back pill and the pinned section title 'Theme' (three layers collide at the top). Layout: row 1 = drag handle (sticky); row 2 (sticky, progressive blur under it) = back pill left, the CURRENT section title centred (single line, truncates), the section's link icon right. The large page title is part of the scrolling content: it scrolls up and fades/moves under row 2, it never sits on top of row 2. Before scrolling, row 2 shows the page title ('Appearance'); after a section header passes under row 2, it crossfades to that section ('Theme', 'Background', …). 2. git merge dev first: this branch predates the Appearance redesign (#183 merged 9cc5ab1b), so the sheet still shows the old Color theme chips. 3. Add e2e assertions: at three scroll positions, row 2's text equals the expected section and no two text boxes in the header area intersect (bounding-rect check). Re-take the sheet screenshots (top, mid, deep scroll; light and dark) and the over-scroll shot.
Author
Owner

Starting the #219 continuation on job/phone-chrome at 0db401590da4336fd073e78910b53792cd913b31. The branch merge base is 65265f87ffcc9c44c05e577b4e2ea9c27de130b2; current dev is dfa8e85f1878c24a339a729845c8db9d635555ad, which I am merging first. I will fix the presentation-sheet header to match the latest review, add header intersection E2E assertions at three scroll positions, and retake the requested production screenshots.

Starting the #219 continuation on `job/phone-chrome` at `0db401590da4336fd073e78910b53792cd913b31`. The branch merge base is `65265f87ffcc9c44c05e577b4e2ea9c27de130b2`; current `dev` is `dfa8e85f1878c24a339a729845c8db9d635555ad`, which I am merging first. I will fix the presentation-sheet header to match the latest review, add header intersection E2E assertions at three scroll positions, and retake the requested production screenshots.
Author
Owner

Production reproduction after merging dev: the updated phone E2E loaded /settings/appearance from the production build and rendered the Appearance sticky title, but the row had no .sheet-trailing control. The run failed while waiting for that control (TimeoutError, phone-chrome.mjs:67). Root cause in code: SettingsGroup owns each group URL beside its scrolling heading; OverlaySurface tracks only heading text and has no sticky trailing link slot bound to the active heading. The replacement E2E now checks this row contract and measures intersecting visible text boxes.

Production reproduction after merging `dev`: the updated phone E2E loaded `/settings/appearance` from the production build and rendered the `Appearance` sticky title, but the row had no `.sheet-trailing` control. The run failed while waiting for that control (`TimeoutError`, `phone-chrome.mjs:67`). Root cause in code: `SettingsGroup` owns each group URL beside its scrolling heading; `OverlaySurface` tracks only heading text and has no sticky trailing link slot bound to the active heading. The replacement E2E now checks this row contract and measures intersecting visible text boxes.
Author
Owner

The required dev merge included server/API changes (contracts/openapi.json, Calendar Items, Files media and Notes/collaboration sources). I am running one local tests/adversarial/run.sh round before the final gates. I will report any non-SLOW finding and either fix it or file it; SLOW-only findings will be treated as shared-host load per the prompt.

The required `dev` merge included server/API changes (`contracts/openapi.json`, Calendar Items, Files media and Notes/collaboration sources). I am running one local `tests/adversarial/run.sh` round before the final gates. I will report any non-SLOW finding and either fix it or file it; SLOW-only findings will be treated as shared-host load per the prompt.
Author
Owner

The first adversarial attempt stopped during the server build, before the server or probes started. The shared sccache daemon resolved compiler temp paths into another worktree's missing target/tmp and rustc exited with No such file or directory. I am retrying with RUSTC_WRAPPER empty so rustc uses this worktree's configured TMPDIR.

The first adversarial attempt stopped during the server build, before the server or probes started. The shared `sccache` daemon resolved compiler temp paths into another worktree's missing `target/tmp` and rustc exited with `No such file or directory`. I am retrying with `RUSTC_WRAPPER` empty so rustc uses this worktree's configured `TMPDIR`.
Author
Owner

The full cargo test gate exited 101 in calternal-search/tests/indexer.rs: watcher_indexes_create_modify_rename_and_delete timed out waiting for secondword at line 97 (search did not find users/alice/Notes/draft.md for "secondword"). The test polls for five seconds. I reran only that exact test with cargo test -p calternal-search --test indexer watcher_indexes_create_modify_rename_and_delete -- --exact --nocapture; it passed (1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out) in 10.48 seconds. Several worktrees were running full cargo tests concurrently. This points to a scheduling-sensitive test timeout; the full-workspace gate result remains failed, and no search code was changed in this job.

The full `cargo test` gate exited 101 in `calternal-search/tests/indexer.rs`: `watcher_indexes_create_modify_rename_and_delete` timed out waiting for `secondword` at line 97 (`search did not find users/alice/Notes/draft.md for "secondword"`). The test polls for five seconds. I reran only that exact test with `cargo test -p calternal-search --test indexer watcher_indexes_create_modify_rename_and_delete -- --exact --nocapture`; it passed (`1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out`) in 10.48 seconds. Several worktrees were running full cargo tests concurrently. This points to a scheduling-sensitive test timeout; the full-workspace gate result remains failed, and no search code was changed in this job.
Author
Owner

phone-chrome complete

Implemented the sticky phone sheet header: the handle remains in its own row; the second row holds the back pill, centered active section title, and active section Copy link action; the large title scrolls and fades below that row. Section titles crossfade, reduced-motion mode skips animation, and Settings sections expose stable deep links. The production E2E checks header identity and text-box intersections at four scroll positions in light and dark themes.

Files changed:

  • packages/ui/src/components/OverlaySurface.svelte
  • apps/web/src/routes/settings/[...path]/+page.svelte
  • apps/web/src/routes/settings/parts/SettingsGroup.svelte
  • apps/web/e2e/phone-chrome.mjs
  • apps/web/src/lib/components/OverlaySurface.svelte.test.ts

Commits: 4aec7af0 merged dev before the fix; e5d0b872 implemented the header. Head: e5d0b872086ccc0c4510afe228bb0cc7e56d6d68.

Screenshots are in artifacts/phone-chrome/: sheet-light-top.png, sheet-light-mid.png, sheet-light-deep.png, sheet-light-top-overscroll.png, and matching dark top/mid/deep images. The same run also saved Files-selection and drawer screenshots.

Gates

cargo fmt --check exited 0 with no output.

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

Finished `dev` profile [unoptimized + debuginfo] target(s) in 12m 29s

The full cargo test gate exited 101 on a search watcher test timeout:

search did not find users/alice/Notes/draft.md for "secondword"
test result: FAILED. 13 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 19.18s
error: test failed, to rerun pass `-p calternal-search --test indexer`

The exact isolated rerun passed:

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 13 filtered out; finished in 10.48s

bun run check:

svelte-check found 0 errors and 0 warnings

bun run test:

Test Files  80 passed (80)
      Tests  583 passed (583)

Production E2E passed Files mode-tray replacement/restoration and phone drawer edge-swipe open/close. It filtered only the expected missing Daily-note 404; the Inter preload warnings remain. The adversarial round ended with its two editor findings, recovery-key stale-session 403, bookmark capture timeouts, oversized analytics request reset, and proxy Slowloris observations recorded on existing issues #225, #226, #227, #222, #166, and #228. Round-two restart passed with zero findings. Remaining latency marks were SLOW; thumbnail generation did not finish in the 10-second media probe window, so that header check was skipped.

Decisions

The design describes the header behavior but not the component API. I used a typed sheetTrailing(title, href) snippet and data-sheet-href metadata so the active section can provide its own stable Copy link action. During the required dev merge, the contextual bar kept its route behavior while adopting the new variantless TabBar API.

cargo clean completed and the generated apps/web/build and apps/web/.svelte-kit directories were removed. No push was made.

## phone-chrome complete Implemented the sticky phone sheet header: the handle remains in its own row; the second row holds the back pill, centered active section title, and active section Copy link action; the large title scrolls and fades below that row. Section titles crossfade, reduced-motion mode skips animation, and Settings sections expose stable deep links. The production E2E checks header identity and text-box intersections at four scroll positions in light and dark themes. Files changed: - `packages/ui/src/components/OverlaySurface.svelte` - `apps/web/src/routes/settings/[...path]/+page.svelte` - `apps/web/src/routes/settings/parts/SettingsGroup.svelte` - `apps/web/e2e/phone-chrome.mjs` - `apps/web/src/lib/components/OverlaySurface.svelte.test.ts` Commits: `4aec7af0` merged `dev` before the fix; `e5d0b872` implemented the header. Head: `e5d0b872086ccc0c4510afe228bb0cc7e56d6d68`. Screenshots are in `artifacts/phone-chrome/`: `sheet-light-top.png`, `sheet-light-mid.png`, `sheet-light-deep.png`, `sheet-light-top-overscroll.png`, and matching dark top/mid/deep images. The same run also saved Files-selection and drawer screenshots. ## Gates `cargo fmt --check` exited 0 with no output. `cargo clippy --all-targets -- -D warnings` exited 0: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 12m 29s ``` The full `cargo test` gate exited 101 on a search watcher test timeout: ```text search did not find users/alice/Notes/draft.md for "secondword" test result: FAILED. 13 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 19.18s error: test failed, to rerun pass `-p calternal-search --test indexer` ``` The exact isolated rerun passed: ```text test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 13 filtered out; finished in 10.48s ``` `bun run check`: ```text svelte-check found 0 errors and 0 warnings ``` `bun run test`: ```text Test Files 80 passed (80) Tests 583 passed (583) ``` Production E2E passed Files mode-tray replacement/restoration and phone drawer edge-swipe open/close. It filtered only the expected missing Daily-note 404; the Inter preload warnings remain. The adversarial round ended with its two editor findings, recovery-key stale-session 403, bookmark capture timeouts, oversized analytics request reset, and proxy Slowloris observations recorded on existing issues #225, #226, #227, #222, #166, and #228. Round-two restart passed with zero findings. Remaining latency marks were `SLOW`; thumbnail generation did not finish in the 10-second media probe window, so that header check was skipped. ## Decisions The design describes the header behavior but not the component API. I used a typed `sheetTrailing(title, href)` snippet and `data-sheet-href` metadata so the active section can provide its own stable Copy link action. During the required `dev` merge, the contextual bar kept its route behavior while adopting the new variantless TabBar API. `cargo clean` completed and the generated `apps/web/build` and `apps/web/.svelte-kit` directories were removed. No push was made.
Author
Owner

Starting screenshot fixes on branch job/phone-chrome, based at dfa8e85f1878c24a339a729845c8db9d635555ad (merge-base with dev). I am tracing the shared OverlaySurface sheet and Settings heading behavior before editing.

Starting screenshot fixes on branch `job/phone-chrome`, based at `dfa8e85f1878c24a339a729845c8db9d635555ad` (merge-base with `dev`). I am tracing the shared `OverlaySurface` sheet and Settings heading behavior before editing.
Author
Owner

Starting #219 continuation on branch job/phone-chrome, HEAD e5d0b872086ccc0c4510afe228bb0cc7e56d6d68, based on dev at dfa8e85f1878c24a339a729845c8db9d635555ad (merge-base). I read CLAUDE.md, CONTEXT.md, docs/DESIGN.md §§34–35, and the issue history. I will replace the Settings back pill with a shared, same-size breadcrumb trail that collapses long paths, reuse the ModeHeader progressive-blur stack, preserve the heading-crossing and header Copy link behavior, and retake the production screenshots at 390px in light and dark, including Files and a Note header for comparison. I will merge dev before final gates and commit the finished change.

Starting #219 continuation on branch `job/phone-chrome`, HEAD `e5d0b872086ccc0c4510afe228bb0cc7e56d6d68`, based on `dev` at `dfa8e85f1878c24a339a729845c8db9d635555ad` (merge-base). I read `CLAUDE.md`, `CONTEXT.md`, `docs/DESIGN.md` §§34–35, and the issue history. I will replace the Settings back pill with a shared, same-size breadcrumb trail that collapses long paths, reuse the ModeHeader progressive-blur stack, preserve the heading-crossing and header Copy link behavior, and retake the production screenshots at 390px in light and dark, including Files and a Note header for comparison. I will merge `dev` before final gates and commit the finished change.
Author
Owner

Paused by orchestrator: owner rejected breadcrumbs for the sheet header (wants a large back chevron + H1). Relaunch after the grill round.

Paused by orchestrator: owner rejected breadcrumbs for the sheet header (wants a large back chevron + H1). Relaunch after the grill round.
Author
Owner

Starting work on job/phone-chrome from base e5d0b87208. I read CLAUDE.md, CONTEXT.md, and the relevant DESIGN sections. The worktree has only untracked artifacts/phone-chrome screenshots; I am preserving them. I will merge dev before editing, as requested.

Starting work on job/phone-chrome from base e5d0b872086ccc0c4510afe228bb0cc7e56d6d68. I read CLAUDE.md, CONTEXT.md, and the relevant DESIGN sections. The worktree has only untracked artifacts/phone-chrome screenshots; I am preserving them. I will merge dev before editing, as requested.
Author
Owner

Merged dev into job/phone-chrome at 4b4873d56d. Resolved the Settings route and SettingsGroup conflicts by keeping the phone sheet heading metadata and adopting LinkedHeading for inline desktop copy links and touch double-tap copy. Focused check:

Test Files 1 passed (1)
Tests 2 passed (2)

Merged dev into job/phone-chrome at 4b4873d56dc2c4ef3525134474b1a3348b64ff9e. Resolved the Settings route and SettingsGroup conflicts by keeping the phone sheet heading metadata and adopting LinkedHeading for inline desktop copy links and touch double-tap copy. Focused check: Test Files 1 passed (1) Tests 2 passed (2)
Author
Owner

Finding: the requested Photos album screenshot has no real page to capture yet. Photos currently supports /photos timeline/filter/date routes and /p/<item-id>; PhotosSidebar.svelte says albums come when the API has them, and apps/web/src/lib/photos/api.ts has no album API. DESIGN §33 also says albums are not built. I will keep this phone-chrome job on real data and report the album screenshot as a gap rather than add mock data or an unrequested album API.

Finding: the requested Photos album screenshot has no real page to capture yet. Photos currently supports `/photos` timeline/filter/date routes and `/p/<item-id>`; `PhotosSidebar.svelte` says albums come when the API has them, and `apps/web/src/lib/photos/api.ts` has no album API. DESIGN §33 also says albums are not built. I will keep this phone-chrome job on real data and report the album screenshot as a gap rather than add mock data or an unrequested album API.
Author
Owner

#219 complete

Branch: job/phone-chrome (pushed to origin). Head: b84fec87aaaf1a692628d373dc94b167451e8e9d.

Implemented the phone nested-page Back/H1 chrome, Settings large-title and active-section behavior, shared progressive blur, and desktop/phone Back sizing. Files keeps desktop breadcrumbs; Photos uses its existing date route. Production screenshots are in artifacts/phone-chrome/.

Known gap: Photos Albums are not implemented in the current API or routes. I captured the available Photos date view and did not invent album data or UI.

Decisions: the design does not define a Photos album view while its API is absent, so this job leaves that view unbuilt. Photos page headings reuse the existing shared Photos date-label helpers.

Final gates:

  • cargo fmt --check: exit 0; no output.
  • cargo clippy --all-targets -- -D warnings:
        Finished `dev` profile [unoptimized + debuginfo] target(s) in 7m 37s
    
  • cargo test: exit 0; final output:
    Doc-tests calternal_tags
    
    running 0 tests
    
    test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    
  • bun run check:
    svelte-check found 0 errors and 0 warnings
    
  • bun run test:
     Test Files  82 passed (82)
          Tests  591 passed (591)
       Start at  16:48:41
       Duration  70.33s (transform 66%, import 15%, environment 11%, tests 6%, setup 2%)
    

Production E2E output: PHONE CHROME E2E PASSED; screenshots in /home/kayg/Developer/calternal-wt/phone-chrome/artifacts/phone-chrome.

#219 complete Branch: `job/phone-chrome` (pushed to `origin`). Head: `b84fec87aaaf1a692628d373dc94b167451e8e9d`. Implemented the phone nested-page Back/H1 chrome, Settings large-title and active-section behavior, shared progressive blur, and desktop/phone Back sizing. Files keeps desktop breadcrumbs; Photos uses its existing date route. Production screenshots are in `artifacts/phone-chrome/`. Known gap: Photos Albums are not implemented in the current API or routes. I captured the available Photos date view and did not invent album data or UI. Decisions: the design does not define a Photos album view while its API is absent, so this job leaves that view unbuilt. Photos page headings reuse the existing shared Photos date-label helpers. Final gates: - `cargo fmt --check`: exit 0; no output. - `cargo clippy --all-targets -- -D warnings`: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 7m 37s ``` - `cargo test`: exit 0; final output: ``` Doc-tests calternal_tags running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` - `bun run check`: ``` svelte-check found 0 errors and 0 warnings ``` - `bun run test`: ``` Test Files 82 passed (82) Tests 591 passed (591) Start at 16:48:41 Duration 70.33s (transform 66%, import 15%, environment 11%, tests 6%, setup 2%) ``` Production E2E output: `PHONE CHROME E2E PASSED; screenshots in /home/kayg/Developer/calternal-wt/phone-chrome/artifacts/phone-chrome`.
Author
Owner

Starting #219 in job/phone-chrome at b84fec87aaaf1a692628d373dc94b167451e8e9d (merge-base with dev: 74d6072643e59cf8668a0cbd9e02b3e36b79736e). I am reproducing the header blur, section-title threshold, and stray dot reports in the production-build e2e before changing the sheet structure.

Starting #219 in `job/phone-chrome` at `b84fec87aaaf1a692628d373dc94b167451e8e9d` (merge-base with `dev`: `74d6072643e59cf8668a0cbd9e02b3e36b79736e`). I am reproducing the header blur, section-title threshold, and stray dot reports in the production-build e2e before changing the sheet structure.
Author
Owner

Production-build e2e reproduction on the current head found three concrete issues. The raw high-contrast probe Laplacian variance fell from 9945.9 to 1829.6 (18.4%) in light and 9945.9 to 1824.0 (18.3%) in dark, but this was tint attenuation: scrim.css disables the progressive layers, so the pixel check needs contrast normalization to distinguish blur from tint. At the reported CSS point (20, 327.5), the DOM hit is the duplicate .detail-header Back PillGroup, rendered as an 8×8 px white circle below the sticky Back control. The Controls heading also clamps at 174 px below the header when the test requests +1 px, which confirms the bottom-of-scroll title shortcut hides the real crossing threshold.

Production-build e2e reproduction on the current head found three concrete issues. The raw high-contrast probe Laplacian variance fell from 9945.9 to 1829.6 (18.4%) in light and 9945.9 to 1824.0 (18.3%) in dark, but this was tint attenuation: `scrim.css` disables the progressive layers, so the pixel check needs contrast normalization to distinguish blur from tint. At the reported CSS point (20, 327.5), the DOM hit is the duplicate `.detail-header` Back `PillGroup`, rendered as an 8×8 px white circle below the sticky Back control. The Controls heading also clamps at 174 px below the header when the test requests +1 px, which confirms the bottom-of-scroll title shortcut hides the real crossing threshold.
Author
Owner

Final web-gate finding: the first bun run test run reported Test Files 2 failed | 80 passed (82) and Tests 2 failed | 589 passed (591). The failures were stale assertions after the intended sheet-layer change: one expected the five blur layers inside .sheet-chrome, and one expected the scrim filter selector to exempt only .glass-chart-readout. The production browser run had already passed its pixel, title-threshold, dot, and drawer checks. I updated both test contracts; the focused rerun reported Test Files 2 passed (2) and Tests 13 passed (13).

Final web-gate finding: the first `bun run test` run reported `Test Files 2 failed | 80 passed (82)` and `Tests 2 failed | 589 passed (591)`. The failures were stale assertions after the intended sheet-layer change: one expected the five blur layers inside `.sheet-chrome`, and one expected the scrim filter selector to exempt only `.glass-chart-readout`. The production browser run had already passed its pixel, title-threshold, dot, and drawer checks. I updated both test contracts; the focused rerun reported `Test Files 2 passed (2)` and `Tests 13 passed (13)`.
Author
Owner

Owner (2026-09-27): 'focus on code reuse please'. The nested-backdrop-root blur bug is ONE root cause across #219 (sheet header), #239 (toasts) and #246 (menus). #246 owns the single shared fix: move apps/web/src/lib/actions/portal.ts into packages/ui, build it into the shared surfaces (OverlaySurface, PopoverSurface, FloatingSurface, menu/, toaster) so every floating surface renders in one top-level layer outside any backdrop-filter ancestor, and move each sheet/overlay's own glass onto a background layer that is not an ancestor of its content (so ProgressiveBlur and nested menus inside a sheet sample the real content). Remove ad-hoc per-component portal uses. #219 and #239 must NOT build their own workaround; they reuse #246. Merge order: #246 first.

Owner (2026-09-27): 'focus on code reuse please'. The nested-backdrop-root blur bug is ONE root cause across #219 (sheet header), #239 (toasts) and #246 (menus). #246 owns the single shared fix: move apps/web/src/lib/actions/portal.ts into packages/ui, build it into the shared surfaces (OverlaySurface, PopoverSurface, FloatingSurface, menu/, toaster) so every floating surface renders in one top-level layer outside any backdrop-filter ancestor, and move each sheet/overlay's own glass onto a background layer that is not an ancestor of its content (so ProgressiveBlur and nested menus inside a sheet sample the real content). Remove ad-hoc per-component portal uses. #219 and #239 must NOT build their own workaround; they reuse #246. Merge order: #246 first.
Author
Owner

Starting #219 continuation on job/phone-chrome at HEAD 75437d06717c073ed40686dc8184425725c11762; current dev is 200d171ea35e1de53ad56e6c1d7fcef95881f0a3 (branch merge-base: 5af2ff7830ebf36e13e768adeddea015f3c8b23b). I read the repo contract, vocabulary and relevant chrome design sections, plus the latest #219 scope comment. I will preserve the existing shared ProgressiveBlur and sheet structure, finish the heading-crossing threshold, stray dot and nested Back + H1 fixes, and mark the pixel blur assertion expected-fail pending #246. Then I will merge dev once, run the requested final gates, capture production screenshots and report the results.

Starting #219 continuation on `job/phone-chrome` at HEAD `75437d06717c073ed40686dc8184425725c11762`; current `dev` is `200d171ea35e1de53ad56e6c1d7fcef95881f0a3` (branch merge-base: `5af2ff7830ebf36e13e768adeddea015f3c8b23b`). I read the repo contract, vocabulary and relevant chrome design sections, plus the latest #219 scope comment. I will preserve the existing shared `ProgressiveBlur` and sheet structure, finish the heading-crossing threshold, stray dot and nested Back + H1 fixes, and mark the pixel blur assertion expected-fail pending #246. Then I will merge `dev` once, run the requested final gates, capture production screenshots and report the results.
Author
Owner

Finding: the local sheet blur adjustment moved ProgressiveBlur beside .sheet-chrome, but it remained inside the shared .surface.sheet glass surface, so the backdrop-filter root remained. It also exempted .sheet-progressive-blur from the scrim's filter suspension. I removed both local exceptions and kept the existing shared ProgressiveBlur use. The pixel probe is now a strict XFAIL linked to #246; it will report XPASS and require removal of the marker after the shared fix merges. The heading-crossing, stray-dot and nested Back + H1 production assertions remain.

Focused evidence:

Test Files  2 passed (2)
     Tests  13 passed (13)

The changed e2e script passes node --check.

Finding: the local sheet blur adjustment moved `ProgressiveBlur` beside `.sheet-chrome`, but it remained inside the shared `.surface.sheet` glass surface, so the backdrop-filter root remained. It also exempted `.sheet-progressive-blur` from the scrim's filter suspension. I removed both local exceptions and kept the existing shared `ProgressiveBlur` use. The pixel probe is now a strict XFAIL linked to #246; it will report XPASS and require removal of the marker after the shared fix merges. The heading-crossing, stray-dot and nested Back + H1 production assertions remain. Focused evidence: ```text Test Files 2 passed (2) Tests 13 passed (13) ``` The changed e2e script passes `node --check`.
Author
Owner

Merged dev once before final validation. Merge head: 3025699104e0b57ec2275edd5fee00b5374f3d9d; dev was 200d171ea35e1de53ad56e6c1d7fcef95881f0a3. The merge did not conflict in the phone-chrome files. The #246 shared fix is not in this dev head, so the linked pixel blur XFAIL remains active.

Merged `dev` once before final validation. Merge head: `3025699104e0b57ec2275edd5fee00b5374f3d9d`; `dev` was `200d171ea35e1de53ad56e6c1d7fcef95881f0a3`. The merge did not conflict in the phone-chrome files. The #246 shared fix is not in this `dev` head, so the linked pixel blur XFAIL remains active.
Author
Owner

#219 complete

Branch: job/phone-chrome (pushed). Head: a769e5378dd8853608b3e237b93a51a509a96fbe. Merged dev once before the final gates at 200d171ea35e1de53ad56e6c1d7fcef95881f0a3.

Work

  • The sheet header keeps its current title until the next heading crosses the header bottom edge. The production E2E checks −1 px, +1 px, then −1 px in light and dark themes.
  • The stray Settings detail dot remains hidden on phones. Nested Files folders and Photos dates show an H1 and a parent Back action.
  • The sheet continues to use the shared ProgressiveBlur in its existing structure. The pixel probe is a strict expected failure, linked to #246; this branch adds no second blur workaround. The measured normalized Laplacian ratios remain light 1.013 and dark 0.969 against the < 0.3 target.
  • The phone selection E2E now waits for the tray replacement while the long press is active, before touchEnd can dispatch its paired click. The final production run passed.
  • Removed 30 previously tracked review PNGs from Git. The review screenshots below are attached to this issue and remain outside the commit history.

Files

apps/web/e2e/phone-chrome.mjs, apps/web/package.json, apps/web/src/lib/components/OverlaySurface.svelte.test.ts, apps/web/src/lib/components/SelectionBar.svelte.test.ts, apps/web/src/lib/components/TagEditor.svelte, apps/web/src/lib/components/analytics/BklitTooltipMaterial.test.ts, apps/web/src/lib/files/FilesBrowser.svelte, apps/web/src/lib/files/ShareDialog.svelte, apps/web/src/lib/modeHeader.svelte.test.ts, apps/web/src/lib/notifications/InboxPanel.svelte, apps/web/src/lib/photos/PhotosView.svelte, apps/web/src/lib/styles/scrim.css, apps/web/src/lib/test-fixtures/BottomBarFixture.svelte, apps/web/src/lib/themes.test.ts, apps/web/src/lib/tray.svelte.test.ts, apps/web/src/routes/+layout.svelte, apps/web/src/routes/layout.css, apps/web/src/routes/settings/[...path]/+page.svelte, apps/web/src/routes/settings/parts/SettingsGroup.svelte, packages/ui/src/components/ModeHeader.svelte, packages/ui/src/components/OverlaySurface.svelte, packages/ui/src/components/ProgressiveBlur.svelte, packages/ui/src/components/SelectionBar.svelte, packages/ui/src/components/TabBar.svelte, packages/ui/src/components/pageChrome.ts, packages/ui/src/index.ts.

Gates

The following lines are verbatim gate output. cargo fmt --check produced no output and exited 0. cargo clippy --all-targets -- -D warnings and cargo test exited 0.

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 06s
svelte-check found 0 errors and 0 warnings
 Test Files  83 passed (83)
      Tests  595 passed (595)
PHONE CHROME E2E PASSED; screenshots in /home/kayg/Developer/calternal-wt/phone-chrome/artifacts/phone-chrome

The workspace test run ended with this output excerpt:

Doc-tests calternal_tags

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Adversarial round and gaps

One time-boxed tests/adversarial/run.sh round completed. The authorization matrix passed 916 requests, HOSTILE BYTES FINDINGS 0, and the journal race kept 40 creates plus 10 uploads with 46 entries and no create timeouts. It also found 87 SLOW latency observations. Non-SLOW findings were reported on existing issues: editor anchor repair under a paste/Unicode storm (#225), bookmark capture storm (3 HTTP 201, 12 HTTP 429, 1 client timeout; #222), public collab socket left open after 301 empty frames (#223), and transient 502s during the intentional restart probe (#226). The server stayed alive; no new endpoint was added here.

The sheet blur pixel probe remains expected-fail until #246 merges. The E2E diagnostics showed no bad responses; the empty daily note returned its expected 404.

Decisions

  • Keep the sheet structure and shared ProgressiveBlur unchanged until #246 supplies the shared backdrop-root fix.
  • The Photos API has no album surface yet, so the nested date route with an API-uploaded image exercises the same Back + H1 contract.
  • No other product decision outside docs/DESIGN.md was needed.

Production screenshots

Sheet light top
Sheet light middle
Sheet light deep
Sheet dark top
Sheet dark middle
Sheet dark deep
Nested Files light
Nested Files dark
Nested Photos light
Nested Photos dark
Files selection light
Files selection dark
Navigation drawer open

## #219 complete Branch: `job/phone-chrome` (pushed). Head: `a769e5378dd8853608b3e237b93a51a509a96fbe`. Merged `dev` once before the final gates at `200d171ea35e1de53ad56e6c1d7fcef95881f0a3`. ### Work - The sheet header keeps its current title until the next heading crosses the header bottom edge. The production E2E checks −1 px, +1 px, then −1 px in light and dark themes. - The stray Settings detail dot remains hidden on phones. Nested Files folders and Photos dates show an H1 and a parent Back action. - The sheet continues to use the shared `ProgressiveBlur` in its existing structure. The pixel probe is a strict expected failure, linked to [#246](https://git.kayg.org/kayg/calternal/issues/246); this branch adds no second blur workaround. The measured normalized Laplacian ratios remain light `1.013` and dark `0.969` against the `< 0.3` target. - The phone selection E2E now waits for the tray replacement while the long press is active, before `touchEnd` can dispatch its paired click. The final production run passed. - Removed 30 previously tracked review PNGs from Git. The review screenshots below are attached to this issue and remain outside the commit history. ### Files `apps/web/e2e/phone-chrome.mjs`, `apps/web/package.json`, `apps/web/src/lib/components/OverlaySurface.svelte.test.ts`, `apps/web/src/lib/components/SelectionBar.svelte.test.ts`, `apps/web/src/lib/components/TagEditor.svelte`, `apps/web/src/lib/components/analytics/BklitTooltipMaterial.test.ts`, `apps/web/src/lib/files/FilesBrowser.svelte`, `apps/web/src/lib/files/ShareDialog.svelte`, `apps/web/src/lib/modeHeader.svelte.test.ts`, `apps/web/src/lib/notifications/InboxPanel.svelte`, `apps/web/src/lib/photos/PhotosView.svelte`, `apps/web/src/lib/styles/scrim.css`, `apps/web/src/lib/test-fixtures/BottomBarFixture.svelte`, `apps/web/src/lib/themes.test.ts`, `apps/web/src/lib/tray.svelte.test.ts`, `apps/web/src/routes/+layout.svelte`, `apps/web/src/routes/layout.css`, `apps/web/src/routes/settings/[...path]/+page.svelte`, `apps/web/src/routes/settings/parts/SettingsGroup.svelte`, `packages/ui/src/components/ModeHeader.svelte`, `packages/ui/src/components/OverlaySurface.svelte`, `packages/ui/src/components/ProgressiveBlur.svelte`, `packages/ui/src/components/SelectionBar.svelte`, `packages/ui/src/components/TabBar.svelte`, `packages/ui/src/components/pageChrome.ts`, `packages/ui/src/index.ts`. ### Gates The following lines are verbatim gate output. `cargo fmt --check` produced no output and exited 0. `cargo clippy --all-targets -- -D warnings` and `cargo test` exited 0. ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 06s svelte-check found 0 errors and 0 warnings Test Files 83 passed (83) Tests 595 passed (595) PHONE CHROME E2E PASSED; screenshots in /home/kayg/Developer/calternal-wt/phone-chrome/artifacts/phone-chrome ``` The workspace test run ended with this output excerpt: ```text Doc-tests calternal_tags running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` ### Adversarial round and gaps One time-boxed `tests/adversarial/run.sh` round completed. The authorization matrix passed 916 requests, `HOSTILE BYTES FINDINGS 0`, and the journal race kept 40 creates plus 10 uploads with 46 entries and no create timeouts. It also found 87 SLOW latency observations. Non-SLOW findings were reported on existing issues: editor anchor repair under a paste/Unicode storm (#225), bookmark capture storm (3 HTTP 201, 12 HTTP 429, 1 client timeout; #222), public collab socket left open after 301 empty frames (#223), and transient 502s during the intentional restart probe (#226). The server stayed alive; no new endpoint was added here. The sheet blur pixel probe remains expected-fail until #246 merges. The E2E diagnostics showed no bad responses; the empty daily note returned its expected 404. ### Decisions - Keep the sheet structure and shared `ProgressiveBlur` unchanged until #246 supplies the shared backdrop-root fix. - The Photos API has no album surface yet, so the nested date route with an API-uploaded image exercises the same Back + H1 contract. - No other product decision outside `docs/DESIGN.md` was needed. ### Production screenshots ![Sheet light top](https://git.kayg.org/attachments/f801eca8-e7ce-4b41-8f98-236a249aeee8) ![Sheet light middle](https://git.kayg.org/attachments/010870b1-5764-46d0-8588-913dd0d0cbe7) ![Sheet light deep](https://git.kayg.org/attachments/8f5e6a31-f910-4f51-a708-e7acd52627d1) ![Sheet dark top](https://git.kayg.org/attachments/feeb3c87-ea39-4036-8bad-62b14fe652e1) ![Sheet dark middle](https://git.kayg.org/attachments/86019bb1-57c4-4d64-ae68-8afb6665f00b) ![Sheet dark deep](https://git.kayg.org/attachments/afc48f8d-21f3-476a-a648-a06895e60808) ![Nested Files light](https://git.kayg.org/attachments/be6c9267-3637-4575-95f7-7c4c48ec4347) ![Nested Files dark](https://git.kayg.org/attachments/ce2f129a-b568-4fbe-9e66-500c38cadf92) ![Nested Photos light](https://git.kayg.org/attachments/28b376a0-fdbd-4cea-b40e-527716dd7daf) ![Nested Photos dark](https://git.kayg.org/attachments/c9519281-0f17-4aba-8109-18e77be0a321) ![Files selection light](https://git.kayg.org/attachments/d837983a-2582-40fb-be48-5f083792ae9c) ![Files selection dark](https://git.kayg.org/attachments/3c9c02ae-6d65-49db-b466-ae21538be5a2) ![Navigation drawer open](https://git.kayg.org/attachments/25c990b4-8311-4a9d-953a-f3d633c78782)
kayg referenced this issue from a commit 2026-09-27 18:45:22 +00:00
Author
Owner

Merged in d231efe9 (PhotosView conflict resolved keeping both the menu icon and the date-page title; svelte-check 0/0, web tests 600/600). Sheet blur still XFAIL until #246.

Merged in d231efe9 (PhotosView conflict resolved keeping both the menu icon and the date-page title; svelte-check 0/0, web tests 600/600). Sheet blur still XFAIL until #246.
kayg closed this issue 2026-09-27 18:48:38 +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#219
No description provided.