mirror of
https://github.com/AeThex-Corporation/AeThex-OS.git
synced 2026-04-17 22:27:19 +00:00
58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
import { useState, useEffect } from "react";
|
|
import { Moon, Sun } from "lucide-react";
|
|
|
|
export function useTheme() {
|
|
const [theme, setTheme] = useState<"light" | "dark">("dark");
|
|
const [mounted, setMounted] = useState(false);
|
|
|
|
useEffect(() => {
|
|
setMounted(true);
|
|
if (typeof window !== "undefined") {
|
|
const stored = localStorage.getItem("aethex_theme");
|
|
if (stored === "light" || stored === "dark") {
|
|
setTheme(stored);
|
|
}
|
|
}
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
if (!mounted) return;
|
|
|
|
const root = document.documentElement;
|
|
if (theme === "light") {
|
|
root.classList.remove("dark");
|
|
root.classList.add("light");
|
|
} else {
|
|
root.classList.remove("light");
|
|
root.classList.add("dark");
|
|
}
|
|
if (typeof window !== "undefined") {
|
|
localStorage.setItem("aethex_theme", theme);
|
|
}
|
|
}, [theme, mounted]);
|
|
|
|
const toggleTheme = () => {
|
|
setTheme((prev) => (prev === "dark" ? "light" : "dark"));
|
|
};
|
|
|
|
return { theme, setTheme, toggleTheme };
|
|
}
|
|
|
|
export function ThemeToggle() {
|
|
const { theme, toggleTheme } = useTheme();
|
|
|
|
return (
|
|
<button
|
|
onClick={toggleTheme}
|
|
className="p-2 rounded-lg border border-white/10 bg-card/50 hover:bg-card transition-colors"
|
|
data-testid="button-theme-toggle"
|
|
aria-label={`Switch to ${theme === "dark" ? "light" : "dark"} mode`}
|
|
>
|
|
{theme === "dark" ? (
|
|
<Sun className="w-4 h-4 text-primary" />
|
|
) : (
|
|
<Moon className="w-4 h-4 text-primary" />
|
|
)}
|
|
</button>
|
|
);
|
|
}
|