Benjamin Lannon

Select a theme. Click on the overlay or the button again to exit

Tackling dark mode with TailwindCSS

Posted on:

When using Tailwind, you may want to add functionality to integrate a dark mode into the site. By default Tailwind does not provide this, but there is a plugin you can add into your workflow to enable this. tailwindcss-dark-mode drops in various variants (dark:, dark-hover:, etc) to just append more utilities to your components when in a dark mode.

To load tailwindcss-dark-mode into Tailwind, install the npm module and then add a require call for the module in the plugins field of the Tailwind config and immediately invoke it.

module.exports = {
theme: {},
variants: {},
plugins: [require("tailwindcss-dark-mode")()],
};

Following, you need to tell Tailwind what utilities you want to use the dark and subsequent variants (If you don't know about custom variants, check out Tailwind Docs - Configuring Variants). If we want to add the default dark and a dark hover state to append to backgroundColor and textColor, the following would be done:

module.exports = {
theme: {},
variants: {
backgroundColor: ["hover", "responsive", " focus", "dark", "dark-hover"],
textColor: ["hover", "responsive", "focus", "dark", "dark-hover"],
},
plugins: [require("tailwindcss-dark-mode")()],
};

Then, this plugin will trigger utilities when the mode-dark class is around. With a snippet of JS, you can use the window.matchMedia function and check if the prefers-color-scheme media query would trigger to add a class to the root element.

function checkDarkMode() {
if (
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
) {
return true;
}
return false;
}

if (checkDarkMode()) {
document.documentElement.classList.add("mode-dark");
} else {
document.documentElement.classList.remove("mode-dark");
}

Finally, if we add some classes to an HTML page (or whatever template language / framework you are using for your website), if you add dark: in front of various classes, it will trigger when in dark mode:

<body class="dark:bg-gray-800">
<div class="max-w-2xl my-5 mx-auto dark:text-white">
<h1 class="text-3xl text-purple-700 dark:text-teal-400">Hello World</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Architecto iusto
dolores corporis asperiores porro velit ipsum voluptatum, autem, veniam
nesciunt ipsa aut voluptatibus itaque quaerat. Rem aspernatur quam porro
molestiae.
</p>
</div>
</body>

Example in light mode

Example in dark mode