Every primitive earns a visible job: structure the page, label a state, carry an action, or make data readable on mobile.
01
Primary commands use verb-plus-object copy, visible focus, and a minimum 44px tap target.
02
InlineLink is for sentence-level destinations. EyebrowLink is a quiet section CTA. Both must describe the destination.
Read the design-system standard before creating local UI.
Component library audit →Dark sections use accessible inline links without relying on color alone.
Return to style index →03
Passive chips describe. Interactive chips link — enforces 44px tap.
04
Badge reports generic status. Pill names trigger taxonomy. Callout explains consequence in text, not color alone.
Design decision
Audit gate
05
Surface primitive. Variants × padding × interactive.
bg-surface border-edge, non-interactive.
bg-surface-muted — subdued card on white.
bg-surface-accent border-brand/20.
bg-ink — inverted card on any surface.
Hover lifts, focus rings, no underline.
interactive={true} without href/to.
06
Measure-enforced long-form wrapper. Three sizes.
Small prose. Used for sidebar explanations or footnotes. Max 65ch measure.
Links render in brand. Strong pushes weight without color shift.
Default body prose. The workhorse. 16px base, 1.625 line-height, 65ch measure.
Two paragraphs here test the inter-paragraph rhythm. Check descenders and ascenders read cleanly.
Large prose. For hero intros and primary content that needs weight. 18px base.
07
Section openers carry scan order: short label, literal heading, and one explanatory lede.
Default — center, h2
The landing-page default. max-w-xl, mx-auto.
align=left, as=h1
For sub-pages where the SectionHeader IS the page title.
Dark
dark prop flips all tokens for bg-ink sections.
08
Mono uppercase label. The atom that signals what's about to be said.
Section label
Another label
When
So I get
Section label
Text with inline eyebrow inside prose.
09
Vertical stack with a fixed-token gap. Replaces ad-hoc space-y-*.
tight (12px)
Label + value pair
Same idea, close together
Third line, still tight
base (24px)
Sibling block A
Sibling block B
Sibling block C
loose (48px)
Distinct concept A
Distinct concept B
10
Mono number + label. bare (default) or card variant. Replaces StatCard.
$25.8K
M12 Cumulative
Base case
M4
Break-even
Base case
$800
Monthly Burn
$25.8K
M12 Cumulative
Base case
M4
Break-even
$800
Monthly Burn
Fixed costs
94%
Uptime
30-day rolling
12ms
p95 latency
$0
Starting cash
Bootstrapped
11
Thin rule with optional eyebrow caption. Segments without nesting a Section.
12
Miller minus two enforced. Show 5, fold the rest.
13
Tables become readable cards on mobile, then regain cross-row comparison on desktop.
| Need | Primitive | Audit reason |
|---|---|---|
| Action | Button | Verb-plus-object labels and 44px targets. |
| Status | Badge / Pill | State stays readable without color. |
| Evidence | DataListTable | No horizontal squeeze at 375px. |
14
A prompt block turns reading into doing. Its copy must be self-contained and its controls must be keyboard reachable.
Put this to work
Copy this prompt. Paste into Claude, ChatGPT, or any AI assistant. The page context is already loaded — send it and get analysis tailored to your role.