Add one root-mounted, Luzzle-style progress component using native SvelteKit navigation state and Svelte motion. No dependency, global loading store or per-route wiring.
Retain the requested session-storage handoff: pagehide records a namespaced timestamp; a new document or persisted pageshow consumes a fresh marker once and displays a short completion cue. This is a post-load cue, not measured server/network progress. Ignore invalid, stale or future markers and tolerate unavailable storage.
Own the completion timer and animation frame so an old navigation cannot hide or finish a subsequent navigation's bar. Respect reduced motion, use the existing theme palette/spacing, and expose a named indeterminate progressbar without invented ARIA percentages.
Keep enhanced-form POST pending work outside scope. No auth, configuration, worker, shared-package, Docker, mise or CI-policy changes. Include a web patch changeset.
Validation
Full web coverage: 1,113 tests /79 files passed, thresholds unchanged.
Types: 0 errors /0 warnings. Full app formatting/ESLint and native production build passed.
3 focused browser journeys passed in one run (15.0s, one worker, stop-first-failure, no retries): A's completion cannot hide/finish pending B; actual document handoff consumption plus persisted-event freshness checks; blocked storage and reduced-motion navigation on mobile.
Browser tests gate real data requests and advance virtual time rather than sleep. The race proof crosses the old completion deadline without spending time testing native Tween interpolation. Persisted-event coverage does not claim actual BFCache eligibility/restoration.
Independent code, readability and test-value reviews completed; test-only typing, clock scheduling and marker-branch findings addressed. No extra test harness or unit-DOM dependency.
Root mise.toml and pnpm-lock.yaml owner edits are excluded in full and preserved; apps/web/mise.toml is unchanged. Local checks used the installed dependency graph. No release, deployment or merge action; owner will land the PR.
## Summary
Closes #111.
- Add one root-mounted, Luzzle-style progress component using native SvelteKit navigation state and Svelte motion. No dependency, global loading store or per-route wiring.
- Retain the requested session-storage handoff: pagehide records a namespaced timestamp; a new document or persisted pageshow consumes a fresh marker once and displays a short completion cue. This is a post-load cue, not measured server/network progress. Ignore invalid, stale or future markers and tolerate unavailable storage.
- Own the completion timer and animation frame so an old navigation cannot hide or finish a subsequent navigation's bar. Respect reduced motion, use the existing theme palette/spacing, and expose a named indeterminate progressbar without invented ARIA percentages.
- Keep enhanced-form POST pending work outside scope. No auth, configuration, worker, shared-package, Docker, mise or CI-policy changes. Include a web patch changeset.
## Validation
- Full web coverage: **1,113 tests /79 files passed**, thresholds unchanged.
- Types: **0 errors /0 warnings**. Full app formatting/ESLint and native production build passed.
- **3 focused browser journeys passed** in one run (15.0s, one worker, stop-first-failure, no retries): A's completion cannot hide/finish pending B; actual document handoff consumption plus persisted-event freshness checks; blocked storage and reduced-motion navigation on mobile.
- Browser tests gate real data requests and advance virtual time rather than sleep. The race proof crosses the old completion deadline without spending time testing native Tween interpolation. Persisted-event coverage does not claim actual BFCache eligibility/restoration.
- Independent code, readability and test-value reviews completed; test-only typing, clock scheduling and marker-branch findings addressed. No extra test harness or unit-DOM dependency.
Root mise.toml and pnpm-lock.yaml owner edits are excluded in full and preserved; apps/web/mise.toml is unchanged. Local checks used the installed dependency graph. No release, deployment or merge action; owner will land the PR.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Closes #111.
Validation
Root mise.toml and pnpm-lock.yaml owner edits are excluded in full and preserved; apps/web/mise.toml is unchanged. Local checks used the installed dependency graph. No release, deployment or merge action; owner will land the PR.