diff --git a/.cursor/rules/00-project.mdc b/.cursor/rules/00-project.mdc index 767fb5c..2f8e290 100644 --- a/.cursor/rules/00-project.mdc +++ b/.cursor/rules/00-project.mdc @@ -11,3 +11,4 @@ Golden rules: - staging and production are isolated (Neon branch, Worker env, R2 bucket per env). Never mix secrets. - Don't add anything you can't explain in the follow-up interview. - When rubric-relevant work ships, update `SUBMISSION.md`, spec mapping, and checklists in the same change (see `.cursor/rules/111-submission-docs.mdc`). +- New routes and async UI must follow page-load motion rules (see `.cursor/rules/31-page-load-motion.mdc`) — animated skeletons, `AnimatedOutlet`, no abrupt pop-in. diff --git a/.cursor/rules/110-docs.mdc b/.cursor/rules/110-docs.mdc index 63ea032..3c60140 100644 --- a/.cursor/rules/110-docs.mdc +++ b/.cursor/rules/110-docs.mdc @@ -5,3 +5,9 @@ globs: "**/*.md" - Keep the README's five graded sections accurate to the code (perf, media, scale, security, prod). - Record decisions as ADRs in docs/adr. Document every public surface. Wrong docs are worse than none. - Reviewer-facing docs (`SUBMISSION.md`, checklists, spec mapping): see **111-submission-docs** — sync with [docs/HOMEWORK-SPEC.md](../../docs/HOMEWORK-SPEC.md) when rubric-relevant work ships; professional yet personable tone for 501. +- Game mode “how to play” copy: see **32-game-guides** — single source `apps/web/src/content/game-guides.ts` + [docs/GAME-GUIDES.md](../../docs/GAME-GUIDES.md). +- Form field tooltips: see **33-field-tooltips** — `field-tooltips.ts` + [docs/FIELD-TOOLTIPS.md](../../docs/FIELD-TOOLTIPS.md). +- Auth / JWT / API keys: see **34-auth** — [docs/AUTH.md](../../docs/AUTH.md). +- Scale / cache / rate limits: see **35-scale** — [docs/SCALE.md](../../docs/SCALE.md). +- Testing / contracts / visual: see **36-quality-dx**. +- PWA / i18n / scorecard / analytics / API docs: see **37-tier7-extras** — [docs/EXTRAS.md](../../docs/EXTRAS.md). diff --git a/.cursor/rules/20-frontend-react.mdc b/.cursor/rules/20-frontend-react.mdc index a907a3f..40362fb 100644 --- a/.cursor/rules/20-frontend-react.mdc +++ b/.cursor/rules/20-frontend-react.mdc @@ -6,3 +6,4 @@ globs: "apps/web/**/*.{ts,tsx}" - Route components are lazy-loaded (code splitting). No global store. - Live updates via the `useLiveSession` WebSocket hook; polling is the documented fallback. - API base URL comes from `import.meta.env.VITE_API_BASE` (per-env). +- Form inputs: use `TextField` / `SelectField` / `FileField` with required `tooltip` — see **33-field-tooltips**. diff --git a/.cursor/rules/30-styling.mdc b/.cursor/rules/30-styling.mdc index e8b2e7b..401bf75 100644 --- a/.cursor/rules/30-styling.mdc +++ b/.cursor/rules/30-styling.mdc @@ -1,8 +1,33 @@ --- -description: Styling — Tailwind v4 + shadcn only +description: Styling — Tailwind v4 + shadcn + Oche motion system globs: "apps/web/**/*.{ts,tsx,css}" --- -- Tailwind utilities + shadcn/ui components only. No ad-hoc CSS files. -- Theme tokens live once in `src/index.css` (`@theme`). Identity = "live scoreboard": - deep slate canvas, chalk text, single `--color-oche` accent, condensed tabular `.score` numerals. -- Don't ship default-looking shadcn; keep the deliberate accent + spacing rhythm. +# Visual identity +- Tailwind utilities + shadcn/ui components only. Theme tokens live in `src/index.css` (`@theme`). +- Identity = "live scoreboard": deep slate canvas, chalk text, single `--color-oche` accent, condensed tabular `.score` numerals. +- Don't ship default-looking shadcn; keep deliberate accent + spacing rhythm. + +# Motion philosophy (interview polish) +Every interactive surface should feel **modern, smooth, and subtly captivating** — never flashy or distracting. + +**Page loads & route entry:** see **31-page-load-motion** — skeletons + slide entrances mandatory; no bare "Loading…" text. + +## Principles +- **Press feedback:** every `