AeThex-OS/shell/aethex-shell/src-webos/components/ThemeToggle.tsx

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>
);
}