Dans ce post, on va voir comment implémenter un mode sombre dans une application Next.js en utilisant Tailwind CSS avec la librairie Next-Themes.
Table of contents
Ouvrir la table des matieÌres
Mettre en place le projet
Pour commencer, on a besoin dâune application Next.js avec Tailwind CSS configurĂ©e. Tu peux utiliser le script suivant pour crĂ©er ton application Next.js avec Tailwind CSS :
pnpx create-next-app@latest
Implémenter le mode sombre
Pour implĂ©menter le mode sombre, il faudra ajouter la propriĂ©tĂ© dark: dans le fichier tailwind.config.ts du projet. Par exemple, tu peux utiliser className=âtext-red-200 dark:text-red-500â. En mode normal, le texte sera de la couleur rouge variant 200 et en mode sombre, le texte sera de la couleur rouge variant 500.
const config: Config = {
darkMode: "class",
// le reste de ta config tailwind
};
Tailwind CSS applique le thĂšme quand la classe dark est prĂ©sente dans le nĆud HTML.
Next-Themes
On a besoin de switcher entre le mode sombre et le mode clair tout en stockant le thĂšme actuel pour que, quand lâutilisateur reviendra sur la page, le thĂšme ne soit pas rĂ©initialisĂ© mais quâil soit le mĂȘme quâavant quâil se soit dĂ©connectĂ© du site.
Pour installer la librairie Next-Themes :
pnpm install next-themes
Ensuite, on aura besoin dâun fichier theme-provider.tsx
qui tournera cÎté client et non cÎté serveur. Next-themes stocke le thÚme actuel dans le localStorage
du navigateur. La propriété attribute="class"
permet dâajouter la classe dark et light dans lâĂ©lĂ©ment HTML de la page.
"use client";
import { ThemeProvider as NextThemesProvider } from "next-themes";
export const ThemeProvider = ({ children }: { children: React.ReactNode }) => (
<NextThemesProvider attribute="class">{children}</NextThemesProvider>
);
Et pour finir, on va devoir wrapper notre application en utilisant ce provider.
import "./globals.css";
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import { ThemeProvider } from "./theme-provider";
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body className={inter.className}>
<ThemeProvider>{children}</ThemeProvider>
</body>
</html>
);
}
Accessibilité
Il est important que ton application soit accessible pour tout le monde. Lors de ton choix de couleurs pour chaque élément de ton site, assure-toi que la couleur du texte, des bordures et des fonds soit assez claire et accessible.
Toggle Theme
Enfin, on va avoir besoin dâun bouton qui permet de changer le thĂšme. Lâavantage de Next-Themes, câest quâil nous fournit une trĂšs bonne api. LĂ , on va utiliser le hook useTheme
pour savoir quel est le thÚme actuel, dark ou light, et changer le thÚme avec la méthode setTheme
qui est fournie avec le hook useTheme
.
"use client";
import { useTheme } from "next-themes";
export const ThemeToggle = () => {
const { theme, setTheme } = useTheme();
const toggle = () => setTheme(theme === "dark" ? "light" : "dark");
return (
<button onClick={toggle} className="rounded-lg border px-2">
{theme}
</button>
);
};
Ensuite, on importe ce composant dans la page ou, dans ton cas, ça peut ĂȘtre dans un Header ou un Footer.
import Image from "next/image";
import { ThemeToggle } from "./_components/toggle-theme";
export default function Home() {
return (
<main className="flex min-h-screen flex-col items-center justify-between p-24">
<ThemeToggle />
</main>
);
}
Bonus
Si tu as besoin dâune palette de couleurs ou de gĂ©nĂ©rer ta propre palette, utilise Radix Colors.
Tout doux! Tu viens de mettre en place un mode sombre pour ton application.
Crédit :
Poster de lâarticle par : Doran