A React + Vite + TypeScript web app for visualizing daily routines on a 24-hour circular clock.
- 24-hour radial timeline (midnight at top, clockwise)
- Drag on ring to create a job block
- Drag arc body to move a job
- Drag start/end handles to resize
- Overlap-friendly concentric lane rendering
- Midnight-crossing jobs (for example
23:00 -> 01:00) - Global timezone selector
- Local persistence via
localStorage - Responsive desktop/mobile layout
- React 19 + TypeScript
- Vite 7
- SVG-based interaction layer
- Vitest + Testing Library
- Playwright E2E
- ESLint + Prettier
npm run dev- start development servernpm run build- type-check and production buildnpm run preview- preview production buildnpm run lint- lint sourcenpm run test- run unit/component testsnpm run test:coverage- run tests with coveragenpm run test:e2e- run Playwright end-to-end testsnpm run format- check Prettier formattingnpm run format:write- write Prettier formatting
src/components/RadialClock.tsx- radial SVG rendering and pointer interactionssrc/components/JobList.tsx- editable job list and delete actionssrc/components/TimezonePicker.tsx- global timezone controlsrc/state/useRoutineStore.ts- reducer actions and persistencesrc/lib/timeMath.ts- time/angle math and midnight logicsrc/lib/lanes.ts- overlap lane assignment
Data is stored under daily-routine.v1 in localStorage as:
{
"version": 1,
"state": {
"timezone": "Asia/Seoul",
"jobs": [],
"ui": { "selectedJobId": null }
}
}