Activer le dark mode dans Next.js

1 août 2025

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.