Dark mode is no longer an optional toggle; it is an expectation. Yet many dark modes feel harsh because developers simply invert pure white to pure black. Here is how to build a resilient, accessible dark theme with Tailwind CSS v4.
The Danger of Pure Black (#000000)
Pure black against pure white text creates extreme contrast (~21:1) that leads to eye strain and optical halation on OLED screens.
Using soft neutral ramps like zinc-950 (#09090b) or zinc-900 (#18181b) preserves visual depth while allowing subtle borders (border-zinc-800) to define container boundaries.
Managing Contrast Ratios for Secondary Text
A frequent pitfall in dark mode is using text-zinc-500 for muted text. While zinc-500 passes WCAG AA on white backgrounds (~4.6:1), it fails on dark backgrounds (~3.6:1).
In dark mode, secondary labels should shift to text-zinc-400 (~6.8:1) to guarantee effortless readability in low-light environments.
/* Recommended contrast pairing */
.label {
@apply text-zinc-600 dark:text-zinc-400;
}
.border-subtle {
@apply border-zinc-200 dark:border-zinc-800;
}Key Takeaway: Always test your color tokens with a contrast checker across both light and dark modes before shipping.
Conclusion
A great dark mode feels cohesive, comfortable, and natural. Mindful contrast adjustments transform a stark inversion into an enjoyable reading experience.
