werkstatt brand and design system version 1.2, october 2026

color

three primaries, ink and paper. flat, saturated and used in a fixed ratio.

the core palette

six values and nothing else in the interface.

action: primary buttons, the one thing to do on a screensignal red#D93A2B · rgb 217 58 43 · hsl 5° 70% 51%
emphasis: selected state, hover, highlights, calloutschrome yellow#F4B81B · rgb 244 184 27 · hsl 43° 91% 53%
structure: focus rings, progress, links on dark, infoultramarine#1E4FA0 · rgb 30 79 160 · hsl 217° 68% 37%
text, borders, inverse panelsink black#161616 · rgb 22 22 22 · hsl 0° 0% 9%
page backgroundpaper grey#EDEAE2 · rgb 237 234 226 · hsl 44° 23% 91%
surfaces: cards, fields, navgallery white#FAFAF7 · rgb 250 250 247 · hsl 60° 23% 97%

usage ratio

paper 50%ink 20%red 12%yellow 9%blue 9%

a typical screen. paper carries half of it, ink a fifth, and the three primaries share the rest. if red is more than a tenth of what you see, there is more than one call to action.

semantic roles

build with the roles, not the raw colors, so a change in one place carries everywhere.

tokenvalueuse
--bgpaperpage background
--surfacewhitecards, fields, bars
--textinkall body and heading text
--borderinkevery rule and outline, 3 px
--actionredthe primary button, destructive confirms
--on-actionwhitetext on red
--emphasisyellowselected, hover, highlight
--on-emphasisinktext on yellow
--structurebluefocus ring, progress, info
--on-structurewhitetext on blue
--inverse-bginkdark panels and footers
--inverse-textwhitetext on ink
--inverse-accentyellowheadings and links on ink
--mutedgreydisabled borders only, never text
.button-primary { background: var(--action); color: var(--on-action); border: var(--rule); }
.card { background: var(--surface); border: var(--rule); }
.selected { background: var(--emphasis); color: var(--on-emphasis); }

contrast

paircontrastverdict
ink on paper15.05 : 1aa text
ink on white17.31 : 1aa text
ink on yellow10.10 : 1aa text
white on red4.37 : 1large text only
white on blue7.49 : 1aa text
white on ink17.31 : 1aa text
yellow on ink10.10 : 1aa text
ink on red3.96 : 1large text only
ink on blue2.31 : 1decorative only
yellow on blue4.37 : 1large text only
red on paper3.81 : 1large text only
blue on paper6.52 : 1aa text
yellow on paper1.49 : 1decorative only
grey on paper1.69 : 1decorative only

computed with the wcag 2.1 formula. text needs 4.5 : 1, or 3 : 1 at 24 px and larger. red and blue on paper work for large display type and for shapes, not for body text. grey is never used for text.

the studio wheel

the twelve-step wheel lives in the color studio and in illustration. it is not a ui palette: interface color stays with the six core values.

the inner triangle marks the three primaries. secondaries sit between them, tertiaries between those. the hexes are in tokens.json under color.studio.

rules

  • one accent per element.a button is red, or yellow, or ink. never two of them on one object.
  • red is for the one thing to do.one red button per screen. if two things compete, one of them is not primary.
  • yellow says selected, hovered or important.it is the only color allowed to change on interaction.
  • blue is structure.focus rings, progress, meters and informational panels.
  • no gradients, no tints, no opacity in ui.if a surface needs to recede, make it paper; if it needs to come forward, give it a border.
  • inverse panels are ink.a dark block uses ink with white text and yellow accents. there is no separate dark theme in version 1.
© 2026 Intelligent Operations. Directed, prompted and published by Tommy Saunders, Intelligent Operations.Generated with Claude Fable 5.1 by Anthropic in the Claude app, 10 and 11 October 2026. Bauhaus is referenced as history; all artwork is original. credits and how to cite · sitemap