Foundations

Tokens

Every color, size, radius, shadow, and duration is a CSS custom property on :root. Dark mode overrides those values under :root[data-theme="dark"]. Components read tokens — they never hardcode values.

Animation

Spring easing for entrances. Standard ease for micro-interactions. Four duration tiers from snappy to deliberate.

Easings
--ease-springcubic-bezier(0.16, 1, 0.3, 1) — overshoots slightly, feels alive
--ease-outease-out — clean deceleration
--ease-standardease — general-purpose transitions
Durations
--duration-fast0.15s — hover states, micro color changes
--duration-base0.22s — filter entrances, focus rings
--duration-moderate0.30s — modals, expandable regions
--duration-slow0.40s — page transitions, large surfaces

Colors

A warm neutral base with a cobalt brand, green reserved strictly for success/trust states, orange-red danger, and categorical data colors. All hues share a muted, slightly desaturated quality. Toggle the theme in the sidebar to see dark values.

Surfaces
Surface
--surface
Surface Subtle
--surface-subtle
Surface Page
--surface-page
Surface Muted
--surface-muted
Surface Inset
--surface-inset
Borders
Border
--border
Border Light
--border-light
Border Strong
--border-strong
Border Dashed
--border-dashed
Text
Primary
--text-primary
Secondary
--text-secondary
Tertiary
--text-tertiary
Disabled
--text-disabled
Inverse
--text-inverse
Brand — Cobalt
Brand
--brand
Brand Light
--brand-light
Brand Mid
--brand-mid
Brand Dark
--brand-dark
Logo mark
--logo
Status — Success (Green, reserved)
Success
--success
Success Light
--success-light
Success Mid
--success-mid
Success Dark
--success-dark
Status — Danger
Danger
--danger
Danger Light
--danger-light
Danger Mid
--danger-mid
Status — Warning
Warning
--warning
Warning Light
--warning-light
Warning Mid
--warning-mid
Status — Info & Accent
Info
--info
Info Light
--info-light
Info Mid
--info-mid
Accent
--accent
Accent Light
--accent-light
Data & Charts
Inflow
--data-inflow
Outflow
--data-outflow
Target
--data-target
Chart Blue
--chart-blue
Chart Azure
--chart-azure
Chart Amber
--chart-amber
Chart Violet
--chart-violet
Color conventions

Keep accents semantic, not decorative — every color should mean something:

Radius

Six steps from sharp to pill. --radius (10px) is the default card radius; --radius-md (8px) is the default container radius.

--radius-xs
4px
--radius-sm
6px
--radius-md
8px
--radius
10px
--radius-lg
12px
--radius-full
9999px

Shadows

Subtle, layered shadows — never solid black, always transparent washes. Shadow tokens lift to higher opacity in dark mode to stay legible against the dark surface.

--shadow-card
--shadow-nav
--shadow-toggle
--shadow-hover
--shadow-modal
--shadow-dropdown
--shadow-overlay

Spacing

A tight scale built for dense UI. Px-named so the value is always obvious. Used for padding, gap, margin, and any other length.

--space-22px
--space-44px
--space-66px
--space-88px
--space-1010px
--space-1212px
--space-1616px
--space-2020px
--space-2424px
--space-3232px
--space-4848px
--space-6464px

Typography

Bricolage Grotesque for headings, display, and numerics. DM Sans for all body and UI text. Both loaded from Google Fonts in a single request.

Font Families
--font-heading
Bricolage Grotesque
Display · Numerics · Headings · Slider values
--font-body
DM Sans
Body · Labels · UI text · Captions
Size Scale
--text-5xl
48px
Sg
--text-4xl
34px
The quick brown fox
--text-3xl
26px
The quick brown fox
--text-2xl
20px
The quick brown fox
--text-xl
18px
The quick brown fox
--text-lg
16px
The quick brown fox
--text-base
13px
The quick brown fox jumps over the lazy dog
--text-md
12px
The quick brown fox jumps over the lazy dog
--text-sm
11px
Label caps · Section heading
--text-xs
10px
Caption · Overline
--text-2xs
9px
Tag · Badge
Weights
--weight-lightLight 300 — light by definition
--weight-regularRegular 400 — body default
--weight-mediumMedium 500 — buttons, links
--weight-semiboldSemibold 600 — section headings
--weight-boldBold 700 — page titles, hero