Calendar header: centred view segmented control (Agenda/Day/Week/Month/Year); remove the Today pager #1112

Open
opened 2026-10-05 07:36:52 +00:00 by kayg · 20 comments
Owner

Owner decision (2026-10-05)

The Calendar view switcher moves from the sidebar to the top centre of the Calendar header as a segmented control: Agenda, Day, Week, Month, Year (macOS-style segmented control in our glass style; the selected segment uses the shared spring morph). Remove the "‹ Today ›" pager from the header: there are other ways to navigate (swipe, arrow keys, the mini month in the sidebar, the T shortcut for Today, the date title menu). Keep a keyboard path for Today (T) and for previous/next (arrow keys / ⌘[ ⌘]). The sidebar keeps the mini month, calendars, tags and saved searches but no longer lists the views. Phone: the segmented control sits in the header too (compact labels if needed). Update DESIGN §34 (this is an owner-approved exception to "sub-views live in the sidebar" for Calendar views) and the deep links stay the same.

## Owner decision (2026-10-05) The Calendar view switcher moves from the sidebar to the **top centre of the Calendar header** as a segmented control: Agenda, Day, Week, Month, Year (macOS-style segmented control in our glass style; the selected segment uses the shared spring morph). Remove the "‹ Today ›" pager from the header: there are other ways to navigate (swipe, arrow keys, the mini month in the sidebar, the T shortcut for Today, the date title menu). Keep a keyboard path for Today (T) and for previous/next (arrow keys / ⌘[ ⌘]). The sidebar keeps the mini month, calendars, tags and saved searches but no longer lists the views. Phone: the segmented control sits in the header too (compact labels if needed). Update DESIGN §34 (this is an owner-approved exception to "sub-views live in the sidebar" for Calendar views) and the deep links stay the same.
Author
Owner

Starting #1112 on job/calhdr-1112, based on dev at 27644444a9. I am checking the existing Calendar header, sidebar view links, shared segmented control, keyboard navigation and deep-link behavior before editing.

Starting #1112 on job/calhdr-1112, based on dev at 27644444a91dad244073113b0ec8ec7a61f2a212. I am checking the existing Calendar header, sidebar view links, shared segmented control, keyboard navigation and deep-link behavior before editing.
Author
Owner

Finding: the existing Calendar route already preserves its view and date in /calendar// and copies links from those values; the old view rows come from app-sidebar.svelte, and CalendarTools.svelte supplies the ‹ Today › pager. The shortcut registry currently binds J/K/T. I will keep the URL grammar, move the controls to the shared header, and add the owner-requested arrow and Cmd/Ctrl-bracket date navigation while retaining J/K.

Finding: the existing Calendar route already preserves its view and date in /calendar/<view>/<date> and copies links from those values; the old view rows come from app-sidebar.svelte, and CalendarTools.svelte supplies the ‹ Today › pager. The shortcut registry currently binds J/K/T. I will keep the URL grammar, move the controls to the shared header, and add the owner-requested arrow and Cmd/Ctrl-bracket date navigation while retaining J/K.
Author
Owner

Finding: after dependencies were linked from the frozen lockfile, the web check found 12 stale performance exception pins for the Calendar sidebar view-list loop that this change removed. I removed those exact pins and recalculated the performance ratchet; the removed view list no longer carries render or surface-contract debt.

Finding: after dependencies were linked from the frozen lockfile, the web check found 12 stale performance exception pins for the Calendar sidebar view-list loop that this change removed. I removed those exact pins and recalculated the performance ratchet; the removed view list no longer carries render or surface-contract debt.
Author
Owner

Correction to my prior finding: the 12 pins are for the Calendar sidebar Tag tree loop, not the view rows. The view rows were generated by a script-side map. The view-list edit leaves the Tag tree loops in place; I checked the source diff and the current parsed loops. I am retaining those existing limits and updating their syntax hashes for the current parser so the guard can validate the unchanged Tag surfaces.

Correction to my prior finding: the 12 pins are for the Calendar sidebar Tag tree loop, not the view rows. The view rows were generated by a script-side map. The view-list edit leaves the Tag tree loops in place; I checked the source diff and the current parsed loops. I am retaining those existing limits and updating their syntax hashes for the current parser so the guard can validate the unchanged Tag surfaces.
Author
Owner

Performance guard finding: bun run check stopped in perf-lint --check at apps/web/src/lib/notes/NotesExplorer.svelte#each:3c7baf2164751d7e:1 because its exception hash is 0d95a3dd…, while the parsed list hash is 4b742bac…. That source is unchanged from origin/dev; I am checking whether the merged ledger needs a count-preserving pin refresh before rerunning the gate.

Performance guard finding: `bun run check` stopped in `perf-lint --check` at `apps/web/src/lib/notes/NotesExplorer.svelte#each:3c7baf2164751d7e:1` because its exception hash is `0d95a3dd…`, while the parsed list hash is `4b742bac…`. That source is unchanged from `origin/dev`; I am checking whether the merged ledger needs a count-preserving pin refresh before rerunning the gate.
Author
Owner

Follow-up to the performance guard finding: inspection of the merged origin/dev tree found 299 stale but still live syntax pins across six existing Svelte/CSS files (ItemPreview, AgendaList, SearchPreview, Settings, tokens.css, and NotesExplorer). It also found one removed ItemPreview list still registered, with 12 unused exceptions. I am refreshing the exact live hashes, removing that stale surface and its 12 unused exceptions, and lowering the matching ratchet counts. This is guard metadata only; it does not change runtime behavior.

Follow-up to the performance guard finding: inspection of the merged `origin/dev` tree found 299 stale but still live syntax pins across six existing Svelte/CSS files (`ItemPreview`, `AgendaList`, `SearchPreview`, Settings, `tokens.css`, and NotesExplorer). It also found one removed ItemPreview list still registered, with 12 unused exceptions. I am refreshing the exact live hashes, removing that stale surface and its 12 unused exceptions, and lowering the matching ratchet counts. This is guard metadata only; it does not change runtime behavior.
Author
Owner

The full performance parser audit found four unwaived findings in untouched origin/dev sources: coverage.surfaces for packages/ui/src/components/calendar/ItemPreview.svelte#each:e5e7ae29d145f79e:1, and io.unresolved-call for by_day:by_day:1f9fccd2cec4b519 (out.push), by_day:calendar_task_day_view:c04706b76c0be3bd (TaskStatus::Todo.as_word().into), and by_day:calendar_task_day_view:be042d92271a211d (TaskStatus::Todo.as_word) in crates/plugins/notes/src/tasks_api.rs. The perf guard also reports 99 stale exception identities (mostly the same Notes task function); the current bun run check stops earlier at stale money_import_preview:mutation. I am keeping this job limited to #1112 behavior and will report the gate limitation.

The full performance parser audit found four unwaived findings in untouched origin/dev sources: `coverage.surfaces` for `packages/ui/src/components/calendar/ItemPreview.svelte#each:e5e7ae29d145f79e:1`, and `io.unresolved-call` for `by_day:by_day:1f9fccd2cec4b519` (`out.push`), `by_day:calendar_task_day_view:c04706b76c0be3bd` (`TaskStatus::Todo.as_word().into`), and `by_day:calendar_task_day_view:be042d92271a211d` (`TaskStatus::Todo.as_word`) in `crates/plugins/notes/src/tasks_api.rs`. The perf guard also reports 99 stale exception identities (mostly the same Notes task function); the current `bun run check` stops earlier at stale `money_import_preview:mutation`. I am keeping this job limited to #1112 behavior and will report the gate limitation.
Author
Owner

Resuming #1112 in branch job/calhdr-1112. The issue implementation is already committed at c837e687a; I preserved the pre-existing generated performance-ledger edits and owner reference image, then merged origin/dev at 570e084c8691a76b9bec904f47151f4ff5701298 (merge commit 90a59425f3cb667be1266f7896f03f3d956d7c45). I am now reviewing the full change, restoring the prior verification state, and running the requested focused gates and production-build screenshots.

Resuming #1112 in branch `job/calhdr-1112`. The issue implementation is already committed at `c837e687a`; I preserved the pre-existing generated performance-ledger edits and owner reference image, then merged `origin/dev` at `570e084c8691a76b9bec904f47151f4ff5701298` (merge commit `90a59425f3cb667be1266f7896f03f3d956d7c45`). I am now reviewing the full change, restoring the prior verification state, and running the requested focused gates and production-build screenshots.
Author
Owner

Finding from the first resumed web gate: TMPDIR=$PWD/target/tmp bun run check stops in scripts/perf-lint --check with unused or changed exception for render.bound at apps/web/src/lib/components/app-sidebar.svelte#each:10a1aaf3137a2426:1. The live source is the Calendar Tags tree loop (node.children at line 631); the retained performance exception has a hash that does not match the merged tree. I am refreshing the exact current fingerprint before one focused gate rerun.

Finding from the first resumed web gate: `TMPDIR=$PWD/target/tmp bun run check` stops in `scripts/perf-lint --check` with `unused or changed exception` for `render.bound` at `apps/web/src/lib/components/app-sidebar.svelte#each:10a1aaf3137a2426:1`. The live source is the Calendar Tags tree loop (`node.children` at line 631); the retained performance exception has a hash that does not match the merged tree. I am refreshing the exact current fingerprint before one focused gate rerun.
Author
Owner

The stale-pin finding is fixed and committed as 63499e816. I refreshed 26 hashes for the two live Calendar sidebar loops and style findings, then compared all 115 updated browser pins against the current Svelte parser (115 updated, 0 mismatches). This changes only performance-ledger fingerprints; it does not change runtime behavior.

The stale-pin finding is fixed and committed as `63499e816`. I refreshed 26 hashes for the two live Calendar sidebar loops and style findings, then compared all 115 updated browser pins against the current Svelte parser (`115` updated, `0` mismatches). This changes only performance-ledger fingerprints; it does not change runtime behavior.
Author
Owner

After refreshing the #1112-related sidebar pins, the second TMPDIR=$PWD/target/tmp bun run check advanced through source parsing and stopped at scripts/perf-lint --check with unused or changed exception for apps/web/src/lib/composer/Composer.svelte#each:1d43d0513f6b6c37:1. This is outside the Calendar files changed by #1112. I am keeping this job scoped to the Calendar header and will report the gate limitation after running its focused checks.

After refreshing the #1112-related sidebar pins, the second `TMPDIR=$PWD/target/tmp bun run check` advanced through source parsing and stopped at `scripts/perf-lint --check` with `unused or changed exception` for `apps/web/src/lib/composer/Composer.svelte#each:1d43d0513f6b6c37:1`. This is outside the Calendar files changed by #1112. I am keeping this job scoped to the Calendar header and will report the gate limitation after running its focused checks.
Author
Owner

The focused command bunx vitest run src/lib/modeHeader.svelte.test.ts src/lib/shortcuts/registry.test.ts --maxWorkers=2 ran 33 tests and failed only keeps changeable app-surface bindings clear of sourced browser and OS shortcuts: 14 reported conflicts are calendar.next/ArrowRight and calendar.previous/ArrowLeft on the browser platforms. #1112 explicitly requires those route-scoped date keys. I will update the registry audit to allow only that pair, while retaining a zero-conflict assertion for every other key.

The focused command `bunx vitest run src/lib/modeHeader.svelte.test.ts src/lib/shortcuts/registry.test.ts --maxWorkers=2` ran 33 tests and failed only `keeps changeable app-surface bindings clear of sourced browser and OS shortcuts`: 14 reported conflicts are `calendar.next`/`ArrowRight` and `calendar.previous`/`ArrowLeft` on the browser platforms. #1112 explicitly requires those route-scoped date keys. I will update the registry audit to allow only that pair, while retaining a zero-conflict assertion for every other key.
Author
Owner

Real-server E2E found that SegmentedControl overwrote each radio option's tooltip-provided aria-keyshortcuts with undefined. Preserved the radio shortcut and added a regression in tray.svelte.test.ts; focused Vitest now passes (3 files, 59 tests). Rebuilding production output before the next E2E attempt.

Real-server E2E found that SegmentedControl overwrote each radio option's tooltip-provided aria-keyshortcuts with undefined. Preserved the radio shortcut and added a regression in tray.svelte.test.ts; focused Vitest now passes (3 files, 59 tests). Rebuilding production output before the next E2E attempt.
Author
Owner

The header E2E passed the shortcut assertions and captured the 390 px screenshots. The combined script then timed out after 30 seconds waiting for its #384 CalDAV overlap fixtures at 820 px; the report had no rendered Event blocks. This appears outside #1112, and I am checking the production build/server pairing before the focused header matrix.

The header E2E passed the shortcut assertions and captured the 390 px screenshots. The combined script then timed out after 30 seconds waiting for its #384 CalDAV overlap fixtures at 820 px; the report had no rendered Event blocks. This appears outside #1112, and I am checking the production build/server pairing before the focused header matrix.
Author
Owner

Rebuilding the local server against the new production frontend removed the stale 'Update available' banner from screenshots. It did not change the separate #384 failure: the CalDAV overlap Event blocks remain absent at 820 px after the 30-second wait. I am isolating the #1112 screenshot and keyboard E2E while leaving the combined default proof unchanged.

Rebuilding the local server against the new production frontend removed the stale 'Update available' banner from screenshots. It did not change the separate #384 failure: the CalDAV overlap Event blocks remain absent at 820 px after the 30-second wait. I am isolating the #1112 screenshot and keyboard E2E while leaving the combined default proof unchanged.
Author
Owner

Header-only E2E captured all 12 responsive Calendar screenshots and both tooltip close-ups. Its final keyboard assertion timed out because the test programmatically focused an unchecked Day radio while Month stayed selected; the shared radio control correctly advanced from the selected Month radio to Year. I am correcting the test to focus Month and use Left to select Week.

Header-only E2E captured all 12 responsive Calendar screenshots and both tooltip close-ups. Its final keyboard assertion timed out because the test programmatically focused an unchecked Day radio while Month stayed selected; the shared radio control correctly advanced from the selected Month radio to Year. I am correcting the test to focus Month and use Left to select Week.
Author
Owner

Finished — READY FOR MERGE: no

Built

  • Moved Agenda, Day, Week, Month and Year into the shared centred Calendar Top row control. The control keeps the same routes and selected dates, shows compact phone labels, and scrolls horizontally when needed.
  • Removed the Calendar view rows from the sidebar. Kept the mini month, Calendars, Tags and saved searches.
  • Removed the Today pager. T jumps to today; arrows, Cmd/Ctrl brackets and the existing J/K aliases navigate date periods when a focused control does not own the keys.
  • Preserved radio option aria-keyshortcuts from the shared warm tooltip. The regression test checks the value announced to assistive technology.
  • Added the responsive header E2E mode. The default combined E2E still runs its separate #384 Calendar overlap proof unchanged.

Files

  • Calendar route: apps/web/src/routes/calendar/[view]/[date]/+page.svelte.
  • Shared UI: packages/ui/src/components/ModeHeader.svelte, SegmentedControl.svelte, pageChrome.ts, calendar/CalendarTools.svelte, calendar/model.ts.
  • Sidebar and shortcuts: apps/web/src/lib/components/app-sidebar.svelte, SidebarLinks.svelte, apps/web/src/lib/shortcuts/registry.ts.
  • Tests: apps/web/e2e/calendar-view-switcher.mjs, apps/web/src/lib/modeHeader.svelte.test.ts, registry.test.ts, tray.svelte.test.ts.
  • Design and performance records: docs/DESIGN.md, bench/header-path-menu-526.mjs, contracts/perf/exceptions.json.

Production screenshots

Captured from the production web build. Playwright reports MacIntel and macOS through both platform surfaces for macOS shortcut rendering. The screenshots cover 390, 820 and 1440 px, both sidebar states, and light and dark themes.

Viewport and sidebar Light Dark
Phone — 390 px, sidebar open Light Dark
Phone — 390 px, sidebar closed Light Dark
Tablet — 820 px, sidebar open Light Dark
Tablet — 820 px, sidebar closed Light Dark
Desktop — 1440 px, sidebar open Light Dark
Desktop — 1440 px, sidebar closed Light Dark

Tooltip close-ups: light · dark.

Head

096831da3b01541801fcce5985f61a2d77d5c634

Commits: 63499e816 refreshes stale performance pins after the dev merge; 902b5ad15 records the owner-approved Calendar arrow conflicts; 430f0fa3c preserves segmented shortcut metadata; b2bbc528e adds the isolated header review matrix; 096831da3 fixes optional tooltip attribute typing. No push, deploy or merge was done.

Gate output (verbatim)

bun run check exited 2 at the unrelated, untouched Composer.svelte exception:

$ ../../scripts/perf-lint --check && node scripts/check-user-storage.mjs && node scripts/check-glass-tokens.mjs && node scripts/check-type-tokens.mjs && node scripts/check-focus-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
perf-lint: parse Rust product sources
perf-lint: parse browser product sources
perf-lint: validate coverage and architecture
perf-lint: INVALID: ('render.bound', 'apps/web/src/lib/composer/Composer.svelte', 'apps/web/src/lib/composer/Composer.svelte#each:1d43d0513f6b6c37:1'): unused or changed exception

Focused Vitest command: bunx vitest run src/lib/tray.svelte.test.ts src/lib/modeHeader.svelte.test.ts src/lib/shortcuts/registry.test.ts --maxWorkers=2:

RUN  v5.0.1 /home/kayg/Developer/calternal-wt/calhdr-1112/apps/web
Not implemented: navigation to another Document
Test Files  3 passed (3)
     Tests  59 passed (59)
  Start at  13:09:17
  Duration  8.00s (transform 56%, environment 18%, tests 15%, setup 5%, import 5%)

bun run svelte-check --tsconfig ./tsconfig.json:

Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/calhdr-1112/apps/web
Getting Svelte diagnostics...

/home/kayg/Developer/calternal-wt/calhdr-1112/apps/web/../../packages/ui/src/components/calendar/AttachmentDeck.svelte:1063:3
Warn: Do not use empty rulesets (css)
  }
  .attachment-row:focus {

/home/kayg/Developer/calternal-wt/calhdr-1112/apps/web/../../packages/ui/src/components/calendar/AgendaList.svelte:1274:3
Warn: Do not use empty rulesets (css)
  }
  .line:focus {

/home/kayg/Developer/calternal-wt/calhdr-1112/apps/web/src/routes/notes/+page.svelte:165:2
Warn: Unused CSS selector ".note-page-lede"
https://svelte.dev/e/css_unused_selector (svelte)
	:global(.note-page-card) { display: grid; gap: 0.75rem; }
	.note-page-lede { margin: 0; color: var(--ink-muted); font-size: var(--text-small); }
	.note-state { margin: 0; color: var(--ink-muted); font-size: var(--text-small); }

/home/kayg/Developer/calternal-wt/calhdr-1112/apps/web/src/routes/notes/+page.svelte:166:2
Warn: Unused CSS selector ".note-state"
https://svelte.dev/e/css_unused_selector (svelte)
	.note-page-lede { margin: 0; color: var(--ink-muted); font-size: var(--text-small); }
	.note-state { margin: 0; color: var(--ink-muted); font-size: var(--text-small); }
	.load-more { justify-self: center; min-height: 2.6rem; border: 0; border-radius: var(--radius-pill); background: var(--paper-2); padding: 0 1rem; color: var(--ink); cursor: pointer; font: inherit; font-size: var(--text-small); }

====================================
svelte-check found 0 errors and 4 warnings in 3 files

The production build ended with:

Compressed 877 static variants; saved 20845733 bytes.

Focused production E2E command: CAL_SWITCHER_HEADER_ONLY=1 bun e2e/calendar-view-switcher.mjs:

PASS Calendar view switcher matrix: 3 widths × 2 sidebar states × 2 themes; screenshots in /home/kayg/Developer/calternal-wt/calhdr-1112/artifacts/calhdr-1112

The default combined E2E still fails in its #384 provider overlap check. Verbatim failure excerpt:

TimeoutError: waitFor: Timeout 30000ms exceeded.
Call log:
  - waiting for locator('.col[data-date] .block.plan[aria-label*="Follow-up overlap"]').first() to be visible

The attached screenshot matrix includes the final captures. The #384 failure report contained "blocks":[] at 820 px, so the seeded CalDAV overlap Events did not reach the Calendar DOM. Rebuilding the local server removed a stale “Update available” banner but did not change that separate fixture failure.

Support server build output:

Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/calhdr-1112/crates/calternal-server)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 45s

No Rust source changed, so Rust format, Clippy and test gates were not run. Cargo cleanup output:

Removed 8626 files, 7.2GiB total

Known gaps

  • The full web check is blocked by the stale performance exception in untouched apps/web/src/lib/composer/Composer.svelte (Composer.svelte#each:1d43d0513f6b6c37:1).
  • The default combined Calendar E2E is blocked by the separate #384 CalDAV fixture not rendering provider Events at 820 px. The #1112-specific production E2E passes.
  • The new bench/header-path-menu-526.mjs profile was not measured. Current verification policy reserves perf measurement for perf issues on the perf VM.
  • There are no known remaining #1112 product UX gaps. The four Svelte warnings are in untouched Calendar and Notes files.

UX gaps closed

Pointer and keyboard view selection work through the shared radio control; the group and every radio have full accessible names, checked state and shortcut metadata. The E2E verifies dates, Today, Cmd/Ctrl brackets, radio arrows, accessible labels, tooltips and the removed sidebar view rows. The phone offers the shared horizontal scroll for all five choices.

UX gaps left

The combined #384 populated-Calendar proof needs its CalDAV fixture issue resolved before the default E2E can pass. The #1112 screenshots show the real empty Calendar state; no sample rows are shipped.

Decisions

  • The issue owner’s #1112 decision overrides the earlier §34 Calendar sidebar/pager layout. Phone labels are Ag, Day, Wk, Mo and Yr, with up to three visible and the selected choice kept in the shared horizontal scroll window.
  • Kept the exported CalendarTools component for package API compatibility; the Calendar route no longer mounts the date pager.
  • Kept J/K as aliases while adding the owner-requested arrows and Cmd/Ctrl brackets.

For the merge round

  • In apps/web, run bun run test with the merge-round worker cap; this covers the complete Vitest and perf-source test suite.
  • Run bun e2e/calendar-view-switcher.mjs in its default mode after the production build. It must keep the #1112 regression matrix passing and prove the separate #384 provider overlap fixture is visible.
  • The merge round runs the combined workspace gates. No API route changed in this job.
Finished — **READY FOR MERGE: no** ### Built - Moved Agenda, Day, Week, Month and Year into the shared centred Calendar Top row control. The control keeps the same routes and selected dates, shows compact phone labels, and scrolls horizontally when needed. - Removed the Calendar view rows from the sidebar. Kept the mini month, Calendars, Tags and saved searches. - Removed the Today pager. T jumps to today; arrows, Cmd/Ctrl brackets and the existing J/K aliases navigate date periods when a focused control does not own the keys. - Preserved radio option `aria-keyshortcuts` from the shared warm tooltip. The regression test checks the value announced to assistive technology. - Added the responsive header E2E mode. The default combined E2E still runs its separate #384 Calendar overlap proof unchanged. ### Files - Calendar route: `apps/web/src/routes/calendar/[view]/[date]/+page.svelte`. - Shared UI: `packages/ui/src/components/ModeHeader.svelte`, `SegmentedControl.svelte`, `pageChrome.ts`, `calendar/CalendarTools.svelte`, `calendar/model.ts`. - Sidebar and shortcuts: `apps/web/src/lib/components/app-sidebar.svelte`, `SidebarLinks.svelte`, `apps/web/src/lib/shortcuts/registry.ts`. - Tests: `apps/web/e2e/calendar-view-switcher.mjs`, `apps/web/src/lib/modeHeader.svelte.test.ts`, `registry.test.ts`, `tray.svelte.test.ts`. - Design and performance records: `docs/DESIGN.md`, `bench/header-path-menu-526.mjs`, `contracts/perf/exceptions.json`. ### Production screenshots Captured from the production web build. Playwright reports `MacIntel` and `macOS` through both platform surfaces for macOS shortcut rendering. The screenshots cover 390, 820 and 1440 px, both sidebar states, and light and dark themes. | Viewport and sidebar | Light | Dark | |---|---|---| | Phone — 390 px, sidebar open | [Light](https://git.kayg.org/attachments/5b55fceb-11e0-4725-bab9-d8e7634bdb66) | [Dark](https://git.kayg.org/attachments/64a17d11-a47c-4e4f-bf2a-bad6bcfa1733) | | Phone — 390 px, sidebar closed | [Light](https://git.kayg.org/attachments/eca0ff41-e841-46b3-b10f-01d326ed1c6f) | [Dark](https://git.kayg.org/attachments/93f2c7c5-e52a-4ef9-8655-26addaebb324) | | Tablet — 820 px, sidebar open | [Light](https://git.kayg.org/attachments/5f996224-173b-4a57-9c8a-b910be4764f8) | [Dark](https://git.kayg.org/attachments/7363a69c-2c5a-412a-b4a8-5f4340be0a29) | | Tablet — 820 px, sidebar closed | [Light](https://git.kayg.org/attachments/223359ef-f621-442e-aa98-e09411131c7d) | [Dark](https://git.kayg.org/attachments/87ed3610-8bad-4edf-9707-eb09e94d7722) | | Desktop — 1440 px, sidebar open | [Light](https://git.kayg.org/attachments/9c5c3577-5048-48e3-87d6-ec62f30c2979) | [Dark](https://git.kayg.org/attachments/9917c259-6c21-4ba6-8248-da6e2e582bf5) | | Desktop — 1440 px, sidebar closed | [Light](https://git.kayg.org/attachments/c261c08e-4228-4139-9b5b-c97b4328ac5b) | [Dark](https://git.kayg.org/attachments/ec3ff9af-2816-4714-a1c7-624a319b1c13) | Tooltip close-ups: [light](https://git.kayg.org/attachments/5ba99fb6-70e7-49c2-9084-019d9bf89253) · [dark](https://git.kayg.org/attachments/891a05ea-4d18-4634-8df2-c21f45051346). ### Head `096831da3b01541801fcce5985f61a2d77d5c634` Commits: `63499e816` refreshes stale performance pins after the dev merge; `902b5ad15` records the owner-approved Calendar arrow conflicts; `430f0fa3c` preserves segmented shortcut metadata; `b2bbc528e` adds the isolated header review matrix; `096831da3` fixes optional tooltip attribute typing. No push, deploy or merge was done. ### Gate output (verbatim) `bun run check` exited 2 at the unrelated, untouched `Composer.svelte` exception: ```text $ ../../scripts/perf-lint --check && node scripts/check-user-storage.mjs && node scripts/check-glass-tokens.mjs && node scripts/check-type-tokens.mjs && node scripts/check-focus-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json perf-lint: parse Rust product sources perf-lint: parse browser product sources perf-lint: validate coverage and architecture perf-lint: INVALID: ('render.bound', 'apps/web/src/lib/composer/Composer.svelte', 'apps/web/src/lib/composer/Composer.svelte#each:1d43d0513f6b6c37:1'): unused or changed exception ``` Focused Vitest command: `bunx vitest run src/lib/tray.svelte.test.ts src/lib/modeHeader.svelte.test.ts src/lib/shortcuts/registry.test.ts --maxWorkers=2`: ```text RUN v5.0.1 /home/kayg/Developer/calternal-wt/calhdr-1112/apps/web Not implemented: navigation to another Document Test Files 3 passed (3) Tests 59 passed (59) Start at 13:09:17 Duration 8.00s (transform 56%, environment 18%, tests 15%, setup 5%, import 5%) ``` `bun run svelte-check --tsconfig ./tsconfig.json`: ```text Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/calhdr-1112/apps/web Getting Svelte diagnostics... /home/kayg/Developer/calternal-wt/calhdr-1112/apps/web/../../packages/ui/src/components/calendar/AttachmentDeck.svelte:1063:3 Warn: Do not use empty rulesets (css) } .attachment-row:focus { /home/kayg/Developer/calternal-wt/calhdr-1112/apps/web/../../packages/ui/src/components/calendar/AgendaList.svelte:1274:3 Warn: Do not use empty rulesets (css) } .line:focus { /home/kayg/Developer/calternal-wt/calhdr-1112/apps/web/src/routes/notes/+page.svelte:165:2 Warn: Unused CSS selector ".note-page-lede" https://svelte.dev/e/css_unused_selector (svelte) :global(.note-page-card) { display: grid; gap: 0.75rem; } .note-page-lede { margin: 0; color: var(--ink-muted); font-size: var(--text-small); } .note-state { margin: 0; color: var(--ink-muted); font-size: var(--text-small); } /home/kayg/Developer/calternal-wt/calhdr-1112/apps/web/src/routes/notes/+page.svelte:166:2 Warn: Unused CSS selector ".note-state" https://svelte.dev/e/css_unused_selector (svelte) .note-page-lede { margin: 0; color: var(--ink-muted); font-size: var(--text-small); } .note-state { margin: 0; color: var(--ink-muted); font-size: var(--text-small); } .load-more { justify-self: center; min-height: 2.6rem; border: 0; border-radius: var(--radius-pill); background: var(--paper-2); padding: 0 1rem; color: var(--ink); cursor: pointer; font: inherit; font-size: var(--text-small); } ==================================== svelte-check found 0 errors and 4 warnings in 3 files ``` The production build ended with: ```text Compressed 877 static variants; saved 20845733 bytes. ``` Focused production E2E command: `CAL_SWITCHER_HEADER_ONLY=1 bun e2e/calendar-view-switcher.mjs`: ```text PASS Calendar view switcher matrix: 3 widths × 2 sidebar states × 2 themes; screenshots in /home/kayg/Developer/calternal-wt/calhdr-1112/artifacts/calhdr-1112 ``` The default combined E2E still fails in its #384 provider overlap check. Verbatim failure excerpt: ```text TimeoutError: waitFor: Timeout 30000ms exceeded. Call log: - waiting for locator('.col[data-date] .block.plan[aria-label*="Follow-up overlap"]').first() to be visible ``` The attached screenshot matrix includes the final captures. The #384 failure report contained `"blocks":[]` at 820 px, so the seeded CalDAV overlap Events did not reach the Calendar DOM. Rebuilding the local server removed a stale “Update available” banner but did not change that separate fixture failure. Support server build output: ```text Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/calhdr-1112/crates/calternal-server) Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 45s ``` No Rust source changed, so Rust format, Clippy and test gates were not run. Cargo cleanup output: ```text Removed 8626 files, 7.2GiB total ``` ### Known gaps - The full web check is blocked by the stale performance exception in untouched `apps/web/src/lib/composer/Composer.svelte` (`Composer.svelte#each:1d43d0513f6b6c37:1`). - The default combined Calendar E2E is blocked by the separate #384 CalDAV fixture not rendering provider Events at 820 px. The #1112-specific production E2E passes. - The new `bench/header-path-menu-526.mjs` profile was not measured. Current verification policy reserves perf measurement for perf issues on the perf VM. - There are no known remaining #1112 product UX gaps. The four Svelte warnings are in untouched Calendar and Notes files. ### UX gaps closed Pointer and keyboard view selection work through the shared radio control; the group and every radio have full accessible names, checked state and shortcut metadata. The E2E verifies dates, Today, Cmd/Ctrl brackets, radio arrows, accessible labels, tooltips and the removed sidebar view rows. The phone offers the shared horizontal scroll for all five choices. ### UX gaps left The combined #384 populated-Calendar proof needs its CalDAV fixture issue resolved before the default E2E can pass. The #1112 screenshots show the real empty Calendar state; no sample rows are shipped. ### Decisions - The issue owner’s #1112 decision overrides the earlier §34 Calendar sidebar/pager layout. Phone labels are `Ag`, `Day`, `Wk`, `Mo` and `Yr`, with up to three visible and the selected choice kept in the shared horizontal scroll window. - Kept the exported `CalendarTools` component for package API compatibility; the Calendar route no longer mounts the date pager. - Kept J/K as aliases while adding the owner-requested arrows and Cmd/Ctrl brackets. ### For the merge round - In `apps/web`, run `bun run test` with the merge-round worker cap; this covers the complete Vitest and perf-source test suite. - Run `bun e2e/calendar-view-switcher.mjs` in its default mode after the production build. It must keep the #1112 regression matrix passing and prove the separate #384 provider overlap fixture is visible. - The merge round runs the combined workspace gates. No API route changed in this job.
Author
Owner

Final E2E review found a second test-only issue in the default #384 grid proof: switchGridView() reads without receiving it. It would throw after the provider fixture wait passes. I am passing the loop's viewport width to the helper; no assertion or product behavior changes.

Final E2E review found a second test-only issue in the default #384 grid proof: switchGridView() reads without receiving it. It would throw after the provider fixture wait passes. I am passing the loop's viewport width to the helper; no assertion or product behavior changes.
Author
Owner

Correction: the combined #384 proof helper switchGridView reads the width variable without receiving it. It would throw after the provider fixture wait passes. I am passing the loop-provided viewport width to the helper; no assertion or product behavior changes.

Correction: the combined #384 proof helper switchGridView reads the width variable without receiving it. It would throw after the provider fixture wait passes. I am passing the loop-provided viewport width to the helper; no assertion or product behavior changes.
Author
Owner

Addendum to the final report: HEAD is now ea1569f1a3e11a5b1ebf8189710f81578c006696. This supersedes the previously reported 096831da3b01541801fcce5985f61a2d77d5c634.

Commit ea1569f1a passes the current viewport width into switchGridView() in the combined #384 proof. It does not change a test expectation or product behavior. Syntax check:

node --check e2e/calendar-view-switcher.mjs

Exit code: 0 (no output). The default combined E2E still stops earlier at its missing CalDAV overlap fixture, so it could not exercise this helper. The #1112 header-only production E2E and screenshot matrix are unchanged and still pass. The issue screenshots remain valid for the final product code.

READY FOR MERGE: no, for the bun run check Composer performance pin and combined #384 fixture gaps listed in the report above.

Addendum to the final report: **HEAD is now `ea1569f1a3e11a5b1ebf8189710f81578c006696`**. This supersedes the previously reported `096831da3b01541801fcce5985f61a2d77d5c634`. Commit `ea1569f1a` passes the current viewport width into `switchGridView()` in the combined #384 proof. It does not change a test expectation or product behavior. Syntax check: ```text node --check e2e/calendar-view-switcher.mjs ``` Exit code: `0` (no output). The default combined E2E still stops earlier at its missing CalDAV overlap fixture, so it could not exercise this helper. The #1112 header-only production E2E and screenshot matrix are unchanged and still pass. The issue screenshots remain valid for the final product code. **READY FOR MERGE: no**, for the `bun run check` Composer performance pin and combined #384 fixture gaps listed in the report above.
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#1112
No description provided.