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>}
"use client"import { useEffect, useState } from "react"import { Loader2, MoonIcon, SunIcon } from "lucide-react"import { useTheme } from "next-themes"import { Button, IconButton } from "@/components/ui/button"export function ThemeToggler() { // This component is only rendered on the client, so we can use useEffect to set the mounted state // and avoid server-side rendering issues with the theme provider const [mounted, setMounted] = useState(false) const { resolvedTheme, setTheme } = useTheme() const toggleTheme = () => { setTheme(resolvedTheme === "light" ? "dark" : "light") } // useEffect only runs on the client, so now we can safely show the UI useEffect(() => { setMounted(true) }, []) if (!mounted) { return ( <IconButton variant="outline" color="neutral" disabled> <Loader2 className="size-5 animate-spin" /> </IconButton> ) } return ( <IconButton variant="outline" color="neutral" onClick={toggleTheme}> {resolvedTheme === "light" ? <MoonIcon /> : <SunIcon />} </IconButton> )}