ThemeToggle.tsx 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. "use client";
  2. import { Moon, Sun } from "lucide-react";
  3. import { useTheme } from "next-themes";
  4. import { useEffect, useState } from "react";
  5. export function ThemeToggle() {
  6. const { theme, setTheme } = useTheme();
  7. const [mounted, setMounted] = useState(false);
  8. useEffect(() => {
  9. // eslint-disable-next-line
  10. setMounted(true);
  11. }, []);
  12. if (!mounted) {
  13. return (
  14. <button className="p-2 rounded-full hover:bg-surface-container-high text-secondary hover:text-white transition-colors w-10 h-10 flex items-center justify-center">
  15. <span className="w-5 h-5 block"></span>
  16. </button>
  17. );
  18. }
  19. return (
  20. <button
  21. onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
  22. className="p-2 rounded-full hover:bg-surface-container-high text-secondary hover:text-white transition-colors flex items-center justify-center"
  23. aria-label="Toggle theme"
  24. >
  25. {theme === "dark" ? (
  26. <Sun className="w-5 h-5" />
  27. ) : (
  28. <Moon className="w-5 h-5" />
  29. )}
  30. </button>
  31. );
  32. }