spnd / design system / v0.2

A quiet system for spending, written down.

SPND is a personal finance product built on restraint. The system values hierarchy over decoration, tabular numerals over illustration, and thin dividers over drop shadows. This codifies every token, component, and pattern that appeared in v0.1 — and extends them with the states, semantic roles, and variations the product needs to grow.

01 — Principles

Five rules that hold the system together

If a decision ever feels uncertain, fall back to these.

01 · Quiet by default

Color, shadow, and motion are spent carefully. Reach for a hairline before a card, a card before a shadow.

02 · Numbers are the hero

Every amount is tabular and right-aligned. Currency symbols are de-emphasized.

03 · Micro-labels

Tiny uppercase labels (10px / 0.15em) replace headings in dense contexts.

04 · Rows before cards

A divider-separated list carries the same meaning with a quarter of the visual weight.

05 · One accent at a time

Primary is slate; accent is reserved for positive progress and the single most important thing on a screen. If two things are accent-colored, one is wrong.

02 — Foundations / Color

Cool neutrals carry the interface; one muted accent earns attention.

A 12-step cool slate ramp plus a single sage accent. Semantic colors share the same chroma and lightness so nothing shouts.

Neutrals · Slate
Accent · Sage
Semantic roles
Positive
Within budget
#65816B
Warning
Near limit
#B08858
Negative
Over budget
#A1595A
Info
Pending
#5A7A9A
03 — Foundations / Typography

Inter for everything human, JetBrains Mono for everything counted.

Inter carries the interface. Monospace is reserved for technical metadata — hex codes, token names, transaction IDs — so real numbers (amounts) can keep Inter's tabular lining figures.

3xl
$2,847.50
48 · -0.025em · 700
2xl
Monthly summary
32 · 700
xl
Category breakdown
24 · 700
md
Whole Foods Market
16 · 600
caption
Groceries & Dining
11 · 500
eyebrow
Details
10 · .15em · 700
mono
txn_01K4A9VT3F
JetBrains · 13
04 — Foundations / Spacing

A 4-pixel base with 12 ramps.

Rows sit at sp-4. Section separation uses sp-7. Screen padding is sp-5 horizontal. Don't invent new values.

05 — Foundations / Radius

Sharp at small sizes, soft at large.

Icon wells and avatars are pill-shaped. Buttons and cards are lg (12px). Inputs md. Match the parent.

xs2 · hairlines
sm4 · chips
md8 · inputs
lg12 · buttons
xl16 · sheets
fullpills
06 — Foundations / Elevation

Five levels. Most things live at 0 or 1.

Elevation communicates floating, not importance. Sticky headers use 0 + hairline. Popovers use 4. In between is usually solvable with a border.

e-0flat
e-1card
e-2raised
e-3dropdown
e-4dialog
07 — Foundations / Iconography

Material Symbols — outlined, 400 weight, 20 optical size.

One family, one style. Filled variants reserved for selected/active states only.

storefrontmerchant
categorycategory
calendar_todaydate
credit_cardpayment
shopping_bagshopping
local_cafedining
directions_cartransport
homehousing
fitness_centerhealth
account_balance_walletbudget
receipt_longexpenses
edit_noteentry
settingssettings
searchsearch
tunefilter
commutecommute
08 — Components / Buttons

Primary is slate. Accent is for progress. Ghost is for dismiss.

Variants
States
default
hover
active
disabled
primary
secondary
ghost
09 — Components / Pills

Single-select chips in a horizontally-scrolling row.

.pill · 28px · radius full · sp-2 gap
10 — Components / Inputs

Bordered field or borderless in-row edit.

Merchant
11 — Components / List Rows

The workhorse of the whole system.

Every transaction, every settings item, every budget line is this row. Left: icon + title + secondary. Right: trailing value + meta.

shopping_bag
Whole Foods Market
Groceries & Dining
−$142.30
10:45 AM
directions_car
Shell Oil Station
Transportation
−$65.00
08:12 AM
local_cafe
Blue Bottle Coffee
Groceries & Dining
−$6.50
10:24 AM
12 — Components / Progress

Four pixels tall. Color communicates proximity to your limit.

Under 60% — positive42%
60–89% — neutral74%
90–99% — warning94%
Over budget — negative112%
13 — Patterns / Section Headers

Label + trailing hairline rule.

The most-used pattern in the system. Replaces h3 headers inside dense lists with near-zero vertical cost.

Today, Oct 24
Yesterday, Oct 23
Category spending
14 — Patterns / Filter Rows

One scope per row, stacked vertically.

When more than one filter axis is needed, stack rows rather than packing everything into a single scroller.

15 — Patterns / Amount Entry

Currency small and light, amount huge and tabular.

Amount
$142.30
$ — 28/300/muted · amount — 56/700/-0.04em/tabular
16 — Patterns / Budget Donut

160px. Four segments max. Center shows a percent.

Spent
63%
Housing · 40%
Food · 30%
Transport · 20%
Other · 10%
17 — Patterns / Empty States

Icon · one-line title · 28-char description · one action.

receipt_long
No expenses yet
Log your first purchase and SPND will start building your history.
18 — Guidelines / Voice & Numbers

Write like a line item. Count like an accountant.

Tone
Neutral, descriptive, never cheerful about money. "Under budget" is enough — skip "Great job!"
Case
Sentence case everywhere. Eyebrows are the only uppercase.
Currency
Symbol before amount, no space: $142.30. Two decimals, always.
Negatives
Minus sign (U+2212), not parentheses or red.
Dates
Relative first (Today, Yesterday), then Oct 24.
Merchants
Use the merchant's own capitalization. Fade out instead of truncating mid-word.
19 — Guidelines / Do & Don't

A few specific traps, called out.

$142.30
check_circleDo — $ smaller & lighter than amount
$142.30
cancelDon't — $ competing with digits
Food74%
check_circleDo — neutral fill for mid-range spend
Food74%
cancelDon't — rainbow "risk" gradients
spnd / spec canvas

Every token on one wall.

Neutral ramp

12 steps

Accent & semantic

muted
accent · sage
#65816B
positive
#65816B
warning
#B08858
negative
#A1595A

Type scale

Inter + Mono
$2,847.50
Category breakdown
Whole Foods Market
Groceries & Dining
Today, Oct 24
txn_01K4A9VT3F

Surface tokens

copy-paste
TokenLightDarkUse
--bg#FFFFFF#0B0F17page
--surface#F8FAFC#111826wells
--outline#E2E8F0#1F2A40borders
--fg#1E293B#E6EAF2text
--primary#334155#E6EAF2CTAs
--accent#65816B#93AE99progress

Radii

match parent
xs2
sm4
md8
lg12
xl16
full

Elevation

0 or 1
e-0
e-1
e-2
e-3
e-4
bg

Motion

3 durations
--dur-fast120mshover
--dur-base180mstransition
--dur-slow320msprogress
ease-out(.2,.8,.2,1)entrances
ease-std(.4,0,.2,1)default

List rows

workhorse
shopping_bag
Whole Foods Market
Groceries
−$142.30
10:45 AM
directions_car
Shell Oil
Transport
−$65.00
08:12 AM
local_cafe
Blue Bottle
Dining
−$6.50
10:24 AM

Donut

pattern
Spent
63%
spnd / playground

Live system.

Change a token on the left — the system recomputes everywhere.

Live screen · Expense historyreflects all tokens
account_circle
Expenses
search
Today, Oct 24
shopping_bag
Whole Foods
Groceries
−$142.30
directions_car
Shell
Transport
−$65.00
Budget left$1,500
Buttonsandbox
Amounttabular
Amount
$
Token readoutcomputed
Tweaks
Direction
Accent
Neutral
Appearance