← 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

Clear Communication Palette

The Ona-derived CREATE SOMETHING 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. Ona sets the clarity bar; CREATE SOMETHING owns the implementation language. Use the palette when the interface must show workflow maps, trust boundaries, approval states, receipts, validation gates, or handoff evidence.

TokenValueUse
--color-clear-porcelain#f9f9f9Page canvas
--color-clear-porcelain-soft#f2f2f2Secondary bands and inactive states
--color-clear-panel#ffffffCards, panels, receipts
--color-clear-onyx#0a0e19Primary text and dark CTAs
--color-clear-grey#636363Secondary copy
--color-clear-grey-quiet#818181Low-emphasis labels
--color-clear-border#e1e1e1Hairline panel borders
--color-clear-border-strong#cececeFocused panel borders
--color-clear-ocean#0048ffSystem/action accent
--color-clear-moss#1e3c2cGoverned run/wait states
--color-clear-stop#c41e3aStop/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);
}