Foundations / Color system

Color system

The palette every Alpha component paints from, in a dark mode and a light one. Only the neutral ramp holds raw greys — text, surfaces, borders and controls are declared as references into it, so retinting the ramp moves everything built on top of it.

On this page

One primitive ramp, everything else on top

Only the neutral ramp holds raw greys. Every neutral-derived token — text, surfaces, borders, the secondary button — is declared as a reference into it, exactly as the source palette declares it. The ramp inverts between modes, so one unchanged declaration paints two colours:

:root,
[data-mode='dark'] {
  --neutral-900: #f9f9f9;
  --text-typical: var(--neutral-900);
}

[data-mode='light'] {
  --neutral-900: #333333;
  --text-typical: var(--neutral-900);
}

The chips below are filled with the token itself rather than a copy of its value, so toggling the theme in the header repaints them. Printed values have their references resolved per mode, dark first — a swatch reading #f9f9f9 / #333333 is one declaration, not two. Colours the source stores as literals stay literals here even where two of them happen to match today, so a future divergence cannot hide behind an alias.

The primitives

The index counts distance from the surface, not lightness: 900 is the furthest from the page and therefore the text colour in both modes. Base --neutral is the nearest surface — white in light, near-black in dark. Retint these and everything aliased to them moves.

neutral
#313131 / #ffffff
neutral-50
#1e1e1e / #f9f9f9
neutral-100
#222222 / #f3f3f3
neutral-200
#282828 / #ebebeb
neutral-300
#373737 / #dddddd
neutral-400
#4c4c4c / #cdcdcd
neutral-500
#7c7c7c / #9a9a9a
neutral-600
#aaaaaa / #858484
neutral-700
#d7d3d3 / #626262
neutral-800
#ececec / #454545
neutral-900
#f9f9f9 / #333333
neutral-backdrop
#00000080