Colors
Rendered live from src/registry/style/base.css, the file the shadcn registry is generated from. Primary is the logo blue (#00549b).
Semantic tokens
Use these in components. They switch automatically in dark mode. Click a swatch to copy its variable.
Surfaces · Page, card and popover surfaces with their text. Elevation order: background < card < popover.
--backgroundLight #f1f6fa
Dark #17181a
--foregroundLight #29323d
Dark #b6bbc3
--cardLight #f5f8fa
Dark #1d1e1f
--card-foregroundLight #13171c
Dark #f5f7fa
--popoverLight #ffffff
Dark #2e2f30
--popover-foregroundLight #1b2328
Dark #e2e4e5
Actions · Buttons and emphasis: primary, secondary, accent, destructive.
--primaryLogo blue
Light #00549b
Dark #6da5e5
--primary-foregroundLight #ffffff
Dark #050b12
--secondaryLight #dce3e9
Dark #2e363e
--secondary-foregroundLight #464e53
Dark #f5f7fa
--accentLight #dce3e9
Dark #424447
--accent-foregroundLight #1b2328
Dark #eef2f5
--destructiveAA as text, also on a /10 tint
Light #ba2b2b
Dark #ff7e76
--destructive-foregroundLight #ffffff
Dark #050b12
Status · Approval states. Use as text/icons, as a /10 tint behind that text, or as a solid fill with its foreground.
--successApproved, complete
Light #21763c
Dark #62c37a
--success-foregroundLight #ffffff
Dark #050b12
--warningPending, needs attention
Light #915c08
Dark #eeb154
--warning-foregroundLight #ffffff
Dark #050b12
--infoNeutral notice
Light #006c9d
Dark #5eb6e6
--info-foregroundLight #ffffff
Dark #050b12
Content · Subdued surfaces and secondary text.
--mutedLight #dee6ed
Dark #252628
--muted-foregroundAA (4.5:1) on every surface
Light #5d6773
Dark #9ea6ac
Form · Borders, inputs and focus rings.
--borderDecorative dividers only
Light #d6d9dd
Dark #383b3e
--inputControl borders, 3:1
Light #848a90
Dark #6e7276
--ringLight #3e80c7
Dark #6da5e5
Sidebar · Navigation sidebar surfaces.
--sidebarLight #eef2f5
Dark #17181a
--sidebar-foregroundLight #3b3c3e
Dark #b6bbc3
--sidebar-primaryLight #00549b
Dark #6da5e5
--sidebar-primary-foregroundLight #fbfbfb
Dark #050b12
--sidebar-accentLight #d4e4f6
Dark #2e363e
--sidebar-accent-foregroundLight #012a52
Dark #f5f7fa
--sidebar-borderLight #dadee3
Dark #383b3e
--sidebar-ringLight #3e80c7
Dark #6da5e5
Charts · Data-visualization series. Distinct hues, alternating lightness, each 3:1 against surfaces. Always pair with labels or markers.
--chart-1Light #00549b
Dark #6da5e5
--chart-2Light #ba7917
Dark #fac871
--chart-3Light #703396
Dark #a86fcf
--chart-4Light #14938d
Dark #77e0d3
--chart-5Light #b6322b
Dark #ea6c5a
Status
Approval states use the status tokens three ways: as text with a /10 tint behind it (badges, alerts), as a solid fill with its foreground (primary emphasis), or as plain text and icons. Never rely on color alone: always pair it with a label or icon.
--success--warning--info--destructiveContrast check
WCAG ratios computed from the resolved values. Text needs 4.5:1 (AA); UI components and chart colors need 3:1. The same pairs run in CI (pnpm tokens:check), so a failing value can't be merged.
| Pair | Needs | Light | Dark |
|---|---|---|---|
foreground on background | Text · 4.5:1 | 11.93:1 · AAA | 9.21:1 · AAA |
foreground on card | Text · 4.5:1 | 12.17:1 · AAA | 8.65:1 · AAA |
foreground on popover | Text · 4.5:1 | 12.98:1 · AAA | 6.95:1 · Pass |
card-foreground on card | Text · 4.5:1 | 16.89:1 · AAA | 15.56:1 · AAA |
popover-foreground on popover | Text · 4.5:1 | 15.94:1 · AAA | 10.51:1 · AAA |
primary-foreground on primary | Text · 4.5:1 | 7.66:1 · AAA | 7.69:1 · AAA |
secondary-foreground on secondary | Text · 4.5:1 | 6.55:1 · Pass | 11.42:1 · AAA |
accent-foreground on accent | Text · 4.5:1 | 12.30:1 · AAA | 8.68:1 · AAA |
muted-foreground on background | Text · 4.5:1 | 5.27:1 · Pass | 7.18:1 · AAA |
muted-foreground on card | Text · 4.5:1 | 5.38:1 · Pass | 6.75:1 · Pass |
muted-foreground on popover | Text · 4.5:1 | 5.74:1 · Pass | 5.42:1 · Pass |
muted-foreground on muted | Text · 4.5:1 | 4.55:1 · Pass | 6.12:1 · Pass |
muted-foreground on sidebar | Text · 4.5:1 | 5.10:1 · Pass | 7.18:1 · AAA |
primary on background | Text · 4.5:1 | 7.04:1 · AAA | 6.91:1 · Pass |
destructive-foreground on destructive | Text · 4.5:1 | 6.04:1 · Pass | 7.99:1 · AAA |
destructive on background | Text · 4.5:1 | 5.55:1 · Pass | 7.17:1 · AAA |
destructive on card | Text · 4.5:1 | 5.67:1 · Pass | 6.74:1 · Pass |
destructive on popover | Text · 4.5:1 | 6.04:1 · Pass | 5.41:1 · Pass |
destructive on destructive/10 over card | Text · 4.5:1 | 4.85:1 · Pass | 5.76:1 · Pass |
destructive on destructive/10 over popover | Text · 4.5:1 | 5.16:1 · Pass | 4.61:1 · Pass |
success-foreground on success | Text · 4.5:1 | 5.67:1 · Pass | 9.07:1 · AAA |
success on background | Text · 4.5:1 | 5.22:1 · Pass | 8.14:1 · AAA |
success on card | Text · 4.5:1 | 5.32:1 · Pass | 7.65:1 · AAA |
success on popover | Text · 4.5:1 | 5.67:1 · Pass | 6.15:1 · Pass |
success on success/10 over card | Text · 4.5:1 | 4.65:1 · Pass | 6.40:1 · Pass |
success on success/10 over popover | Text · 4.5:1 | 4.94:1 · Pass | 5.11:1 · Pass |
warning-foreground on warning | Text · 4.5:1 | 5.65:1 · Pass | 10.42:1 · AAA |
warning on background | Text · 4.5:1 | 5.19:1 · Pass | 9.35:1 · AAA |
warning on card | Text · 4.5:1 | 5.29:1 · Pass | 8.79:1 · AAA |
warning on popover | Text · 4.5:1 | 5.65:1 · Pass | 7.06:1 · AAA |
warning on warning/10 over card | Text · 4.5:1 | 4.63:1 · Pass | 7.22:1 · AAA |
warning on warning/10 over popover | Text · 4.5:1 | 4.92:1 · Pass | 5.75:1 · Pass |
info-foreground on info | Text · 4.5:1 | 5.78:1 · Pass | 8.75:1 · AAA |
info on background | Text · 4.5:1 | 5.31:1 · Pass | 7.85:1 · AAA |
info on card | Text · 4.5:1 | 5.42:1 · Pass | 7.38:1 · AAA |
info on popover | Text · 4.5:1 | 5.78:1 · Pass | 5.93:1 · Pass |
info on info/10 over card | Text · 4.5:1 | 4.70:1 · Pass | 6.19:1 · Pass |
info on info/10 over popover | Text · 4.5:1 | 5.00:1 · Pass | 4.95:1 · Pass |
destructive on destructive/10 (dark /20) over card | Text · 4.5:1 | 4.85:1 · Pass | 4.77:1 · Pass |
sidebar-foreground on sidebar | Text · 4.5:1 | 9.76:1 · AAA | 9.21:1 · AAA |
sidebar-primary-foreground on sidebar-primary | Text · 4.5:1 | 7.40:1 · AAA | 7.69:1 · AAA |
sidebar-accent-foreground on sidebar-accent | Text · 4.5:1 | 11.16:1 · AAA | 11.42:1 · AAA |
ring on background | UI / graphics · 3:1 | 3.77:1 · Pass | 6.91:1 · Pass |
ring on card | UI / graphics · 3:1 | 3.85:1 · Pass | 6.49:1 · Pass |
input on background | UI / graphics · 3:1 | 3.21:1 · Pass | 3.67:1 · Pass |
input on card | UI / graphics · 3:1 | 3.28:1 · Pass | 3.44:1 · Pass |
sidebar-primary on sidebar | UI / graphics · 3:1 | 6.80:1 · Pass | 6.91:1 · Pass |
chart-1 on background | UI / graphics · 3:1 | 7.04:1 · Pass | 6.91:1 · Pass |
chart-1 on card | UI / graphics · 3:1 | 7.18:1 · Pass | 6.49:1 · Pass |
chart-2 on background | UI / graphics · 3:1 | 3.30:1 · Pass | 11.50:1 · Pass |
chart-2 on card | UI / graphics · 3:1 | 3.37:1 · Pass | 10.80:1 · Pass |
chart-3 on background | UI / graphics · 3:1 | 7.43:1 · Pass | 4.95:1 · Pass |
chart-3 on card | UI / graphics · 3:1 | 7.58:1 · Pass | 4.65:1 · Pass |
chart-4 on background | UI / graphics · 3:1 | 3.46:1 · Pass | 11.33:1 · Pass |
chart-4 on card | UI / graphics · 3:1 | 3.52:1 · Pass | 10.64:1 · Pass |
chart-5 on background | UI / graphics · 3:1 | 5.52:1 · Pass | 5.75:1 · Pass |
chart-5 on card | UI / graphics · 3:1 | 5.63:1 · Pass | 5.41:1 · Pass |
Shape & elevation
Shape · Corner radius and base letter-spacing.
--radiuslg tier; the rest of the scale is derived | 0.5rem | |
--tracking-baseLatin only; Ethiopic text resets to normal | -0.01em |
Elevation · Three steps. In dark mode surface lightness carries elevation; shadows only reinforce it.
--elevation-smRaised in place: active tab, inset panel | 0 1px 2px 0 hsl(220 30% 15% / 0.06), 0 1px 3px 0 hsl(220 30% 15% / 0.08) dark: 0 1px 2px 0 hsl(0 0% 0% / 0.4) | |
--elevation-mdFloating: menus, popovers, tooltips | 0 2px 4px -1px hsl(220 30% 15% / 0.08), 0 4px 8px -2px hsl(220 30% 15% / 0.1) dark: 0 4px 8px -2px hsl(0 0% 0% / 0.5) | |
--elevation-lgOverlays: sheets, dialogs, toasts | 0 4px 6px -2px hsl(220 30% 15% / 0.08), 0 12px 24px -4px hsl(220 30% 15% / 0.14) dark: 0 12px 24px -4px hsl(0 0% 0% / 0.6) |