Design System
ROZO's design system — monochrome, infrastructure-grade, built for stablecoin payments. Light theme only; no brand color by design. Design tokens plus the rules for using them.
Version:
alpha. Tokens may change without notice during alpha. Hex values are sRGB.
Overview
ROZO is a design system for building consistent, infrastructure-grade interfaces for stablecoin payments. The aesthetic is monochrome, hairline, and quiet: plenty of whitespace, near-black on white, and structure carried by 1px borders rather than shadows. The test for any choice is "would this feel right on a Bloomberg terminal or a switch's admin page?" Prioritize readability, density that breathes, and restraint. Use weight, space, and contrast — not color — to signal importance.
This is the single theme. There is no dark theme and no brand color by design; black (#0a0a0a) is the accent. Light-only is a deliberate alpha constraint: financial data needs high-fidelity contrast that is hard to guarantee across a dark palette without a dedicated second token set, so dark mode is deferred to a later version rather than half-done now.
Colors
ROZO is monochrome-first. There is no blue, no purple, no brand hue — if you reach for a color to make something feel important, that is the wrong choice; use weight, space, or contrast instead.
Core neutrals
background
#ffffff
Flat white page background
background-alt
#fafafa
Cooler page chrome behind cards
foreground
#0a0a0a
Primary text, icons, primary action
card
#fcfcfc
Surface that must read as separate from the page
muted / secondary
#f5f5f5
Quiet fills, hover tints
muted-foreground
#525252
Secondary text: metadata, captions, column headers
border
#e5e5e5
The 1px hairline that carries structure ~95% of the time
border-strong
#d4d4d4
A firmer edge — hover borders and inputs that need more definition
Action & accent
primary and accent share the value #0a0a0a / #ffffff on purpose, but mean different things: primary is the fill of the one primary action on a screen (the black button); accent is the near-black used to emphasize a word, a number, or an active state. Keep them as separate tokens so either can evolve without disturbing the other.
input (#e5e5e5) is intentionally the same value as border. It is a distinct token so form-control edges can be tuned independently from structural hairlines later — reference input on form elements, border on everything structural.
ring (#0a0a0a) is the focus color (see Focus).
Neutral scale
The neutral-* scale runs light to near-black for tables, dividers, and opaque fills.
50
100
200
300
400
500
600
700
800
900
#fafafa
#f5f5f5
#e5e5e5
#d4d4d4
#a3a3a3
#737373
#525252
#404040
#262626
#0a0a0a
Status colors
Status colors are functional only and rare: success green (#15803d) for settled, warning amber (#a16207) for action required, destructive red (#b91c1c) for hard failure or destructive confirmation. They appear as a single dot, a thin underline, or a word — never as a fill behind a card or chip. No gradients, no glows, no neon, no glass. If a surface must read as separate from the page, give it a 1px solid #e5e5e5 border and a #fcfcfc background.
Contrast
All text/background pairs hold WCAG AA (≥ 4.5:1 for body, ≥ 3:1 for large/UI text) on white.
foreground #0a0a0a
background #ffffff
20.1:1
AAA
muted-foreground #525252
background #ffffff
7.6:1
AAA
muted-foreground #525252
muted #f5f5f5
6.9:1
AA
success #15803d
background #ffffff
4.8:1
AA
warning #a16207
background #ffffff
4.8:1
AA
destructive #b91c1c
background #ffffff
5.9:1
AA
neutral-400 #a3a3a3 (disabled)
background #ffffff
2.5:1
UI only — never body text
Typography
Inter sets the entire UI and prose stack; JetBrains Mono is reserved for code, transaction hashes, addresses, and amount strings on developer surfaces. We never reach for a display font, a serif, or a script. For CJK, fall back to the system CJK stack ("PingFang SC", "Microsoft YaHei", "Hiragino Sans", sans-serif) — Inter does not cover Han glyphs.
display
Inter
64 / 70
600
-1.28px
h1
Inter
48 / 53
600
-0.72px
h2
Inter
32 / 40
600
-0.48px
h3
Inter
24 / 30
600
-0.12px
h4
Inter
20 / 25
600
-0.1px
body
Inter
16 / 26
400
0
small
Inter
14 / 20
400
0
caption
Inter
12 / 16
400
0
eyebrow
Inter
12 / 16
500
+0.96px, uppercase
mono-14/13/12
JetBrains Mono
14·13·12 / 20·20·16
400
0
Headings (
display64 →h420) title pages and sections; tracking tightens as size grows, and headings cap at 64px — confident, not oversized.Body (16px) and small (14px) cover most text. Letter-spacing is
0below headings.Eyebrow is the 12px uppercase,
+0.96px-tracked, medium-weight label used over KPIs and section headers.Mono pairs JetBrains Mono for hashes, addresses, and amounts; always use tabular figures (
font-variant-numeric: tabular-nums) where numbers must align — in tables and on dashboards.
Weight does the work of color: a 600-weight word inside a 400-weight paragraph is how we emphasize. Keep to two weights per view (400 body + 600 emphasis); reserve 700/800 for marketing surfaces.
Layout
Spacing follows a 4px scale: 4, 8, 12, 16, 24, 32, 48, 64px. Keep a three-step rhythm: 8px inside a group, 16px between groups, 32–48px between sections. Do not invent 18, 22, 40. Cards pad 24px (16px compact, 32px hero). Center content in a 12-column grid, 24px gutters, 1120–1200px max. Dashboards breathe — a table row is 56px tall, not 36. Sidebars are 240–280px fixed with a hairline right border; top bars are 56–64px fixed with a hairline bottom border. One primary action per screen; everything else is secondary or tertiary.
Breakpoints. sm 640 · md 768 · lg 1024 · xl 1280 · 2xl 1536. The fixed sidebar collapses to an off-canvas drawer below lg; the 12-column grid drops to 8 columns at md and a single column below sm. Tables become horizontally scrollable rather than reflowing below md.
Stacking (z-index). Use named layers, never ad-hoc values: base 0 · dropdown 1000 · sticky 1100 · overlay 1200 · modal 1300 · toast 1400 · tooltip 1500.
Elevation & depth
Hierarchy comes from tonal surfaces and 1px borders first, so shadows stay essentially absent. The default elevation of a card is its border.
Raised cards:
none(border only)Floating menu / popover (ceiling):
0 4px 12px rgba(10,10,10,0.06), 0 0 0 1px rgba(10,10,10,0.04)Hairline lift:
0 1px 0 0 rgba(10,10,10,0.04)
Never wrap a card in a soft drop shadow; if it needs to separate, use a border.
Motion
Fast, neutral, almost invisible. 120ms for hover, 180ms for state changes, 260ms for layered transitions like a modal entering. Easing is cubic-bezier(0.2, 0, 0, 1). No bounce, no spring, no overshoot, no parallax, no scroll-jacking, no decorative looping. Loading is a 1px progress bar or a thin spinner — never a shimmer skeleton. Honor prefers-reduced-motion by dropping nonessential motion.
Shapes
Radii stay tight and consistent within a view: 6px for everyday controls (buttons, inputs, search), 8px available for secondary surfaces, 12–16px for cards, 9999px reserved for small status chips and avatars only. Never wrap a whole card in a pill, and never mix rounded and sharp corners in one view.
Token
xs
sm
md
lg
xl
pill
Value
4px
6px
8px
12px
16px
9999px
Components
The component tokens give ready-to-use values drawn from this theme.
Primary button: solid
#0a0a0afill, white label, 6px radius, 40px tall — the single most important action on a view. Hover darkens to#262626.Secondary button: white fill,
#e5e5e5border, gains a#0a0a0aborder on hover.Ghost button: transparent, tints with
mutedon hover, for low-emphasis actions.Destructive button: solid
#b91c1cfill, white text, for hard/destructive actions.Sizes are
sm32px (12px horizontal padding) andlg48px (20px padding) around the default 40px medium (16px padding). Icon-only buttons are square at each height (32/40/48px).Input: white fill,
#e5e5e5border, 6px radius, 40px tall; on focus, the border goes to#0a0a0aand the standard focus ring is applied (see Focus).Card: white /
#fcfcfc, 1px#e5e5e5border, 12–16px radius, no shadow, 24–32px padding. Title top-left, actions top-right, content below. Interactive (clickable) cards shift their background tobackground-alton hover — no shadow, no scale.Badge / status: the status is carried by a
6px × 6pxdot withborder-radius: 50%(a circle — unrelated to theroundedscale); the text stays neutral. No fill, no colored border.Table: header row on
muted(#f5f5f5), 1pxborderrow separators, 12–16px cell padding, 56px row height. Numbers and status align right (JetBrains Mono, tabular figures); text and dates align left.
Focus
There is exactly one focus treatment. Use the shadows.focus token everywhere — a thin black ring on a white gap:
It is always visible at :focus-visible and never removed. (Earlier drafts described a soft rgba(10,10,10,0.08) ring on inputs — that is deprecated; the double-ring above is the only focus style.)
Disabled uses a muted fill, neutral-400 text, and a not-allowed cursor.
Using tokens
These tokens are meant to be copied straight into a project. Two ways to consume them:
CSS custom properties
Name variables --rozo-<group>-<name>:
Tailwind config
Component example
A primary button, built only from tokens:
Voice & content
The voice is declarative, technical, and quiet. ROZO does not sell; it states. Copy reads like an SDK reference or a hardware spec sheet, not a Web3 landing page.
Sentence case for everything — buttons, headings, menu items, titles. ("Create invoice," not "Create Invoice.") Product names and acronyms keep canonical case: ROZO, USDC, EVM, SDK, POS. Short status chips may use Title Case ("Settled", "Pending").
Name actions with a verb and a noun (
Send payment,Delete member), neverConfirm,OK, or a bare verb.Write errors as what happened plus where:
Transfer failed. Insufficient gas on Base.Status reads as fact, not celebration:
Settled · $48.20 USDC, never "🎉 Payment successful!".Empty states point to the first action:
Connect a wallet to continue.In-progress states use the present participle with an ellipsis:
Settling…,Routing….Prefer the vocabulary of rails: settle, route, intent, rail, chain, net, clear. Avoid seamless, revolutionary, next-gen, empower, unleash, and crypto slang (
gm,wagmi,ape in).Use numerals (
3 chains), the en dash for ranges (5–8 sec), ISO currency codes (USDC, USDT). Noplease, no marketing superlatives.No emoji. Anywhere. No exclamation points except in destructive confirmations ("This cannot be undone.").
Formatting. Amounts: $48.20 USDC (two decimals, ISO code after, space before). Addresses: truncate as first-6 + last-4 (0x49CD…eEe0). Dates: ISO-like 2026-06-21 or Jun 21, 2026; times in 24h with timezone. Percentages: one decimal (9.8% APY).
Do's and don'ts
Use the gray scale to rank information:
foregroundfor primary text,muted-foregroundfor secondary,neutral-400for disabled.Emphasize with weight (600), not color or highlight.
Let a 1px border be the default elevation; reserve shadow for floating menus only.
Hold WCAG AA contrast (4.5:1 for body text).
Show the focus ring on every interactive element at
:focus-visible; never remove an outline without a visible replacement.Use the typography and spacing tokens instead of hand-setting size, line height, weight, or odd pixel gaps.
Don't reach for a brand color, a gradient, a glow, or a glass effect — there is no brand color.
Don't signal status with a fill; the dot, underline, or word carries it.
Don't mix rounded and sharp corners, or more than two font weights, in one view.
Don't use decorative icons or emoji; every icon has a job (status, action, or category).
Last updated