Owner sees a different UI font (Google Sans?) on Calendar hover cards #1150

Open
opened 2026-10-05 15:12:16 +00:00 by kayg · 7 comments
Owner

Owner report (2026-10-05, production, desktop, macOS): "did the UI font rendering change from Google Sans to something else?" … "fonts are still not fixed?"

Screens: Calendar Week event block and its hover card (scratchpad font-hovercard.png). The orchestrator verified: --font-ui is still 'Google Sans Variable', 'Google Sans Fallback', system-ui (apps/web/src/calternal-app.css), production serves /fonts/google-sans-latin-wght-normal.woff2 (200, 70 KB, font/woff2), and no font-family / font-smoothing / variation CSS changed in the last 3 days. The owner still sees a different-looking font, so measure what is actually rendered.

Do (investigation first, then fix)

  1. Build production from origin/dev and from the build of 2026-10-02 (git log --until=2026-10-02T23:59 -1 origin/dev) and run both on the real local server with a seeded User and a timed Journal entry like the owner's. In Chromium AND WebKit (macOS rendering via Playwright WebKit; also on the macOS VM Safari if possible, see memory macos-vm), for: the Week event block text, the hover card label/title/date/time chips/tag, the sidebar rows, the palette rows, a Note body:
    • getComputedStyle: font-family, font-weight, font-size, line-height, letter-spacing, font-optical-sizing, font-variation-settings, -webkit-font-smoothing, font-synthesis.
    • The real platform font used (Chromium CDP CSS.getPlatformFontsForNode), and document.fonts status for Google Sans Variable (loaded? which unicode-range files?).
    • Tabulate old vs new per element; attach side-by-side 4x crops.
  2. Check for: a fallback because a weight/axis outside the woff2's range (e.g. weight 650 vs 400–700), font-synthesis faking bold, the unicode-range split (latin vs latin-ext) missing glyphs, a font-display swap that never swaps in the hover card's top layer/popover (separate document? shadow root?), CSP font-src, or a different --font-ui value set by a theme/Settings font option (Google Sans / Inter / System — check the owner's saved Appearance setting shape).
  3. Report the cause with evidence on this issue. If there is a real regression, fix it at the source with a regression test (e2e that asserts the platform font for these nodes is Google Sans); if nothing differs, post the table and crops and say so plainly.
## Owner report (2026-10-05, production, desktop, macOS): "did the UI font rendering change from Google Sans to something else?" … "fonts are still not fixed?" Screens: Calendar Week event block and its hover card (scratchpad font-hovercard.png). The orchestrator verified: `--font-ui` is still `'Google Sans Variable', 'Google Sans Fallback', system-ui` (apps/web/src/calternal-app.css), production serves /fonts/google-sans-latin-wght-normal.woff2 (200, 70 KB, font/woff2), and no font-family / font-smoothing / variation CSS changed in the last 3 days. The owner still sees a different-looking font, so measure what is actually rendered. ## Do (investigation first, then fix) 1. Build production from origin/dev and from the build of 2026-10-02 (`git log --until=2026-10-02T23:59 -1 origin/dev`) and run both on the real local server with a seeded User and a timed Journal entry like the owner's. In Chromium AND WebKit (macOS rendering via Playwright WebKit; also on the macOS VM Safari if possible, see memory macos-vm), for: the Week event block text, the hover card label/title/date/time chips/tag, the sidebar rows, the palette rows, a Note body: - getComputedStyle: font-family, font-weight, font-size, line-height, letter-spacing, font-optical-sizing, font-variation-settings, -webkit-font-smoothing, font-synthesis. - The real platform font used (Chromium CDP `CSS.getPlatformFontsForNode`), and `document.fonts` status for Google Sans Variable (loaded? which unicode-range files?). - Tabulate old vs new per element; attach side-by-side 4x crops. 2. Check for: a fallback because a weight/axis outside the woff2's range (e.g. weight 650 vs 400–700), `font-synthesis` faking bold, the unicode-range split (latin vs latin-ext) missing glyphs, a font-display swap that never swaps in the hover card's top layer/popover (separate document? shadow root?), CSP font-src, or a different `--font-ui` value set by a theme/Settings font option (Google Sans / Inter / System — check the owner's saved Appearance setting shape). 3. Report the cause with evidence on this issue. If there is a real regression, fix it at the source with a regression test (e2e that asserts the platform font for these nodes is Google Sans); if nothing differs, post the table and crops and say so plainly.
Author
Owner

Cause found (orchestrator, 2026-10-05)

The owner's "font looks different" is a SIZE regression, not a typeface change. Commit 3fe2a4e2b "Improve Calendar card spacing on touch" (#1083, shipped in batch 3) raised Calendar Event text from --text-small to --text-body UNCONDITIONALLY in packages/ui/src/components/calendar/GridColumn.svelte, MonthGrid.svelte and AgendaList.svelte (plus tokens.css insets). The owner's phone report asked for denser, more readable cards on touch; desktop was never meant to change. Owner (desktop): "the fonts look bigger on desktop calendar … gets cut off too and does not reveal the whole event on hover" (scratchpad cal-text-clip.png: a short Event shows "Running to PV" cut through the glyphs at the block's bottom edge).

Do

  1. Restore the pre-3fe2a4e2b sizes for fine pointers (desktop): Week/Day blocks, Month cells, Agenda rows use the compact calendar text tokens again. Keep the #1083 touch improvements only under (pointer: coarse) (or the existing coarse-pointer token layer in tokens.css), so the phone stays as approved. One token pair per role (e.g. --calendar-event-text / --calendar-event-text-coarse), no literals.
  2. No mid-glyph clipping: an Event block shows only whole lines. Short blocks degrade by level of detail: hide time chip → title on one line with ellipsis → title only at reduced leading; never a half-visible line (use line-clamp computed from the block height / LOD levels in GridColumn, not overflow:hidden on arbitrary heights).
  3. Hover reveals the whole Event: on fine pointers, hovering (or keyboard-focusing) a clipped Event block raises it above its neighbours and expands it in place to its full content height with the shared spring (Fantastical-style), in addition to the existing hover card; it collapses on leave. No layout shift of other blocks. Reduced motion: no animation.
  4. The hover card itself keeps its current content; its time range/date fixes belong to #1139 (do not duplicate).

Evidence

Before/after 4x crops at 1440 (desktop, fine pointer) and 390 (touch): Week block, short 15–30 min block, Month cell, Agenda row, light + dark. e2e: computed font-size on fine pointer equals the compact token; no Event block has a text line whose box is partially outside the block (Range rects vs block rect); hover expands a clipped block to its scrollHeight.

## Cause found (orchestrator, 2026-10-05) The owner's "font looks different" is a SIZE regression, not a typeface change. Commit 3fe2a4e2b "Improve Calendar card spacing on touch" (#1083, shipped in batch 3) raised Calendar Event text from `--text-small` to `--text-body` UNCONDITIONALLY in packages/ui/src/components/calendar/GridColumn.svelte, MonthGrid.svelte and AgendaList.svelte (plus tokens.css insets). The owner's phone report asked for denser, more readable cards on touch; desktop was never meant to change. Owner (desktop): "the fonts look bigger on desktop calendar … gets cut off too and does not reveal the whole event on hover" (scratchpad cal-text-clip.png: a short Event shows "Running to PV" cut through the glyphs at the block's bottom edge). ## Do 1. Restore the pre-3fe2a4e2b sizes for fine pointers (desktop): Week/Day blocks, Month cells, Agenda rows use the compact calendar text tokens again. Keep the #1083 touch improvements only under `(pointer: coarse)` (or the existing coarse-pointer token layer in tokens.css), so the phone stays as approved. One token pair per role (e.g. `--calendar-event-text` / `--calendar-event-text-coarse`), no literals. 2. **No mid-glyph clipping:** an Event block shows only whole lines. Short blocks degrade by level of detail: hide time chip → title on one line with ellipsis → title only at reduced leading; never a half-visible line (use line-clamp computed from the block height / LOD levels in GridColumn, not overflow:hidden on arbitrary heights). 3. **Hover reveals the whole Event:** on fine pointers, hovering (or keyboard-focusing) a clipped Event block raises it above its neighbours and expands it in place to its full content height with the shared spring (Fantastical-style), in addition to the existing hover card; it collapses on leave. No layout shift of other blocks. Reduced motion: no animation. 4. The hover card itself keeps its current content; its time range/date fixes belong to #1139 (do not duplicate). ## Evidence Before/after 4x crops at 1440 (desktop, fine pointer) and 390 (touch): Week block, short 15–30 min block, Month cell, Agenda row, light + dark. e2e: computed font-size on fine pointer equals the compact token; no Event block has a text line whose box is partially outside the block (Range rects vs block rect); hover expands a clipped block to its scrollHeight.
Author
Owner

Starting #1150 on branch job/font-1150, based on de654a42ac4f9a6dca83bed8e0eebc99706f7dfe (origin/dev). The current diagnosis is a Calendar text-size regression introduced by #1083; I am checking its source and existing coverage before restoring fine-pointer sizing while preserving coarse-pointer sizing. I will also verify whole-line clipping and in-place expansion, then run the scoped UI gates and attach the requested screenshots.

Starting #1150 on branch `job/font-1150`, based on `de654a42ac4f9a6dca83bed8e0eebc99706f7dfe` (`origin/dev`). The current diagnosis is a Calendar text-size regression introduced by #1083; I am checking its source and existing coverage before restoring fine-pointer sizing while preserving coarse-pointer sizing. I will also verify whole-line clipping and in-place expansion, then run the scoped UI gates and attach the requested screenshots.
Author
Owner

Finding: the required post-merge bun run check stops at perf-lint --check, before the token checks and Svelte diagnostics. The command exits 2 with this output:

perf-lint: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964

No perf-guard files are part of the #1150 change.

Finding: the required post-merge `bun run check` stops at `perf-lint --check`, before the token checks and Svelte diagnostics. The command exits 2 with this output: ```text perf-lint: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964 ``` No perf-guard files are part of the #1150 change.
Author
Owner

Finding: the required user-storage subcheck also fails when run directly. apps/web/src/lib/navigation/clientRouteStatus.svelte.ts matches origin/dev and is not changed by #1150. Exact output:

lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access
lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access
lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access
lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access

check-glass-tokens.mjs, check-type-tokens.mjs, check-focus-tokens.mjs and check-motion-tokens.mjs each exit 0.

Finding: the required user-storage subcheck also fails when run directly. `apps/web/src/lib/navigation/clientRouteStatus.svelte.ts` matches `origin/dev` and is not changed by #1150. Exact output: ```text lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access ``` `check-glass-tokens.mjs`, `check-type-tokens.mjs`, `check-focus-tokens.mjs` and `check-motion-tokens.mjs` each exit 0.
Author
Owner

Finding from the first after-build WebKit e2e: at 390 px in Day view, the 15-minute Event block spans y=615–636.5 while its title Range rectangle spans y=613–634; the 30-minute Event block spans y=639–660.5 while its title Range rectangle spans y=637–658. Each title line starts 2 px above its block. The Range width also exceeds the block because the short title uses white-space: nowrap and ellipsis, so the follow-up check treats horizontal ellipsis separately from vertical line clipping. I am inspecting the title element box and correcting the short-block layout before rerunning the after evidence.

Finding from the first after-build WebKit e2e: at 390 px in Day view, the 15-minute Event block spans y=615–636.5 while its title Range rectangle spans y=613–634; the 30-minute Event block spans y=639–660.5 while its title Range rectangle spans y=637–658. Each title line starts 2 px above its block. The Range width also exceeds the block because the short title uses `white-space: nowrap` and ellipsis, so the follow-up check treats horizontal ellipsis separately from vertical line clipping. I am inspecting the title element box and correcting the short-block layout before rerunning the after evidence.
Author
Owner

Finding: the #1083 e2e previously required positive vertical padding for Month Event rows at every pointer type. The exact pre-#1083 fine-pointer row is height: 21px with padding-block: 0; only the coarse-pointer rule has vertical insets. I updated the assertion to check the 21 px/zero-inset desktop row and positive coarse insets. The production Month subset passes at 390, 820 and 1440 px in both themes.

Finding: the #1083 e2e previously required positive vertical padding for Month Event rows at every pointer type. The exact pre-#1083 fine-pointer row is `height: 21px` with `padding-block: 0`; only the coarse-pointer rule has vertical insets. I updated the assertion to check the 21 px/zero-inset desktop row and positive coarse insets. The production Month subset passes at 390, 820 and 1440 px in both themes.
Author
Owner

Forgejo #1150 complete

Branch: job/font-1150
Head: 0b330e66caf131796bec1d4d9b07e6a45a151bcc

Built

Restored compact Calendar Event text sizes for fine pointers in Day, Week, Month and Agenda. Coarse pointers keep the larger touch text and spacing. Grid Events now show only complete lines at each duration level. Fine-pointer hover and keyboard focus raise a clipped Event and expand it in place; adjacent Events keep their positions, focus remains usable, and reduced motion removes the transition. The existing hover card content was not changed.

Added a production WebKit evidence script and a runnable Event-reveal bench profile. The profile uses 200 real Logs, 100 Photos and 43 provider-backed Events, and records p50/p95 reveal latency, Chromium CPU/RSS, and a 50-reveal burst. The profile was not measured: the 2026-10-02 verification policy allows perf measurements only on the perf VM and only for performance issues; #1150 is a visual issue.

Files

  • packages/ui/src/tokens.css
  • packages/ui/src/components/calendar/GridColumn.svelte
  • packages/ui/src/components/calendar/MonthGrid.svelte
  • packages/ui/src/components/calendar/AgendaList.svelte
  • docs/DESIGN.md
  • apps/web/e2e/cards-1083.mjs
  • apps/web/e2e/calendar-hover-608.mjs
  • apps/web/src/lib/calendar/MonthGrid.svelte.test.ts (added the noteId: null fixture value required by the incoming origin/dev type)
  • bench/calendar-event-reveal-1150.mjs

Evidence and gates

  • Production WebKit evidence passed at 390, 820 and 1440 px in light and dark themes, with macOS platform labels. The complete 4-view matrix passed; after the Month assertion was tightened to the pre-#1083 21px fine-pointer row, the updated Month checks passed at all 3 widths and both themes.

    Exact complete-matrix output:

    PASS #1083/#1150: 4 Calendar views × 3 widths × 2 themes in WebKit with macOS platform labels; crops and LOD checks in /home/kayg/Developer/calternal-wt/font-1150/apps/web/../../artifacts/font-1150/after
    
  • The captures and 4× crops are in ignored worktree paths artifacts/font-1150/before/ and artifacts/font-1150/after/. fj issue comment --help has no attachment option, and the available issue tool only creates comments, so I could not upload them to Forgejo. They are not committed.

  • bun run build passed. Final build output:

    Compressed 885 static variants; saved 20913464 bytes.
    
  • Focused Vitest bunx vitest run src/lib/calendar/MonthGrid.svelte.test.ts --maxWorkers=2 passed. Output:

    Not implemented: Window's scrollTo() method
    Not implemented: Window's scrollTo() method
    
     Test Files  1 passed (1)
          Tests  10 passed (10)
       Start at  18:20:48
       Duration  18.76s (transform 71%, environment 15%, import 6%, tests 5%, setup 4%)
    
      Transform  |component| transforming modules took 12.88s · 71% of tracked time, re-done on every run
                 persist transforms between reruns with fsModuleCache: true
                 learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns
    
  • Direct Svelte check after the fixture correction:

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

    The warnings are in existing unused CSS rules.

  • bun run check stopped at the incoming performance-lint ratchet. Exact output:

    $ ../../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: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964
    
  • The separate direct storage guard reports four existing direct sessionStorage uses in the incoming origin/dev file apps/web/src/lib/navigation/clientRouteStatus.svelte.ts:

    lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access
    lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access
    lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access
    lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access
    
  • node --check apps/web/e2e/calendar-hover-608.mjs bench/calendar-event-reveal-1150.mjs and git diff --check passed with no output.

  • No Rust source changed, so Rust gates were not run. The local server was built for e2e, then cargo clean removed its build output:

         Removed 8633 files, 7.2GiB total
    

    Web build output was also removed. Worktree is clean.

Decisions

  • Fine-pointer Grid and Month Events use the compact Caption role; Agenda uses Small. Coarse pointers use Body. These shared role tokens preserve the approved #1083 touch sizes without changing desktop.
  • “Short” means 30 minutes or less. A 1.25 line-height lets one complete title line fit inside WebKit’s 21px minimum ink box; if no complete line fits, the title stays hidden until reveal.
  • Expanded Events use their full measured content height while their absolute grid placement keeps nearby Events fixed. This follows the hover/focus behavior in #1150 and is documented in DESIGN §34.

UX gaps closed / left

Closed: desktop text density regression; partial-line clipping; inaccessible full titles on compact cards; no reveal path for clipped Events; neighboring Event movement during reveal; reduced-motion behavior. Pointer and keyboard focus reveal the same Event, and coarse-pointer sizing remains intact.

Left: no product UX gaps identified. Orchestrator visual review remains pending; the screenshot set is available in the worktree paths above but could not be attached with the installed Forgejo CLI.

For the merge round

  • cd apps/web && bun run check — rerun after the shared perf-lint ratchet and incoming user-storage guard issues are resolved.
  • cd apps/web && bun run test — prove the full web unit suite passes on the merged branch.
  • cd apps/web && bun run test:e2e — run the full web e2e suite on the merged branch. The focused #1150 WebKit matrix already passed as recorded above.
# Forgejo #1150 complete Branch: `job/font-1150` Head: `0b330e66caf131796bec1d4d9b07e6a45a151bcc` ## Built Restored compact Calendar Event text sizes for fine pointers in Day, Week, Month and Agenda. Coarse pointers keep the larger touch text and spacing. Grid Events now show only complete lines at each duration level. Fine-pointer hover and keyboard focus raise a clipped Event and expand it in place; adjacent Events keep their positions, focus remains usable, and reduced motion removes the transition. The existing hover card content was not changed. Added a production WebKit evidence script and a runnable Event-reveal bench profile. The profile uses 200 real Logs, 100 Photos and 43 provider-backed Events, and records p50/p95 reveal latency, Chromium CPU/RSS, and a 50-reveal burst. The profile was not measured: the 2026-10-02 verification policy allows perf measurements only on the perf VM and only for performance issues; #1150 is a visual issue. ## Files - `packages/ui/src/tokens.css` - `packages/ui/src/components/calendar/GridColumn.svelte` - `packages/ui/src/components/calendar/MonthGrid.svelte` - `packages/ui/src/components/calendar/AgendaList.svelte` - `docs/DESIGN.md` - `apps/web/e2e/cards-1083.mjs` - `apps/web/e2e/calendar-hover-608.mjs` - `apps/web/src/lib/calendar/MonthGrid.svelte.test.ts` (added the `noteId: null` fixture value required by the incoming `origin/dev` type) - `bench/calendar-event-reveal-1150.mjs` ## Evidence and gates - Production WebKit evidence passed at 390, 820 and 1440 px in light and dark themes, with macOS platform labels. The complete 4-view matrix passed; after the Month assertion was tightened to the pre-#1083 21px fine-pointer row, the updated Month checks passed at all 3 widths and both themes. Exact complete-matrix output: ``` PASS #1083/#1150: 4 Calendar views × 3 widths × 2 themes in WebKit with macOS platform labels; crops and LOD checks in /home/kayg/Developer/calternal-wt/font-1150/apps/web/../../artifacts/font-1150/after ``` - The captures and 4× crops are in ignored worktree paths `artifacts/font-1150/before/` and `artifacts/font-1150/after/`. `fj issue comment --help` has no attachment option, and the available issue tool only creates comments, so I could not upload them to Forgejo. They are not committed. - `bun run build` passed. Final build output: ``` Compressed 885 static variants; saved 20913464 bytes. ``` - Focused Vitest `bunx vitest run src/lib/calendar/MonthGrid.svelte.test.ts --maxWorkers=2` passed. Output: ``` Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Test Files 1 passed (1) Tests 10 passed (10) Start at 18:20:48 Duration 18.76s (transform 71%, environment 15%, import 6%, tests 5%, setup 4%) Transform |component| transforming modules took 12.88s · 71% of tracked time, re-done on every run persist transforms between reruns with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns ``` - Direct Svelte check after the fixture correction: ``` svelte-check found 0 errors and 4 warnings in 3 files ``` The warnings are in existing unused CSS rules. - `bun run check` stopped at the incoming performance-lint ratchet. Exact output: ``` $ ../../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: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964 ``` - The separate direct storage guard reports four existing direct `sessionStorage` uses in the incoming `origin/dev` file `apps/web/src/lib/navigation/clientRouteStatus.svelte.ts`: ``` lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access lib/navigation/clientRouteStatus.svelte.ts: direct sessionStorage access ``` - `node --check apps/web/e2e/calendar-hover-608.mjs bench/calendar-event-reveal-1150.mjs` and `git diff --check` passed with no output. - No Rust source changed, so Rust gates were not run. The local server was built for e2e, then `cargo clean` removed its build output: ``` Removed 8633 files, 7.2GiB total ``` Web build output was also removed. Worktree is clean. ## Decisions - Fine-pointer Grid and Month Events use the compact Caption role; Agenda uses Small. Coarse pointers use Body. These shared role tokens preserve the approved #1083 touch sizes without changing desktop. - “Short” means 30 minutes or less. A 1.25 line-height lets one complete title line fit inside WebKit’s 21px minimum ink box; if no complete line fits, the title stays hidden until reveal. - Expanded Events use their full measured content height while their absolute grid placement keeps nearby Events fixed. This follows the hover/focus behavior in #1150 and is documented in DESIGN §34. ## UX gaps closed / left Closed: desktop text density regression; partial-line clipping; inaccessible full titles on compact cards; no reveal path for clipped Events; neighboring Event movement during reveal; reduced-motion behavior. Pointer and keyboard focus reveal the same Event, and coarse-pointer sizing remains intact. Left: no product UX gaps identified. Orchestrator visual review remains pending; the screenshot set is available in the worktree paths above but could not be attached with the installed Forgejo CLI. ## For the merge round - `cd apps/web && bun run check` — rerun after the shared perf-lint ratchet and incoming user-storage guard issues are resolved. - `cd apps/web && bun run test` — prove the full web unit suite passes on the merged branch. - `cd apps/web && bun run test:e2e` — run the full web e2e suite on the merged branch. The focused #1150 WebKit matrix already passed as recorded 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#1150
No description provided.