Colour

The site has one theme, deep navy, by choice. Each value appears once, as a primitive. Every role the CSS uses references one primitive.

Primitives

PrimitiveValueUse
--navy-950#060D19Deepest navy
--navy-900#0B1628Page navy
--navy-800#12223ARaised navy
--navy-700#2A3B57Hairline navy
--teal-400#2EC4B6Interaction and the first brand stop
--pink-400#FF6FB1Annotation and the last brand stop
--blue-400#7C9BFFAccent and the middle brand stop
--violet-400#A78BFAAccent
--orange-400#FF7A45Danger. Hue 17 degrees, 44 degrees from pink-400
--grey-100#E8EDF4Text
--grey-300#B9C6D8Muted text

Roles

RoleReferencesUse
--color-surface--navy-900Page background
--color-surface-raised--navy-800Cards, tables, the menu and contents sheets
--color-surface-deep--navy-950Code blocks and gate output
--color-text--grey-100Text and headings
--color-text-muted--grey-300Metadata, notes and captions
--color-interactive--teal-400Links, buttons, focus and selected states
--color-on-interactive--navy-900Text on teal, violet and pink fills
--color-hairline--navy-7001px borders and separators
--color-annotation--pink-400"Show the spec" annotations
--color-annotation-component--violet-400Component name tags in "Show the spec"
--color-accent--blue-400File names and keys in code, secondary labels
--color-accent-pink--pink-400Accent text, pills and the brand's warm end
--color-accent-violet--violet-400Accent text and headings
--color-danger--orange-400Failure states: "Fails AA" and gate FAIL lines
--color-brand-start--teal-400Brand gradient, first stop
--color-brand-middle--blue-400Brand gradient, middle stop
--color-brand-end--pink-400Brand gradient, last stop

Contrast

The build fails if a text pair drops below 4.5:1, or a large text or UI pair below 3:1. These are the WCAG 2.2 AA minimums.

PairRatioMinimum
text on surface15.39:1Text, 4.5:1
text on surface-raised13.57:1Text, 4.5:1
text on surface-deep16.54:1Text, 4.5:1
text-muted on surface10.46:1Text, 4.5:1
text-muted on surface-raised9.22:1Text, 4.5:1
text-muted on surface-deep11.24:1Text, 4.5:1
interactive on surface8.35:1Text, 4.5:1
interactive on surface-raised7.36:1Text, 4.5:1
interactive on surface-deep8.98:1Text, 4.5:1
on-interactive on interactive8.35:1Text, 4.5:1
annotation on surface7.04:1Text, 4.5:1
annotation on surface-raised6.20:1Text, 4.5:1
on-interactive on annotation7.04:1Text, 4.5:1
surface on annotation7.04:1Text, 4.5:1
on-interactive on annotation-component6.65:1Text, 4.5:1
accent on surface6.89:1Text, 4.5:1
accent on surface-raised6.07:1Text, 4.5:1
accent on surface-deep7.40:1Text, 4.5:1
danger on surface7.00:1Text, 4.5:1
danger on surface-raised6.17:1Text, 4.5:1
danger on surface-deep7.52:1Text, 4.5:1
interactive on hairline5.20:1Large text and UI, 3:1
accent-pink on surface7.04:1Text, 4.5:1
accent-pink on surface-raised6.20:1Text, 4.5:1
accent-violet on surface6.65:1Text, 4.5:1
accent-violet on surface-raised5.87:1Text, 4.5:1

Recreations of product screens use 30 further --demo- colours. They show the product's brand and stay inside the recreations.

Type

Atkinson Hyperlegible Next sets all text. Atkinson Hyperlegible Mono sets code, gate output and spec annotations. Body text is 18px with line-height 1.55 at 900px and above, and 16px with 1.5 below.

  • --text-64: 64pxI run design systems as products.
  • --text-40: 40pxI run design systems as products.
  • --text-28: 28pxI run design systems as products.
  • --text-20: 20pxI run design systems as products.
  • --text-18: 18pxI run design systems as products.
  • --text-16: 16pxI run design systems as products.
  • --text-14: 14pxI run design systems as products.
Line heightValue
--leading-tight1.05
--leading-snug1.15
--leading-body1.55
--leading-body-compact1.5
WeightValue
--weight-regular400
--weight-medium500
--weight-semibold600
--weight-bold700

Spacing

Every margin, padding and gap uses one of these steps. Below 900px, the gap between sections steps down from 96 to 64 and the gap between blocks from 48 to 32.

  • --space-4: 4px
  • --space-8: 8px
  • --space-12: 12px
  • --space-16: 16px
  • --space-24: 24px
  • --space-32: 32px
  • --space-48: 48px
  • --space-64: 64px
  • --space-96: 96px

Radius

Radius follows the role an element plays, so hierarchy shows in its corners.

  • --radius-control: 10pxButtons, inputs, contents button
  • --radius-surface: 16pxGate output, recreation frames, tables
  • --radius-modal: 20pxContents sheet, recreated modal
  • --radius-pill: 999pxStatus and disclosure labels
  • --radius-circle: 50%Swatches and step markers

Gradient and pattern

The brand sweeps from teal through blue to pink. It runs along the top of the header, borders the chosen cards and colours one phrase per headline. Every stop clears 3:1 against navy, so gradient type stays readable as large text. A soft aurora sits behind the whole page and stays put as you scroll, so no section cuts it off.

  • --gradient-brandBrand sweep: teal, blue, pink. Used where the brand is the subject, and as the header rule
  • --gradient-textGradient type. Every stop clears 3:1 for large text on navy
  • --gradient-auroraDrifting glow behind navy bands
  • --gradient-surface-glowFaint glow on page-surface panels
  • --gradient-page-glowFaint glows spread down the whole page, so sections flow into each other
  • --pattern-spec-gridThe grid behind "Show the spec": an 8px baseline and 48px columns

Elevation and borders

Three shadows do three jobs. --shadow-overlay lifts the menu and contents sheets, --shadow-card lifts a card you point at, and --shadow-glow marks the one action or piece of work that matters most. A 1px --color-hairline border separates kinds of content.

--shadow-overlay
--shadow-card
--shadow-glow

Motion

Motion adds a little joy without getting in the way of reading. Aurora glows drift slowly, headlines sharpen into focus, sections ease in as they arrive and figures count up once. "Show the spec" fades in a grid, then draws each measurement top to bottom. With reduced motion set, every duration becomes 0ms and nothing moves.

TokenValueUse
--motion-fast200msHover, toggles, the menu and contents sheets, the spec reveal and the resize highlight
--motion-medium400msCard lift and bars
--motion-reveal700msSections easing in as they scroll into view
--motion-count1400msFigures counting up
--motion-ambient24sThe slow drift of the aurora glow
--motion-easecubic-bezier(0.2, 0.8, 0.2, 1)One easing curve for everything
--motion-draw600ms"Show the spec" lines and outlines drawing in
--motion-stagger45msDelay between one annotation and the next