03 · Components

Everything you can click

Each specimen is live — hover it, focus it, type in it. Press Markup on any of them to see the HTML that produced it.

01

Buttons

The solid .btn is the only place the accent becomes a fill, so a screen gets one of them. Everywhere else the accent is a hairline or a text colour. .ghost is the workhorse.

.btn — variants
.btn — sizes, icons, block
Other button forms
Do

One solid button per screen — the thing you actually want done. Everything else is ghost.

Don't

Put two solid buttons side by side. Two primaries is no primary.

Do

Keep labels in wide-tracked uppercase. They are chrome, and chrome is uppercase in this system.

Don't

Round the corners or add a shadow to imply a press. The 1px rule has no exceptions here.

02

Forms & inputs

A field is a recessed panel with a hairline border. Focus does not draw a browser ring — it lifts the border to the accent, and the caret is already cyan. That is enough, and it stays inside the 1px rule.

Text fields
Needs an @ and a domain.
Leave blank to search every catalogue.
Choices
.toolbar — the strip above a table or chart
04

Tabs & pills

Four ways to switch, in decreasing order of how much room they take. All four are driven by the same data-tab / data-panel pair in journeymro.js — the class only decides how it looks.

.tabs — labelled
Stock cover across 14 sites, weighted by criticality.
.sv7-ticks — unlabelled, where the sections are titled elsewhere
.seg and .pill
Critical × Insurance Consumable
05

Cards & lists

A card is the frame's hairline again. An empty media area gets a diagonal hatch rather than a flat fill — it reads as "space reserved" instead of "nothing here", which matters when the real content is a chart that has not loaded.

.svc-grid — master / detail
01

Master data audit

What the ERP says you hold, against what the site actually holds — and the gap costed.

InputItem master, receipts, issues, 24 months
OutputCosted gap register, cleansing rules, an owner per rule
Not forSites without transaction history
Lists — the bullet is a 1px dash, never a disc
  • Costed gap register — every variance with a dollar figure
  • Cleansing rules — written to be run again next quarter
  • An owner per rule — no orphan actions
  1. Pull 24 months of receipts and issues.
  2. Reconcile against the item master.
  3. Cost the variance and rank it.
06

Overlays

A dialog is a panel of the frame that happens to float: same hairline, no radius, and rules running between its sections rather than boxes around them. Escape, the backdrop and any [data-dialog-close] all close it; focus returns to whatever opened it.

.svc7-dialog
.viz-tip — tooltip
Week 32 · 2026
On hand1,184
Reorder point860
Forecast1,020
07

Feedback

.callout — a 2px left rule and nothing else
Neutral. Context a reader needs but did not ask for.
Information. The accent rule. Use it for the thing that makes the rest make sense.
Warning. Something that will bite later if ignored now.
Danger. This is already wrong.
No tinted box. The colour of the rule is the entire signal. A filled panel behind a callout fights the grid background and, in the light theme, turns into a highlighter pen.
.badge and .tier
Draft Active In stock Low Stockout New Tier A Tier B Tier C
Loading and empty states
Skeleton
No movements recorded

This part has no receipts or issues in the selected window. Widen the range or check the site filter.

.toast
Export queued
14,203 rows. You will get an email when it is ready.
Saved
Reorder points written back to the item master.
Upload rejected
Column LEAD_TIME is missing from the file.