From 1a57ba9fa363c604b30bc5f81305f4c7c4757bc9 Mon Sep 17 00:00:00 2001 From: Val Alexander Date: Thu, 2 Apr 2026 06:40:57 -0500 Subject: [PATCH] Replace panels menu with inline header toggles - Swap the overflow panels menu for direct terminal, preview, and diff toggles - Remove code viewer header wiring now that panel control is simplified --- apps/web/src/components/ChatView.tsx | 1 - apps/web/src/components/chat/ChatHeader.tsx | 13 -- .../src/components/chat/HeaderPanelsMenu.tsx | 143 ++++++++---------- 3 files changed, 62 insertions(+), 95 deletions(-) diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 04ab96f6e..553aa2f51 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -4623,7 +4623,6 @@ export default function ChatView({ threadId }: ChatViewProps) { onToggleDiff={onToggleDiff} onTogglePreview={() => togglePreviewOpen()} onTogglePreviewLayout={() => togglePreviewLayout(activeThread.id)} - onToggleCodeViewer={toggleCodeViewer} /> diff --git a/apps/web/src/components/chat/ChatHeader.tsx b/apps/web/src/components/chat/ChatHeader.tsx index e8d637b7f..c1a4245fc 100644 --- a/apps/web/src/components/chat/ChatHeader.tsx +++ b/apps/web/src/components/chat/ChatHeader.tsx @@ -12,7 +12,6 @@ import { Badge } from "../ui/badge"; import ProjectScriptsControl, { type NewProjectScriptInput } from "../ProjectScriptsControl"; import { SidebarTrigger } from "../ui/sidebar"; import { useThreadTitleEditor } from "~/hooks/useThreadTitleEditor"; -import { useCodeViewerStore } from "~/codeViewerStore"; import { useProjectColor } from "~/projectColors"; import { useTheme } from "~/hooks/useTheme"; import type { ClientMode } from "~/lib/clientMode"; @@ -51,7 +50,6 @@ interface ChatHeaderProps { onToggleDiff: () => void; onTogglePreview: () => void; onTogglePreviewLayout: () => void; - onToggleCodeViewer: () => void; } export const ChatHeader = memo(function ChatHeader({ @@ -86,11 +84,8 @@ export const ChatHeader = memo(function ChatHeader({ onToggleDiff, onTogglePreview, onTogglePreviewLayout: _onTogglePreviewLayout, - onToggleCodeViewer, }: ChatHeaderProps) { const isMobileCompanion = clientMode === "mobile"; - const codeViewerOpen = useCodeViewerStore((state) => state.isOpen); - const hasCodeViewerTabs = useCodeViewerStore((state) => state.tabs.length > 0); const projectColor = useProjectColor(activeProjectId); const { resolvedTheme } = useTheme(); const isDark = resolvedTheme === "dark"; @@ -186,13 +181,9 @@ export const ChatHeader = memo(function ChatHeader({ diffOpen={diffOpen} diffToggleShortcutLabel={diffToggleShortcutLabel} isGitRepo={isGitRepo} - codeViewerOpen={codeViewerOpen} - hasCodeViewerTabs={hasCodeViewerTabs} - hasProject={activeProjectName !== undefined} onToggleTerminal={onToggleTerminal} onTogglePreview={onTogglePreview} onToggleDiff={onToggleDiff} - onToggleCodeViewer={onToggleCodeViewer} /> )} {/* Mobile: only diff toggle */} @@ -206,13 +197,9 @@ export const ChatHeader = memo(function ChatHeader({ diffOpen={diffOpen} diffToggleShortcutLabel={diffToggleShortcutLabel} isGitRepo={isGitRepo} - codeViewerOpen={false} - hasCodeViewerTabs={false} - hasProject={false} onToggleTerminal={() => {}} onTogglePreview={() => {}} onToggleDiff={onToggleDiff} - onToggleCodeViewer={() => {}} /> )} diff --git a/apps/web/src/components/chat/HeaderPanelsMenu.tsx b/apps/web/src/components/chat/HeaderPanelsMenu.tsx index 5b0ffc35b..0a6f67076 100644 --- a/apps/web/src/components/chat/HeaderPanelsMenu.tsx +++ b/apps/web/src/components/chat/HeaderPanelsMenu.tsx @@ -1,14 +1,11 @@ -import { memo } from "react"; +import { memo, useMemo } from "react"; import { DiffIcon, - EllipsisIcon, - FileCodeIcon, MonitorIcon, TerminalSquareIcon, } from "lucide-react"; -import { Button } from "../ui/button"; -import { Menu, MenuCheckboxItem, MenuPopup, MenuSeparator, MenuTrigger } from "../ui/menu"; import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip"; +import { ToggleGroup, Toggle, ToggleGroupSeparator } from "../ui/toggle-group"; interface HeaderPanelsMenuProps { terminalAvailable: boolean; @@ -19,13 +16,9 @@ interface HeaderPanelsMenuProps { diffOpen: boolean; diffToggleShortcutLabel: string | null; isGitRepo: boolean; - codeViewerOpen: boolean; - hasCodeViewerTabs: boolean; - hasProject: boolean; onToggleTerminal: () => void; onTogglePreview: () => void; onToggleDiff: () => void; - onToggleCodeViewer: () => void; } export const HeaderPanelsMenu = memo(function HeaderPanelsMenu({ @@ -37,88 +30,76 @@ export const HeaderPanelsMenu = memo(function HeaderPanelsMenu({ diffOpen, diffToggleShortcutLabel, isGitRepo, - codeViewerOpen, - hasCodeViewerTabs, - hasProject, onToggleTerminal, onTogglePreview, onToggleDiff, - onToggleCodeViewer, }: HeaderPanelsMenuProps) { + const value = useMemo(() => { + const v: string[] = []; + if (terminalOpen) v.push("terminal"); + if (previewOpen) v.push("preview"); + if (diffOpen) v.push("diff"); + return v; + }, [terminalOpen, previewOpen, diffOpen]); + return ( - + + + + + + } + /> + + Terminal{terminalToggleShortcutLabel ? ` ${terminalToggleShortcutLabel}` : ""} + + + + + + + + } + /> + Preview + + - - - } - /> + + + } /> - Panels + + Diff{diffToggleShortcutLabel ? ` ${diffToggleShortcutLabel}` : ""} + - - - - - Terminal - {terminalToggleShortcutLabel ? ( - - {terminalToggleShortcutLabel} - - ) : null} - - - - - - Preview - - - - - - - Diff - {diffToggleShortcutLabel ? ( - - {diffToggleShortcutLabel} - - ) : null} - - - {hasProject && hasCodeViewerTabs ? ( - - - - Code viewer - - - ) : null} - - + ); });