aboutsummaryrefslogtreecommitdiffstats
path: root/renderer/src/App.tsx
diff options
context:
space:
mode:
authorbndw <ben@bdw.to>2026-02-28 21:49:29 -0800
committerbndw <ben@bdw.to>2026-02-28 21:49:29 -0800
commit454453788e759fa16442e755434fbb842fa1acab (patch)
tree38cff99c9cd9c625f549d7f05d435d0b3fd04479 /renderer/src/App.tsx
parent0484d97dfbc3b8a2e7878d3ab35a9895decdf467 (diff)
feat: **`globals.css`** — Edit `.chat-pane`: remove `width: 3… (+7 more)
- ✅ **`globals.css`** — Edit `.chat-pane`: remove `width: 380px`, add `min-width: 0`, `overflow: hidden`, `transition: width 0.2s ease` - ✅ **`globals.css`** — Insert `.chat-resize-handle`, `.chat-header`, `.chat-collapse-btn` rules after `.chat-pane` block - ✅ **`globals.css`** — Append `::-webkit-scrollbar` rules at end of file - ✅ **`ChatPane.tsx`** — Full rewrite: new props interface, header strip, conditional body, inline width style - ✅ **`App.tsx`** — Add `chatWidth` + `chatCollapsed` state with lazy localStorage initialisers - ✅ **`App.tsx`** — Add two `useEffect` persistence hooks - ✅ **`App.tsx`** — Add `handleResizeMouseDown` function - ✅ **`App.tsx`** — Update `.main-content` JSX: insert conditional resize handle div, pass new props to `<ChatPane>`
Diffstat (limited to 'renderer/src/App.tsx')
-rw-r--r--renderer/src/App.tsx42
1 files changed, 42 insertions, 0 deletions
diff --git a/renderer/src/App.tsx b/renderer/src/App.tsx
index 7d75196..c3eafd4 100644
--- a/renderer/src/App.tsx
+++ b/renderer/src/App.tsx
@@ -63,15 +63,47 @@ export function App() {
63 () => (localStorage.getItem("cf-theme") as Theme) ?? "dark" 63 () => (localStorage.getItem("cf-theme") as Theme) ?? "dark"
64 ); 64 );
65 65
66 const [chatWidth, setChatWidth] = useState<number>(
67 () => Number(localStorage.getItem("cf-chat-width")) || 380
68 );
69 const [chatCollapsed, setChatCollapsed] = useState<boolean>(
70 () => localStorage.getItem("cf-chat-collapsed") === "true"
71 );
72
66 // Keep document.documentElement in sync and persist to localStorage 73 // Keep document.documentElement in sync and persist to localStorage
67 useEffect(() => { 74 useEffect(() => {
68 document.documentElement.setAttribute("data-theme", theme); 75 document.documentElement.setAttribute("data-theme", theme);
69 localStorage.setItem("cf-theme", theme); 76 localStorage.setItem("cf-theme", theme);
70 }, [theme]); 77 }, [theme]);
71 78
79 useEffect(() => {
80 localStorage.setItem("cf-chat-width", String(chatWidth));
81 }, [chatWidth]);
82
83 useEffect(() => {
84 localStorage.setItem("cf-chat-collapsed", String(chatCollapsed));
85 }, [chatCollapsed]);
86
72 const handleToggleTheme = () => 87 const handleToggleTheme = () =>
73 setTheme((t) => (t === "dark" ? "light" : "dark")); 88 setTheme((t) => (t === "dark" ? "light" : "dark"));
74 89
90 const handleResizeMouseDown = (e: React.MouseEvent) => {
91 e.preventDefault();
92 const startX = e.clientX;
93 const startWidth = chatWidth;
94 const onMove = (ev: MouseEvent) => {
95 const delta = startX - ev.clientX; // drag left = wider chat
96 const next = Math.max(180, Math.min(700, startWidth + delta));
97 setChatWidth(next);
98 };
99 const onUp = () => {
100 document.removeEventListener("mousemove", onMove);
101 document.removeEventListener("mouseup", onUp);
102 };
103 document.addEventListener("mousemove", onMove);
104 document.addEventListener("mouseup", onUp);
105 };
106
75 const hasChanges = documentContent !== originalContent; 107 const hasChanges = documentContent !== originalContent;
76 108
77 // Clear error after 5 seconds 109 // Clear error after 5 seconds
@@ -380,6 +412,13 @@ export function App() {
380 theme={theme} 412 theme={theme}
381 /> 413 />
382 414
415 {!chatCollapsed && (
416 <div
417 className="chat-resize-handle"
418 onMouseDown={handleResizeMouseDown}
419 />
420 )}
421
383 <ChatPane 422 <ChatPane
384 messages={messages} 423 messages={messages}
385 onSend={handleSendMessage} 424 onSend={handleSendMessage}
@@ -390,6 +429,9 @@ export function App() {
390 ? `Chat with Claude (${selectedSession.phase})...` 429 ? `Chat with Claude (${selectedSession.phase})...`
391 : "Select a session to start" 430 : "Select a session to start"
392 } 431 }
432 collapsed={chatCollapsed}
433 chatWidth={chatWidth}
434 onToggleCollapse={() => setChatCollapsed((c) => !c)}
393 /> 435 />
394 </div> 436 </div>
395 437