Skip to content

Foundations · @csdr/theme

Colour palettes

Three swappable palettes — default (PatternFly), landscape, goap — on PatternFly’s token contract: ramps, roles, validated chart sets, and every component rendered in the palette you are viewing.

Import
palette: goap # report frontmatter · PUBLIC_CSDR_PALETTE=landscape · <SiteLayout palette="goap">
Use on
reports · landing · docs · tools

Australian landscape landscape

Eucalypt, ochre, red earth, wattle, billabong blue, saltbush, jacaranda and sandstone neutrals — moderate chroma so the palette reads as country, not as a highlighter set. Ramps are generated onto PatternFly's step curve; every contrast promise per step holds.

Brand family
green — links, focus ring, primary buttons, masthead
Role remaps
brand → green info → blue
Provenance
Designed for csdr-project (D13). Working names; tune hues on /design/palette within the gates.
Select it
Report: palette: landscape in frontmatter · Site: PUBLIC_CSDR_PALETTE=landscape · Page: <SiteLayout palette="landscape">

Ramps

Nine PatternFly families at PatternFly's steps (grays 10–95). The step is the promise: 10–20 tints, 30 dark-mode text and links, 40 dark-mode UI, 50 light-mode interactive, 60 text on white (≥ 4.5:1 in every family), 70–80 emphasis. Base and semantic tokens (--pf-t--global--*) resolve to these; components never touch them directly.

blueinfo
10
#e4eff9
20
#c2dbf1
30
#a2c7e7
40
#73a6d2
50
#3573a4
60
#316288
70
#1e3f59
80
#152a3b
tealcustom
10
#e4f0ef
20
#c4dedb
30
#a4cbc8
40
#74ada9
50
#4a8e8a
60
#326864
70
#1f4340
80
#152c2b
greenbrand
10
#e6f0e8
20
#c8dfcb
30
#aacdb0
40
#7eae87
50
#427a4f
60
#3d6947
70
#26442c
80
#1a2d1e
yellowwarning
10
#f6ecd9
20
#ead5ab
30
#ddbe7d
40
#c59931
50
#a07a15
60
#765805
70
#4c3803
80
#342501
orange
10
#fbe9dd
20
#f5cfb4
30
#ecb58c
40
#d88d50
50
#bd670d
60
#8c4900
70
#5b2e01
80
#3d1f05
red-orangedanger
10
#ffe7e1
20
#fccabd
30
#f6ae9b
40
#e48169
50
#ca593d
60
#963e29
70
#622718
80
#411a11
red
05
#fff0ef
10
#fee7e6
20
#fdc8c7
30
#faa9a8
40
#e97b7d
50
#ce5057
60
#99373d
70
#652226
80
#43181a
purple
10
#efebf6
20
#ddd2eb
30
#cabadf
40
#ac95c7
50
#8d73ac
60
#67527f
70
#423452
80
#2c2337
gray
10
#f5f2ee
20
#e2e0dc
30
#c9c7c3
40
#a5a39f
45
#8e8c88
50
#72706c
60
#4f4d4a
70
#3a3835
80
#2b2926
90
#211f1c
95
#171512
brownextension
10
#f4ebe7
20
#e5d3ca
30
#d6bcae
40
#bc9885
50
#9e7660
60
#745544
70
#4b362b
80
#32241d

Step contract

Contrast ratios the generator enforces on every family (pnpm check:palette). Brand-50 must reach 4.5:1 because it is the link and primary-button colour; other families need 3:1 at 50.

Family50 on white60 on white70 on white30 on dark40 on dark10 vs white
blue✓ 5.07✓ 6.5✓ 10.99✓ 8.22✓ 5.62✓ 1.17
green✓ 5.09✓ 6.34✓ 10.79✓ 8.36✓ 5.74✓ 1.17
orange✓ 4.11✓ 6.84✓ 11.44✓ 8✓ 5.44✓ 1.18
purple✓ 4.05✓ 6.8✓ 11.38✓ 8.04✓ 5.46✓ 1.17
red✓ 4.28✓ 7.07✓ 11.6✓ 7.83✓ 5.26✓ 1.18
red-orange✓ 4.19✓ 6.96✓ 11.52✓ 7.93✓ 5.29✓ 1.18
teal✓ 3.8✓ 6.36✓ 10.85✓ 8.28✓ 5.75✓ 1.17
yellow✓ 3.97✓ 6.63✓ 11.2✓ 8.13✓ 5.52✓ 1.17

Role tokens

  • ✓ link on white (brand-50): 5.09:1 (needs 4.5:1)
  • ✓ link on secondary surface (brand-50 on gray-10): 4.56:1 (needs 4.5:1)
  • ✓ brand text (brand-60) on white: 6.34:1 (needs 4.5:1)
  • ✓ white on brand (brand-50): 5.09:1 (needs 4.5:1)
  • ✓ dark link (brand-20) on dark surface: 10.3:1 (needs 4.5:1)
  • ✓ dark brand (brand-30) on dark surface: 8.36:1 (needs 4.5:1)
  • ✓ body text (gray-95) on white: 18.22:1 (needs 7:1)
  • ✓ subtle text (gray-60) on white: 8.42:1 (needs 4.5:1)
  • ✓ danger text on white: 6.96:1 (needs 4.5:1)
  • ✓ success text on white: 6.34:1 (needs 4.5:1)
  • ✓ warning text on white: 6.63:1 (needs 4.5:1)
  • ✓ info text on white: 6.5:1 (needs 4.5:1)
  • ✓ white on info (info-50): 5.07:1 (needs 4.5:1)
  • ✓ info text (info-50) on white: 5.07:1 (needs 4.5:1)

Chart sets

Categorical colours are a separate parameter from UI colours: muted brand hues fall under the chart chroma floor and read as grey in a series, so each palette carries a "data-grade" set derived from the same hues and validated (lightness band, chroma floor ≥ 0.10, adjacent CVD ΔE ≥ 8, normal-vision ΔE ≥ 15, ≥ 3:1 vs surface). Assigned in fixed order, never cycled; status colours are reserved and never used for series.

Light surface — 6 primary slots

  • 1 eucalypt
    #246e3a
  • 2 jacaranda
    #a486d7
  • 3 wattle
    #8d6d01
  • 4 billabong
    #3e8cc9
  • 5 red earth
    #8b4b06
  • 6 saltbush
    #209993
  • ✓ lightness band — all inside L 0.43–0.77
  • ✓ chroma floor — all ≥ 0.1
  • ✓ CVD separation (adjacent) — worst #8b4b06↔#209993 ΔE 17.6 (deutan); target ≥ 8, floor 6
  • ✓ normal-vision floor — worst #8d6d01↔#3e8cc9 ΔE 23.8; floor 15
  • ✓ contrast vs surface — all ≥ 3:1 on #ffffff
  • All-pairs clean (scatter, maps, small multiples) up to 2 slots.

Sequential 7

Diverging

Status

  • good
  • warning
  • serious
  • critical

Dark surface — 6 primary slots

  • 1 eucalypt
    #448c56
  • 2 jacaranda
    #987aca
  • 3 wattle
    #967515
  • 4 billabong
    #4493d0
  • 5 ochre
    #ce710c
  • 6 saltbush
    #018d87
  • ✓ lightness band — all inside L 0.48–0.67
  • ✓ chroma floor — all ≥ 0.1
  • ✓ CVD separation (adjacent) — worst #ce710c↔#018d87 ΔE 12.9 (protan); target ≥ 8, floor 6
  • ✓ normal-vision floor — worst #448c56↔#987aca ΔE 23.1; floor 15
  • ✓ contrast vs surface — all ≥ 3:1 on #2b2926
  • All-pairs clean (scatter, maps, small multiples) up to 2 slots.

Sequential 7

Diverging

Status

  • good
  • warning
  • serious
  • critical

Six series, this palette (build-time SVG)

View data
yearNorth (index)South (index)East (index)West (index)Central (index)Islands (index)
201912851036
20201497845
202113116964
202216109756

Download data (CSV)Download chart (SVG)

Figure 1.Illustrative index by region — six categorical slots in fixed order.
View data
yearNorthSouthEastWestCentralIslands
201912851036
20201497845
202113116964
202216109756

Download data (CSV)Download chart (SVG)

Code
<LineChart data={rows} x="year" y="value" series="region" alt="…" />   {/* colours follow the page's palette */}

Components in this palette

Everything below is the ordinary component rendered on a page stamped data-palette="landscape" — nothing is styled specially for this page.

Brand and status

A text link
TopicRegionPublicationInsightEventAuthor

Info alert:Data updated 5 August 2026

Success alert:Build passed

Warning alert:Provisional values for the current year

Danger alert:Checksum mismatch in bundle noaa-mlo-co2

Code
<Button variant="primary">Download PDF</Button>  <Button variant="secondary">Cite</Button>  <Button variant="link">Read more</Button>

Editorial

Latest monthly mean

431.1ppm

+2.4 vs a year earlier

Growth, 1960s

0.9ppm/yr

Growth, 2010s

2.5ppm/yr

Code
<Callout kind="key-finding" title="…">…</Callout>  <StatTile tone="good" … />

The other palettes

Adding or changing a palette

  1. Edit or add packages/theme/palettes/<id>.json: nine families as hue + chroma (with optional pins for exact brand hexes), optional extensions, roles, and the chart sets.
  2. Run pnpm palette:build. It generates the CSS palette layer, the chart values and this page's report — and refuses to write if a contract, role or chart check fails.
  3. pnpm check (which runs check:palette) fails on any drift between the JSON and the generated files, so hexes never get hand-edited downstream.
  4. Look at it here and in the report preview; then pnpm test for the axe/VR matrix. See Theme → Palettes and D13.