/* ======================================== File: frontend/components/common/ThemeController.tsx ======================================== */ "use client"; import { useState, useEffect, useRef, type ReactNode } from "react"; import { useTheme } from "next-themes"; import { Sun, Moon, Laptop, Palette, Check } from "lucide-react"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator, DropdownMenuLabel, } from "@/components/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; // Define available color schemes (these affect CSS variables) const colorSchemes = [ { name: "Blue", primary: "221.2 83.2% 53.3%" }, // Default blue { name: "Green", primary: "142.1 76.2% 36.3%" }, { name: "Purple", primary: "262.1 83.3% 57.8%" }, { name: "Orange", primary: "24.6 95% 53.1%" }, { name: "Teal", primary: "173 80.4% 40%" }, ]; interface ThemeControllerProps { children: ReactNode; defaultColorScheme?: string; } export function ThemeController({ children, defaultColorScheme = "Blue" }: ThemeControllerProps) { const { setTheme, theme } = useTheme(); const [colorScheme, setColorScheme] = useState(defaultColorScheme); // State for overlay boundaries removed, as overlay context now manages positioning/constraints. // const [overlayBoundaries, setOverlayBoundaries] = useState({ width: 0, height: 0 }); const containerRef = useRef(null); // Update overlay boundaries - This logic might be better placed within the OverlayProvider // or removed if not strictly necessary for the controller's function. // Kept here for now as per original code structure, but consider moving it. // useEffect(() => { // const updateBoundaries = () => { // if (containerRef.current) { // const width = containerRef.current.clientWidth; // const height = containerRef.current.clientHeight; // document.documentElement.style.setProperty("--max-overlay-width", `${width - 32}px`); // document.documentElement.style.setProperty("--max-overlay-height", `${height - 32}px`); // } // }; // updateBoundaries(); // window.addEventListener("resize", updateBoundaries); // return () => window.removeEventListener("resize", updateBoundaries); // }, []); // Apply color scheme by setting the '--primary' CSS variable useEffect(() => { const scheme = colorSchemes.find((s) => s.name === colorScheme); if (scheme) { document.documentElement.style.setProperty("--primary", scheme.primary); // You might need to set --ring as well if it depends on primary // document.documentElement.style.setProperty("--ring", scheme.primary); } }, [colorScheme]); return (
{children} {/* Theme Controller UI */}
{" "} {/* Ensure high z-index */} Theme Options setTheme("light")} className="flex items-center justify-between">
Light
{theme === "light" && }
setTheme("dark")} className="flex items-center justify-between">
Dark
{theme === "dark" && }
setTheme("system")} className="flex items-center justify-between">
System
{theme === "system" && }
Color Scheme {colorSchemes.map((scheme) => ( setColorScheme(scheme.name)} className="flex items-center justify-between">
{scheme.name}
{colorScheme === scheme.name && } ))}

Theme Settings

); }