# `src/components/` React components. The UI primitives are shadcn/ui (new-york style, zinc base) over Radix + Tailwind 4 + Lucide; everything above the primitives is feature-grouped by surface. Components are server components unless they need a hook, state, or browser API, in which case they open with `"use client"`. Charts use Recharts 3 — replacing the chart library requires explicit approval. ## Primitives and shell - **`ui/`** — shadcn/ui primitives (button, dialog, sheet, table, …). Generated by the shadcn CLI; keep edits minimal and on-style. - **`layout/`** — the app shell: sidebar, topbar, bottom nav. - **`providers.tsx`, `version-poller.tsx`** — top-level context providers and the self-healing stale-shell poller. - **`i18n/`** — translation context + locale switcher. ## Feature groups - **`insights/`** — insight status, assessment cards, Coach surface, advisor cards (the largest group). - **`medications/`** — medication cards, the schedule wizard, intake timeline, detail history. - **`settings/`** — the section components behind each settings page. - **`measurements/`, `mood/`, `dashboard/`** — entry forms, lists, dashboard tiles. - **`charts/`** — Recharts wrappers. - **`monitoring/`** — Umami / GlitchTip client bootstrap. - **`gamification/`, `targets/`, `comparison/`, `doctor-report/`, `clinician/`, `onboarding/`, `admin/`** — the remaining per-surface groups. ## Conventions Kebab-case filenames; React component exports stay PascalCase regardless. (A handful of PascalCase-filename outliers under `medications/` + `onboarding/` are pre-existing drift, noted in [`../../CLAUDE.md`](../../CLAUDE.md).) Every `t()` call needs a matching key in `messages/en.json` — guarded by `i18n-call-site-coverage.test.ts`. Data reads go through TanStack Query with keys from `@/lib/query-keys` and unwrap `(await res.json()).data`. Tests live in [`__tests__/`](__tests__/).