docs(spec): record as-built deviations from final review adjudication

PageHeader slots trimmed; Client 360 KPI substitution (no server outstanding
figure); 'since' dropped (no createdAt); §8 render tests → pure-function tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat/client-detail-redesign
Thomas Joise 5 days ago
parent 5a1c84f1de
commit 1db0a8c6b7

@ -70,7 +70,7 @@ overlays); black-ink primary buttons; accent reserved for *state*.
| Component | Change | | Component | Change |
|---|---| |---|---|
| `PageHeader` | Adds optional `breadcrumb`, inline status-chip slot, and stat-strip slot below desc (Direction A v2 header pattern). Existing call sites keep working (all new props optional). | | `PageHeader` | Adds optional `breadcrumb` (Direction A v2 header pattern). Existing call sites keep working (all new props optional). *(As built: the status-chip/stat-strip slots were dropped — pages compose `Badge`/`Stats` directly, visually equivalent; record pages hand-roll `wf-crumbs` beside `RecordHeader`.)* |
| `DataTable` | Per-row `tone` (subtle `*-soft` tinting — e.g. overdue rows err-soft; APEX-checklist "pending first" is data-side, tinting is the visual half); per-column `mono`; sticky header. | | `DataTable` | Per-row `tone` (subtle `*-soft` tinting — e.g. overdue rows err-soft; APEX-checklist "pending first" is data-side, tinting is the visual half); per-column `mono`; sticky header. |
| `FilterChips` **new** | Pill row with counts, single-select (`All · Active · Dormant · Lost`). Serves the funnel spec's `All | Mine | Overdue | Owner` later. | | `FilterChips` **new** | Pill row with counts, single-select (`All · Active · Dormant · Lost`). Serves the funnel spec's `All | Mine | Overdue | Owner` later. |
| `Skeleton` **new** | Varied-width shimmer bars; replaces every "Loading…" EmptyState. | | `Skeleton` **new** | Varied-width shimmer bars; replaces every "Loading…" EmptyState. |
@ -92,9 +92,13 @@ the mockups' emoji placeholders. Used in `apps/hq-web` only, so `@sims/ui` gains
- **Clients** — FilterChips by status with counts + existing search + total badge; `code` - **Clients** — FilterChips by status with counts + existing search + total badge; `code`
column mono; inline-create form restyled as a card. column mono; inline-create form restyled as a card.
- **ClientDetail → "Client 360"** (hero page): - **ClientDetail → "Client 360"** (hero page):
- `RecordHeader`: avatar, name, status pill, meta line (`code · state · GSTIN · since`), - `RecordHeader`: avatar, name, status pill, meta line (`code · state · GSTIN · contact`
`since` dropped: the Client API carries no createdAt),
actions: Log call · Record payment · New document. actions: Log call · Record payment · New document.
- KPI row: Outstanding ₹ · Active modules · AMC status · Last interaction. - KPI row *(as built)*: Active modules · Advance on account ₹ · Open documents · Last
interaction. (Spec originally said Outstanding ₹ + AMC status; the server exposes no
outstanding figure and client-side paise math is banned — revisit when the ledger
endpoint grows an outstanding field.)
- **Timeline ribbon "Relationship pulse — last 12 months"** (HQ-specific component in - **Timeline ribbon "Relationship pulse — last 12 months"** (HQ-specific component in
`apps/hq-web`): 4 lanes — Documents / Payments / Interactions / AMC & renewals — on a `apps/hq-web`): 4 lanes — Documents / Payments / Interactions / AMC & renewals — on a
shared 12-month axis, plotted from data the page already loads. Hover → readout bar shared 12-month axis, plotted from data the page already loads. Hover → readout bar
@ -129,10 +133,11 @@ banner behavior exactly as today.
## 8. Testing & verification ## 8. Testing & verification
- `npm run typecheck` and `npm test` (177 tests) stay green — no domain code touched. - `npm run typecheck` and `npm test` stay green — no domain code touched.
- New `@sims/ui` components get vitest render tests where logic exists (FilterChips - New `@sims/ui` logic gets vitest tests *(as built: pure-function tests only — avatar
selection, Tabs switching, DataTable tone/mono mapping, timeline bucketing math for the hashing, palette matching, pulse month-bucketing; the repo has no DOM test environment,
ribbon: month-bucket function is a pure exported helper with unit tests). so FilterChips/Tabs/DataTable render behavior is covered by typecheck + the e2e walk
rather than render tests)*.
- End-to-end: run server + Vite, exercise Dashboard → Clients → Client 360 (all tabs, - End-to-end: run server + Vite, exercise Dashboard → Clients → Client 360 (all tabs,
ribbon hover/click) → DocumentView → NewDocument preview → Reports → theme/accent switch ribbon hover/click) → DocumentView → NewDocument preview → Reports → theme/accent switch
(light+dark) → Ctrl+K palette → narrow-viewport pass, before claiming done. (light+dark) → Ctrl+K palette → narrow-viewport pass, before claiming done.

Loading…
Cancel
Save