theme-toggle.tsx 854 B

123456789101112131415161718192021222324252627282930313233343536
  1. "use client";
  2. import { useTheme } from "next-themes";
  3. import { useEffect, useState } from "react";
  4. import { Moon, Sun } from "lucide-react";
  5. export function ThemeToggle() {
  6. const { theme, setTheme } = useTheme();
  7. const [mounted, setMounted] = useState(false);
  8. useEffect(() => {
  9. setMounted(true);
  10. }, []);
  11. if (!mounted) {
  12. return (
  13. <button className="p-2 rounded-md border border-border bg-card">
  14. <Sun className="h-4 w-4" />
  15. </button>
  16. );
  17. }
  18. return (
  19. <button
  20. onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
  21. className="p-2 rounded-md border border-border bg-card hover:bg-accent transition-colors"
  22. aria-label="Toggle theme"
  23. >
  24. {theme === "dark" ? (
  25. <Sun className="h-4 w-4" />
  26. ) : (
  27. <Moon className="h-4 w-4" />
  28. )}
  29. </button>
  30. );
  31. }