diff options
Diffstat (limited to 'renderer/src/App.tsx')
| -rw-r--r-- | renderer/src/App.tsx | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/renderer/src/App.tsx b/renderer/src/App.tsx index 26ac252..5ca7a9b 100644 --- a/renderer/src/App.tsx +++ b/renderer/src/App.tsx | |||
| @@ -8,6 +8,8 @@ import "./styles/globals.css"; | |||
| 8 | 8 | ||
| 9 | const api = window.api; | 9 | const api = window.api; |
| 10 | 10 | ||
| 11 | type Theme = "dark" | "light"; | ||
| 12 | |||
| 11 | export function App() { | 13 | export function App() { |
| 12 | const [projects, setProjects] = useState<Project[]>([]); | 14 | const [projects, setProjects] = useState<Project[]>([]); |
| 13 | const [sessions, setSessions] = useState<Session[]>([]); | 15 | const [sessions, setSessions] = useState<Session[]>([]); |
| @@ -23,6 +25,19 @@ export function App() { | |||
| 23 | }); | 25 | }); |
| 24 | const [error, setError] = useState<string | null>(null); | 26 | const [error, setError] = useState<string | null>(null); |
| 25 | 27 | ||
| 28 | const [theme, setTheme] = useState<Theme>( | ||
| 29 | () => (localStorage.getItem("cf-theme") as Theme) ?? "dark" | ||
| 30 | ); | ||
| 31 | |||
| 32 | // Keep document.documentElement in sync and persist to localStorage | ||
| 33 | useEffect(() => { | ||
| 34 | document.documentElement.setAttribute("data-theme", theme); | ||
| 35 | localStorage.setItem("cf-theme", theme); | ||
| 36 | }, [theme]); | ||
| 37 | |||
| 38 | const handleToggleTheme = () => | ||
| 39 | setTheme((t) => (t === "dark" ? "light" : "dark")); | ||
| 40 | |||
| 26 | const hasChanges = documentContent !== originalContent; | 41 | const hasChanges = documentContent !== originalContent; |
| 27 | 42 | ||
| 28 | // Clear error after 5 seconds | 43 | // Clear error after 5 seconds |
| @@ -282,6 +297,8 @@ export function App() { | |||
| 282 | onCreateSession={handleCreateSession} | 297 | onCreateSession={handleCreateSession} |
| 283 | onDeleteProject={handleDeleteProject} | 298 | onDeleteProject={handleDeleteProject} |
| 284 | onDeleteSession={handleDeleteSession} | 299 | onDeleteSession={handleDeleteSession} |
| 300 | theme={theme} | ||
| 301 | onToggleTheme={handleToggleTheme} | ||
| 285 | /> | 302 | /> |
| 286 | 303 | ||
| 287 | <div className="main-content"> | 304 | <div className="main-content"> |
| @@ -291,6 +308,7 @@ export function App() { | |||
| 291 | phase={selectedSession?.phase || "research"} | 308 | phase={selectedSession?.phase || "research"} |
| 292 | disabled={!selectedSession || selectedSession.phase === "implement"} | 309 | disabled={!selectedSession || selectedSession.phase === "implement"} |
| 293 | showOnboarding={!selectedProject} | 310 | showOnboarding={!selectedProject} |
| 311 | theme={theme} | ||
| 294 | /> | 312 | /> |
| 295 | 313 | ||
| 296 | <ChatPane | 314 | <ChatPane |
