theme-toggle.tsx 1.0 KB

12345678910111213141516171819202122232425262728293031323334
  1. 'use client';
  2. import * as React from 'react';
  3. import { Moon, Sun } from 'lucide-react';
  4. import { useTheme } from 'next-themes';
  5. import { cn } from '@/lib/utils';
  6. export function ThemeToggle() {
  7. const { theme, setTheme } = useTheme();
  8. const [mounted, setMounted] = React.useState(false);
  9. React.useEffect(() => {
  10. setMounted(true);
  11. }, []);
  12. if (!mounted) {
  13. return null;
  14. }
  15. return (
  16. <button
  17. onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}
  18. className={cn(
  19. 'relative inline-flex h-10 w-10 items-center justify-center rounded-lg',
  20. 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
  21. 'transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring'
  22. )}
  23. aria-label="Toggle theme"
  24. >
  25. <Sun className="h-5 w-5 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
  26. <Moon className="absolute h-5 w-5 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
  27. </button>
  28. );
  29. }