
Dark mode is no longer a feature. It is an expectation.
Modern UI systems must support multiple themes without duplicating CSS
or creating override chaos.
This lesson explains how dark mode and theming systems actually work
using prefers-color-scheme, CSS variables, and scalable theme logic
with live editable examples.
Why Dark Mode Is a System Problem
Dark mode is not just inverting colors. It affects:
- Contrast and readability
- Shadows and elevation
- Borders and dividers
- States and feedback
Info!
If dark mode is handled with overrides, the architecture will not scale.
prefers-color-scheme (The Foundation)
The prefers-color-scheme media query lets CSS detect the user’s system theme.
Basic Dark Mode Example
How it works:
The browser applies styles automatically based on the user’s OS preference.
No JavaScript is required.
Why Media Queries Alone Do Not Scale
This approach breaks down quickly:
- Duplicate styles for light and dark
- Hard-to-maintain overrides
- No support for custom themes
A scalable system needs abstraction.
CSS Variables (The Core of Theming)
CSS variables allow you to define colors once and reuse them everywhere. Themes then become simple variable swaps.
Theme Variables Setup
How it works:
Components never reference raw colors.
They use semantic variables instead.
Dark Theme via prefers-color-scheme
Now we switch variables, not components.
How it works:
When the system theme changes, CSS variables update automatically.
Every component updates instantly.
Manual Theme Switching (Scalable Logic)
Many apps allow users to override system preference. This should still reuse the same variables.
Attribute-Based Theme System
How it works:
JavaScript only toggles the attribute.
CSS handles the entire theme system.
Theme Tokens (Professional Pattern)
Never name variables by color. Name them by purpose.
--color-bg
--color-surface
--color-text
--color-border
--color-accent
Info!
Semantic tokens allow unlimited themes without rewriting components.
Handling Shadows in Dark Mode
Shadows must also adapt.
How it works:
Dark mode often needs stronger shadows to preserve depth.
Common Dark Mode Mistakes
- Pure black backgrounds
- Low contrast text
- Hardcoded colors in components
- Theme overrides instead of tokens
Warning!
Dark mode should reduce eye strain, not increase it.
Final Theming Architecture Rules
- Use CSS variables everywhere
- Switch variables, not components
- Support system preference by default
- Allow user override cleanly
Dark mode is not a theme. It is a configuration of the same system.
Next lesson: Css Performance & Rendering Optimization