theme provider

This commit is contained in:
2025-12-24 11:49:17 +03:30
parent c5872fb762
commit 6a644b9a4e
26 changed files with 637 additions and 33 deletions

View File

@@ -0,0 +1,39 @@
import { DarkModeIcon, LightModeIcon } from "@/assets";
import { useMapLayersStore } from "@/stores/useMapLayersStore";
import { AnimatePresence, motion } from "framer-motion";
import { useTheme } from "next-themes";
export default function ThemeToggle() {
const { theme, setTheme } = useTheme();
const setActiveLayer = useMapLayersStore((s) => s.setActiveLayer);
function handleThemeToggle() {
if (theme === "dark") {
setActiveLayer("bright");
setTheme("light");
} else {
setActiveLayer("dark");
setTheme("dark");
}
}
return (
<AnimatePresence>
<button onClick={handleThemeToggle} className="flex cursor-pointer items-center py-2">
<motion.div
key={theme}
initial={{ rotate: -90, opacity: 0 }}
animate={{ rotate: 0, opacity: 1 }}
exit={{ rotate: 90, opacity: 0 }}
transition={{ duration: 0.5, ease: "easeInOut" }}
>
{theme === "dark" ? (
<DarkModeIcon className="text-text size-6" />
) : (
<LightModeIcon className="text-text size-6" />
)}
</motion.div>
</button>
</AnimatePresence>
);
}