fabro/apps/fabro-web
Bryan Helmkamp 6050b5fa4b
feat(web): Run Files tab empty/error/loading states, refresh, a11y
Completes Units 11 and 12 of the Run Files Changed plan:

- Empty-state taxonomy: distinct copy for total_changed==0 vs no
  recoverable diff
- LoadingSkeleton on initial loader navigation (shimmer respects
  prefers-reduced-motion via motion-safe:animate-pulse)
- ErrorBoundary export handling 401/403/503/429 and generic 5xx
- Refresh button + Toolbar with freshness indicator; relative
  timestamps tick every 10s
- SSE subscription to /runs/{id}/attach with a 500ms debounce that
  revalidates on checkpoint.completed, run.completed, run.failed
- After a revalidation completes, focus returns to the Refresh button
- j/k keyboard navigation over file rows, ignoring key presses while
  a text field is focused
- md (768 px) breakpoint collapses split to unified without writing
  any persisted preference
- #file=<encoded-path> deep link scrolls + focuses the matching row
  on mount; absent file surfaces a 5s toast; patch-only mode shows
  a toast explaining the limitation
- Touch targets on the Refresh button meet WCAG 2.5.5 AAA (44x44)

Refs plan docs/plans/2026-04-19-002-feat-run-files-changed-tab-plan.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 17:13:17 -04:00
..
app feat(web): Run Files tab empty/error/loading states, refresh, a11y 2026-04-19 17:13:17 -04:00
public Add screenshots, workflow diagram, lightbox, and fix logotype viewBox 2026-03-16 10:09:57 -04:00
scripts feat(install): add browser-based setup flow 2026-04-19 11:20:58 -04:00
.dockerignore Rename Arc to Fabro in TypeScript/JavaScript 2026-03-12 11:13:18 -04:00
.gitignore Rename Arc to Fabro in TypeScript/JavaScript 2026-03-12 11:13:18 -04:00
index.template.html fix(fabro-web): default unsaved theme selection to dark 2026-04-08 12:10:34 -04:00
package.json build(web): upgrade @pierre/diffs to 1.1.15 2026-04-19 17:00:50 -04:00
tsconfig.json Fix login route collision after SPA cutover 2026-04-01 21:55:30 -07:00