import { ListFilterIcon, Maximize2Icon, Minimize2Icon, PanelBottomIcon, PanelRightIcon, } from "lucide-react"; import { memo, type ReactElement, type ReactNode, type RefObject } from "react"; import type { ThreadPanelPresentation } from "../../rightPanelLayout"; import { Popover, PopoverPopup, PopoverTrigger } from "../ui/popover"; import { Toggle } from "../ui/toggle"; import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip"; export interface PanelLayoutControlsProps { showThreadPanelControl?: boolean; showTerminalControl?: boolean; showRightPanelControl?: boolean; terminalAvailable: boolean; terminalOpen: boolean; terminalShortcutLabel: string | null; threadPanelOpen: boolean; threadPanelPresentation: ThreadPanelPresentation; threadPanelPopoverAnchor?: RefObject; threadPanelPopoverContent?: ReactNode; threadPanelShortcutLabel: string | null; threadPanelHasAttention: boolean; rightPanelAvailable: boolean; rightPanelOpen: boolean; rightPanelShortcutLabel: string | null; rightPanelUnavailableLabel?: string; /** Running + waiting subagents in this thread; badges the right panel toggle. */ liveAgentCount: number; onToggleTerminal: () => void; onToggleThreadPanel: () => void; onToggleRightPanel: () => void; } export const PanelLayoutControls = memo(function PanelLayoutControls({ showThreadPanelControl = true, showTerminalControl = true, showRightPanelControl = true, terminalAvailable, terminalOpen, terminalShortcutLabel, threadPanelOpen, threadPanelPresentation, threadPanelPopoverAnchor, threadPanelPopoverContent, threadPanelShortcutLabel, threadPanelHasAttention, rightPanelAvailable, rightPanelOpen, rightPanelShortcutLabel, rightPanelUnavailableLabel = "Right panel is unavailable", liveAgentCount, onToggleTerminal, onToggleThreadPanel, onToggleRightPanel, }: PanelLayoutControlsProps) { const threadPanelToggle = ( {threadPanelHasAttention ? ( ); const threadPanelTooltip = (trigger: ReactElement) => ( Toggle thread details {threadPanelShortcutLabel ? ` (${threadPanelShortcutLabel})` : ""} ); return (
{showThreadPanelControl ? ( threadPanelPresentation === "popover" ? ( { if (open !== threadPanelOpen) onToggleThreadPanel(); }} > {threadPanelTooltip()} {threadPanelPopoverContent} ) : ( threadPanelTooltip(threadPanelToggle) ) ) : null} {showTerminalControl ? ( }> {terminalAvailable ? `Toggle terminal drawer${terminalShortcutLabel ? ` (${terminalShortcutLabel})` : ""}` : "Terminal drawer is unavailable"} ) : null} {showRightPanelControl ? ( }> 0 ? `Toggle right panel, ${liveAgentCount} ${liveAgentCount === 1 ? "agent" : "agents"} working` : "Toggle right panel" } variant="ghost" size="sm" disabled={!rightPanelAvailable} > {liveAgentCount > 0 ? ( {liveAgentCount} ) : null} {rightPanelAvailable ? `Toggle right panel${rightPanelShortcutLabel ? ` (${rightPanelShortcutLabel})` : ""}${ liveAgentCount > 0 ? ` ยท ${liveAgentCount} ${liveAgentCount === 1 ? "agent" : "agents"} working` : "" }` : rightPanelUnavailableLabel} ) : null}
); }); export const RightPanelMaximizeControl = memo(function RightPanelMaximizeControl({ maximized, onToggle, }: { maximized: boolean; onToggle: () => void; }) { const label = maximized ? "Restore panel size" : "Maximize panel"; return ( {maximized ? ( ) : ( )} } /> {label} ); });