Files
linker/src/components/theme-toggle.tsx
2025-08-06 18:37:47 +02:00

62 lines
2.0 KiB
TypeScript

"use client"
import { Button } from "@/components/ui/button"
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
import { Monitor, Moon, Sun } from "lucide-react"
import { useTheme } from "next-themes"
import { useEffect, useState } from "react"
export function ThemeToggle() {
const { theme, setTheme } = useTheme()
const [mounted, setMounted] = useState(false)
// Prevent hydration mismatch
useEffect(() => {
setMounted(true)
}, [])
if (!mounted) {
return (
<Button variant="outline" size="icon" disabled>
<Sun className="h-[1.2rem] w-[1.2rem]" />
</Button>
)
}
const getIcon = () => {
switch (theme) {
case "light":
return <Sun className="h-[1.2rem] w-[1.2rem]" />
case "dark":
return <Moon className="h-[1.2rem] w-[1.2rem]" />
default:
return <Monitor className="h-[1.2rem] w-[1.2rem]" />
}
}
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" size="icon">
{getIcon()}
<span className="sr-only">Toggle theme</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem onClick={() => setTheme("light")}>
<Sun className="mr-2 w-4 h-4" />
<span>Light</span>
</DropdownMenuItem>
<DropdownMenuItem onClick={() => setTheme("dark")}>
<Moon className="mr-2 w-4 h-4" />
<span>Dark</span>
</DropdownMenuItem>
<DropdownMenuItem onClick={() => setTheme("system")}>
<Monitor className="mr-2 w-4 h-4" />
<span>System</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)
}