Files
SkillCompiler/data/skills-bench/tasks/fix-visual-stability/environment/app/src/components/ThemeProvider.tsx
T
2026-09-04 14:58:42 +08:00

44 lines
1.1 KiBLFS
TypeScript

'use client';
import { createContext, useContext, useState, useEffect, ReactNode } from 'react';
type Theme = 'light' | 'dark';
const ThemeContext = createContext<{
theme: Theme;
toggleTheme: () => void;
}>({ theme: 'light', toggleTheme: () => {} });
export function useTheme() {
return useContext(ThemeContext);
}
export function ThemeProvider({ children }: { children: ReactNode }) {
const [theme, setTheme] = useState<Theme>('light');
useEffect(() => {
const savedTheme = localStorage.getItem('theme') as Theme;
if (savedTheme) {
setTheme(savedTheme);
}
}, []);
useEffect(() => {
document.documentElement.setAttribute('data-theme', theme);
}, [theme]);
const toggleTheme = () => {
const newTheme = theme === 'light' ? 'dark' : 'light';
setTheme(newTheme);
localStorage.setItem('theme', newTheme);
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
<div data-testid="theme-wrapper" id="theme-wrapper" className={`min-h-screen ${theme === 'dark' ? 'bg-[#1a1a1a] text-white' : 'bg-white text-black'}`}>
{children}
</div>
</ThemeContext.Provider>
);
}