feat: add theme toggle component with dropdown menu support to the layout

This commit is contained in:
2026-06-29 18:54:38 +07:00 Unverified
parent 9c45c25db8
commit 45ceae5c6e
5 changed files with 358 additions and 11 deletions
+55
View File
@@ -0,0 +1,55 @@
"use client"
import * as React from "react"
import { Moon, Sun, Monitor } from "lucide-react"
import { useTheme } from "next-themes"
import { Button } from "@/components/ui/button"
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
export function ThemeToggle() {
const { setTheme, theme, resolvedTheme } = useTheme()
const [mounted, setMounted] = React.useState(false)
React.useEffect(() => {
setMounted(true)
}, [])
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="icon" className="w-9 h-9">
{!mounted ? (
<Sun className="h-[1.2rem] w-[1.2rem]" />
) : theme === "system" ? (
<Monitor className="h-[1.2rem] w-[1.2rem]" />
) : resolvedTheme === "dark" ? (
<Moon className="h-[1.2rem] w-[1.2rem]" />
) : (
<Sun className="h-[1.2rem] w-[1.2rem]" />
)}
<span className="sr-only">Toggle theme</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem onClick={() => setTheme("light")}>
<Sun className="mr-2 h-4 w-4" />
Light theme
</DropdownMenuItem>
<DropdownMenuItem onClick={() => setTheme("dark")}>
<Moon className="mr-2 h-4 w-4" />
Dark theme
</DropdownMenuItem>
<DropdownMenuItem onClick={() => setTheme("system")}>
<Monitor className="mr-2 h-4 w-4" />
System
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)
}