'use client'; import React, { useState, useRef, useEffect } from 'react'; import { useTheme } from 'next-themes'; import { SunIcon, MoonIcon, ContrastIcon, HighContrastLightIcon, HighContrastDarkIcon } from '../atoms/Icons'; type ThemeType = 'light' | 'dark' | 'high-contrast-light' | 'high-contrast-dark' | 'system'; const ThemeSelector: React.FC = () => { const { theme, setTheme, resolvedTheme } = useTheme(); const [isOpen, setIsOpen] = useState(false); const [mounted, setMounted] = useState(false); const dropdownRef = useRef(null); // Prevent hydration mismatch useEffect(() => { setMounted(true); }, []); if (!mounted) { return (
); } // Simple close handler for escape key const handleKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'Escape') { setIsOpen(false); } }; const handleThemeChange = (newTheme: ThemeType) => { setTheme(newTheme); setIsOpen(false); }; // Get current theme icon based on resolved theme const ThemeIcon = () => { switch (resolvedTheme) { case 'dark': return ; case 'high-contrast-light': return ; case 'high-contrast-dark': return ; default: return ; } }; // Get theme name for screen readers const getThemeName = (themeType: string | undefined): string => { switch (themeType) { case 'dark': return 'Dark Mode'; case 'high-contrast-light': return 'High Contrast Light Mode'; case 'high-contrast-dark': return 'High Contrast Dark Mode'; case 'system': return 'System Theme'; default: return 'Light Mode'; } }; return (
{isOpen && (
Choose Website Theme
Choose Website Theme
Keyboard shortcut: Ctrl + T
)}
); }; export default ThemeSelector;