Skip to content
ThorbisInterface Guidelines (opens in a new tab)

Color

One focused chapter from the Thorbis interface research. 16 rules. Read the research index for every chapter and focused study.

Color

Locked roles? Almost none. Surfaces are Linear’s dark greys and black, canvas oklch(14.5% 0 none) and panel oklch(20.5% 0 none). Type is an off-white with a little cream, type oklch(96.8% 0.009 84.6). Electric blue is the brand. Olive, forest, pumpkin, and burnt are extras. Use them quietly, or for fun. They are not jobs. Status is shadcn’s: success success oklch(62.7% 0.17 149.2), error error oklch(62.6% 0.193 23), info info oklch(62.3% 0.188 259.8). Warning is Shopify’s amber, warning oklch(82.7% 0.171 80.5). That is law.
  • Cream on the dark greys. Canvas is near-black, canvas oklch(14.5% 0 none). Panels are panel oklch(20.5% 0 none). Type is an off-white with a little cream, type oklch(96.8% 0.009 84.6). Body is body oklch(65.2% 0.013 259.8). The grey is cool, like a work shirt, not a pure chip. Not stone. Not olive walls.
    114 Oak StreetLeak · dispatched
    Cream type on the dark greys. The body is quieter. Accent is a guest.
  • Electric blue is the brand. accent oklch(55.8% 0.188 264.4) is Thorbis. Identity, focus, the one accent. It can mark a selected row or a focus ring. It is not every heading. It is not a wash on a quiet panel. Greys still carry the interface.
    One blue. On the selected row. Not on every word.
  • Olive and forest are extras. Soft warm olive olive oklch(47.9% 0.05 115.3) and forest forest oklch(38% 0.052 147.2) are sitting in the kit because I like them. A quiet badge, a bit of fun. They are not success. They are not “on-site.” Do not build a status system out of them. They do belong on a 16px place mark. Quiet. After the word, not before.
    oliveforest
    Pretty. Not a status system.
  • Pumpkin and burnt are extras too. Burnt pumpkin pumpkin oklch(59.4% 0.152 47.5) and burnt red burnt oklch(49.6% 0.143 34) are the same idea. Subtle, or just fun. The sponsor heart can be burnt. A warning does not have to be pumpkin. Do not invent a second brand with them.
    pumpkinburnt
    Fun. Not warning. Not destroy.
  • Perceptual tokens. Author color in OKLCH. Lightness is the first lever for contrast. Chroma and hue stay stable across a ramp. Ship the token as oklch(), not hex. On a swatch, the fill is the color. The type is off-white or off-black, whichever reads. One hue, many lightnesses.
  • Greys work. Color is a guest. Most of the product is dark grey and a little cream. Brand blue is the guest that matters. Status is locked: success is shadcn green success oklch(62.7% 0.17 149.2), error is shadcn red error oklch(62.6% 0.193 23), info is shadcn blue info oklch(62.3% 0.188 259.8), warning is Shopify amber warning oklch(82.7% 0.171 80.5). Loading is cream busy oklch(96.8% 0.009 84.6) and it pulses. Olive is not success. Burnt is not error. They mark a copy, a keep, a failed save. They do not paint the board.
    CopiedFailedOverdueQueued
    Green copied. Red failed. Amber warning. Blue info. Not olive.
  • System first. Light if we can’t tell. Default is System. If the OS will not say, we fall back to Light. Dark is always a choice, so is Light, so is System. All three stay visible. Do not mechanically invert a palette. Retune chroma and recheck every pair. One hatch on the root. No flash of the wrong morning.
  • Theme generation is semantic. Reduce theme inputs to base, accent, and contrast. Derive surfaces, text, and controls. Electric blue is an input, not the color of the chrome.
  • One brand, not six meanings. Electric blue is the brand. If it is also every heading, it stops being the brand. Give the second use a grey.
  • Lightness, chroma, hue. We work in OKLCH. Lightness is whether you can read it. Chroma is how loud. Hue is which color. Fix a failing pair on lightness. Saturating it is a costume. Cream sits around hue 85. Accent around 264. Canvas has no hue. Full law: color theory.
  • Warm cream on a cool void. Type is warm. The void is achromatic. Body grey is cool. Accent is cool blue and points. Do not warm the canvas to match the cream. Do not cool the type to match the blue. Light is a retune of lightness, not an invert.
  • Quieter than 60 / 30 / 10. Canvas is the field. The sheet is the work. Accent is a pointer, not ten percent of the screen. A wash, a blue rail, a rainbow of node types: fail. Status hues are reserved words, not a triad. Showcase uses the same palette. No teal-and-orange grade.
  • Chrome likes soft color. Place marks, menu icons, command glyphs may carry olive olive oklch(47.9% 0.05 115.3), forest forest oklch(38% 0.052 147.2), pumpkin pumpkin oklch(59.4% 0.152 47.5), burnt burnt oklch(49.6% 0.143 34), or accent mixed with marker until it sits with those. Phosphor Regular, 16px at rest. Fill when this is the place. The word stays cream or body. Only the mark is tinted. Selected fills the mark and lifts the word, not a blue wash. Directional marks (back, next, send) flip in RTL. Nudge a play triangle or a chevron in a circle when geometry lies. D-020. Do not grey every icon to look serious. Do not candy them. You notice the hue after you read the word. If the icon shouts first, drop chroma.
  • Outline at rest. Fill when this is the place. Still icons stay Phosphor. Regular is the default. Fill marks the current place on a dock, a tab, a rail. Do not fill every glyph to make them “bold.” Morphicons only when the mark itself is the state (idle → loader → check). One SVG, currentColor, states from CSS. D-020.
  • Prefer a preference. When the work varies person to person, let them change it. Theme, density, this list, saved views, default place, pinned places. Persist it. The default must still be complete. They may not rewrite the inverted L, the tokens, or the words. No hex picker. No display options on Arrive. A shared invoice does not wear their Light theme as the document. D-015.
  • Prefer a mark. Buttons do not wear a label unless the action would be guessed wrong without it. Search, theme, command, close, back, overflow: a 16px Phosphor mark in a circle. A commit keeps a word when it is destructive, when two commits sit together, when the mark is not a household verb, or when it is the one action on a Guided view. Save invoice. Cancel job. A value chip stays a word. Every icon-only control has an accessible name, and a title on a mouse. Mystery meat is a defect. D-016.

I built this for the dispatcher at 7 a.m., the tech in a crawlspace, and the owner closing the books. Quiet chrome. Precise work. I’m still learning. These are the notes.

Applied bookmark research

Reviewed 2026-09-06. These examples reinforce the existing owners; they do not introduce another visual style or claim the product behavior is implemented. Read the 26-source review and access limits.

Use color to clarify state, not replace it

A borrowed visual trick can weaken contrast or make a state readable only by its color.

Keep semantic roles and Thorbis tokens in charge. Inspect state words, marks, and control edges together in both themes. External suggestions for shadows, smoothing, and image outlines are evidence to evaluate, not a new palette.

Thorbis example. A failed invoice action has an understandable error and a recovery action; it is not merely a red icon. A rounded input retains the real rim required by D-017 rather than losing its boundary on a similar-toned surface.

Verify. Review focus, selected, disabled, pending, and error states in light, dark, and forced-colors conditions. Check contrast and meaning separately from whether the screenshot feels subtle.

Do not import. No second accent, literal source colors, missing control rim, or ornamental gradient and blur imported from a reference.

Open the color skill · Evidence: Web Interface Guidelines; Details that make interfaces feel better; components.build

A control keeps its meaning through every state

A button that changes width, a field that loses input, or a dialog that loses focus breaks the task even when the resting design looks precise.

Review the approved primitive as a sequence: resting, focused, activated, pending, resolved, and recovered. Keep the action label and footprint stable, associate errors with their fields, and preserve a visible keyboard path.

Thorbis example. Save estimate remains Save estimate while its state mark changes. A validation error keeps the entered values, explains the repair beside the field, and moves focus only when the interaction calls for it.

Verify. Test Tab, Shift-Tab, Enter, Escape where applicable, paste, invalid input, rapid activation, and a slow response. Repeat at 390px, in both themes, with zoom and reduced motion.

Do not import. No hand-built duplicate primitive, hidden label, disabled browser zoom, or borrowed shadow-only outer edge that violates D-017.

Open the ui skill · Evidence: Web Interface Guidelines; Invisible Details; components.build; Details that make interfaces feel better

Loading search…

Loading search. You can close this message and keep reading.