diff --git a/src/App.tsx b/src/App.tsx index 18dc951..4755be2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,11 +14,18 @@ function App() { const [showFavoritesOnly, setShowFavoritesOnly] = useState(false); const [fontSize] = useState(14); const [username, setUsername] = useState(''); + const [theme, setTheme] = useState<'light' | 'dark' | 'system'>('system'); + const [effectiveTheme, setEffectiveTheme] = useState<'light' | 'dark'>('light'); useEffect(() => { const savedServer = localStorage.getItem('serverURL'); const savedUsername = localStorage.getItem('username'); const savedPassword = localStorage.getItem('password'); + const savedTheme = localStorage.getItem('theme') as 'light' | 'dark' | 'system' | null; + + if (savedTheme) { + setTheme(savedTheme); + } if (savedServer && savedUsername && savedPassword) { const apiInstance = new NextcloudAPI({ @@ -32,6 +39,30 @@ function App() { } }, []); + useEffect(() => { + const updateEffectiveTheme = () => { + if (theme === 'system') { + const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + setEffectiveTheme(isDark ? 'dark' : 'light'); + } else { + setEffectiveTheme(theme); + } + }; + + updateEffectiveTheme(); + + if (theme === 'system') { + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + const handler = () => updateEffectiveTheme(); + mediaQuery.addEventListener('change', handler); + return () => mediaQuery.removeEventListener('change', handler); + } + }, [theme]); + + useEffect(() => { + document.documentElement.classList.toggle('dark', effectiveTheme === 'dark'); + }, [effectiveTheme]); + useEffect(() => { if (api && isLoggedIn) { syncNotes(); @@ -75,6 +106,11 @@ function App() { setIsLoggedIn(false); }; + const handleThemeChange = (newTheme: 'light' | 'dark' | 'system') => { + setTheme(newTheme); + localStorage.setItem('theme', newTheme); + }; + const handleCreateNote = async () => { if (!api) return; try { @@ -152,6 +188,8 @@ function App() { onSync={syncNotes} onLogout={handleLogout} username={username} + theme={theme} + onThemeChange={handleThemeChange} searchText={searchText} onSearchChange={setSearchText} showFavoritesOnly={showFavoritesOnly} diff --git a/src/components/NoteEditor.tsx b/src/components/NoteEditor.tsx index 0843576..c2a66bc 100644 --- a/src/components/NoteEditor.tsx +++ b/src/components/NoteEditor.tsx @@ -142,22 +142,22 @@ export function NoteEditor({ note, onUpdateNote, fontSize }: NoteEditorProps) { } return ( -