aboutsummaryrefslogtreecommitdiffstats
path: root/renderer/src/components/Header.tsx
diff options
context:
space:
mode:
authorClawd <ai@clawd.bot>2026-02-28 07:30:40 -0800
committerClawd <ai@clawd.bot>2026-02-28 07:30:40 -0800
commit6d70c5f8a3ed90564b08616a3fb041409916059c (patch)
tree4c6480c5a606ab0a178dca72efa93c60ebe70c34 /renderer/src/components/Header.tsx
parent66f66d1c17213f55aa56d69c0cccc309b16f3362 (diff)
Phase 4: React UI
- Add renderer/src/types.ts with Project, Session, Message, Phase types - Add renderer/src/styles/globals.css with full styling - Dark theme with accent colors - Header, document pane, chat pane, action bar layouts - Phase indicator, token usage bar, buttons - Add renderer/src/components/Header.tsx - Project/session dropdowns with create buttons - Phase indicator showing current workflow state - Add renderer/src/components/DocumentPane.tsx - Markdown viewer/editor with toggle - Syntax highlighting for review comments - Task checkbox rendering - Add renderer/src/components/ChatPane.tsx - Message list with auto-scroll - Input field with Enter to send - Loading state indicator - Add renderer/src/components/ActionBar.tsx - Token usage bar with color coding - Review/Submit buttons for workflow - Permission mode toggle for implement phase - Add renderer/src/App.tsx - Full state management for projects, sessions, messages - Claude message subscription - Workflow handlers (review, submit, phase advance) - Update renderer/src/main.tsx to render App
Diffstat (limited to 'renderer/src/components/Header.tsx')
-rw-r--r--renderer/src/components/Header.tsx99
1 files changed, 99 insertions, 0 deletions
diff --git a/renderer/src/components/Header.tsx b/renderer/src/components/Header.tsx
new file mode 100644
index 0000000..3dcbba9
--- /dev/null
+++ b/renderer/src/components/Header.tsx
@@ -0,0 +1,99 @@
1import React from "react";
2import type { Project, Session, Phase } from "../types";
3
4interface HeaderProps {
5 projects: Project[];
6 sessions: Session[];
7 selectedProject: Project | null;
8 selectedSession: Session | null;
9 onSelectProject: (project: Project | null) => void;
10 onSelectSession: (session: Session | null) => void;
11 onCreateProject: () => void;
12 onCreateSession: () => void;
13}
14
15const phaseLabels: Record<Phase, string> = {
16 research: "Research",
17 plan: "Plan",
18 implement: "Implement",
19};
20
21const phases: Phase[] = ["research", "plan", "implement"];
22
23export function Header({
24 projects,
25 sessions,
26 selectedProject,
27 selectedSession,
28 onSelectProject,
29 onSelectSession,
30 onCreateProject,
31 onCreateSession,
32}: HeaderProps) {
33 return (
34 <header className="header">
35 <div className="header-left">
36 <select
37 value={selectedProject?.id || ""}
38 onChange={(e) => {
39 const project = projects.find((p) => p.id === e.target.value);
40 onSelectProject(project || null);
41 onSelectSession(null);
42 }}
43 >
44 <option value="">Select Project...</option>
45 {projects.map((p) => (
46 <option key={p.id} value={p.id}>
47 {p.name}
48 </option>
49 ))}
50 </select>
51 <button onClick={onCreateProject}>+ Project</button>
52
53 {selectedProject && (
54 <>
55 <select
56 value={selectedSession?.id || ""}
57 onChange={(e) => {
58 const session = sessions.find((s) => s.id === e.target.value);
59 onSelectSession(session || null);
60 }}
61 >
62 <option value="">Select Session...</option>
63 {sessions.map((s) => (
64 <option key={s.id} value={s.id}>
65 {s.name}
66 </option>
67 ))}
68 </select>
69 <button onClick={onCreateSession}>+ Session</button>
70 </>
71 )}
72 </div>
73
74 <div className="header-right">
75 {selectedSession && (
76 <div className="phase-indicator">
77 {phases.map((phase) => {
78 const phaseIndex = phases.indexOf(phase);
79 const currentIndex = phases.indexOf(selectedSession.phase);
80 const isComplete = phaseIndex < currentIndex;
81 const isActive = phase === selectedSession.phase;
82
83 return (
84 <span
85 key={phase}
86 className={`phase-step ${isActive ? "active" : ""} ${
87 isComplete ? "complete" : ""
88 }`}
89 >
90 {phaseLabels[phase]}
91 </span>
92 );
93 })}
94 </div>
95 )}
96 </div>
97 </header>
98 );
99}