Skip to content

Colour System

The colour system is defined entirely as CSS custom properties in docs/src/styles/tokens.css. All colours in interfaces must reference these tokens — never hardcode hex values.


Section accent triad

Three colours identify the three operational domains of the platform. The accent is the primary identity signal for interactive and active states.

DomainTokenHexBright variantUse
Operations--c-ops#3b82f6--c-ops-bright: #6ea8ffInfrastructure, system status, ops dashboard
Consulting--c-consulting#34c58a--c-consulting-bright: #5fe3a9Client work, consulting pages, portfolio
Admin--c-admin#f2913d--c-admin-bright: #ffb066Settings, configuration, admin tools

The default accent maps to Operations blue:

:root {
--accent: var(--c-ops);
--accent-bright: var(--c-ops-bright);
}

Apply per-section accent by setting data-section on the <html> element:

[data-section="ops"] { --accent: var(--c-ops); --accent-bright: var(--c-ops-bright); }
[data-section="consulting"] { --accent: var(--c-consulting); --accent-bright: var(--c-consulting-bright); }
[data-section="admin"] { --accent: var(--c-admin); --accent-bright: var(--c-admin-bright); }

Dark mode surface hierarchy

The dark theme uses a layered surface stack — each level is slightly lighter than the one beneath, creating a sense of physical depth without relying on shadows alone.

TokenHexPerceived depthUse
--bg#161a21Deepest — basePage background
--surface#1d222b+1 — raisedPrimary content panels, sidebar
--surface-2#232a35+2 — raised furtherNested panels, hover backgrounds
--surface-sink#161a21Same as --bgInset wells (code blocks, inputs) — same colour as bg creates depth illusion
--line#313a48Borders, dividers, hairlines
[data-theme="dark"] {
--bg: #161a21;
--surface: #1d222b;
--surface-2: #232a35;
--surface-sink: #161a21;
--line: #313a48;
}

Dark ink hierarchy

TokenHexUse
--ink#e7ebf3Primary text — headings, body
--ink-dim#9aa6b8Secondary text — nav items, table cells
--ink-faint#6b7585Tertiary text — labels, captions, group headers
--linkvar(--c-ops-bright)Hyperlinks

Light mode surface hierarchy

The light theme inverts the depth model: surfaces are light, wells are grey.

TokenHexUse
--bg#e7eaf0Page background
--surface#eef1f6Primary panels
--surface-2#f7f9fcNested panels (lighter in light mode — inverse of dark)
--surface-sink#dde2eaInset wells
--line#c7cedbBorders, dividers
[data-theme="light"] {
--bg: #e7eaf0;
--surface: #eef1f6;
--surface-2: #f7f9fc;
--surface-sink: #dde2ea;
--line: #c7cedb;
}

Light ink hierarchy

TokenHexUse
--ink#1c2230Primary text
--ink-dim#535d70Secondary text
--ink-faint#8a93a4Tertiary text
--link#2563ebHyperlinks

Glass chrome

Used exclusively for floating navigation surfaces.

TokenDark valueLight value
--glass-bgrgba(29,34,43,.72)rgba(247,249,252,.7)
--glass-blursaturate(160%) blur(10px)saturate(150%) blur(8px)

Colour usage rules

  1. Never hardcode hex values in component CSS. Always use var(--token).
  2. Ink hierarchy must be respected. Primary content uses --ink; supporting/metadata text uses --ink-dim or --ink-faint.
  3. Accent colours are state signals, not decoration. Apply --accent to borders, glows, and focus rings — not background fills.
  4. Surface hierarchy must be sequential. Content nested inside a --surface panel should use --surface-2; do not skip levels.
  5. WCAG AA contrast is maintained for all ink-on-surface combinations in both themes. Verify with a contrast checker before introducing new colour pairings.

Accent on backgrounds

When using an accent colour as a fill (e.g. hover backgrounds), reduce opacity to preserve legibility:

/* Hover background — accent at 9% opacity */
background: color-mix(in srgb, var(--accent) 9%, transparent);
/* Subtle accent tint */
background: rgba(59, 130, 246, 0.12);

Glow shadows

Section-specific glow effects are available for featured panels and active states:

TokenEffect
--sh-glow-opsBlue glow ring + soft outer shadow
--sh-glow-consultingGreen glow ring + soft outer shadow
--sh-glow-adminOrange glow ring + soft outer shadow
--sh-glowResolves to current section’s glow
.featured-panel {
box-shadow: var(--sh-raise), var(--sh-glow);
}