ThemeToggle.tsx 786 B

123456789101112131415161718192021222324252627
  1. import { useEffect, useState } from "preact/hooks";
  2. export default function ThemeToggle() {
  3. const [dark, setDark] = useState(false);
  4. useEffect(() => {
  5. setDark(document.documentElement.classList.contains("dark"));
  6. }, []);
  7. const toggle = () => {
  8. const isDark = !dark;
  9. setDark(isDark);
  10. document.documentElement.classList.toggle("dark", isDark);
  11. localStorage.setItem("theme", isDark ? "dark" : "light");
  12. document.dispatchEvent(new CustomEvent("ThemeChange", { detail: isDark }));
  13. };
  14. return (
  15. <i
  16. className={`bi ${
  17. dark ? "bi-sun" : "bi-moon-stars"
  18. } text-base cursor-pointer hover:text-blue-600 dark:hover:text-blue-400`}
  19. onClick={toggle}
  20. title={dark ? "Switch to light mode" : "Switch to dark mode"}
  21. />
  22. );
  23. }