Foundations

Colors

The system uses CSS tokens with light and dark variants. Never hardcode hex — always use the token so everything respects the active mode.

Updated Sep 30, 2026 by Juan Pablo Turina

Brand

Light#3e4fe0
Dark#3e4fe0
Primary
var(--primary)

Main CTA, links, active states. One Primary per screen.

Light#fafafa
Dark#ffffff
Primary foreground
var(--primary-foreground)

Text on Primary surfaces.

Light#3e4fe0
Dark#7181ff
Primary text
var(--primary-text)

Primary as INK — links, ghost buttons, emphasis. It lifts in dark because one indigo cannot both carry white on a button and read as text on a dark ground; the two requirements do not overlap.

Surfaces

Light#ffffff
Dark#0a0a0a
Background
var(--background)

App base surface.

Light#ffffff
Dark#171717
Card
var(--card)

Containers elevated over the background.

Light#f5f5f5
Dark#262626
Muted
var(--muted)

Subtle backgrounds: TabsList, alternating rows, code blocks.

Light#f5f5f5
Dark#404040
Accent
var(--accent)

Hover states and selection in menus.

Light#ffffff
Dark#262626
Popover
var(--popover)

Dropdowns, tooltip content, context menus.

Text

Light#0a0a0a
Dark#fafafa
Foreground
var(--foreground)

Primary text.

Light#737373
Dark#a3a3a3
Muted foreground
var(--muted-foreground)

Secondary text, hints, low-hierarchy labels.

Borders & focus

Light#e5e5e5
Darkrgb(255 255 255 / 10%)
Border
var(--border)

Card borders, separators.

Light#e5e5e5
Darkrgb(255 255 255 / 15%)
Input
var(--input)

Input and toggle borders.

Light#737373
Dark#a3a3a3
Ring
var(--ring)

Focus ring.

Semantic

Light#dc2626
Dark#f87171
Destructive
var(--destructive)

Destructive actions, errors, critical alerts.

Light#15803d
Dark#4ade80
Success
var(--success)

Confirmations, approved states.

Light#ca8a04
Dark#facc15
Warning
var(--warning)

Cautions and states that need attention but are not errors. Yellow, imported from production — amber is not in the system.

Status tones

Two StatusBadge states with a colour of their own, not a system meaning. Use them only for those states and their charts; never for a series, never as a caution.

Light#155dfc
Dark#50a2ff
Status info
var(--status-info)

The blue of a StatusBadge state: Created, and the badge info tone. #155dfc in light (what Tailwind v4 blue-600 renders), #50a2ff in dark. Not the info of an Alert or Toast, which is --primary-text.

Light#ca3500
Dark#ff8904
Status refunded
var(--status-refunded)

The orange of the Refunded state. #ca3500 in light (Tailwind v4 orange-700), #ff8904 in dark. A state, never a caution: caution is --warning.

Series

Which entity a mark is: a market, a method, a currency, a provider. Six slots and Other, assigned by entity and never by rank: each entity takes its slot by its place in a fixed catalogue, most common first, and past the sixth it goes in a table. A series never impersonates a state, and status and identity never share a chart. The 20-colour --chart-* set stays for screens that mirror production.

Light#3e4fe0
Dark#556efb
Series 1
var(--series-1)

The brand indigo. A chart with one series is always this slot.

Light#eb6834
Dark#d95926
Series 2
var(--series-2)

Orange. Identity only: it never stands for a caution.

Light#1baf7a
Dark#199e70
Series 3
var(--series-3)

Teal. Identity only, 14.5 (OKLab) from --success. Under 3:1 in light: show its labels.

Light#eda100
Dark#c98500
Series 4
var(--series-4)

Gold, the one amber the system allows, as a declared exception. Identity only, never a caution: the caution tone is --warning, and this slot never shares a chart with a status. Under 3:1 in light: show its labels.

Light#e87ba4
Dark#d55181
Series 5
var(--series-5)

Pink. Under 3:1 in light: show its labels.

Light#2a78d6
Dark#3987e5
Series 6
var(--series-6)

Blue.

Light#a3a3a3
Dark#525252
Series other
var(--series-other)

Other: the folded tail past the sixth entity. Always grey.

Usage

System rules when applying color on screen.

Do
  • Always use var(--token) so light and dark work automatically.
  • One Primary per screen — reserve it for the main action.
  • Semantics (Destructive / Success) only communicate real state, they don't decorate.
  • Muted foreground for hints, timestamps, and low-hierarchy labels.
Don't
  • Never hardcode #hex in components — breaks dark mode.
  • Don't use Destructive as visual accent — it loses meaning.
  • Don't mix Muted background with Muted foreground without checking contrast.
  • Don't invent new tokens without discussing — you lose consistency with the real DS.

Tailwind palette

The full 22-family × 11-shade Tailwind default palette is available in the framework. Click any swatch to copy its class name (bg-slate-500, text-blue-600, etc.).

Reach for tokens first.
For anything Dashboard-adjacent, default to the semantic tokens above — that's what makes light/dark and future theme changes work automatically. The raw palette is only for cases the tokens can't serve: chart series, illustrations, and one-off brand accents.
50
100
200
300
400
500
600
700
800
900
950
slate
gray
zinc
neutral
stone
red
orange
amber
yellow
lime
green
emerald
teal
cyan
sky
blue
indigo
violet
purple
fuchsia
pink
rose

Notes from the real DS

Slate vs neutral.
The official DS has 2 tokens (--accent, --input) defined with slate/100 and slate/200 when the Figma DS documents them in neutral. Here we use neutral (Figma source of truth). Watch out when porting to the real Dashboard.