← All Foundations

Canon

Colors

Every color you need, ready to copy. Black and white for structure. Opacity for hierarchy. Semantic colors when something needs attention.

Published January 8, 2026

Why so few colors?

More colors mean more decisions. We use black and white as the foundation, then adjust opacity to create hierarchy—no need to pick new shades. When you need to show success, error, or a warning, semantic colors do the work.

“Color communicates. Decoration distracts.”

Backgrounds

Four levels from pure black to subtle grey. Stack them to create depth—like layers of paper.

TokenValueDescription
--color-bg-pure#000000Pure black, the canvas
--color-bg-base#0a0a0aSlight lift for main surfaces
--color-bg-surface#111111Cards and elevated elements
--color-bg-elevated#1a1a1aModals and popovers

Foregrounds

Five text colors, all white at different opacities. Use brighter for headlines, dimmer for captions.

TokenValueContrastDescription
--color-fg-primaryrgba(255,255,255,1)21:1Headlines, emphasis
--color-fg-secondaryrgba(255,255,255,0.8)13.7:1Body text
--color-fg-tertiaryrgba(255,255,255,0.6)9.7:1Secondary information
--color-fg-mutedrgba(255,255,255,0.46)4.56:1Captions, hints
--color-fg-subtlergba(255,255,255,0.2)2.1:1Decorative only

WCAG Compliance: --color-fg-muted (4.56:1) meets AA for normal text. --color-fg-subtle should only be used for decorative elements.

Borders

Three border levels for separation and emphasis.

TokenValueDescription
--color-border-defaultrgba(255,255,255,0.1)Subtle separation
--color-border-emphasisrgba(255,255,255,0.2)Hover states
--color-border-strongrgba(255,255,255,0.3)Active states

Performance Lab Readability Palette

The CREATE SOMETHING Performance Lab communication layer uses a light operational palette. Use these tokens for buyer-facing and operator-facing surfaces that need immediate comprehension.

This is now a stable Canon layer, not a one-off property treatment. Use the palette when the interface must show workflow maps, trust boundaries, approval states, receipts, validation gates, or handoff evidence.

TokenValueUse
--color-performance-paper#f3f3f0Page canvas
--color-performance-court#e6e6e0Secondary bands and inactive states
--color-performance-panel#ffffffCards, panels, receipts
--color-performance-ink#090909Primary text and dark CTAs
--color-performance-muted#5e6268Secondary copy
--color-performance-muted#5e6268Low-emphasis labels
--color-performance-line#d7d7d2Hairline panel borders
--color-performance-line-strong#9c9c96Focused panel borders
--color-performance-signal#0057b8System/action accent
--color-performance-growth#007a4dGoverned run/wait states
--color-performance-risk#c62026Stop/block states

Do not use the clear palette as generic decoration. A clear surface should answer at least one operational question: what is mapped, what can run, what needs review, what is blocked, or what evidence proves the handoff.

Semantic Colors

Four colors that mean something: success, error, warning, info. Each comes with -muted and -border variants.

TokenValueUse
--color-success#22c55ePositive feedback
--color-error#ef4444Errors, destructive actions
--color-warning#f59e0bCaution states
--color-info#3b82f6Informational

Variants

Each semantic color has muted and border variants:

/* Success variants */
--color-success: #22c55e;
--color-success-muted: rgba(34, 197, 94, 0.1);
--color-success-border: rgba(34, 197, 94, 0.3);

/* Error variants */
--color-error: #ef4444;
--color-error-muted: rgba(239, 68, 68, 0.1);
--color-error-border: rgba(239, 68, 68, 0.3);

Interactive States

TokenValueUse
--color-hoverrgba(255,255,255,0.05)Hover backgrounds
--color-activergba(255,255,255,0.1)Active/pressed states
--color-focusrgba(255,255,255,0.5)Focus rings

Usage Example

.card {
  background: var(--color-bg-surface);
  border: 1px solid var(--color-border-default);
  color: var(--color-fg-secondary);
}

.card:hover {
  border-color: var(--color-border-emphasis);
  background: var(--color-hover);
}

.card-title {
  color: var(--color-fg-primary);
}

.card-meta {
  color: var(--color-fg-muted);
}