Skip to content

Commit a78d3b1

Browse files
authored
Replace panels menu with inline header toggles (#206)
- Swap the overflow panels menu for direct terminal, preview, and diff toggles - Remove code viewer header wiring now that panel control is simplified
1 parent fe9ea82 commit a78d3b1

3 files changed

Lines changed: 62 additions & 95 deletions

File tree

apps/web/src/components/ChatView.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4623,7 +4623,6 @@ export default function ChatView({ threadId }: ChatViewProps) {
46234623
onToggleDiff={onToggleDiff}
46244624
onTogglePreview={() => togglePreviewOpen()}
46254625
onTogglePreviewLayout={() => togglePreviewLayout(activeThread.id)}
4626-
onToggleCodeViewer={toggleCodeViewer}
46274626
/>
46284627
</header>
46294628

apps/web/src/components/chat/ChatHeader.tsx

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import { Badge } from "../ui/badge";
1212
import ProjectScriptsControl, { type NewProjectScriptInput } from "../ProjectScriptsControl";
1313
import { SidebarTrigger } from "../ui/sidebar";
1414
import { useThreadTitleEditor } from "~/hooks/useThreadTitleEditor";
15-
import { useCodeViewerStore } from "~/codeViewerStore";
1615
import { useProjectColor } from "~/projectColors";
1716
import { useTheme } from "~/hooks/useTheme";
1817
import type { ClientMode } from "~/lib/clientMode";
@@ -51,7 +50,6 @@ interface ChatHeaderProps {
5150
onToggleDiff: () => void;
5251
onTogglePreview: () => void;
5352
onTogglePreviewLayout: () => void;
54-
onToggleCodeViewer: () => void;
5553
}
5654

5755
export const ChatHeader = memo(function ChatHeader({
@@ -86,11 +84,8 @@ export const ChatHeader = memo(function ChatHeader({
8684
onToggleDiff,
8785
onTogglePreview,
8886
onTogglePreviewLayout: _onTogglePreviewLayout,
89-
onToggleCodeViewer,
9087
}: ChatHeaderProps) {
9188
const isMobileCompanion = clientMode === "mobile";
92-
const codeViewerOpen = useCodeViewerStore((state) => state.isOpen);
93-
const hasCodeViewerTabs = useCodeViewerStore((state) => state.tabs.length > 0);
9489
const projectColor = useProjectColor(activeProjectId);
9590
const { resolvedTheme } = useTheme();
9691
const isDark = resolvedTheme === "dark";
@@ -186,13 +181,9 @@ export const ChatHeader = memo(function ChatHeader({
186181
diffOpen={diffOpen}
187182
diffToggleShortcutLabel={diffToggleShortcutLabel}
188183
isGitRepo={isGitRepo}
189-
codeViewerOpen={codeViewerOpen}
190-
hasCodeViewerTabs={hasCodeViewerTabs}
191-
hasProject={activeProjectName !== undefined}
192184
onToggleTerminal={onToggleTerminal}
193185
onTogglePreview={onTogglePreview}
194186
onToggleDiff={onToggleDiff}
195-
onToggleCodeViewer={onToggleCodeViewer}
196187
/>
197188
)}
198189
{/* Mobile: only diff toggle */}
@@ -206,13 +197,9 @@ export const ChatHeader = memo(function ChatHeader({
206197
diffOpen={diffOpen}
207198
diffToggleShortcutLabel={diffToggleShortcutLabel}
208199
isGitRepo={isGitRepo}
209-
codeViewerOpen={false}
210-
hasCodeViewerTabs={false}
211-
hasProject={false}
212200
onToggleTerminal={() => {}}
213201
onTogglePreview={() => {}}
214202
onToggleDiff={onToggleDiff}
215-
onToggleCodeViewer={() => {}}
216203
/>
217204
)}
218205
</div>
Lines changed: 62 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import { memo } from "react";
1+
import { memo, useMemo } from "react";
22
import {
33
DiffIcon,
4-
EllipsisIcon,
5-
FileCodeIcon,
64
MonitorIcon,
75
TerminalSquareIcon,
86
} from "lucide-react";
9-
import { Button } from "../ui/button";
10-
import { Menu, MenuCheckboxItem, MenuPopup, MenuSeparator, MenuTrigger } from "../ui/menu";
117
import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip";
8+
import { ToggleGroup, Toggle, ToggleGroupSeparator } from "../ui/toggle-group";
129

1310
interface HeaderPanelsMenuProps {
1411
terminalAvailable: boolean;
@@ -19,13 +16,9 @@ interface HeaderPanelsMenuProps {
1916
diffOpen: boolean;
2017
diffToggleShortcutLabel: string | null;
2118
isGitRepo: boolean;
22-
codeViewerOpen: boolean;
23-
hasCodeViewerTabs: boolean;
24-
hasProject: boolean;
2519
onToggleTerminal: () => void;
2620
onTogglePreview: () => void;
2721
onToggleDiff: () => void;
28-
onToggleCodeViewer: () => void;
2922
}
3023

3124
export const HeaderPanelsMenu = memo(function HeaderPanelsMenu({
@@ -37,88 +30,76 @@ export const HeaderPanelsMenu = memo(function HeaderPanelsMenu({
3730
diffOpen,
3831
diffToggleShortcutLabel,
3932
isGitRepo,
40-
codeViewerOpen,
41-
hasCodeViewerTabs,
42-
hasProject,
4333
onToggleTerminal,
4434
onTogglePreview,
4535
onToggleDiff,
46-
onToggleCodeViewer,
4736
}: HeaderPanelsMenuProps) {
37+
const value = useMemo(() => {
38+
const v: string[] = [];
39+
if (terminalOpen) v.push("terminal");
40+
if (previewOpen) v.push("preview");
41+
if (diffOpen) v.push("diff");
42+
return v;
43+
}, [terminalOpen, previewOpen, diffOpen]);
44+
4845
return (
49-
<Menu>
46+
<ToggleGroup
47+
value={value}
48+
variant="outline"
49+
size="xs"
50+
className="shrink-0"
51+
>
52+
<Tooltip>
53+
<TooltipTrigger
54+
render={
55+
<Toggle
56+
value="terminal"
57+
disabled={!terminalAvailable}
58+
onClick={onToggleTerminal}
59+
aria-label="Toggle terminal"
60+
>
61+
<TerminalSquareIcon className="size-3.5" />
62+
</Toggle>
63+
}
64+
/>
65+
<TooltipPopup side="bottom">
66+
Terminal{terminalToggleShortcutLabel ? ` ${terminalToggleShortcutLabel}` : ""}
67+
</TooltipPopup>
68+
</Tooltip>
69+
<ToggleGroupSeparator />
70+
<Tooltip>
71+
<TooltipTrigger
72+
render={
73+
<Toggle
74+
value="preview"
75+
disabled={!previewAvailable}
76+
onClick={onTogglePreview}
77+
aria-label="Toggle preview"
78+
>
79+
<MonitorIcon className="size-3.5" />
80+
</Toggle>
81+
}
82+
/>
83+
<TooltipPopup side="bottom">Preview</TooltipPopup>
84+
</Tooltip>
85+
<ToggleGroupSeparator />
5086
<Tooltip>
5187
<TooltipTrigger
5288
render={
53-
<MenuTrigger
54-
render={
55-
<Button variant="outline" size="xs" className="shrink-0" aria-label="Toggle panels">
56-
<EllipsisIcon className="size-3.5" />
57-
</Button>
58-
}
59-
/>
89+
<Toggle
90+
value="diff"
91+
disabled={!isGitRepo}
92+
onClick={onToggleDiff}
93+
aria-label="Toggle diff"
94+
>
95+
<DiffIcon className="size-3.5" />
96+
</Toggle>
6097
}
6198
/>
62-
<TooltipPopup side="bottom">Panels</TooltipPopup>
99+
<TooltipPopup side="bottom">
100+
Diff{diffToggleShortcutLabel ? ` ${diffToggleShortcutLabel}` : ""}
101+
</TooltipPopup>
63102
</Tooltip>
64-
<MenuPopup side="bottom" align="end" sideOffset={6}>
65-
<MenuCheckboxItem
66-
checked={terminalOpen}
67-
onCheckedChange={onToggleTerminal}
68-
disabled={!terminalAvailable}
69-
variant="switch"
70-
>
71-
<span className="inline-flex items-center gap-2">
72-
<TerminalSquareIcon className="size-3.5 opacity-80" />
73-
Terminal
74-
{terminalToggleShortcutLabel ? (
75-
<kbd className="ml-auto text-[10px] text-muted-foreground">
76-
{terminalToggleShortcutLabel}
77-
</kbd>
78-
) : null}
79-
</span>
80-
</MenuCheckboxItem>
81-
<MenuCheckboxItem
82-
checked={previewOpen}
83-
onCheckedChange={onTogglePreview}
84-
disabled={!previewAvailable}
85-
variant="switch"
86-
>
87-
<span className="inline-flex items-center gap-2">
88-
<MonitorIcon className="size-3.5 opacity-80" />
89-
Preview
90-
</span>
91-
</MenuCheckboxItem>
92-
<MenuSeparator />
93-
<MenuCheckboxItem
94-
checked={diffOpen}
95-
onCheckedChange={onToggleDiff}
96-
disabled={!isGitRepo}
97-
variant="switch"
98-
>
99-
<span className="inline-flex items-center gap-2">
100-
<DiffIcon className="size-3.5 opacity-80" />
101-
Diff
102-
{diffToggleShortcutLabel ? (
103-
<kbd className="ml-auto text-[10px] text-muted-foreground">
104-
{diffToggleShortcutLabel}
105-
</kbd>
106-
) : null}
107-
</span>
108-
</MenuCheckboxItem>
109-
{hasProject && hasCodeViewerTabs ? (
110-
<MenuCheckboxItem
111-
checked={codeViewerOpen}
112-
onCheckedChange={onToggleCodeViewer}
113-
variant="switch"
114-
>
115-
<span className="inline-flex items-center gap-2">
116-
<FileCodeIcon className="size-3.5 opacity-80" />
117-
Code viewer
118-
</span>
119-
</MenuCheckboxItem>
120-
) : null}
121-
</MenuPopup>
122-
</Menu>
103+
</ToggleGroup>
123104
);
124105
});

0 commit comments

Comments
 (0)