diff --git a/CLAUDE.md b/CLAUDE.md index 761e04a..51bcfb8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,7 +17,7 @@ dashboard, an append-only audit log, an APEX importer, and a scheduler. | Part | Where | Notes | |---|---|---| | Backend | `apps/hq/src` | Express over `better-sqlite3`, DB at `data/hq.db` (WAL) | -| Frontend | `apps/hq-web/src` | React + Vite; pages Dashboard (My Day) / Pipeline / Reminders / Clients / ClientDetail / Documents / NewDocument / DocumentView / Modules / Reports / Employees (owner-only) / Profile / APEX Import (owner-only) / Settings | +| Frontend | `apps/hq-web/src` | React + Vite. **Home** card launcher is the landing (`/`); Dashboard (My Day) is at `/dashboard` (D30). Pages: Home / Dashboard / Pipeline / Reminders / Tickets / Onboarding / Clients / ClientDetail / Documents / NewDocument / DocumentView / Renewals / Modules / Module data / Portals / Reports / MIS cockpit (owner-only) / SMS credits / Employees (owner-only) / Profile / APEX Import (owner-only) / Audit log (owner-only) / Settings. Theme = light/dark, 7 accents, 4 neutral palettes (Warm/Slate/Graphite/Zinc), Geist font -- all in Settings > Appearance (D29) | | Repos | `apps/hq/src/repos-*.ts` | one file per domain; plain functions over a `DB` handle | | Schema | `apps/hq/src/db.ts` + `apps/hq/schema.sql` | `CREATE TABLE IF NOT EXISTS` + additive `migrate()` | | Shared packages | `packages/*` | trimmed forks — see below | diff --git a/docs/06-DECISIONS.md b/docs/06-DECISIONS.md index ee078a0..96719b7 100644 --- a/docs/06-DECISIONS.md +++ b/docs/06-DECISIONS.md @@ -494,6 +494,34 @@ and the owner Cockpit + Dashboard carry the low-count alert. **Ticket SLA**: an `ticket.sla_days` (dated) drives an overdue mark + filter, and a "Bill" action opens New Document with the client pre-selected (light ticket→invoice; `/documents/new?client=`). +## D29 — Console visual refresh: cockpit dashboard + palettes + Geist (2026-07-19) +The Dashboard is reworked into a **cockpit**: a flat "Today" hero (date, greeting, the headline +overdue figure, Everyone↔Mine scope, quick actions), the four KPI stat cards, the reminder queue, +then a **bento grid** of the day's sections (overdue, due-this-week, renewals, follow-ups, recent +payments). Low-colour on purpose — ink + neutrals + one accent, red only for real failures +(`.dash-*` in `apps/hq-web/src/app.css`, wired to the existing `/dashboard` payload; honest data +only, no invented figures). + +**Theme gains a third axis — palette (the neutral ground).** Alongside mode (light/dark) and the +seven accents, `data-palette` selects the greys: **Warm** (the default, unchanged), **Slate** +(cool), **Graphite** (dark-first), **Zinc** (near-mono). Backward-compatible and config-driven +(`packages/ui` `theme.ts` + `tokens.css`; `warm` needs no attribute), picked in Settings → +Appearance beside accent + mode. The UI font is swapped **Inter → Geist Variable + Geist Mono** +(bundled offline via `@fontsource-variable/geist`). Class names stay stable — restyling stays in +one place. + +## D30 — Home hub landing + sidebar reorg + section counts (2026-07-19) +A **Home hub** card launcher becomes the landing (`/`); the Dashboard moves to `/dashboard`. The +hub surfaces only the day-to-day sections (Dashboard, Clients, Documents, Reminders, Renewals, +Pipeline, Tickets, SMS credits, Modules) — each a card with a one-line purpose and a live count — +everything else stays in the sidebar. The **sidebar is reorganized** from one overloaded "Work" +group into six intent groups (Overview · Work · Clients & billing · Catalog · Insight · Admin) +with clearer names (MIS cockpit, SMS credits, APEX import); "New document" is an action, not a nav +row. **Section count badges** — neutral by default, amber for SMS-low, red for failed sends — sit +on Reminders / Pipeline / Tickets / Renewals / SMS / Clients / Documents-drafts / Modules, fetched +best-effort (a slow/failed one never blocks the shell). The Modules page gains a per-module +**client count** column. + ## D31 — Credentials stored in the clear (owner decision, 2026-07-19) Founder call: "no encryption for anything — those credentials will be used regularly." The held-out `HQ_SECRET_KEY` was a daily friction point (the SMS-gateway balance pull needs to