App / Dashboard
Analytics dashboard for a subscription-metrics platform — MRR, ARR, churn, LTV, cohort retention. Inherits the marketing brand (Inter, -0.32px tracking, #000 ink, slate/periwinkle/tan/navy palette) and derives a charting + status scale for data-dense surfaces. Nine recurring archetypes are documented below as reusable component recipes, plus the shared sidebar / tabbed-report chrome.
Colors & Charting Palette
Brand slate (#7A87A2) and periwinkle (#D0DBF5) are the primary chart series; deep navy is the emphasis line; warm tan is a contrast segment. Status uses conventional green / amber / red so growth and churn read instantly.
Surfaces & Text
Chart Series
Status
Cohort Heatmap Ramp (low → high retention)
Typography
Inter throughout at -0.32px tracking. KPI values run 32px/700 with tabular-nums; table headers are 12px uppercase muted; cells 14px.
| Role | Size | Line | Weight |
|---|---|---|---|
| Page title | 28px | 34px | 700 |
| KPI value | 32px | 38px | 700 |
| KPI label | 14px | 20px | 500 |
| Card title | 16px | 24px | 700 |
| Table header | 12px uppercase | 16px | 600 |
| Table cell | 14px | 20px | 400 |
| Caption / delta | 12px | 16px | 400–600 |
Layout
| Sidebar width | 248px |
| Topbar height | 64px |
| Content padding | 24px 32px |
| Card gap | 16px |
| KPI grid | repeat(auto-fit, minmax(220px, 1fr)) |
| Chart-card min-height | 320px |
| Table row height | 52px |
| Drawer width | 420px |
Shared Chrome — Sidebar & Tabbed Report Nav
Left sidebar: workspace switcher up top, grouped nav with icons, a usage meter pinned to the bottom. Tabbed report nav sits under the page title for sub-reports.
Shared Chrome — Filter Toolbar
Date-range preset pills, granularity dropdown, a compare control, and a Configure affordance to rearrange cards. The active range pill goes solid black.
KPI Stat Card
Big-number card: label + info icon, 32px tabular value, a delta badge (green up / red down), a width-spanning sparkline with start/end ticks, and an "Updated…" caption. The default landing surface.
Chart Card
Title + per-card toolbar (info, expand, overflow), a chart body, and a footer caption. Stacked bars show MRR composition by plan/segment; an overlaid navy line shows growth. Legend chips below. Includes a zero/empty state.
Chart renders flat at 0 rather than hiding.
Cohort Heatmap Table
Triangular grid: rows are cohort start periods, columns are Month 0..N, cells shaded by retention intensity. Toggle between % and count; pair with a "Most retained" list and an Export CSV action.
| Cohort | Size | M0 | M1 | M2 | M3 | M4 |
|---|---|---|---|---|---|---|
| Jan 2026 | 812 | 100 | 82 | 71 | 63 | 58 |
| Feb 2026 | 934 | 100 | 79 | 68 | 60 | — |
| Mar 2026 | 1,021 | 100 | 84 | 73 | — | — |
| Apr 2026 | 1,140 | 100 | 81 | — | — | — |
Churn Breakdown
A KPI strip plus a cumulative chart with voluntary/involuntary series, and a plain-language narrative summary. Export Data lives top-right.
You lost $48,200 in MRR because of revenue churn this period, of which $31,400 was voluntary and $16,800 involuntary.
Donut & Segmented Bar with Legend List
Composition shown as a donut (subscription status) or a single segmented horizontal bar, each paired with a legend list giving value and percentage per segment.
Data Table
Sortable uppercase headers, leading avatar + name/email cell, numeric right-aligned columns, relative-time cells, status pills, a trailing row-action menu, a gear column-config, filter chips, search, and a pagination footer. No row striping.
Segment Builder Row
Row-based builder with inline pill controls for event / property / operator / value / date, add-condition and add-group buttons, a "Valid segment" indicator, and Save / Discard.
Detail Drawer
Right-side drawer over a table row: identity header with copy, a key/value detail section, and a vertical activity timeline. Lets users drill in without leaving the list.
Status Pills
Pill-shaped (32px radius) with a 6px leading dot in the status colour over a 10%-tint background. Used across tables, drawers, and donuts.
.status-pill.active { color: #16A34A; background: rgba(22,163,74,0.10); }
.status-pill.trial { color: #D97706; background: rgba(217,119,6,0.10); }
.status-pill.canceled{ color: #DC2626; background: rgba(220,38,38,0.10); }
border-radius: 32px; padding: 3px 10px 3px 8px; font: 600 12px Inter;
Tailwind Reference
Drop the tailwind block from design-system-app.json into theme.extend and use these recipes verbatim. Set letter-spacing: -0.32px globally. The full set of recipes (sidebar, toolbar, KPI, chart, cohort, table, segment builder, drawer, status pills) ships in the JSON.
| Recipe | Class pattern |
|---|---|
appShell | min-h-screen bg-bg-page text-fg-primary font-sans tracking-tight grid grid-cols-[248px_1fr] |
sidebarItem | flex items-center gap-2.5 px-5 py-2 text-sm text-fg-muted rounded-md hover:bg-bg-page data-[active=true]:bg-bg-muted data-[active=true]:text-fg-primary data-[active=true]:font-semibold |
filterToolbar | flex items-center gap-3 rounded-card bg-bg-surface border border-border-table px-3 py-2.5 |
dateRangePill | rounded-control px-3 py-1.5 text-[13px] text-fg-muted hover:bg-bg-muted data-[active=true]:bg-fg-primary data-[active=true]:text-white |
kpiCard | rounded-card bg-bg-surface border border-border-card p-5 shadow-card flex flex-col gap-3 |
kpiValue | text-kpiValue tabular-nums |
chartCard | rounded-card bg-bg-surface border border-border-card shadow-card min-h-[320px] flex flex-col |
cohortCell | rounded-cell text-center p-2 text-fg-primary (bg from heat.0…6) |
dataTable | w-full border-collapse rounded-card overflow-hidden border border-border-card |
tableRow | h-[52px] border-t border-border-table hover:bg-bg-page |
statusPillActive | inline-flex items-center gap-1.5 rounded-pill bg-status-positiveBg text-status-positive text-caption font-semibold px-2.5 py-0.5 |
drawer | fixed right-0 top-0 h-screen w-drawer bg-bg-surface shadow-drawer flex flex-col transition-transform |
builderPill | inline-flex items-center rounded-control border border-border-input px-2.5 py-1.5 text-[13px] |