Data display
The components that present records: status badges, people, cards, tables,
histories and metadata. Every example uses the Northwind Ops sample data and
the exact lib/theme.ts + app/globals.css your app ships, so a list or record
screen built from these parts looks like this.
Badge
Status, category and count labels. light is the default variant; colour props resolve to the semantic scales.
light is the theme default. Light and outline text is promoted to the AA 700 stop; blue | green | yellow | red resolve to info / success / warning / danger.ORDER_STATUS mapped to a colour prop — the same badges the list and record templates use.variant="dot" for live state — user status, sync health.size xs – xl; md is the default. Text is fixed at --ds-font-size-xs by the theme, so size changes height and padding.leftSection / rightSection — an icon, an avatar, or a CloseButton for removable filters.Approvals
Alerts
Orders
Inbox
circle keeps single-digit counts round; longer counts (“12”, “99+”) use the pill shape.variant="white" is for badges laid over imagery or a filled band (shown on --ds-brand-ink-900).Avatar
People and organisations — initials on a tint, round for people, rounded squares for workspaces.
variant="light" (top) and filled. Use primary for people unless a colour encodes something.size xs (16px) – xl (84px). sm in tables, md in lists, xl on profile headers.radius="md" for organisations and workspaces. No children → user glyph; src → image.filled, with a variant="default" +N; light tints are translucent and show through the overlap.Amelia Hart
Online
Daniel Osei
Online
Priya Raman
Online
Marco Silva
Invite pending
Indicator with position="bottom-end", offset and withBorder — the border uses the surface colour so the dot cuts out cleanly.Indicator
A dot or count pinned to the corner of another element: unread, online, new.
processing adds the pulse for live activity.label turns the dot into a count; inline anchors it to inline content.primary (ember) by default; status colours via color.top-start
top-end
middle-end
bottom-start
bottom-end
position top / middle / bottom × start / center / end; offset pulls the dot in for round targets.ThemeIcon
An icon on a tinted tile — feature bullets, empty states and KPI cards.
filled
light
outline
default
transparent
color → theme primary (ember). light is the usual choice beside text.size xs – xl; radius={1000} for circles — the theme's xl radius is 16px, so it only rounds small icons fully.Open purchase orders
128
+12 vs. last week
light ThemeIcon heading a KPI tile — the pattern the dashboard template uses.Card
The main content container. Sections bleed to the edge; globals.css supplies the hairline border, card shadow and --ds-radius-card.
Atlas Packaging
Corrugated boxes, void fill and pallet wrap. Net 30, ships from Rotterdam.
Orders YTD
14
Spend YTD
$186,400
Card.Section on top — here a token gradient (--ds-primary-50 → 300) standing in for a cover image.
Supplier intake
Onboarding form for new vendors — 12 fields, routed to Procurement.
Card.Section wrapping an Image bleeds to the card edges and inherits its top radius.Card.Section withBorder inheritPadding draws hairline dividers (--ds-card-border) between header, body and footer.Approvers
Amelia Hart
Platform
Daniel Osei
Fulfilment
Priya Raman
Finance
padding="sm" with Dividers — every Card gets the hairline border and --ds-card-shadow from globals.css.Paper
A plain surface for sub-panels and floating layers, with the brand’s soft shadow scale.
xs
shadow
sm
shadow
md
shadow
lg
shadow
xl
shadow
shadow xs – xl map to --ds-shadow-*: soft, long and low-opacity. sm for raised panels, lg for floating surfaces, xl for modals.withBorder
Flat sub-panel inside a card or page.
withBorder + shadow="sm"
Raised panel on the page background.
shadow="lg"
Floating surface — popovers, toasts.
--ds-radius-md; withBorder adds the hairline --mantine-color-default-border (→ --ds-border-color).Table
The workhorse of list screens. The theme turns on withTableBorder and sets small semibold gray headers.
2 selected · $15,990
highlightOnHover, header checkbox with indeterminate, sortable headers (click them), status badges, owner avatars with a Tooltip, right-aligned money and a row Menu. Like the shipped VTable, rows take no selected tint — selection shows in the default-size checkbox and the toolbar count.Appearance
Toggle the visual props to compare densities and border styles.
| Name | Team | Role | Last active | Status |
|---|---|---|---|---|
| Amelia Hart | Platform | Administrator | 2 min ago | Active |
| Daniel Osei | Fulfilment | Editor | 18 min ago | Active |
| Priya Raman | Finance | Approver | 1 hour ago | Active |
| Marco Silva | Procurement | Editor | — | Invited |
| Hana Kobayashi | Support | Viewer | Yesterday | Active |
striped, highlightOnHover, withColumnBorders, withRowBorders and verticalSpacing. Stripes use gray-0 (--ds-gray-50), deliberately faint on a white card. withTableBorder is on by default in the theme.Scrolling, empty and loading
stickyHeader inside a ScrollArea h={240} — scroll the rows; the header stays pinned over them.| Order | Supplier | Status |
|---|---|---|
No orders match these filters Try a different status or date range. | ||
Table.Td colSpan row with a ThemeIcon, a reason and a way out.| Order | Supplier | Status |
|---|---|---|
Skeleton bars in each cell keep the column rhythm while data loads.From data
| Category | Orders | Spend |
|---|---|---|
| Freight | 1 | $48,200 |
| Packaging | 2 | $28,140 |
| Software | 1 | $21,600 |
| Catering | 1 | $7,425 |
| Facilities | 1 | $3,150 |
<Table data={{ caption, head, body }} /> — the quickest read-only table; cells accept any React node.Accordion
Collapsible sections for secondary detail. Four variants, all on the same tokens.
Northwind DC2, Dock 4 — 18 Harbour Road, Rotterdam. Deliveries accepted 07:00–15:00 on weekdays.
Northwind DC2, Dock 4 — 18 Harbour Road, Rotterdam. Deliveries accepted 07:00–15:00 on weekdays.
Northwind DC2, Dock 4 — 18 Harbour Road, Rotterdam. Deliveries accepted 07:00–15:00 on weekdays.
Northwind DC2, Dock 4 — 18 Harbour Road, Rotterdam. Deliveries accepted 07:00–15:00 on weekdays.
Timeline
Order history and activity feeds. Completed steps take the ember accent.
Daniel Osei · 24 Oct, 14:02
Daniel Osei · 27 Oct, 10:18
Priya Raman · Today, 08:15
“Within Q4 freight budget.”
Due 31 Oct
—
active={2} colours completed steps ember; upcoming steps use lineVariant="dashed".Priya Raman approved PO-2040 · Keystone Logistics
12 min ago
Daniel Osei submitted PO-2041 · Atlas Packaging
1 hour ago
Amelia Hart invited Marco Silva to Procurement
3 hours ago
Hana Kobayashi commented on PO-2038 · Meridian Foods
Yesterday
active={-1} so no step reads as “current”.Description list
Key/value metadata for a record — the top of a detail page or its side panel.
PO-2040
Keystone Logistics
- Amount
- $48,200.00
- Owner
- PRPriya Raman
- Category
- Freight
- Due
- 31 Oct 2026
- Last updated
- Today, 08:15
- Reference
ord_8f3k2m1x
<dl> in a three-column grid — dimmed xs terms over medium-weight values. Mixed value types: badge, avatar, money, code with CopyButton.Supplier
- Legal name
- Keystone Logistics B.V.
- Contact
- ops@keystone-logistics.eu
- Payment terms
- Net 30
- Categories
- FreightCustoms
- Risk rating
- Low
--ds-divider — the side panel of a record detail page.List
Checklists and steps; ThemeIcon bullets make requirements scannable.
- Approved vendor
- Budget headroom
- Quote under 30 days old
- Finance sign-off
icon on List sets every bullet; List.Item icon overrides one — here the pending check.- Draft
- Attach quote
- Submit
- Receive
- Packaging
- Freight
- Road
- Sea
- Facilities
type="ordered" for sequences; nested lists use withPadding. Pass listStyleType when a CSS reset strips markers.Code & Kbd
Monospace for ids and payloads, keycaps for shortcuts.
Search
⌘+
KSave record
Ctrl+
SShortcuts
Shift+
?size xs – xl.The status field moves from pending to approved when the last approver signs. Reference ord_8f3k2m1x in support tickets.
Code sets JetBrains Mono on a gray tint — ids, field keys and API values inside prose.{
"id": "ord_8f3k2m1x",
"number": "PO-2040",
"supplier": "Keystone Logistics",
"status": "approved",
"amount": 48200,
"currency": "USD"
}block renders a pre — API payloads, webhook samples and config snippets.NumberFormatter
Consistent money, percentages and units without hand-written formatting.
| Use | Props | Output |
|---|---|---|
| Currency | prefix="$" thousandSeparator | $48,200 |
| Cents | decimalScale={2} fixedDecimalScale | $7,425.50 |
| Percentage | suffix="%" decimalScale={1} | 79.3% |
| Units | suffix=" pcs" thousandSeparator | 12,500 pcs |
| European | thousandSeparator="." decimalSeparator="," | € 21.600,75 |
| Negative | value={-1250} prefix="$" | -$1,250 |
NumberFormatter renders text only — pair it with tabular figures (ff="monospace") when values stack in a column.ColorSwatch
A colour chip — label colour pickers and legend keys.
Preview
component="button" swatches filled with --mantine-color-*-filled, so they follow the dark-mode remap. Click one.size in px; radius from the theme scale; withShadow (default) adds an inner ring for light colours.Spoiler
Clips long notes behind a show more / show less link.
Keystone has handled our Rotterdam inbound freight since 2023. Pickups must be booked 48 hours ahead through their portal; same-day collection is available for an additional fee and needs approval from the Fulfilment lead. Customs paperwork is prepared by Keystone, but HS codes must be confirmed by us on every order.
Damaged pallets are reported within 24 hours of delivery with photos attached to the order. Credit notes usually arrive within 10 working days and should be matched against the original PO in Finance.
maxHeight clips long text with a showLabel / hideLabel toggle (styled as a link, --ds-accent-text).Image
Thumbnails and attachment previews, with a placeholder for missing media.

intake-form-draft.png · 412 KB
radius="md", a fixed h and fit="cover" keep attachment thumbnails a consistent size.packing-list.pdf · 88 KB
AspectRatio box on --ds-gray-50 with a dashed --ds-gray-300 border.