Skip to content
ColorArchive
Issue 120
2028-04-15

Dark mode color adaptation: how to translate a light-mode palette without starting over

Designing dark mode is not simply inverting a light-mode palette. The perceptual behavior of colors changes dramatically at low background luminance: colors that looked soft in light mode become harsh, saturated colors that glowed attractively become uncomfortable, and light-mode hierarchy breaks down. A systematic adaptation approach preserves the palette identity while correctly adjusting for dark-mode perception.

Highlights
The core perceptual shift in dark mode is the Helmholtz-Kohlrausch effect: at low luminance, colors appear more vivid and more saturated than at high luminance. A color that reads as comfortably saturated on a light background can appear to glow or vibrate on a dark background. This means that light-mode accent colors — brand primary, CTA buttons, link colors — must typically be desaturated and lightness-adjusted for dark mode. A light-mode primary at hsl(220, 70%, 48%) might need to become hsl(220, 55%, 65%) in dark mode: lighter (so it has contrast against the dark surface) and less saturated (so it does not feel overwhelming against the dark field). The lightness increase is necessary for contrast; the saturation reduction is necessary for comfort.
Surface hierarchy in dark mode uses the same logic as light mode but in the opposite direction. In light mode, surfaces move from white (page) to slightly off-white (card) to light gray (secondary surface) to medium gray (borders). In dark mode, surfaces move from near-black (page background) to slightly lighter dark gray (card) to mid-dark gray (secondary surface) to medium-light dark gray (borders). The critical constraint: dark mode surfaces should use very small lightness steps between surface levels. Light-mode interfaces can use large lightness steps (page: L98, card: L95, secondary: L88) because there is ample room. Dark-mode interfaces should use smaller steps (page: L8, card: L12, secondary: L16, border: L22) to avoid the depth feeling too dramatic. The result looks like a range of dark grays that are subtly but perceptibly different.
Icon and illustration color needs special attention in dark mode. Icons that work at their original color on light backgrounds often need to become line-weight or opacity-based in dark mode rather than filled. A filled amber icon at hsl(45, 90%, 55%) looks warm and friendly on white; the same icon on a dark background becomes a small glowing shape that competes with other UI elements. Reducing fill color to a tinted outline or reducing opacity (amber icon at 70% opacity on dark) often produces more usable results than literal color inversion. For illustrations, areas of dark detail on light backgrounds need to be re-evaluated as light detail on dark backgrounds — the luminance hierarchy of the illustration often needs to be rebuilt rather than inverted, since the original illustration was designed with the assumption of a light surround.

The halation problem and how to avoid it

Halation is the visual blooming effect where bright colors appear to glow or bleed at their edges when surrounded by darkness. It occurs because the human visual system is adapted to process scenes under natural light (where bright = sunlit, dark = shadow), and bright, saturated colors in a dark surround trigger the same neural processing as light sources. In UI terms, highly saturated accent colors on dark backgrounds almost always produce halation — the color seems to vibrate or pulse, especially at the edges where it meets the dark background. The fix: reduce saturation for dark-mode accents (typically to 50–65% of the light-mode saturation value), use slightly desaturated border colors rather than sharp high-contrast borders at the edge of bright elements, and prefer slightly larger color elements over small dense saturated ones. Small saturated elements on dark backgrounds (e.g., tiny status dots, small icon fills) are especially prone to halation and benefit most from saturation reduction.

Maintaining brand identity across light and dark

The challenge of multi-theme design: the brand color needs to be recognizable in both themes while being perceptually appropriate in each. A brand primary of hsl(220, 70%, 48%) — a medium-value blue — works well in light mode as a button fill with dark text. In dark mode, the same value at 48% lightness is too dark against dark surfaces and will have insufficient contrast against dark backgrounds. Increasing to 65% lightness changes the character of the color substantially. The solution: treat light-mode and dark-mode accent colors as two expressions of the same identity, not as a single value applied in two contexts. The dark-mode version (lighter, slightly less saturated) should be close enough in hue and character that users perceive it as the same brand color. A light-mode primary of hsl(220, 70%, 48%) and a dark-mode primary of hsl(222, 58%, 64%) will read as consistent brand expression across themes while each performing correctly in its context.

Status and state colors in dark mode

Error, warning, success, and info colors need dark-mode variants as much as accent colors. A light-mode error red at hsl(4, 75%, 50%) is dark enough to contrast against light surfaces and light enough to remain recognizably red. In dark mode, this value is too dark (insufficient contrast against dark surfaces) and will need to move to hsl(4, 60%, 65%) or similar — lighter and less saturated. Each status color needs the same analysis: increase lightness for contrast, reduce saturation for comfort. Status background tints (the light pink behind an error message in light mode) also need dark-mode adaptation: instead of a light pink tint, use a dark warm-red tint — the background should be darker than the text but carry the same hue as the status color. A light-mode error container with background hsl(4, 80%, 96%) and text hsl(4, 75%, 30%) becomes a dark-mode container with background hsl(4, 40%, 15%) and text hsl(4, 55%, 72%). The hue stays consistent; the lightness logic inverts.

Testing dark mode: what to check before shipping

Dark mode requires its own review pass beyond just checking contrast ratios. The most important checks: (1) Halation audit — turn off room lights or lower screen brightness, then scan the interface for elements that seem to glow or pulse. These are halation candidates needing saturation reduction. (2) Surface hierarchy audit — can you tell the difference between page background, card surfaces, secondary surfaces, and borders? All four levels should be perceptibly different. (3) Text hierarchy audit — does the text hierarchy (primary, secondary, tertiary) still hold at dark-mode contrast levels? Secondary text especially tends to fail WCAG at the same opacity level that works in light mode. (4) Interactive state audit — do hover, focus, and pressed states feel distinct from their default states in dark mode? Light-mode hover states often use small lightness changes that become imperceptible on dark surfaces. (5) Motion and transition audit — some transitions that look smooth in light mode (e.g., opacity fades) can produce jarring results in dark mode, especially with saturated colors. Review any animated elements that involve color changes in both themes.

Newer issue
Pairing color with typefaces: how typography weight, style, and color interact in practice
2028-04-08
Older issue
Color in e-commerce design: trust, urgency, conversion, and the cost of getting it wrong
2028-04-22