- TopBar: brand + nav links (NavLink active styling) + user dropdown
- TimeEntryForm: create + edit mode; date/project/h:mm inputs; pre-fills
on edit; posts to /api/time-entries or PUTs /{id}
- WeeklyView: ISO week navigation (← →); 7-day list with entry rows,
inline TimeEntryForm per day, delete; week total in header
- MonthlyView: year-month navigation; per-project table with time and
cost progress bars; BudgetBanner for breached projects
- ProjectsView: project list with budget bars + create-project form
- BudgetBanner: red banner displayed when any project is over budget
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- tailwindcss + @tailwindcss/vite, react-router-dom, date-fns, zod installed
- vite.config.ts: Tailwind v4 Vite plugin wired in
- index.css: single @import "tailwindcss" (zero-config v4)
- main.tsx: wrapped in <BrowserRouter>; imports index.css
- App.tsx: layout shell with <TopBar/> + <Routes> (/, /weekly, /monthly, /projects)
- lib/api.ts: Zod schemas for all API types + typed fetch wrapper; all
responses validated before field access (per CLAUDE.md rule)
- lib/format.ts: minutesToHmm, hmmToMinutes, centsToEur, ISO week helpers,
year-month helpers, formatDate
- lib/types.ts: z.infer<> re-exports from api.ts
- state/UserContext.tsx: selected user persisted in localStorage; auto-
selects first user on load
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sets up toolchain pinning, format/lint (Biome + Spotless), lefthook
pre-commit hooks, Docker Compose for Postgres, and trivial passing
tests for both stacks.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>