# Phase 5 React Race Hub ## Purpose Phase 5 begins the production Web UI. The backend now has the foundation needed for a local-first Race Hub: live timing is shared, a domain store exists, ingestion can populate it, and `/api/v1/race-hub` can read from local data with dataset metadata. This is the point to switch from Cursor to Claude for frontend/UI work. ## Manager Decision Start with a focused React Race Hub slice, not a full app rewrite. The goal is to prove the chosen frontend stack, visual language, responsive layout, and API contract against the new local-first backend. Keep the old Web UI available until the React route is credible. ## Scope Add a Vite + React + TypeScript frontend foundation and build a first Race Hub route around: - meeting/session header; - dataset/source status strip; - classification table; - starting grid table; - driver/team color treatment; - missing dataset states; - compact Race Hub navigation shell; - responsive desktop, tablet, and phone layouts. Use `/api/v1/race-hub?session_key=...` as the primary API. ## Stack Defaults - Vite - React - TypeScript - TanStack Query - TanStack Router, unless integration cost argues for React Router - D3 only for bespoke charts later; do not use it for basic layout tables - Vitest for component/unit tests - Playwright for at least one smoke path if practical ## Visual Direction The temporary static mockups used during early product exploration have been removed now that the production React routes exist. Use the implemented React screens as the current source of truth, and keep this visual direction in mind for future refinement. The UI should feel like an F1 operations room: - dense but readable; - technical, not generic SaaS; - restrained use of panels; - no card sludge; - no decorative gradient blobs; - strong timing-table ergonomics; - team colors used as data, not wallpaper; - mobile views designed directly, not merely squeezed desktop. ## Integration Policy Do not rip out the existing static Web UI on day one. Add the React app in a way that can coexist while the route is built and tested. Acceptable approaches: - add a Vite app under a dedicated frontend directory and document the dev flow; - serve built assets from Go only after the React slice is stable; - expose a `/react` or equivalent route temporarily if needed. The implementation should avoid large backend changes except for tiny API contract fixes discovered while integrating. ## Non-Goals Do not include these in Phase 5: - full replacement of every existing Web screen; - live timing React rewrite; - ingest UI; - settings UI; - full season/calendar rebuild; - new backend ingestion features; - persistence of live SignalR events. ## Acceptance Criteria Phase 5 is complete when: - the React app can run locally; - a Race Hub screen loads from `/api/v1/race-hub`; - available and missing datasets are visibly distinct; - the layout is usable on desktop and phone widths; - tests or smoke checks cover the Race Hub happy path; - the old Web UI still works. ## Next Phase After This Phase 6 should expand the React app around the Race Hub: strategy chart, position evolution, lap comparison, and richer Data Library/status workflows.