fabro/apps/fabro-web/app
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
..
components feat(web): render command/script stage output on stage detail page 2026-04-15 10:23:55 -04:00
data refactor(runs): blocked status canonicalization cleanup (#165) 2026-04-19 14:53:46 -04:00
layouts feat(web): add empty state to runs page and fix logo link 2026-04-16 08:02:18 -04:00
lib feat(web): graph direction control, failed node colors, breadcrumb and stage fixes 2026-04-15 10:52:12 -04:00
routes feat(web): Run Files tab empty/error/loading states, refresh, a11y 2026-04-19 17:13:17 -04:00
api.test.ts fix(runs): bound board enrichment and demo normalization 2026-04-19 11:35:30 -04:00
api.ts fix(runs): bound board enrichment and demo normalization 2026-04-19 11:35:30 -04:00
app.css feat(web): render markdown in stage system prompt and assistant blocks 2026-04-15 11:21:25 -04:00
entry.tsx feat(install): add browser-based setup flow 2026-04-19 11:20:58 -04:00
install-api.test.ts refactor(install): collapse overlapping React state into discriminated unions 2026-04-19 13:59:09 -04:00
install-api.ts refactor(install): collapse overlapping React state into discriminated unions 2026-04-19 13:59:09 -04:00
install-app.test.tsx fix(install): harden web wizard against review findings 2026-04-19 12:43:00 -04:00
install-app.tsx refactor(install): collapse overlapping React state into discriminated unions 2026-04-19 13:59:09 -04:00
install-config.test.ts fix(install): exclude openai-compatible from v1 setup 2026-04-19 11:43:38 -04:00
install-config.ts fix(install): exclude openai-compatible from v1 setup 2026-04-19 11:43:38 -04:00
install-flow.test.ts fix(install): exclude openai-compatible from v1 setup 2026-04-19 11:43:38 -04:00
install-flow.ts fix(install): exclude openai-compatible from v1 setup 2026-04-19 11:43:38 -04:00
install-router.tsx feat(install): add browser-based setup flow 2026-04-19 11:20:58 -04:00
mode.test.ts fix(install): harden web wizard against review findings 2026-04-19 12:43:00 -04:00
mode.ts fix(install): harden web wizard against review findings 2026-04-19 12:43:00 -04:00
root.tsx fix(fabro-web): default unsaved theme selection to dark 2026-04-08 12:10:34 -04:00
router.test.tsx refactor(setup): remove browser-based GitHub app bootstrap 2026-04-13 18:25:29 -04:00
router.tsx feat(web): enhance run detail UI with stages tab, graph controls, and live annotations 2026-04-15 10:12:10 -04:00