Triiiceratops Design system

Design system

An appendix: every design token the site is built from, with the measured contrast ratio that admitted it.

Color

Two palettes, each selected and measured against its own ground rather than derived from the other. A token showing one swatch keeps that value in both schemes: a filled color field carries its own ground with it, so re-stepping it would only weaken the identity.

  • --bone #f7f2e9 light · #1a1613 dark
    Page ground
  • --paper #fffdf9 light · #221d18 dark
    Raised ground
  • --bench #f2ebdd light · #14100d dark
    Recessed ground
  • --stage #e6dfd0 light · #1e1915 dark
    Viewer stage
  • --rail-bg #efe7d9 light · #201b16 dark
    Rail ground
  • --band-1 #efe3cd light · #302820 dark
    Rail tint, group 1
  • --band-2 #e9e2d0 light · #29221a dark
    Rail tint, group 2
  • --band-3 #e3ddcb light · #231d17 dark
    Rail tint, group 3
  • --ink #191512 light · #f2ebdd dark
    Body text
  • --ink-soft #3d362f light · #d9cfbd dark
    Secondary text
  • --ink-2 #5f564c light · #b3a795 dark
    Muted and italic text
  • --rule #ded3c1 light · #3a3229 dark
    Hairline rule
  • --rule-2 #cabda6 light · #4a4036 dark
    Emphasized rule
  • --link #b84a19 light · #d9662b dark
    Orange as text — steps lighter in dark, not darker
  • --grid #ded3c1 light · #332c24 dark
    Chart gridline
  • --code-bg #221e1a light · #12100d dark
    Code ground
  • --mark #8d8375 light · #a19582 dark
    Data mark, de-emphasized
  • --mark-emphasis #b84a19 light · #e0a32e dark
    Data mark, emphasized — orange on light, amber on dark
  • --ink-block #2a2521 · both schemes
    Dark filled field
  • --ink-on-dark #e9dfcc · both schemes
    Text on the dark field
  • --ink-dim-on-dark #b7aa93 · both schemes
    Muted text on the dark field
  • --cta #b84a19 · both schemes
    Orange as a filled field
  • --cta-ink #fff3ea · both schemes
    Text on the orange field
  • --amber #e0a32e · both schemes
    Brand amber, filled fields only — never text, never a data mark on light
  • --amber-ink #2b1e04 · both schemes
    Text on the amber field

Contrast

Every pairing used as text, in both schemes, with its measured ratio. WCAG AA at body size is 4.5, and each of the 20 pairings below clears it.

Measured contrast ratio of every text pairing, in each scheme
PairingRoleLightDark
--ink on --boneBody text on the page16.2715.16
--ink on --paperBody text on a raised ground17.8614.08
--ink on --benchBody text on a recessed ground15.3015.95
--ink on --stageViewer text on its stage13.6814.69
--ink-soft on --boneLede and prose10.6611.65
--ink-soft on --paperProse on a raised ground11.7010.83
--ink-2 on --boneAsides and numerals6.447.60
--ink-2 on --paperAsides on a raised ground7.077.06
--ink-2 on --benchThe unlanded-prose notice6.068.00
--ink-2 on --rail-bgRail chrome5.857.22
--ink-2 on --band-1Rail numerals, group 15.666.12
--ink-2 on --band-2Rail numerals, group 25.566.64
--ink-2 on --band-3Rail numerals, group 35.297.05
--link on --boneLinks on the page4.675.04
--link on --paperLinks on a raised ground5.134.68
--cta-ink on --ctaThe orange link block4.784.78
--amber-ink on --amberThe amber link block7.327.32
--ink-on-dark on --ink-blockThe dark link block11.4711.47
--ink-dim-on-dark on --ink-blockMuted text on the dark block6.636.63
--paper on --inkThe skip link17.8614.08

The data marks are graphical rather than text, so their threshold is 3: --mark on --bone 3.34 light, 6.11 dark.--mark-emphasis on --bone 4.67 light, 8.09 dark. The brand amber measures 1.99 on the light page ground, so it can carry neither text nor a mark there — which is why the emphasized mark in a chart is the orange on light and the amber on dark, the opposite of what brand instinct wants.

Type

One family, display through captions. Monospaced type appears only inside a real code block.

--t-display Hero
--t-h1 Page heading
--t-h2 Section heading
--t-h3 Subheading
--t-body Body
--t-small Aside
--t-tiny Numeral

Space

A 4px base, used for padding, gaps and rhythm alike.

--s1 4px
--s2 8px
--s3 12px
--s4 16px
--s5 24px
--s6 32px
--s7 48px
--s8 64px
--s9 96px

Measure

Two bounds, and every route obeys both. Prose stops at the measure; a table, a chart or a figure is allowed past it and stops at the content cap. The cap bounds what a full-bleed strip lays out, never the strip: a band’s ground and its top rule still run the whole column.

--measure 62ch — Prose
--content-max 1120px — A page frame’s content
--rail-w 290px — The navigation rail