color theory

Parallel System

A parallel system treats dark mode as its own complete design surface with unique rules for elevation, chroma, and text. Your light palette might use sharp shadows and high contrast whites. Dark mode cannot. Shadows disappear. Saturated colors bloom into painful halos. The concept exists because inversion creates flat grey disasters or burning accents that drive users back to light mode within minutes.

The entire system gets designed separately yet maps to the exact same semantic layer. Background, surface, accent, and text tokens stay consistent in name. Only the OKLCH values change. This lets components ignore the mode switch entirely while the root theme swaps the primitives. It is more work than slapping a media query on your light tokens. It is the only approach that does not look like an afterthought at 2 a.m.

A parallel system is not your light palette run through HSL darken functions. It is not a Figma plugin that flips lightness values and calls it done. The most common confusion comes from teams who treat dark mode as cosmetic instead of architectural. They end up with the same hues at wrong lightness levels creating mud or vibration. That is theme inversion. It is not a parallel system.

It is also not user custom themes like Arc browser spaces. Those let people pick any hue per workspace. A parallel system protects brand identity while adjusting only the physics of perception. Hue stays locked. Lightness lifts. Chroma drops. The brand stays recognizable. The eye stays comfortable.

Linear shipped a reference parallel system in 2022. Their light purple lives around oklch(0.62 0.22 270). The dark version shifts to oklch(0.72 0.15 270) against a warm oklch(0.10 0.012 30) background. Surface tokens step up in tight 0.04 increments creating four tiers without a single shadow. The UI feels like one seamless dark field with real depth. Adoption rates jumped because the dark mode finally felt as considered as the light one.

Stripe followed the same logic with their brand blue. They lifted lightness 10 points and pulled chroma back 25 percent. Their dense data tables remain readable at every surface tier because the elevation model was built in parallel rather than borrowed. Vercel proved the opposite extreme works too. Their binary background and elevated surface commit fully to the parallel approach without half measures. No muddy greys. No regrets.

Use a parallel system when your product sees heavy night usage or long sessions. Code editors, dashboards, design tools, and reading apps earn every hour spent. Skip it on marketing sites where dark mode is mostly cosmetic. The tradeoff is maintenance. You now own two complete primitive sets and must QA both for shimmer, halo, and bloom. Teams without senior oversight will drown in the details.

The extra effort only pays off if craft matters more than velocity. Early stage products can survive with clever inversion for the first year. Once real users stare at your UI past midnight the parallel system becomes non negotiable. Anything less signals you stopped at the settings page.

Build dark mode like it has to stand alone at 2 a.m. or do not bother building it at all.

Related terms

Keep exploring