Skip to content

feat(ui): mark & ledger chrome, learning-time & dictionary, sticky fo… - #101

Merged
alvachien merged 3 commits into
mainfrom
chroe/keepimprv-3
Nov 12, 2026
Merged

alvachien merged 3 commits into
mainfrom
chroe/keepimprv-3

Conversation

@alvachien

Copy link
Copy Markdown
Owner

…oter shell

  • footer promoted to persistent app-shell chrome: one under the router-outlet, flex-pinned to the viewport bottom (margin-top:auto + flex-shrink:0 in app-root's 100vh column - no position:fixed, so no hardcoded clearance); compact <=884px tier keeps the pinned band slim on phones; per-page removed from the 8 page templates that carried it
  • Mark & Ledger work wave (pre-existing tree, committed together as files overlap): UserLearningTimeService heartbeat + leaderboard, WordDictionaryService review lookups, /help compiled bilingual guide, NAV_ICON single source, vocabulary autoplay options dialog, habits/homepage/toolbar refinements, single azure theme (4-palette switcher removed), page title "K.H.B., by Alva Chien", version 1.9.52 -> 1.9.64 (released 2026-11-08)
  • delete orphaned quit-confirm dialog template + its quitConfirm* i18n keys; bind habit-list header glyph to NAV_ICON.habits
  • docs: full CLAUDE.md audit vs code - HOWLER_GLOBAL token, Vocabulary* store names, class-guard status (sanctioned exception), help fragment scroll mechanics (no withInMemoryScrolling), filtering-pattern rewrite, test counts, tools/ + docs/ inventories; architecture doc tree line for the deleted orphan; stale navbar breakpoint comments corrected

Verify: ng build clean; ng test 93 files / 2229 tests green (2026-11-11).

alvachien and others added 3 commits November 11, 2026 20:51
…oter shell

- footer promoted to persistent app-shell chrome: one <app-footer/> under the
  router-outlet, flex-pinned to the viewport bottom (margin-top:auto +
  flex-shrink:0 in app-root's 100vh column - no position:fixed, so no
  hardcoded clearance); compact <=884px tier keeps the pinned band slim on
  phones; per-page <app-footer> removed from the 8 page templates that carried it
- Mark & Ledger work wave (pre-existing tree, committed together as files
  overlap): UserLearningTimeService heartbeat + leaderboard, WordDictionaryService
  review lookups, /help compiled bilingual guide, NAV_ICON single source,
  vocabulary autoplay options dialog, habits/homepage/toolbar refinements,
  single azure theme (4-palette switcher removed), page title "K.H.B., by Alva Chien",
  version 1.9.52 -> 1.9.64 (released 2026-11-08)
- delete orphaned quit-confirm dialog template + its quitConfirm* i18n keys;
  bind habit-list header glyph to NAV_ICON.habits
- docs: full CLAUDE.md audit vs code - HOWLER_GLOBAL token, Vocabulary* store
  names, class-guard status (sanctioned exception), help fragment scroll
  mechanics (no withInMemoryScrolling), filtering-pattern rewrite, test counts,
  tools/ + docs/ inventories; architecture doc tree line for the deleted orphan;
  stale navbar breakpoint comments corrected

Verify: ng build clean; ng test 93 files / 2229 tests green (2026-11-11).

Co-Authored-By: Claude Code <noreply@anthropic.com>
…ial CI workers

The build-and-test workflow failed PR #101 with pure timeouts under runner
CPU contention (no assertion failures): habit DOM tests died at the default
5s budget, and the playAuthenticatedOneShot onEnd tests blew past their
20s escape hatch (MockHowl defers onload on a real 1ms timer).

- vitest.config.ts: maxWorkers 1 when CI is set (full parallelism locally),
  testTimeout 15s for the heavy interactive specs
- audio-service.service.spec.ts: onEnd describe drives fake timers via
  advanceTimersByTimeAsync — deterministic, no wall-clock dependence

Co-Authored-By: Claude Code <noreply@anthropic.com>
…erConfig

The habit-spec CI timeouts were not CPU contention: the translate review
store spec installed vi.useFakeTimers() in its quit/destruction describes
with no restore, and the unit-test builder runs files with isolate:false
(shared worker globals). The fake clock leaked into the next spec file in
the same worker, hanging every real-timer await (flush/setTimeout) until
the 5s default timeout — the victim file varied with worker assignment,
so it passed locally and failed in CI. Reproduced with a cold vitest cache
+ VITEST_MAX_WORKERS=1 (leaker first, victim times out 4/4).

- translate store spec: afterEach(vi.useRealTimers) on quit + destruction
- vocabulary store spec: move in-test afterEach registrations (they landed
  on the file suite and worked only by accident) to describe level
- angular.json: set test.options.runnerConfig — without it the builder
  silently ignores vitest.config.ts, so 90bba4b's 15s testTimeout and
  serial CI workers never applied (CI still showed the 5s default)
- vitest.config.ts: keep runner-level options only (the builder manages
  include/setupFiles/globals); correct the rationale comments
- CLAUDE.md: document the fake-timer restore rule and runnerConfig wiring

Verified: full suite 2229/2229 green serially (1 worker) and in parallel.

Co-Authored-By: Claude Code <noreply@anthropic.com>
@alvachien
alvachien merged commit 7b62f96 into main Nov 12, 2026
2 checks passed
@alvachien
alvachien deleted the chroe/keepimprv-3 branch November 12, 2026 12:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant