ThemeToggleButton.jsx 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. "use client";
  2. import React from "react";
  3. import { Moon, Sun } from "lucide-react";
  4. import { useTheme } from "next-themes";
  5. import { Button } from "@/components/ui/button";
  6. export default function ThemeToggleButton() {
  7. const { setTheme } = useTheme();
  8. function toggleTheme() {
  9. // We intentionally read the current state from the DOM class to avoid
  10. // hydration-unsafe theme reads during SSR/SSG. :contentReference[oaicite:2]{index=2}
  11. const isDark =
  12. typeof document !== "undefined" &&
  13. document.documentElement.classList.contains("dark");
  14. setTheme(isDark ? "light" : "dark");
  15. }
  16. return (
  17. <Button
  18. type="button"
  19. variant="ghost"
  20. size="icon-sm"
  21. onClick={toggleTheme}
  22. aria-label="Design umschalten"
  23. title="Design umschalten"
  24. >
  25. {/* Light mode: show Moon (switch to dark) */}
  26. <Moon className="h-4 w-4 dark:hidden" aria-hidden="true" />
  27. {/* Dark mode: show Sun (switch to light) */}
  28. <Sun className="hidden h-4 w-4 dark:block" aria-hidden="true" />
  29. <span className="sr-only">Design umschalten</span>
  30. </Button>
  31. );
  32. }