| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- "use client";
- import { useTheme } from "next-themes";
- import { useEffect, useState } from "react";
- export function ThemeToggle() {
- const { theme, setTheme } = useTheme();
- const [mounted, setMounted] = useState(false);
- useEffect(() => {
- setMounted(true);
- }, []);
- if (!mounted) {
- return <div className="w-8 h-8" />;
- }
- return (
- <button
- onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
- className="w-8 h-8 flex items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-muted transition-colors"
- aria-label="Toggle theme"
- >
- {theme === "dark" ? (
- <svg
- width="16"
- height="16"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- strokeWidth="2"
- strokeLinecap="round"
- strokeLinejoin="round"
- >
- <circle cx="12" cy="12" r="4" />
- <path d="M12 2v2" />
- <path d="M12 20v2" />
- <path d="m4.93 4.93 1.41 1.41" />
- <path d="m17.66 17.66 1.41 1.41" />
- <path d="M2 12h2" />
- <path d="M20 12h2" />
- <path d="m6.34 17.66-1.41 1.41" />
- <path d="m19.07 4.93-1.41 1.41" />
- </svg>
- ) : (
- <svg
- width="16"
- height="16"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- strokeWidth="2"
- strokeLinecap="round"
- strokeLinejoin="round"
- >
- <path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z" />
- </svg>
- )}
- </button>
- );
- }
|