ThemeToggleButton.jsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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. import {
  7. Tooltip,
  8. TooltipContent,
  9. TooltipProvider,
  10. TooltipTrigger,
  11. } from "@/components/ui/tooltip";
  12. export default function ThemeToggleButton() {
  13. const { setTheme } = useTheme();
  14. function toggleTheme() {
  15. // Read current theme from the DOM class to avoid hydration-unsafe theme reads.
  16. const isDark =
  17. typeof document !== "undefined" &&
  18. document.documentElement.classList.contains("dark");
  19. setTheme(isDark ? "light" : "dark");
  20. }
  21. return (
  22. <TooltipProvider delayDuration={200}>
  23. <Tooltip>
  24. <TooltipTrigger asChild>
  25. <Button
  26. type="button"
  27. variant="ghost"
  28. size="icon-sm"
  29. onClick={toggleTheme}
  30. aria-label="Design umschalten"
  31. >
  32. {/* Light mode: show Moon (switch to dark) */}
  33. <Moon className="h-4 w-4 dark:hidden" aria-hidden="true" />
  34. {/* Dark mode: show Sun (switch to light) */}
  35. <Sun className="hidden h-4 w-4 dark:block" aria-hidden="true" />
  36. <span className="sr-only">Design umschalten</span>
  37. </Button>
  38. </TooltipTrigger>
  39. <TooltipContent side="bottom">Design umschalten</TooltipContent>
  40. </Tooltip>
  41. </TooltipProvider>
  42. );
  43. }