authorgravatar for 72981323+antiisaint@users.noreply.github.comANTI <72981323+antiisaint@users.noreply.github.com> 2026-03-24 05:28:41-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-03-24 09:28:41+00:00
logbe1abc88fda0beacb606b2e7de6f4e82cc31155f
tree2cf34b5b5ec7703a9a75dc721997aa466ddeaa33
parent384f35084e8a94985d37c95e17b3da83ed153e57
signature Signed by PGP key B5690EEEBB952194

feat: add terminal toggle button to chat header (#633)

Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com>

2 files changed, 41 insertions(+), 1 deletions(-)

apps/web/src/components/ChatView.tsx+8
......@@ -1119,6 +1119,10 @@ export default function ChatView({ threadId }: ChatViewProps) {
11191119 }, [activeProjectCwd, activeThreadWorktreePath]);
11201120 // Default true while loading to avoid toolbar flicker.
11211121 const isGitRepo = branchesQuery.data?.isRepo ?? true;
1122 const terminalToggleShortcutLabel = useMemo(
1123 () => shortcutLabelForCommand(keybindings, "terminal.toggle"),
1124 [keybindings],
1125 );
11221126 const splitTerminalShortcutLabel = useMemo(
11231127 () => shortcutLabelForCommand(keybindings, "terminal.split"),
11241128 [keybindings],
......@@ -3474,6 +3478,9 @@ export default function ChatView({ threadId }: ChatViewProps) {
34743478 }
34753479 keybindings={keybindings}
34763480 availableEditors={availableEditors}
3481 terminalAvailable={activeProject !== undefined}
3482 terminalOpen={terminalState.terminalOpen}
3483 terminalToggleShortcutLabel={terminalToggleShortcutLabel}
34773484 diffToggleShortcutLabel={diffPanelShortcutLabel}
34783485 gitCwd={gitCwd}
34793486 diffOpen={diffOpen}
......@@ -3483,6 +3490,7 @@ export default function ChatView({ threadId }: ChatViewProps) {
34833490 onAddProjectScript={saveProjectScript}
34843491 onUpdateProjectScript={updateProjectScript}
34853492 onDeleteProjectScript={deleteProjectScript}
3493 onToggleTerminal={toggleTerminalVisibility}
34863494 onToggleDiff={onToggleDiff}
34873495 />
34883496 </header>
apps/web/src/components/chat/ChatHeader.tsx+33-1
......@@ -6,7 +6,7 @@ import {
66} from "@t3tools/contracts";
77import { memo } from "react";
88import GitActionsControl from "../GitActionsControl";
9import { DiffIcon } from "lucide-react";
9import { DiffIcon, TerminalSquareIcon } from "lucide-react";
1010import { Badge } from "../ui/badge";
1111import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip";
1212import ProjectScriptsControl, { type NewProjectScriptInput } from "../ProjectScriptsControl";
......@@ -24,6 +24,9 @@ interface ChatHeaderProps {
2424 preferredScriptId: string | null;
2525 keybindings: ResolvedKeybindingsConfig;
2626 availableEditors: ReadonlyArray<EditorId>;
27 terminalAvailable: boolean;
28 terminalOpen: boolean;
29 terminalToggleShortcutLabel: string | null;
2730 diffToggleShortcutLabel: string | null;
2831 gitCwd: string | null;
2932 diffOpen: boolean;
......@@ -31,6 +34,7 @@ interface ChatHeaderProps {
3134 onAddProjectScript: (input: NewProjectScriptInput) => Promise<void>;
3235 onUpdateProjectScript: (scriptId: string, input: NewProjectScriptInput) => Promise<void>;
3336 onDeleteProjectScript: (scriptId: string) => Promise<void>;
37 onToggleTerminal: () => void;
3438 onToggleDiff: () => void;
3539}
3640
......@@ -44,6 +48,9 @@ export const ChatHeader = memo(function ChatHeader({
4448 preferredScriptId,
4549 keybindings,
4650 availableEditors,
51 terminalAvailable,
52 terminalOpen,
53 terminalToggleShortcutLabel,
4754 diffToggleShortcutLabel,
4855 gitCwd,
4956 diffOpen,
......@@ -51,6 +58,7 @@ export const ChatHeader = memo(function ChatHeader({
5158 onAddProjectScript,
5259 onUpdateProjectScript,
5360 onDeleteProjectScript,
61 onToggleTerminal,
5462 onToggleDiff,
5563}: ChatHeaderProps) {
5664 return (
......@@ -94,6 +102,30 @@ export const ChatHeader = memo(function ChatHeader({
94102 />
95103 )}
96104 {activeProjectName && <GitActionsControl gitCwd={gitCwd} activeThreadId={activeThreadId} />}
105 <Tooltip>
106 <TooltipTrigger
107 render={
108 <Toggle
109 className="shrink-0"
110 pressed={terminalOpen}
111 onPressedChange={onToggleTerminal}
112 aria-label="Toggle terminal drawer"
113 variant="outline"
114 size="xs"
115 disabled={!terminalAvailable}
116 >
117 <TerminalSquareIcon className="size-3" />
118 </Toggle>
119 }
120 />
121 <TooltipPopup side="bottom">
122 {!terminalAvailable
123 ? "Terminal is unavailable until this thread has an active project."
124 : terminalToggleShortcutLabel
125 ? `Toggle terminal drawer (${terminalToggleShortcutLabel})`
126 : "Toggle terminal drawer"}
127 </TooltipPopup>
128 </Tooltip>
97129 <Tooltip>
98130 <TooltipTrigger
99131 render={