# Style and Page Architecture

This document defines how styling and page structure should evolve in this project.

## Goals

- Keep global styling predictable and centralized.
- Keep component styling local and maintainable.
- Keep page flow explicit and easy to extend.
- Make it easy for contributors and agents to add new pages and styles consistently.

## Current Page Organization

Pages live in `src/pages/` and are intentionally minimal placeholders right now.

- `src/pages/HomePage.tsx`
- `src/pages/SongSelectionPage.tsx`
- `src/pages/GamePage.tsx`
- `src/pages/EndOfGamePage.tsx`
- `src/pages/LeaderboardPage.tsx`
- `src/pages/CreditsPage.tsx`

Routes are centralized in:

- `src/app/route-paths.ts` for route constants
- `src/app/AppRoutes.tsx` for route definitions

App bootstrap:

- `src/main.tsx` wraps the app in `BrowserRouter` and imports global CSS.
- `src/App.tsx` renders `AppRoutes` only.

## Route Map

- `/` -> Home
- `/song-selection` -> Song Selection
- `/game` -> Game Screen
- `/end-of-game` -> End Of Game
- `/leaderboard` -> Leaderboard
- `/credits` -> Credits

No page-to-page navigation links are required yet.

## Style Architecture (Target)

Planned structure:

- `src/styles/tokens.css`: design tokens (CSS variables)
- `src/styles/global.css`: reset/base/global element rules
- `src/index.css`: optional thin aggregator, or can stay empty if `main.tsx` imports styles directly

Recommended usage:

1. Import global styles once in `src/main.tsx`.
2. Use CSS Modules for component-local styles (`ComponentName.module.css`).
3. Keep page-specific layout styles in page modules only when needed (`PageName.module.css`).
4. Use tokens (`var(--...)`) in component/page modules to avoid hardcoded values.

## Font System

Fonts are stored in `src/assets/fonts/just-dance/` and loaded globally via `@font-face` in `src/index.css`.

- `JustDance-Regular.otf` (400)
- `JustDance-Bold.otf` (700)
- `JustDance-Black.otf` (900)

Semantic font variables (in `:root`):

- `--font-family-base`
- `--font-family-display`
- `--font-family-ui`
- `--font-size-display-xl`
- `--font-size-display-lg`
- `--font-size-title`
- `--font-size-body`
- `--font-size-caption`
- `--font-weight-regular`
- `--font-weight-bold`
- `--font-weight-black`

Semantic utility classes (global):

- `.font-display`
- `.font-title`
- `.font-body`
- `.font-caption`

Guideline:

- Use variables for sizing/weights in component CSS.
- Use semantic classes for quick typography intent in markup.

## Rules of Thumb

- Global CSS should handle only app-wide concerns:
  - normalize/reset
  - typography defaults
  - body/root layout primitives
  - utility classes used globally
- Component CSS Modules should handle component visuals and layout.
- Avoid adding feature-specific styles to global files.
- Prefer semantic token names, for example `--color-surface`, `--space-md`, `--radius-sm`.

## Adding a New Page

1. Create `src/pages/NewPage.tsx`.
2. Add path constant in `src/app/route-paths.ts`.
3. Register route in `src/app/AppRoutes.tsx`.
4. Add page style module only if needed (`src/pages/NewPage.module.css`).

## Migration Note

The previous webcam-focused styling and view were replaced by route placeholders to support upcoming multi-page flow. Reintroduce webcam/game UI inside the appropriate page component (likely `GamePage`) as the next feature step.
