Le dark mode est devenu un standard pour améliorer l’expérience utilisateur. Voici comment l’implémenter simplement dans une application Next.js avec next-themes et le design system shadcn/ui.
1. installer les dépendances
1npm install next-themes
2npx shadcn-ui init
3npx shadcn-ui add dropdown-menu
4npm install lucide-react
2. Créer un ThemeProvider
Ce composant va envelopper votre application pour gérer le thème global.
1"use client";
2
3import { ThemeProvider as NextThemesProvider } from "next-themes";
4
5export function ThemeProvider({ children }: { children: React.ReactNode }) {
6 return <NextThemesProvider attribute="class" defaultTheme="system" enableSystem disableTransitionOnChange>
7 {children}
8 </NextThemesProvider>;
9}
3. Ajouter le ThemeProvider dans le layout
Dans app/layout.tsx, entourez votre application avec le provider.
1import { ThemeProvider } from "@/components/theme-provider";
2
3export default function RootLayout({ children }: { children: React.ReactNode }) {
4 return (
5 <html lang="fr" suppressHydrationWarning>
6 <head />
7 <body>
8 <ThemeProvider>
9 {children}
10 </ThemeProvider>
11 </body>
12 </html>
13 );
14}
4. Créer un composant toggle de thème
Utilisez le composant dropdown-menu de shadcn/ui pour proposer le choix entre clair, sombre et système.
1"use client";
2
3import { useTheme } from "next-themes";
4import { Button } from "@/components/ui/button";
5import {
6 DropdownMenu,
7 DropdownMenuTrigger,
8 DropdownMenuContent,
9 DropdownMenuItem,
10} from "@/components/ui/dropdown-menu";
11import { Sun, Moon } from "lucide-react";
12
13export function ModeToggle() {
14 const { setTheme } = useTheme();
15
16 return (
17 <DropdownMenu>
18 <DropdownMenuTrigger asChild>
19 <Button variant="outline" size="icon" aria-label="Changer de thème">
20 <Sun className="h-5 w-5 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
21 <Moon className="absolute h-5 w-5 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
22 </Button>
23 </DropdownMenuTrigger>
24 <DropdownMenuContent align="end">
25 <DropdownMenuItem onClick={() => setTheme("light")}>Clair</DropdownMenuItem>
26 <DropdownMenuItem onClick={() => setTheme("dark")}>Sombre</DropdownMenuItem>
27 <DropdownMenuItem onClick={() => setTheme("system")}>Système</DropdownMenuItem>
28 </DropdownMenuContent>
29 </DropdownMenu>
30 );
31}
32
5. Intégrer le composant toggle dans votre interface
Placez ce composant dans votre header ou navbar pour permettre à l’utilisateur de changer facilement de thème.