diff options
Diffstat (limited to 'renderer')
| -rw-r--r-- | renderer/src/App.tsx | 25 | ||||
| -rw-r--r-- | renderer/src/components/Header.tsx | 11 | ||||
| -rw-r--r-- | renderer/src/components/SettingsPage.tsx | 33 |
3 files changed, 36 insertions, 33 deletions
diff --git a/renderer/src/App.tsx b/renderer/src/App.tsx index 5fb3dd1..b53184b 100644 --- a/renderer/src/App.tsx +++ b/renderer/src/App.tsx | |||
| @@ -487,22 +487,7 @@ export function App() { | |||
| 487 | setMessages([]); | 487 | setMessages([]); |
| 488 | setDocumentContent(""); | 488 | setDocumentContent(""); |
| 489 | setOriginalContent(""); | 489 | setOriginalContent(""); |
| 490 | 490 | // User starts the conversation — no auto-send for manually-chosen phases. | |
| 491 | // For sessions that start beyond research, kick off Claude immediately | ||
| 492 | // with the same message used when advancing into that phase via Submit. | ||
| 493 | if (phase === "plan" || phase === "implement") { | ||
| 494 | const initialMsg = | ||
| 495 | phase === "plan" | ||
| 496 | ? "Create a detailed implementation plan based on the research." | ||
| 497 | : "Begin implementing the plan."; | ||
| 498 | setLoadingBySession((prev) => ({ ...prev, [session.id]: true })); | ||
| 499 | try { | ||
| 500 | await api.sendMessage(session.id, initialMsg); | ||
| 501 | } catch (err) { | ||
| 502 | setError(err instanceof Error ? err.message : "Failed to start session"); | ||
| 503 | setLoadingBySession((prev) => ({ ...prev, [session.id]: false })); | ||
| 504 | } | ||
| 505 | } | ||
| 506 | }; | 491 | }; |
| 507 | 492 | ||
| 508 | const handleDeleteProject = async (id: string) => { | 493 | const handleDeleteProject = async (id: string) => { |
| @@ -552,8 +537,6 @@ export function App() { | |||
| 552 | <div className="app"> | 537 | <div className="app"> |
| 553 | <Header | 538 | <Header |
| 554 | selectedSession={selectedSession} | 539 | selectedSession={selectedSession} |
| 555 | theme={theme} | ||
| 556 | onToggleTheme={handleToggleTheme} | ||
| 557 | gitBranch={selectedSession?.git_branch ?? null} | 540 | gitBranch={selectedSession?.git_branch ?? null} |
| 558 | onOpenSettings={() => setShowSettings(true)} | 541 | onOpenSettings={() => setShowSettings(true)} |
| 559 | viewPhase={viewPhase} | 542 | viewPhase={viewPhase} |
| @@ -661,7 +644,11 @@ export function App() { | |||
| 661 | /> | 644 | /> |
| 662 | 645 | ||
| 663 | {showSettings && ( | 646 | {showSettings && ( |
| 664 | <SettingsPage onClose={() => setShowSettings(false)} /> | 647 | <SettingsPage |
| 648 | onClose={() => setShowSettings(false)} | ||
| 649 | theme={theme} | ||
| 650 | onToggleTheme={handleToggleTheme} | ||
| 651 | /> | ||
| 665 | )} | 652 | )} |
| 666 | 653 | ||
| 667 | {showNewSessionModal && ( | 654 | {showNewSessionModal && ( |
diff --git a/renderer/src/components/Header.tsx b/renderer/src/components/Header.tsx index 4e193e8..84b9135 100644 --- a/renderer/src/components/Header.tsx +++ b/renderer/src/components/Header.tsx | |||
| @@ -3,12 +3,8 @@ import type { Session, Phase } from "../types"; | |||
| 3 | 3 | ||
| 4 | const api = window.api; | 4 | const api = window.api; |
| 5 | 5 | ||
| 6 | type Theme = "dark" | "light"; | ||
| 7 | |||
| 8 | interface HeaderProps { | 6 | interface HeaderProps { |
| 9 | selectedSession: Session | null; | 7 | selectedSession: Session | null; |
| 10 | theme: Theme; | ||
| 11 | onToggleTheme: () => void; | ||
| 12 | gitBranch: string | null; | 8 | gitBranch: string | null; |
| 13 | onOpenSettings: () => void; | 9 | onOpenSettings: () => void; |
| 14 | viewPhase: Phase; | 10 | viewPhase: Phase; |
| @@ -25,8 +21,6 @@ const phases: Phase[] = ["research", "plan", "implement"]; | |||
| 25 | 21 | ||
| 26 | export function Header({ | 22 | export function Header({ |
| 27 | selectedSession, | 23 | selectedSession, |
| 28 | theme, | ||
| 29 | onToggleTheme, | ||
| 30 | gitBranch, | 24 | gitBranch, |
| 31 | onOpenSettings, | 25 | onOpenSettings, |
| 32 | viewPhase, | 26 | viewPhase, |
| @@ -103,11 +97,6 @@ export function Header({ | |||
| 103 | </button> | 97 | </button> |
| 104 | )} | 98 | )} |
| 105 | 99 | ||
| 106 | {/* ── Theme toggle ── */} | ||
| 107 | <button className="theme-toggle" onClick={onToggleTheme}> | ||
| 108 | {theme === "dark" ? "[light]" : "[dark]"} | ||
| 109 | </button> | ||
| 110 | |||
| 111 | {/* ── Maximize toggle ── */} | 100 | {/* ── Maximize toggle ── */} |
| 112 | <button | 101 | <button |
| 113 | className="maximize-btn" | 102 | className="maximize-btn" |
diff --git a/renderer/src/components/SettingsPage.tsx b/renderer/src/components/SettingsPage.tsx index 7d06547..0c0c2e8 100644 --- a/renderer/src/components/SettingsPage.tsx +++ b/renderer/src/components/SettingsPage.tsx | |||
| @@ -4,15 +4,18 @@ import { GitSettings } from "./settings/GitSettings"; | |||
| 4 | import { ModelSettings } from "./settings/ModelSettings"; | 4 | import { ModelSettings } from "./settings/ModelSettings"; |
| 5 | import { McpSettings } from "./settings/McpSettings"; | 5 | import { McpSettings } from "./settings/McpSettings"; |
| 6 | 6 | ||
| 7 | type SettingsSection = "model" | "mcp" | "system-prompts" | "git"; | 7 | type Theme = "dark" | "light"; |
| 8 | type SettingsSection = "appearance" | "model" | "mcp" | "system-prompts" | "git"; | ||
| 8 | 9 | ||
| 9 | interface SettingsPageProps { | 10 | interface SettingsPageProps { |
| 10 | onClose: () => void; | 11 | onClose: () => void; |
| 12 | theme: Theme; | ||
| 13 | onToggleTheme: () => void; | ||
| 11 | } | 14 | } |
| 12 | 15 | ||
| 13 | export function SettingsPage({ onClose }: SettingsPageProps) { | 16 | export function SettingsPage({ onClose, theme, onToggleTheme }: SettingsPageProps) { |
| 14 | const [activeSection, setActiveSection] = | 17 | const [activeSection, setActiveSection] = |
| 15 | useState<SettingsSection>("model"); | 18 | useState<SettingsSection>("appearance"); |
| 16 | 19 | ||
| 17 | return ( | 20 | return ( |
| 18 | <div className="settings-overlay"> | 21 | <div className="settings-overlay"> |
| @@ -35,6 +38,14 @@ export function SettingsPage({ onClose }: SettingsPageProps) { | |||
| 35 | <nav className="settings-nav"> | 38 | <nav className="settings-nav"> |
| 36 | <button | 39 | <button |
| 37 | className={`settings-nav-item${ | 40 | className={`settings-nav-item${ |
| 41 | activeSection === "appearance" ? " active" : "" | ||
| 42 | }`} | ||
| 43 | onClick={() => setActiveSection("appearance")} | ||
| 44 | > | ||
| 45 | Appearance | ||
| 46 | </button> | ||
| 47 | <button | ||
| 48 | className={`settings-nav-item${ | ||
| 38 | activeSection === "model" ? " active" : "" | 49 | activeSection === "model" ? " active" : "" |
| 39 | }`} | 50 | }`} |
| 40 | onClick={() => setActiveSection("model")} | 51 | onClick={() => setActiveSection("model")} |
| @@ -69,6 +80,22 @@ export function SettingsPage({ onClose }: SettingsPageProps) { | |||
| 69 | 80 | ||
| 70 | {/* Content */} | 81 | {/* Content */} |
| 71 | <div className="settings-content"> | 82 | <div className="settings-content"> |
| 83 | {activeSection === "appearance" && ( | ||
| 84 | <div> | ||
| 85 | <div className="settings-section-title">Theme</div> | ||
| 86 | <div className="settings-section-desc"> | ||
| 87 | Choose between light and dark mode. | ||
| 88 | </div> | ||
| 89 | <div className="settings-toggle-row"> | ||
| 90 | <span className="settings-toggle-label"> | ||
| 91 | {theme === "dark" ? "Dark" : "Light"} | ||
| 92 | </span> | ||
| 93 | <button className="btn-secondary" onClick={onToggleTheme}> | ||
| 94 | Switch to {theme === "dark" ? "Light" : "Dark"} mode | ||
| 95 | </button> | ||
| 96 | </div> | ||
| 97 | </div> | ||
| 98 | )} | ||
| 72 | {activeSection === "model" && <ModelSettings />} | 99 | {activeSection === "model" && <ModelSettings />} |
| 73 | {activeSection === "mcp" && <McpSettings />} | 100 | {activeSection === "mcp" && <McpSettings />} |
| 74 | {activeSection === "system-prompts" && <SystemPromptsSettings />} | 101 | {activeSection === "system-prompts" && <SystemPromptsSettings />} |
