Capítulo 79 de 108
Adiciona dark mode a um app Next.js usando a lib next-themes, que gerencia classe CSS, persistência e prevenção de flash de tema incorreto.
ThemeProvider e useTheme().<html> porque o tema é aplicado client-side, causando mismatch esperado entre SSR e hydration.next-themes alterna a classe dark no <html> (compatível com o Tailwind dark: variant)."use client"
import * as React from "react"
import { ThemeProvider as NextThemesProvider } from "next-themes"
export function ThemeProvider({ children, ...props }: React.ComponentProps<typeof NextThemesProvider>) {
return <NextThemesProvider {...props}>{children}</NextThemesProvider>
}
<html lang="en" suppressHydrationWarning>
<body>
<ThemeProvider attribute="class" defaultTheme="system" enableSystem disableTransitionOnChange>
{children}
</ThemeProvider>
</body>
</html>
suppressHydrationWarning evitando warning de hydration mismatch.const { setTheme } = useTheme()
<DropdownMenuItem onClick={() => setTheme("light")}>Light</DropdownMenuItem>
useTheme() de next-themes expõe setTheme direto, sem contexto customizado.suppressHydrationWarning: causa warning de React porque o class do <html> é decidido no client (localStorage/prefers-color-scheme) e diverge do SSR.npm install next-themes é o único pré-requisito de dependência.attribute="class" é o que faz a integração funcionar com as classes dark: do Tailwind.ModeToggle usa Sun/Moon com dark:scale-0/dark:scale-100 para animação cross-fade entre ícones.