토론 타이머 웹 애플리케이션 프론트엔드. 토론 테이블 구성, 타이머 실행, 투표 기능을 제공한다.
- Framework: React 18 + Vite
- Language: TypeScript (strict mode)
- Routing: React Router v7 (
createBrowserRouter) - Server State: TanStack React Query 5
- HTTP: Axios (custom
request<T>primitive insrc/apis/primitives.ts) - Styling: Tailwind CSS 3 + PostCSS
- i18n: i18next + react-i18next
- Animation: Framer Motion
- Testing: Vitest + @testing-library/react + userEvent + MSW
- Storybook: Available on port 6006
src/
├── page/{PageName}/ # Page components (local components/ + hooks/)
├── components/{Component}/ # Reusable UI components
├── hooks/
│ ├── query/ # TanStack Query hooks (useGet*)
│ ├── mutations/ # TanStack Mutation hooks (usePost*, usePatch*, useDelete*)
│ └── use{Hook}.ts # Utility hooks
├── apis/
│ ├── apis/{domain}.ts # API functions (Axios)
│ ├── requests/{domain}.ts # Request types
│ ├── responses/{domain}.ts # Response types
│ ├── primitives.ts # Generic request<T> helper
│ ├── axiosInstance.ts # Axios instance with interceptors
│ └── endpoints.ts # API URL constants
├── util/ # Utility functions
├── constants/ # Constants and static data
├── type/ # Shared TypeScript types
├── repositories/ # Repository pattern (API/Session)
├── mocks/handlers/ # MSW handlers
├── layout/ # Layout components (DefaultLayout)
└── routes/routes.tsx # Route definitions
- Components: function declaration (
export default function X() {}), NOT arrow function const - Variables:
constdefault,letonly for reassignment, NEVERvar - Naming: Components PascalCase, hooks
useprefix camelCase, utils camelCase, constants UPPER_SNAKE_CASE - Boolean:
is/has/shouldprefix - Event handlers:
handleprefix - i18n: All user-facing text via
useTranslation()
- Approach: Red-Green-Refactor
- Runner: Vitest (globals: true, jsdom)
- Setup:
setup.ts(MSW server, ResizeObserver mock, i18n) - Convention:
{module}.test.ts(x)co-located, Korean test descriptions - Mocking: MSW for API, minimize other mocks
- Order:
util/→apis/→hooks/→components/→page/
npm run dev # Development server
npm run dev-mock # Dev with MSW API mocking
npm run build # Production build
npm run test # Run Vitest
npm run lint # ESLint + Stylelint + TSC
npm run storybook # Storybook on port 6006This project uses the speckits specification workflow. Scripts are in .specify/scripts/bash/ and templates in .specify/templates/.
Workflow order:
/speckits/specify— Create feature specification/speckits/clarify— Clarify ambiguities in spec/speckits/plan— Generate TDD-driven implementation plan/speckits/tasks— Break plan into ordered tasks/speckits/analyze— Cross-artifact consistency check/speckits/implement— Execute tasks/speckits/checklist— Generate quality checklist
Command definitions are in .claude/commands/speckits/. Constitution is at .specify/memory/constitution.md.
- Main branch:
develop - Feature branches:
feat/#{issue}-{slug} - PR target:
develop