Colour.

The system runs on neutrals, anchored by brand navy. Other colour is functional: it signals state and separates data. It does not decorate. Restraint is the brand.

Anchor
Navy #1b3644
System
Neutral greys
Modes
Light · Dark
Standard
WCAG AA
2.1

Principles

Three values do most of the work: a near-white page, near-black text, and brand navy. Status colours, data colours, and the rare highlight are reserved for a job. Colour earns its place by meaning, never by mood, and every value resolves from a token so light and dark stay in lockstep. Use the named role, not a raw sample or an invented value.

The pagebackground
The textforeground
The brandprimary
2.2

Neutrals

Semantic greys cover surfaces, text, hairlines, and states. They are named by role, not value. Use background, muted-foreground, or border rather than a raw grey, so one change applies everywhere.

background

Page surface

Lt#ffffff
Dk#0a0a0a

foreground

Body text

Lt#0a0a0a
Dk#fafafa

card

Raised surface

Lt#ffffff
Dk#171717

muted

Subtle fill

Lt#f5f5f5
Dk#262626

muted-foreground

Secondary text

Lt#525252
Dk#a3a3a3

border

Hairlines

Lt#e5e5e5
Dk#262626

accent

Hover / active fill

Lt#f5f5f5
Dk#404040

ring

Focus ring

Lt#a3a3a3
Dk#737373

card-foreground

Text on card

Lt#0a0a0a
Dk#fafafa

accent-foreground

Text on accent fill

Lt#171717
Dk#fafafa

popover

Overlay surface (menus, tooltips)

Lt#ffffff
Dk#262626

popover-foreground

Text on popover

Lt#0a0a0a
Dk#fafafa

input

Input border / control hairline

Lt#e5e5e5
Dk#262626
2.3

Brand

Navy is the anchor and the only dark surface. It is the wordmark’s colour and the system’s one confident note. Gold is a rare highlight, never a surface or large field. Sand is an occasional warm ground.

primary

Brand navy — anchor & the one dark surface

Lt#1b3644
Dk#1b3644

primary-foreground

On navy

Lt#fafafa
Dk#fafafa

secondary

Gold — the single accent, never a surface

Lt#eaa23a
Dk#eaa23a

secondary-foreground

On gold

Lt#171717
Dk#171717

sand

Warm neutral ground

Lt#c6b298
Dk#c6b298
Navy as a full surface: the one dark ground.
Gold as a surface or large field.
A second brand colour competing with navy.
2.4

Status

Red, green, and amber carry meaning, not decoration. They form the RAG vocabulary for delivery health, validation, and alerts. Use a tinted surface with its named foreground and always add a label.

destructive

Errors / destructive

Lt#dc2626
Dk#f87171

success

Success

Lt#16a34a
Dk#22c55e

warning

Warning

Lt#d97706
Dk#f59e0b

destructive-foreground

Text on destructive

Lt#ffffff
Dk#0a0a0a

success-foreground

Text on success

Lt#0a0a0a
Dk#0a0a0a

warning-foreground

Text on warning

Lt#0a0a0a
Dk#0a0a0a
On trackAt riskOff trackStatus in use: colour plus a label.
2.5

Data visualisation

The five-step chart palette stays distinct in both modes. Earlier values carry more visual weight. Use it for categories and comparisons; status colours keep their meaning and never stand in for a category.

chart-1

Series 1 — navy, the protagonist

Lt#1b3644
Dk#7da6bb

chart-2

Series 2 — steel (a lighter rung of the navy ramp)

Lt#3f6b7d
Dk#eaa23a

chart-3

Series 3 — sand

Lt#c6b298
Dk#c6b298

chart-4

Series 4 — gold, the single accent

Lt#eaa23a
Dk#5f8294

chart-5

Series 5 — cool grey, a quiet 5th

Lt#9aa7b1
Dk#c2ccd3
2.6

Light & dark

Every token has a light value and a dark value. Mode switches the value; applications do not redefine it. Design with the token and both modes follow. Navy holds while neutrals and states invert.

backgroundLt · Dk
foregroundLt · Dk
mutedLt · Dk
primaryLt · Dk
destructiveLt · Dk
successLt · Dk
2.7

Proportion

Judge colour by area, not swatch count. Neutrals fill the page, navy anchors a fraction, and all functional colour together forms a sliver. If a layout reads as colourful, the proportion is wrong.

Neutrals
Navy
Sand
Data
Gold
Neutrals dominate · navy anchors · status & data are accents.
2.8

Type & contrast

Type on colour must clear WCAG AA: at least 4.5:1 for body text and 3:1 for large text. Use the measured surface and foreground pairings below. Never improvise a lower-contrast combination.

Aa
primaryWhite 12.67:1
Aa
secondaryBlack 9.17:1
Aa
sandBlack 9.64:1
Aa
destructiveWhite 4.83:1
Aa
successBlack 6.01:1
Aa
warningBlack 6.21:1
Safe text pairings: surface token → foreground token
PairSurfaceForeground
AabackgroundforegroundLight 19.80:1 · Dark 18.97:1
Aamutedmuted-foregroundLight 7.17:1 · Dark 6.00:1
Aaprimaryprimary-foregroundLight 12.14:1 · Dark 12.14:1
Aasecondarysecondary-foregroundLight 8.30:1 · Dark 8.30:1
AasandforegroundLight 9.64:1 · Dark 1.97:1
Aadestructivedestructive-foregroundLight 4.83:1 · Dark 7.16:1
Aasuccesssuccess-foregroundLight 6.01:1 · Dark 8.69:1
Aawarningwarning-foregroundLight 6.21:1 · Dark 9.22:1
3:1minimum for large text (≥ 24px, or 19px bold)
4.5:1minimum for body text and UI labels
2.9

Misuse

Colour is governed by tokens and meaning. Resolve every value from a token, keep colour functional, and never lean on it alone to carry information.

#3b6ea5
Don't hardcode a hex. Use the semantic token.
Don't use gold as a surface or large field.
Don't signal with colour alone. Pair it with a label.
Low contrast
Don't set type on colour below 4.5:1.
Don't repurpose a status colour as a category.
Don't tint a large surface with a status colour.