Spaces:
Sleeping
Sleeping
| 'use client' | |
| import { useTheme } from '@/lib/stores/theme-store' | |
| import { Button } from '@/components/ui/button' | |
| import { | |
| DropdownMenu, | |
| DropdownMenuContent, | |
| DropdownMenuItem, | |
| DropdownMenuTrigger, | |
| } from '@/components/ui/dropdown-menu' | |
| import { Sun, Moon, Monitor } from 'lucide-react' | |
| interface ThemeToggleProps { | |
| iconOnly?: boolean | |
| } | |
| export function ThemeToggle({ iconOnly = false }: ThemeToggleProps) { | |
| const { theme, setTheme } = useTheme() | |
| return ( | |
| <DropdownMenu> | |
| <DropdownMenuTrigger asChild> | |
| <Button | |
| variant={iconOnly ? "ghost" : "outline"} | |
| size={iconOnly ? "icon" : "default"} | |
| className={iconOnly ? "h-9 w-full" : "w-full justify-start gap-2"} | |
| > | |
| <div className="relative h-[1.2rem] w-[1.2rem]"> | |
| <Sun className="absolute inset-0 h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" /> | |
| <Moon className="absolute inset-0 h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" /> | |
| </div> | |
| {!iconOnly && <span>Theme</span>} | |
| <span className="sr-only">Toggle theme</span> | |
| </Button> | |
| </DropdownMenuTrigger> | |
| <DropdownMenuContent align="end"> | |
| <DropdownMenuItem | |
| onClick={() => setTheme('light')} | |
| className={theme === 'light' ? 'bg-accent' : ''} | |
| > | |
| <Sun className="mr-2 h-4 w-4" /> | |
| <span>Light</span> | |
| </DropdownMenuItem> | |
| <DropdownMenuItem | |
| onClick={() => setTheme('dark')} | |
| className={theme === 'dark' ? 'bg-accent' : ''} | |
| > | |
| <Moon className="mr-2 h-4 w-4" /> | |
| <span>Dark</span> | |
| </DropdownMenuItem> | |
| <DropdownMenuItem | |
| onClick={() => setTheme('system')} | |
| className={theme === 'system' ? 'bg-accent' : ''} | |
| > | |
| <Monitor className="mr-2 h-4 w-4" /> | |
| <span>System</span> | |
| </DropdownMenuItem> | |
| </DropdownMenuContent> | |
| </DropdownMenu> | |
| ) | |
| } |