POLISH: Calendar now pill drops AM/PM (formatToParts); one heavier sidebar row weight token #287

Closed
opened 2026-09-28 06:12:29 +00:00 by kayg · 15 comments
Owner

Owner feedback (2026-09-28, screenshots of calternal.cloud).

1. Calendar now pill: no AM/PM suffix

The Day/Week now pill shows 11:33a. Owner: "it shouldn't [show] am because the indicators above it and below it already say AM or PM." The hour labels on the grid already carry the period. The pill must show the hour and minute only (11:33 in a 12-hour cycle, 11:33 in a 24-hour cycle, keep the padded hour rule of timeOptions).

  • Owner: formatCompactClockTime in packages/ui/src/time.ts (used by TimeGrid.svelte .now-label). Remove the period in a locale-safe way: use formatToParts and drop the dayPeriod part and the literal spacing next to it. Do not use a regex on the formatted string, because it fails for locales that put the period first (ko, zh, ja: 오전 11:33).
  • Tests: add cases for en-US 12h, en-GB 24h, ko-KR, zh-CN, and the 12_hour and 24_hour preferences.
  • Context for the report: "System" follows the browser's language locale. Browsers do not expose the macOS 24-hour clock toggle, so an en-US browser gives a 12-hour clock. The Settings time-format preference (12-hour / 24-hour / System) is the supported override. Do not add OS detection hacks.

2. Sidebar label weight: a bit heavier, one token

Owner: "The font weight for the sidebar font needs to be increased a bit. code reuse please!" The Files sidebar rows (Files / Shared / Recent / Trash) and the empty-state text look too thin in Google Sans.

  • Add ONE token (--sidebar-row-weight, e.g. 500 where it is 400 now; pick from real screenshots) in packages/ui/src/tokens.css. Every sidebar row in every mode (Files, Notes, Photos, Calendar, Settings, Admin, Analytics) reads it through the shared sidebar row component (SidebarLinks, FloatingSidebar rows, and any other shared row). Delete per-mode font-weight overrides for sidebar rows. The selected row stays heavier than the rest (keep the current difference, e.g. 600 vs 500).
  • Check that the font setting in Settings → Appearance → Text still applies and that a variable-weight font renders the weight (Google Sans Flex / static weights: load the weight if it is missing; no faux bold).

Evidence

Crops at 2× zoom, before and after, light and dark themes, desktop and phone: a Calendar week with the now pill, and the sidebars of Files, Notes, Settings. Check icon/text vertical alignment in the crops.

Owner feedback (2026-09-28, screenshots of calternal.cloud). ## 1. Calendar now pill: no AM/PM suffix The Day/Week now pill shows `11:33a`. Owner: "it shouldn't [show] am because the indicators above it and below it already say AM or PM." The hour labels on the grid already carry the period. The pill must show the hour and minute only (`11:33` in a 12-hour cycle, `11:33` in a 24-hour cycle, keep the padded hour rule of `timeOptions`). - Owner: `formatCompactClockTime` in `packages/ui/src/time.ts` (used by `TimeGrid.svelte` `.now-label`). Remove the period in a locale-safe way: use `formatToParts` and drop the `dayPeriod` part and the literal spacing next to it. Do not use a regex on the formatted string, because it fails for locales that put the period first (ko, zh, ja: `오전 11:33`). - Tests: add cases for en-US 12h, en-GB 24h, ko-KR, zh-CN, and the 12_hour and 24_hour preferences. - Context for the report: "System" follows the browser's language locale. Browsers do not expose the macOS 24-hour clock toggle, so an en-US browser gives a 12-hour clock. The Settings time-format preference (12-hour / 24-hour / System) is the supported override. Do not add OS detection hacks. ## 2. Sidebar label weight: a bit heavier, one token Owner: "The font weight for the sidebar font needs to be increased a bit. code reuse please!" The Files sidebar rows (Files / Shared / Recent / Trash) and the empty-state text look too thin in Google Sans. - Add ONE token (`--sidebar-row-weight`, e.g. 500 where it is 400 now; pick from real screenshots) in `packages/ui/src/tokens.css`. Every sidebar row in every mode (Files, Notes, Photos, Calendar, Settings, Admin, Analytics) reads it through the shared sidebar row component (`SidebarLinks`, `FloatingSidebar` rows, and any other shared row). Delete per-mode font-weight overrides for sidebar rows. The selected row stays heavier than the rest (keep the current difference, e.g. 600 vs 500). - Check that the font setting in Settings → Appearance → Text still applies and that a variable-weight font renders the weight (Google Sans Flex / static weights: load the weight if it is missing; no faux bold). ## Evidence Crops at 2× zoom, before and after, light and dark themes, desktop and phone: a Calendar week with the now pill, and the sidebars of Files, Notes, Settings. Check icon/text vertical alignment in the crops.
Author
Owner

Starting #287 on job/polish, based on dev at 8778fd00a6d390085d1672fe6ca1915c449aea60. I have read the issue and the required repo docs. I’ll handle the locale-safe compact clock output and the shared sidebar row weight, with focused regression tests and screenshot evidence.

Starting #287 on `job/polish`, based on `dev` at `8778fd00a6d390085d1672fe6ca1915c449aea60`. I have read the issue and the required repo docs. I’ll handle the locale-safe compact clock output and the shared sidebar row weight, with focused regression tests and screenshot evidence.
Author
Owner

Finding for #287: formatCompactClockTime reduced only English suffixes, so the pill showed 11:33a; Korean and Chinese prefix periods were also left in place. Regression tests failed before the change (2:05p vs 2:05, 11:33a vs 11:33) and pass after using Intl.DateTimeFormat.formatToParts to omit dayPeriod and its adjacent literal. bun run test -- src/lib/time.test.ts: 18 passed.

Finding for #287: `formatCompactClockTime` reduced only English suffixes, so the pill showed `11:33a`; Korean and Chinese prefix periods were also left in place. Regression tests failed before the change (`2:05p` vs `2:05`, `11:33a` vs `11:33`) and pass after using `Intl.DateTimeFormat.formatToParts` to omit `dayPeriod` and its adjacent literal. `bun run test -- src/lib/time.test.ts`: 18 passed.
Author
Owner

Finding for #287: sidebar rows had inconsistent weights. The shared links inherited the normal 400 weight, Notes and saved searches also inherited it, and FloatingSidebar used a separate 500 rule without a heavier selected row. Added one --sidebar-row-weight: 500 token for all sidebar rows and empty text; selected navigation rows derive 600 from that token. The focused sidebar contract test failed before the change and now passes (2 tests).

Finding for #287: sidebar rows had inconsistent weights. The shared links inherited the normal 400 weight, Notes and saved searches also inherited it, and FloatingSidebar used a separate 500 rule without a heavier selected row. Added one `--sidebar-row-weight: 500` token for all sidebar rows and empty text; selected navigation rows derive 600 from that token. The focused sidebar contract test failed before the change and now passes (2 tests).
Author
Owner

Follow-up from the mobile surface audit: Settings' phone master list uses its own .row style, outside FloatingSidebar, and still inherited the default weight. I routed that row through --sidebar-row-weight and added it to the shared sidebar contract test. The new assertion failed before the change and passes now; the selected desktop Settings row still uses the shared +100 rule.

Follow-up from the mobile surface audit: Settings' phone master list uses its own `.row` style, outside `FloatingSidebar`, and still inherited the default weight. I routed that row through `--sidebar-row-weight` and added it to the shared sidebar contract test. The new assertion failed before the change and passes now; the selected desktop Settings row still uses the shared +100 rule.
Author
Owner

Owner follow-up (2026-09-28, screenshots of Photos on calternal.cloud), scope amended:
3. The default UI font weight is too thin everywhere, not only in the sidebar. Owner: 'the default ui font weight needs to be a bit more. text looks too thin otherwise.' Examples: the Photos empty-state body text, the menu row 'Copy link to Photos', the sidebar. Add ONE base UI weight token (e.g. --ui-weight, applied to body/UI text through the type scale). The sidebar row token (--sidebar-row-weight) derives from it, and the other weights (medium, semibold, headings) stay one step above it. Google Sans Flex is variable (wght axis), so try 450 first and then 500, and choose from real screenshots in both themes (dark text on light and light text on dark render differently; dark mode may need the heavier value). Load the weights you need; no faux bold. Check that the user's font choice in Settings → Appearance → Text still works; for a static font, round to the nearest weight it ships.
4. A menu opened with the pointer must not show a highlighted row. Screenshot: the Photos ⋯ menu with a single item, 'Copy link to Photos', opens with that row painted in the accent colour, so it looks hovered or selected even though the pointer is not on it. The shared menu (packages/ui/src/components/menu) sets its one .active row on open. Rule: open with the keyboard (Enter/Space/↓ on the trigger, a shortcut) → the first row is active (the focus indicator, keep it for a11y); open with the pointer (click, tap, right-click) → no row is active until the pointer hovers a row or an arrow key is pressed. Focus still moves into the menu for screen readers (aria-activedescendant or roving focus stays correct). Fix it once in the shared menu so every menu, context menu and select gets it. Add a unit test for both open paths.

Owner follow-up (2026-09-28, screenshots of Photos on calternal.cloud), scope amended: 3. **The default UI font weight is too thin everywhere, not only in the sidebar.** Owner: 'the default ui font weight needs to be a bit more. text looks too thin otherwise.' Examples: the Photos empty-state body text, the menu row 'Copy link to Photos', the sidebar. Add ONE base UI weight token (e.g. `--ui-weight`, applied to body/UI text through the type scale). The sidebar row token (`--sidebar-row-weight`) derives from it, and the other weights (medium, semibold, headings) stay one step above it. Google Sans Flex is variable (wght axis), so try 450 first and then 500, and choose from real screenshots in both themes (dark text on light and light text on dark render differently; dark mode may need the heavier value). Load the weights you need; no faux bold. Check that the user's font choice in Settings → Appearance → Text still works; for a static font, round to the nearest weight it ships. 4. **A menu opened with the pointer must not show a highlighted row.** Screenshot: the Photos ⋯ menu with a single item, 'Copy link to Photos', opens with that row painted in the accent colour, so it looks hovered or selected even though the pointer is not on it. The shared menu (`packages/ui/src/components/menu`) sets its one `.active` row on open. Rule: open with the keyboard (Enter/Space/↓ on the trigger, a shortcut) → the first row is active (the focus indicator, keep it for a11y); open with the pointer (click, tap, right-click) → no row is active until the pointer hovers a row or an arrow key is pressed. Focus still moves into the menu for screen readers (aria-activedescendant or roving focus stays correct). Fix it once in the shared menu so every menu, context menu and select gets it. Add a unit test for both open paths.
Author
Owner

Orchestrator weight audit on dev 58818bc3 (the owner asked which weights are used and where they differ). Item 3 now means this.

Facts. The type-scale tokens exist in apps/web/src/calternal-app.css: body 400, label 400, caption 400, tick 400, eyebrow 500, stat 500, title 600. Only about 32 declarations use them. 202 hard-coded font-weight literals in 86 files bypass them, with 13 distinct values: 600 (71), 560 (34), 500 (24), 650 (21), 550 (9), 520 (8), 620 (7), 700 (6), 680 (4), 400 (4), 640 (3), 540 (3), 660/630 (2 each). The worst offenders: NoteEditorSurface and SearchPreview (520–680, six values), search rows, calendar (MiniMonth, MonthGrid, AgendaList, GridColumn, CalendarTitle), PhotosView, FilesBrowser, and Settings +page. Every plain UI text (body, labels, captions, menu rows, empty states) is 400, which looks thin in Google Sans Variable (the shipped axis is 400–700), especially light text on dark.

Fix (one owner, reuse).

  1. A four-step weight scale in the tokens: --weight-regular (UI text: body, label, caption, tick, menu rows, sidebar rows), --weight-medium (eyebrows, stats, selected rows, buttons), --weight-semibold (titles, list-item names, section headings), --weight-bold (H1 / display, rare). Starting values: regular 450, medium 530, semibold 600, bold 680. Dark mode may raise regular to 470 if the screenshots say so (one token override under the dark scheme, never per component).
  2. The existing --type-*-weight tokens map onto the four steps. --sidebar-row-weight from your earlier commit becomes regular (selected: medium).
  3. Replace all 202 literals with the step that matches their role (not the nearest number). Add a lint/unit check that fails on a new numeric font-weight outside tokens.css and the @font-face ranges.
  4. The display font (Bricolage Grotesque, headings) keeps its own heading weights through the same tokens. Check that its axis covers them.
  5. The user's font choice (Settings → Appearance → Text): the steps must work on every font offered; round to the font's available weights.
    Evidence: a before/after crop grid of the same 8 screens (Calendar week, Files list, Notes editor, Search palette + preview, Photos empty state, Settings, a ⋯ menu, the sidebar) in light and dark.
Orchestrator weight audit on dev 58818bc3 (the owner asked which weights are used and where they differ). Item 3 now means this. **Facts.** The type-scale tokens exist in apps/web/src/calternal-app.css: body 400, label 400, caption 400, tick 400, eyebrow 500, stat 500, title 600. Only about 32 declarations use them. **202 hard-coded font-weight literals in 86 files bypass them**, with 13 distinct values: 600 (71), 560 (34), 500 (24), 650 (21), 550 (9), 520 (8), 620 (7), 700 (6), 680 (4), 400 (4), 640 (3), 540 (3), 660/630 (2 each). The worst offenders: NoteEditorSurface and SearchPreview (520–680, six values), search rows, calendar (MiniMonth, MonthGrid, AgendaList, GridColumn, CalendarTitle), PhotosView, FilesBrowser, and Settings +page. Every plain UI text (body, labels, captions, menu rows, empty states) is 400, which looks thin in Google Sans Variable (the shipped axis is 400–700), especially light text on dark. **Fix (one owner, reuse).** 1. A four-step weight scale in the tokens: `--weight-regular` (UI text: body, label, caption, tick, menu rows, sidebar rows), `--weight-medium` (eyebrows, stats, selected rows, buttons), `--weight-semibold` (titles, list-item names, section headings), `--weight-bold` (H1 / display, rare). Starting values: **regular 450, medium 530, semibold 600, bold 680**. Dark mode may raise regular to 470 if the screenshots say so (one token override under the dark scheme, never per component). 2. The existing `--type-*-weight` tokens map onto the four steps. `--sidebar-row-weight` from your earlier commit becomes regular (selected: medium). 3. **Replace all 202 literals** with the step that matches their role (not the nearest number). Add a lint/unit check that fails on a new numeric font-weight outside tokens.css and the @font-face ranges. 4. The display font (Bricolage Grotesque, headings) keeps its own heading weights through the same tokens. Check that its axis covers them. 5. The user's font choice (Settings → Appearance → Text): the steps must work on every font offered; round to the font's available weights. Evidence: a before/after crop grid of the same 8 screens (Calendar week, Files list, Notes editor, Search palette + preview, Photos empty state, Settings, a ⋯ menu, the sidebar) in light and dark.
Author
Owner

Continuing #287 on job/polish at 3e29890fac5c3e75d1099841282245aebda53b62; the current dev head is 58818bc361bf880bdf0b3e13d04d2eb7b43e8cb2. The worktree is clean. I have read all issue comments and the binding repo docs. I will complete the four-step weight scale, migrate the audited numeric font-weight declarations with a guard, and fix pointer-opened menu active-row state with tests. I will attach the requested crop grid and keep screenshots out of git.

Continuing #287 on `job/polish` at `3e29890fac5c3e75d1099841282245aebda53b62`; the current `dev` head is `58818bc361bf880bdf0b3e13d04d2eb7b43e8cb2`. The worktree is clean. I have read all issue comments and the binding repo docs. I will complete the four-step weight scale, migrate the audited numeric `font-weight` declarations with a guard, and fix pointer-opened menu active-row state with tests. I will attach the requested crop grid and keep screenshots out of git.
Author
Owner

Finding for #287 item 4: the pointer-open menu's first row becomes active because FloatingSurface moves focus to that row on open and Menu.svelte marks every focused row active. The new component regression test reproduced the screenshot: after a pointer open, the first row was still .active; focus was already inside the menu. I am changing the active-row signal so initial pointer focus stays accessible without painting a selection, while :focus-visible, pointer hover and keyboard navigation select rows.

Finding for #287 item 4: the pointer-open menu's first row becomes active because `FloatingSurface` moves focus to that row on open and `Menu.svelte` marks every focused row active. The new component regression test reproduced the screenshot: after a pointer open, the first row was still `.active`; focus was already inside the menu. I am changing the active-row signal so initial pointer focus stays accessible without painting a selection, while `:focus-visible`, pointer hover and keyboard navigation select rows.
Author
Owner

The scan of dev at c9ec6aff84a9ec810124a2cfbdd07c189eea1b9c found 202 numeric font-weight declarations across the web, UI and editor source. The known sidebar values include 560 in apps/web/src/lib/styles/sidebar.css:17; apps/web/src/routes/layout.css:248-256 also has 550 and 520 overrides. This job found no separate issue to add; please fold the current counts and sources into the existing weight work as useful.

The scan of dev at `c9ec6aff84a9ec810124a2cfbdd07c189eea1b9c` found 202 numeric `font-weight` declarations across the web, UI and editor source. The known sidebar values include `560` in `apps/web/src/lib/styles/sidebar.css:17`; `apps/web/src/routes/layout.css:248-256` also has `550` and `520` overrides. This job found no separate issue to add; please fold the current counts and sources into the existing weight work as useful.
Author
Owner

Weight audit finding and implementation: this worktree had 200 numeric font-weight declarations remaining across 84 UI source files after the earlier issue slices. I migrated those declarations by their existing weight bands to regular (450), medium (530), semibold (600), and bold (680) tokens; added a guard for numeric declarations and bundled variable font coverage; and updated the shared sidebar scale assertions. Focused verification passed: 4 test files, 11 tests. I will recheck the total after merging dev, which may contain the remaining concurrent changes.

Weight audit finding and implementation: this worktree had 200 numeric `font-weight` declarations remaining across 84 UI source files after the earlier issue slices. I migrated those declarations by their existing weight bands to regular (450), medium (530), semibold (600), and bold (680) tokens; added a guard for numeric declarations and bundled variable font coverage; and updated the shared sidebar scale assertions. Focused verification passed: 4 test files, 11 tests. I will recheck the total after merging `dev`, which may contain the remaining concurrent changes.
Author
Owner

Production comparison grids are attached for the eight requested screens in light and dark themes. They use the same real local API fixtures and 1440 × 960 CSS viewport at 2× device scale.

The menu capture records one active row after the pointer leaves on the baseline and zero on the after build, in both themes. The production capture also selected Inter in Settings, verified the applied font family after reload, and restored Google Sans.

Production comparison grids are attached for the eight requested screens in light and dark themes. They use the same real local API fixtures and 1440 × 960 CSS viewport at 2× device scale. - Baseline: `3e29890fac5c3e75d1099841282245aebda53b62` - After: `6662f323753f3b54200490f7e43762c5efff7163` - [Light crop grid](https://git.kayg.org/attachments/93a2e663-b886-4994-853a-ebbccc6f6663) - [Dark crop grid](https://git.kayg.org/attachments/8280926b-1d0a-4c0c-9b3e-5af4b285a524) The menu capture records one active row after the pointer leaves on the baseline and zero on the after build, in both themes. The production capture also selected Inter in Settings, verified the applied font family after reload, and restored Google Sans.
Author
Owner

Finding during final gates: the first cargo test attempt exited 101 while compiling webauthn-authenticator-rs:

error: error writing dependencies to /home/kayg/Developer/calternal-wt/hunt-20260928/target/tmp/sccacheTynSam/deps.d: No such file or directory (os error 2)

The path belongs to another worktree and was absent when checked. This workspace uses a shared sccache daemon (RUSTC_WRAPPER=sccache, cache at /srv/calternal/cache/sccache), so its temp path did not follow this job's TMPDIR. I will make one retry with the shared compiler wrapper unset and this worktree's target/tmp, then report that result.

Finding during final gates: the first `cargo test` attempt exited 101 while compiling `webauthn-authenticator-rs`: `error: error writing dependencies to `/home/kayg/Developer/calternal-wt/hunt-20260928/target/tmp/sccacheTynSam/deps.d`: No such file or directory (os error 2)` The path belongs to another worktree and was absent when checked. This workspace uses a shared sccache daemon (`RUSTC_WRAPPER=sccache`, cache at `/srv/calternal/cache/sccache`), so its temp path did not follow this job's `TMPDIR`. I will make one retry with the shared compiler wrapper unset and this worktree's `target/tmp`, then report that result.
Author
Owner

The isolated workspace test retry reached test execution and failed one existing load-sensitive performance assertion in calternal-collab:

10,000-block open, first sync and snapshot took 2.889903266s

The test requires under 2 seconds. Its measured phases were parse 1.660s, Yrs 1.000s, block index 64ms, first sync 37ms, snapshot 128ms. The shared host was running multiple other builds and a search stress process. I left the test expectation and code unchanged; per the owner rule this is a slow-only load finding. The full cargo test command exited 101 at this crate, so later workspace test targets did not run.

The isolated workspace test retry reached test execution and failed one existing load-sensitive performance assertion in `calternal-collab`: `10,000-block open, first sync and snapshot took 2.889903266s` The test requires under 2 seconds. Its measured phases were parse 1.660s, Yrs 1.000s, block index 64ms, first sync 37ms, snapshot 128ms. The shared host was running multiple other builds and a search stress process. I left the test expectation and code unchanged; per the owner rule this is a slow-only load finding. The full `cargo test` command exited 101 at this crate, so later workspace test targets did not run.
Author
Owner

Correction to my previous comment: the TimeGrid failure is directly within #287. The issue requires the now pill to omit AM/PM, and formatCompactClockTime correctly returns 8:17. The component test still expected the old 8:17a label. I am updating only that stale expected value; the behavior requirement is explicit in this issue.

Correction to my previous comment: the `TimeGrid` failure is directly within #287. The issue requires the now pill to omit AM/PM, and `formatCompactClockTime` correctly returns `8:17`. The component test still expected the old `8:17a` label. I am updating only that stale expected value; the behavior requirement is explicit in this issue.
Author
Owner

Completed #287 on job/polish.

Built

  • Added the four shared font-weight steps (450 / 530 / 600 / 680), mapped text roles by semantic use, migrated 200 hard-coded font-weight declarations across 84 files, and added a guard against numeric weights outside token definitions and @font-face ranges.
  • Fixed pointer-open menus so focus may remain in the menu without marking a row active until hover or keyboard selection. Keyboard-open menus still activate the first row.
  • Updated the stale Calendar now-pill assertion from 8:17a to 8:17, as #287 requires the compact label to omit AM/PM.
  • Captured the eight requested screens from production builds against a real local API at 2×, in light and dark themes. The light grid and dark grid are attached. Pointer-open menu row count after the pointer leaves: baseline 1; after 0, in both themes. The font-picker capture applied Inter, persisted it through reload, then restored Google Sans.

Key files: packages/ui/src/tokens.css, packages/ui/src/components/menu/Menu.svelte, packages/ui/src/components/calendar/TimeGrid.svelte, apps/web/src/calternal-app.css, apps/web/src/lib/styles/font-weight-token.test.ts, apps/web/src/lib/menu-open-focus.svelte.test.ts, and apps/web/src/lib/calendar/TimeGrid.svelte.test.ts. The weight declaration migration spans 84 source files in apps/web, packages/ui, and packages/editor.

Commits and branch

  • ea508456 — fix pointer-open menu selection.
  • ae57d8e3 — add weight tokens, migrate declarations, and add guard.
  • df91593a — map weight tokens by text role.
  • 6662f323 — merge dev once (merged e3dffb54).
  • 9be3c325e1cf88bb2bc64014896e38a50132beb4 — update the compact now-pill test expectation.

Head: 9be3c325e1cf88bb2bc64014896e38a50132beb4 (pushed to origin/job/polish). Local dev later advanced to c99fc31; I did not make a second merge.

Gates

cargo fmt --check:

EXIT_CODE=0

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

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 8m 55s

EXIT_CODE=0

First cargo test attempt (shared sccache temp path was in another worktree and absent):

error: error writing dependencies to `/home/kayg/Developer/calternal-wt/hunt-20260928/target/tmp/sccacheTynSam/deps.d`: No such file or directory (os error 2)
error: could not compile `webauthn-authenticator-rs` (lib) due to 1 previous error
EXIT_CODE=101

One retry with RUSTC_WRAPPER unset and this worktree's TMPDIR reached tests. The existing 10,000-block collaboration performance assertion exceeded its 2-second limit:

10,000-block collaboration phases: parse=1.660348513s, Yrs=1.000027954s, block-index=64.111576ms, first-sync=37.346388ms (616204 bytes), snapshot=128.068835ms (616199 bytes), total=2.889903266s
test result: FAILED. 12 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.12s
error: test failed, to rerun pass `-p calternal-collab --lib`
EXIT_CODE=101

Per the owner rule, this is a slow-only load finding. The 10,000-block timeout is already tracked by #265. I did not change its expectation. Later workspace test targets did not run after this failure.

bun run check:

svelte-check found 0 errors and 0 warnings
EXIT_CODE=0

bun run test after updating the stale #287 assertion:

 Test Files  110 passed (110)
      Tests  709 passed (709)
   Start at  10:47:14
   Duration  221.14s (transform 58%, environment 16%, import 14%, tests 8%, setup 3%)

EXIT_CODE=0

Decisions and gaps

I followed the issue's explicit role mapping and pointer/keyboard menu behavior. I changed the existing now-pill expectation only because #287 explicitly changes that behavior to omit AM/PM. No other design decision was needed. The workspace cargo test gate remains limited by the recorded slow-only collaboration assertion and the initial shared sccache temp-path error.

Completed #287 on `job/polish`. ## Built - Added the four shared font-weight steps (450 / 530 / 600 / 680), mapped text roles by semantic use, migrated 200 hard-coded `font-weight` declarations across 84 files, and added a guard against numeric weights outside token definitions and `@font-face` ranges. - Fixed pointer-open menus so focus may remain in the menu without marking a row active until hover or keyboard selection. Keyboard-open menus still activate the first row. - Updated the stale Calendar now-pill assertion from `8:17a` to `8:17`, as #287 requires the compact label to omit AM/PM. - Captured the eight requested screens from production builds against a real local API at 2×, in light and dark themes. The [light grid](https://git.kayg.org/attachments/93a2e663-b886-4994-853a-ebbccc6f6663) and [dark grid](https://git.kayg.org/attachments/8280926b-1d0a-4c0c-9b3e-5af4b285a524) are attached. Pointer-open menu row count after the pointer leaves: baseline 1; after 0, in both themes. The font-picker capture applied Inter, persisted it through reload, then restored Google Sans. Key files: `packages/ui/src/tokens.css`, `packages/ui/src/components/menu/Menu.svelte`, `packages/ui/src/components/calendar/TimeGrid.svelte`, `apps/web/src/calternal-app.css`, `apps/web/src/lib/styles/font-weight-token.test.ts`, `apps/web/src/lib/menu-open-focus.svelte.test.ts`, and `apps/web/src/lib/calendar/TimeGrid.svelte.test.ts`. The weight declaration migration spans 84 source files in `apps/web`, `packages/ui`, and `packages/editor`. ## Commits and branch - `ea508456` — fix pointer-open menu selection. - `ae57d8e3` — add weight tokens, migrate declarations, and add guard. - `df91593a` — map weight tokens by text role. - `6662f323` — merge `dev` once (merged `e3dffb54`). - `9be3c325e1cf88bb2bc64014896e38a50132beb4` — update the compact now-pill test expectation. Head: `9be3c325e1cf88bb2bc64014896e38a50132beb4` (pushed to `origin/job/polish`). Local `dev` later advanced to `c99fc31`; I did not make a second merge. ## Gates `cargo fmt --check`: ```text EXIT_CODE=0 ``` `cargo clippy --all-targets -- -D warnings`: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 8m 55s EXIT_CODE=0 ``` First `cargo test` attempt (shared sccache temp path was in another worktree and absent): ```text error: error writing dependencies to `/home/kayg/Developer/calternal-wt/hunt-20260928/target/tmp/sccacheTynSam/deps.d`: No such file or directory (os error 2) error: could not compile `webauthn-authenticator-rs` (lib) due to 1 previous error EXIT_CODE=101 ``` One retry with `RUSTC_WRAPPER` unset and this worktree's `TMPDIR` reached tests. The existing 10,000-block collaboration performance assertion exceeded its 2-second limit: ```text 10,000-block collaboration phases: parse=1.660348513s, Yrs=1.000027954s, block-index=64.111576ms, first-sync=37.346388ms (616204 bytes), snapshot=128.068835ms (616199 bytes), total=2.889903266s test result: FAILED. 12 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.12s error: test failed, to rerun pass `-p calternal-collab --lib` EXIT_CODE=101 ``` Per the owner rule, this is a slow-only load finding. The 10,000-block timeout is already tracked by #265. I did not change its expectation. Later workspace test targets did not run after this failure. `bun run check`: ```text svelte-check found 0 errors and 0 warnings EXIT_CODE=0 ``` `bun run test` after updating the stale #287 assertion: ```text Test Files 110 passed (110) Tests 709 passed (709) Start at 10:47:14 Duration 221.14s (transform 58%, environment 16%, import 14%, tests 8%, setup 3%) EXIT_CODE=0 ``` ## Decisions and gaps I followed the issue's explicit role mapping and pointer/keyboard menu behavior. I changed the existing now-pill expectation only because #287 explicitly changes that behavior to omit AM/PM. No other design decision was needed. The workspace `cargo test` gate remains limited by the recorded slow-only collaboration assertion and the initial shared sccache temp-path error.
kayg closed this issue 2026-09-28 09:04:19 +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#287
No description provided.