ColorArchive
Log in
Issue 026
2026-05-14

Why dark mode colors need more saturation than you think

The most common mistake in dark mode color systems is lifting light-mode colors onto dark backgrounds without adjustment. Colors that look rich and saturated on white appear washed out and gray on dark surfaces. The physics of simultaneous contrast explains why, and the fix is systematic rather than case-by-case.

Highlights
Simultaneous contrast causes the same hue to read differently depending on its surroundings — a medium blue on white reads as vivid, while the same hex value on near-black reads as dim and muted, requiring a chroma boost of roughly 15–25% to maintain perceived equivalence.
Dark mode brand colors often need to shift hue slightly as well as increase saturation — warm hues in particular tend to appear more orange and less yellow against dark backgrounds, a phenomenon caused by the Bezold-Brücke hue shift at different luminance levels.
The most robust approach is to define separate dark-mode primitive tokens rather than using opacity or filter adjustments on existing values, which produce inconsistent results across different background colors.

The simultaneous contrast problem

Human color perception is not absolute — it is relational. The visual cortex interprets a color partly by comparing it to its immediate surroundings. A surface that reflects a given spectral profile will look different depending on whether it is surrounded by lighter or darker values. On a white background, a medium saturation blue competes against a bright surround, and the contrast makes it appear vivid. On a dark background, the same color has no bright surround to push against, so the eye interprets it as less saturated — closer to the dark field than it actually is. This is not a display calibration issue; it is a fundamental property of human vision.

What systematic compensation looks like

Rather than adjusting individual colors by eye after the fact, effective dark mode systems apply a consistent chroma offset at the token level. If your light mode primary color is 60% saturation in HSL, your dark mode primitive equivalent might be 75–85% saturation at a similar lightness, adjusted until the perceived intensity matches your light mode intent. Hue also needs attention: the Bezold-Brücke shift affects warm hues most strongly, so oranges and yellows typically need a slight hue rotation toward their respective primaries when moving from light to dark contexts. These adjustments are predictable enough to encode as formulas rather than arbitrary overrides.

Building the token structure

The practical implication for token architecture is that dark mode cannot be implemented purely through a layer of semantic overrides on top of a single primitive set. You need a separate dark primitive palette — a set of base color values that have been adjusted for dark context — and a semantic layer that references the correct primitive set based on the active mode. This is more upfront work than the common shortcut of applying a CSS filter or opacity to existing colors, but it produces much more consistent results and makes QA straightforward: each token has an explicit expected value in each mode, which can be tested.

Newer issue
The case for limiting your palette to five colors
2026-05-07
Older issue
Color naming is a systems design decision, not a branding exercise
2026-05-21