| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- import { useTheme, Theme } from '../contexts/ThemeContext';
- function SunIcon({ className }: { className?: string }) {
- return (
- <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
- <path strokeLinecap="round" strokeLinejoin="round" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z" />
- </svg>
- );
- }
- function MoonIcon({ className }: { className?: string }) {
- return (
- <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
- <path strokeLinecap="round" strokeLinejoin="round" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z" />
- </svg>
- );
- }
- function SystemIcon({ className }: { className?: string }) {
- return (
- <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
- <path strokeLinecap="round" strokeLinejoin="round" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
- </svg>
- );
- }
- const themeOrder: Theme[] = ['light', 'dark', 'system'];
- const themeLabels: Record<Theme, string> = {
- light: 'Light mode',
- dark: 'Dark mode',
- system: 'System theme',
- };
- export default function ThemeToggle() {
- const { theme, resolvedTheme, setTheme } = useTheme();
- const cycleTheme = () => {
- const currentIndex = themeOrder.indexOf(theme);
- const nextTheme = themeOrder[(currentIndex + 1) % themeOrder.length];
- setTheme(nextTheme);
- };
- const getIcon = () => {
- if (theme === 'system') {
- return <SystemIcon className="h-5 w-5" />;
- }
- return resolvedTheme === 'dark'
- ? <MoonIcon className="h-5 w-5" />
- : <SunIcon className="h-5 w-5" />;
- };
- return (
- <button
- onClick={cycleTheme}
- className="p-2 rounded-lg transition-colors duration-200 text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)]"
- title={themeLabels[theme]}
- aria-label={themeLabels[theme]}
- >
- {getIcon()}
- </button>
- );
- }
|