01 · foundations
live for your theme

Color. Zinc neutrals, one accent.

Primitives are the atoms. Components consume only the semantic tokens below, never a primitive or a hex. The brand shifts per theme. Everything else is shared.

view .md
Neutrals · zinc
8 tokens
zinc-950
#09090B
bg.canvas
zinc-900
#18181B
bg.surface, small fills
zinc-800
#27272A
border.subtle
zinc-700
#3F3F46
border.strong
zinc-500
#71717A
a reference; light fg.muted is #68686F
zinc-400
#A1A1AA
fg.secondary
zinc-200
#E4E4E7
text on dark
zinc-50
#FAFAFA
fg.primary
Accents
7 tokens
violet-500
#7C6BFF
entrepta brand
violet-400
#9B8EFF
brand hover
indigo-400
#818CF8
status.info
emerald-500
#10B981
status.success
emerald-400
#34D399
soft success fg
amber-500
#F59E0B
status.warning
rose-500
#F43F5E
status.error
Surfaces
6 tokens

Cards sit on --bg-card, a hair above the canvas and defined by their border. Anything that covers the page, and code, sits on --bg-overlay. Fields sit on --bg-field. A zinc-900 area reads as a field of gray, so no component paints one.

--bg-canvas
-
the page
--bg-card
-
cards, a hair above the canvas
--bg-card-hover
-
a card under the pointer
--bg-overlay
-
menus, tooltips, code, dialogs, the palette, toasts
--bg-field
-
inputs, textareas, the box of a checkbox or switch
--bg-surface
-
zinc-900: small fills only, never an area
Finish
1 class, 3 tokens

Every surface has the same finish: near black underneath, the .sheen class for a brand glow in the top-left corner, and --edge-light, a line of light on the top edge, which --shadow-card and --shadow-overlay already carry. Put both on a surface of your own.

bg-card
sheen bg-card shadow-card
--sheen-tint
-
the brand glow in a corner, 9% dark and 4% light
--bg-surface-brand
-
the tint a highlighted row takes
Text and borders
5 tokens
--fg-primary
-
titles and body text
--fg-secondary
-
supporting text
--fg-muted
-
metadata, timestamps
--border-subtle
-
card and divider borders
--border-strong
-
inputs, hover borders
Brand
8 tokens

Every theme sets the brand and its two inks. The rest is mixed from --fg-brand with color-mix, so it follows any theme on its own. Switch the theme with the button in the corner and these repaint.

--fg-brand
-
fills, borders, glyphs, text 24px and up
--fg-brand-hover
-
the fill on hover
--fg-brand-text
-
brand-colored text below 24px
--fg-on-brand
-
text on a brand fill
--bg-surface-brand
-
the tint: soft badges, selected items
--border-brand
-
35% of the brand
--border-brand-strong
-
60%, a featured card on hover
--fg-brand-glow
-
50%, pulses and glows
Inks
measured live

Each ink on what it actually sits on, measured for the theme and mode you are in. The floors are what the contrast test enforces in all twelve combinations.

sampleinkonratiofloor
Aa 12px--fg-on-brand--fg-brand-4.5: text on a brand fill
Aa 12px--fg-brand-text--bg-canvas-4.5: brand text on the page
Aa 12px--fg-brand-text--bg-card-4.5: brand text on a card
Aa 12px--fg-brand-text--bg-surface-brand over --bg-canvas-5: brand text on the tint
Aa 12px--fg-primary--bg-canvas-4.5: body text
Aa 12px--fg-secondary--bg-card-4.5: secondary text on a card
Aa 12px--fg-muted--bg-canvas-4.5: metadata on the page
Aa 12px--fg-muted--bg-card-4.5: metadata on a card
Aa 12px--fg-muted--bg-overlay-4.5: metadata in a dialog
Aa 12px--status-success-fg--status-success-soft over --bg-canvas-4.5: a soft success badge
Aa 12px--status-error-fg--bg-card-4.5: a field error on a card
Chart palette
10 tokens

No fixed color. Each series is the brand's hue, turned in steps of 45°, at one lightness per mode that clears 3:1 on a card. Switch the theme and the palette follows. A result above or below zero uses the status colors and a sign instead.

--chart-1
-
the brand's hue
--chart-2
-
the brand's hue turned 45°
--chart-3
-
the brand's hue turned 90°
--chart-4
-
the brand's hue turned 135°
--chart-5
-
the brand's hue turned 180°
--chart-6
-
the brand's hue turned 225°
--chart-7
-
the brand's hue turned 270°
--chart-8
-
the brand's hue turned 315°
--chart-grid
-
horizontal grid lines only
--chart-axis
-
axis labels
Status
4 tokens
--status-success
-
synced, shipped
--status-warning
-
stale, partial
--status-error
-
error, denied
--status-info
-
loading, syncing
Active theme: entrepta, dark mode.