feat(web): ATB-26 — neobrutal design system, components, and route stubs (#39)
* docs: ATB-26 web UI foundation design
Design doc for the neobrutal design system, layout, static file
serving, shared components, and route stubs that form the Phase 4
web UI foundation.
* docs: ATB-26 web UI foundation implementation plan
Step-by-step TDD plan for neobrutal design system, shared components,
static file serving, and route stubs. Notes frontend-design skill
for CSS content.
* feat(web): add tokensToCss utility for CSS custom property injection
* feat(web): add neobrutal light design token preset
* feat(web): update BaseLayout with neobrutal tokens, fonts, and semantic HTML
* feat(web): add static file serving and neobrutal CSS
- Mount serveStatic middleware on /static/* in index.ts
- Add reset.css with minimal normalize (box-sizing, font inheritance, img display:block)
- Add theme.css with full neobrutal component styles (body, headings, links, code, layout, card, btn, page-header, error-display, empty-state, loading-state)
- All theme.css values use var(--token) — no hardcoded colors, sizes, or fonts
- Add 3 tests verifying reset.css/theme.css are served with text/css content-type and 404 for unknown paths
* fix(web): add global error handler and tokenize button press offsets
* feat(web): add Card component
* feat(web): add Button with primary/secondary/danger variants
* feat(web): add PageHeader component
* feat(web): add ErrorDisplay, EmptyState, LoadingState components
* feat(web): add component barrel export
* fix(web): align LoadingState element and add missing test assertions
* feat(web): add route stubs for boards, topics, login, new-topic
- Update home route to use PageHeader + EmptyState with correct title
- Add boards, topics, login, and new-topic route stubs
- All routes use BaseLayout, PageHeader, and EmptyState components
- TDD: 5 new tests in stubs.test.tsx confirming 200 responses and titles
* feat(web): register all route stubs in router
- Import and mount boards, topics, login, and new-topic routes
- All routes now accessible via webRoutes in the main app
- 47 tests pass across 10 test files
* fix(web): address PR review feedback — error handler, token caching, test coverage
- Compute CSS root block once at module load (ROOT_CSS constant in base.tsx)
- Add startup existence check for static file directory with structured error log
- Improve global error handler: DOCTYPE, lang attr, dev-mode diagnostics
- Add tests for global error handler (500 status, HTML content-type, dev/prod modes)
- Tighten theme separator assertion to exact string match
- Add EmptyState negative assertion for missing action element