import { ChevronDown, Download, FilePlus, MessageSquareDashed, PanelRightClose, Settings, } from "lucide-react" import { useRef } from "react" import { DevXmlSimulator } from "@/components/dev-xml-simulator" import { BrandMark } from "@/components/workspace/brand-mark" import { IconButton } from "@/components/workspace/icon-button" import { useDiagram } from "@/contexts/diagram-context" import { useDictionary } from "@/hooks/use-dictionary" import { usePanelWidth } from "@/hooks/use-panel-width" import { modKey } from "@/lib/platform" import { cn } from "@/lib/utils" import { PANEL_MAX_WIDTH, PANEL_MIN_WIDTH, useSettingsStore, } from "@/stores/settings-store" import { useUiStore } from "@/stores/ui-store" import { useChatEngine } from "./chat-engine" import { Composer } from "./composer" import { MessageList } from "./message-list" import { SessionMenu, useSessionTitle } from "./session-menu" import { VersionStrip } from "./version-strip" const DEBUG = process.env.NODE_ENV === "development" /** Drag handle on the panel's left edge (the panel sits on the right) */ function ResizeHandle() { const panelWidth = usePanelWidth() const setPanelWidth = useSettingsStore((s) => s.setPanelWidth) const startRef = useRef<{ x: number; width: number } | null>(null) return ( // biome-ignore lint/a11y/useSemanticElements: a draggable handle, not a divider line
{ e.preventDefault() const panel = e.currentTarget.parentElement startRef.current = { x: e.clientX, width: panel?.getBoundingClientRect().width ?? 384, } e.currentTarget.setPointerCapture(e.pointerId) }} onPointerMove={(e) => { const start = startRef.current if (!start) return // Dragging left widens the panel setPanelWidth(start.width - (e.clientX - start.x)) }} onPointerUp={(e) => { startRef.current = null e.currentTarget.releasePointerCapture(e.pointerId) }} /> ) } function EmptyThread() { const dict = useDictionary() return (

{dict.chat.emptyThread}

) } /** The floating chat panel: header, versions, conversation, message box */ export function ChatPanel({ mobile = false, onOpenFile, }: { mobile?: boolean onOpenFile: () => void }) { const dict = useDictionary() const engine = useChatEngine() const { loadDiagram, isDrawioReady } = useDiagram() const setSaveDialogOpen = useUiStore((s) => s.setSaveDialogOpen) const title = useSessionTitle() const panelWidth = usePanelWidth() const openSettings = useUiStore((s) => s.openSettings) const setPanelOpen = useUiStore((s) => s.setPanelOpen) return ( ) }