From b0e7fe23e627e531b3d8366ae3e090cfcbe6351e Mon Sep 17 00:00:00 2001 From: Val Alexander Date: Sun, 5 Apr 2026 00:51:00 -0500 Subject: [PATCH 1/2] Use four terminal action icons --- apps/web/src/components/ChatView.tsx | 2 +- apps/web/src/components/Sidebar.tsx | 2 +- .../src/components/ThreadTerminalDrawer.tsx | 117 ++++++++---------- apps/web/src/components/WorkspaceFileTree.tsx | 2 +- .../src/components/chat/InlineDiffBlock.tsx | 20 ++- .../src/components/chat/MessagesTimeline.tsx | 1 - .../merge-conflicts/MergeConflictShell.tsx | 2 +- .../src/hooks/useAutoDeleteMergedThreads.ts | 5 +- apps/web/src/hooks/useFileViewNavigation.ts | 2 +- apps/web/src/routes/_chat.file-view.tsx | 2 +- packages/contracts/src/ws.ts | 7 +- 11 files changed, 81 insertions(+), 81 deletions(-) diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 2df5ec6c0..a7a5ef957 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -1486,7 +1486,6 @@ export default function ChatView({ threadId }: ChatViewProps) { }); }, [diffOpen, navigate, threadId]); - const toggleCodeViewer = useCodeViewerStore((state) => state.toggle); const pendingContext = useCodeViewerStore((state) => state.pendingContext); const clearPendingContext = useCodeViewerStore((state) => state.clearPendingContext); @@ -5547,6 +5546,7 @@ export default function ChatView({ threadId }: ChatViewProps) { closeShortcutLabel={closeTerminalShortcutLabel ?? undefined} onActiveTerminalChange={activateTerminal} onCloseTerminal={closeTerminal} + onCollapseTerminal={toggleTerminalVisibility} onHeightChange={setTerminalHeight} onAddTerminalContext={addTerminalContextToDraft} onSendTerminalContext={sendSelectedTerminalContext} diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 134598cca..5879272c8 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -814,7 +814,7 @@ export default function Sidebar() { }, }); const { copyToClipboard: copyPathToClipboard } = useCopyToClipboard<{ path: string }>({ - onCopy: (ctx) => { + onCopy: () => { toastManager.add({ type: "success", title: "Path copied", diff --git a/apps/web/src/components/ThreadTerminalDrawer.tsx b/apps/web/src/components/ThreadTerminalDrawer.tsx index 22e7ed0b4..7496d5115 100644 --- a/apps/web/src/components/ThreadTerminalDrawer.tsx +++ b/apps/web/src/components/ThreadTerminalDrawer.tsx @@ -19,14 +19,6 @@ import { useRef, useState, } from "react"; -import { - Menu, - MenuItem, - MenuPopup, - MenuSeparator, - MenuShortcut, - MenuTrigger, -} from "~/components/ui/menu"; import { Popover, PopoverPopup, PopoverTrigger } from "~/components/ui/popover"; import { type TerminalContextSelection } from "~/lib/terminalContext"; import { openInPreferredEditor } from "../editorPreferences"; @@ -817,6 +809,7 @@ interface ThreadTerminalDrawerProps { closeShortcutLabel?: string | undefined; onActiveTerminalChange: (terminalId: string) => void; onCloseTerminal: (terminalId: string) => void; + onCollapseTerminal: () => void; onHeightChange: (height: number) => void; onAddTerminalContext: (selection: TerminalContextSelection) => void; onSendTerminalContext?: ((selection: TerminalContextSelection) => void) | undefined; @@ -852,62 +845,60 @@ function TerminalActionButton({ label, className, onClick, children }: TerminalA ); } -interface TerminalDropdownMenuProps { +interface TerminalActionRailProps { onSplitTerminal: () => void; onNewTerminal: () => void; onCloseTerminal: () => void; + onCollapseTerminal: () => void; splitDisabled: boolean; splitLabel: string; newLabel: string; closeLabel: string; - splitShortcutLabel?: string | undefined; - newShortcutLabel?: string | undefined; - closeShortcutLabel?: string | undefined; - triggerClassName: string; + collapseLabel: string; + actionClassName: string; + destructiveActionClassName?: string | undefined; } -function TerminalDropdownMenu({ +function TerminalActionRail({ onSplitTerminal, onNewTerminal, onCloseTerminal, + onCollapseTerminal, splitDisabled, splitLabel, newLabel, closeLabel, - splitShortcutLabel, - newShortcutLabel, - closeShortcutLabel, - triggerClassName, -}: TerminalDropdownMenuProps) { + collapseLabel, + actionClassName, + destructiveActionClassName, +}: TerminalActionRailProps) { return ( - - } +
+ - - - - - - {splitLabel} - {splitShortcutLabel ? {splitShortcutLabel} : null} - - - - {newLabel} - {newShortcutLabel ? {newShortcutLabel} : null} - - - - - {closeLabel} - {closeShortcutLabel ? {closeShortcutLabel} : null} - - -
+ + + + + + + + + + + + ); } @@ -928,6 +919,7 @@ export default function ThreadTerminalDrawer({ closeShortcutLabel, onActiveTerminalChange, onCloseTerminal, + onCollapseTerminal, onHeightChange, onAddTerminalContext, onSendTerminalContext, @@ -1056,6 +1048,7 @@ export default function ThreadTerminalDrawer({ const closeTerminalActionLabel = closeShortcutLabel ? `Close Terminal (${closeShortcutLabel})` : "Close Terminal"; + const collapseTerminalActionLabel = "Collapse Terminal"; const onSplitTerminalAction = useCallback(() => { if (hasReachedSplitLimit) return; onSplitTerminal(); @@ -1171,18 +1164,18 @@ export default function ThreadTerminalDrawer({ {!hasTerminalSidebar && (
- onCloseTerminal(resolvedActiveTerminalId)} + onCollapseTerminal={onCollapseTerminal} splitDisabled={hasReachedSplitLimit} - splitLabel="Split Terminal" - newLabel="New Terminal" - closeLabel="Close Terminal" - splitShortcutLabel={splitShortcutLabel} - newShortcutLabel={newShortcutLabel} - closeShortcutLabel={closeShortcutLabel} - triggerClassName="p-1 text-foreground/90 transition-colors hover:bg-accent" + splitLabel={splitTerminalActionLabel} + newLabel={newTerminalActionLabel} + closeLabel={closeTerminalActionLabel} + collapseLabel={collapseTerminalActionLabel} + actionClassName="inline-flex size-7 items-center justify-center text-foreground/90 transition-colors hover:bg-accent" + destructiveActionClassName="inline-flex size-7 items-center justify-center text-destructive transition-colors hover:bg-destructive/10" />
@@ -1255,18 +1248,18 @@ export default function ThreadTerminalDrawer({