@papermap/papermap 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/readme.md +107 -99
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/PapermapChat.tsx","../src/utils/cn.ts","../src/hooks/useAutoFade.ts","../src/hooks/useKeyboardShortcuts.ts","../src/store/PapermapProvider.tsx","../src/store/papermap-store.ts","../src/api/endpoints.ts","../src/services/streaming.ts","../src/queryClient.ts","../src/api/client.ts","../src/services/chart.service.ts","../src/services/workspace.service.ts","../src/store/papermap-services.ts","../src/hooks/useAnalyticsStream.ts","../src/api/sse-client.ts","../src/api/analytics-sse.ts","../src/types/streaming.ts","../src/hooks/use-toast.ts","../src/components/ui/toast.tsx","../src/components/ui/toaster.tsx","../src/components/ThemeProvider.tsx","../src/components/ChatAssistant.tsx","../src/components/ui/alert.tsx","../src/components/ui/button.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/markdown.tsx","../src/components/ui/ThinkingMessage.tsx","../src/components/ui/chat-code-block.tsx","../src/components/ui/dialog.tsx","../src/components/ui/tooltip.tsx","../src/components/common/ButtonWithTooltip.tsx","../src/lib/analytics-stream-replay.ts","../src/components/dashboard/StreamingTimeline.tsx","../src/components/dashboard/AgentThoughtDisplay.tsx","../src/components/dashboard/ToolCallDisplay.tsx","../src/components/common/BookmarkButton.tsx","../src/components/common/ConfettiEffect.tsx","../src/components/common/BranchButton.tsx","../src/components/common/FeedbackButtons.tsx","../src/components/common/ThinkingLogo.tsx","../src/assets/loading.json","../src/components/LogoStandAlone.tsx","../src/components/MorphGradient.tsx","../src/components/dashboard/RecentConversations.tsx","../src/components/common/RecentConversationItem.tsx","../src/components/dashboard/DeleteConfirmationModal.tsx","../src/components/dashboard/ChartHistory.tsx","../src/components/ui/card.tsx","../src/components/dashboard/HistoryChartCard.tsx","../src/components/charts/ChartDialog.tsx","../src/components/charts/ChartView.tsx","../src/components/ui/select.tsx","../src/components/charts/AreaChart.tsx","../src/components/ui/chart.tsx","../src/lib/chart-utils.ts","../src/components/charts/BarChart.tsx","../src/components/charts/DataTable.tsx","../src/components/ui/table.tsx","../src/components/charts/LineChart.tsx","../src/components/charts/NoDataCard.tsx","../src/components/charts/PieChart.tsx","../src/components/charts/RadarChart.tsx","../src/components/charts/ScatterChart.tsx","../src/utils/screenshot.ts","../src/components/charts/Tile.tsx","../src/lib/screenshot.ts","../src/components/dashboard/SavedMemory.tsx","../src/components/ui/ShineBorder.tsx","../src/components/ui/separator.tsx","../src/components/ui/hover-card.tsx","../src/components/ui/switch.tsx","../src/components/common/ToolbarButtons.tsx","../src/components/common/ModelSelector.tsx","../src/components/PapermapChartCard.tsx","../src/components/charts/StreamingChartDialog.tsx","../src/components/StreamingChatPanel.tsx","../src/utils/chart-card-storage.ts","../src/components/dashboard/DashboardToolbar.tsx","../src/hooks/useAutoResize.ts","../src/features/GridDashboard/GridDashboard.tsx","../src/components/theme/ThemeCustomizationSettings.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/theme/constants.ts","../src/components/theme/ContrastIndicator.tsx","../src/components/theme/utils/colorUtils.ts","../src/components/ui/label.tsx","../src/components/theme/ThemeColorInput.tsx","../src/components/ui/input.tsx","../src/components/theme/ThemeColorSection.tsx","../src/components/ui/slider.tsx","../src/components/theme/ThemeTypographySection.tsx","../src/components/theme/ThemePresetSelector.tsx","../src/components/theme/ContrastWarnings.tsx","../src/components/theme/ThemePreview.tsx","../src/components/theme/hooks/useThemeValidation.ts","../src/utils/dashboard-theme.ts","../src/utils/resolve-dashboard-theme.ts","../src/utils/workspace-theme-persist.ts","../src/features/GridDashboard/constants.ts","../src/features/GridDashboard/layout.ts","../src/features/GridDashboard/styles.ts"],"sourcesContent":["// Main components\nexport { PapermapChat } from './components'\nexport type { PapermapChatProps } from './components/PapermapChat'\n\nexport { PapermapChartCard } from './components'\nexport type { PapermapChartCardProps } from './components/PapermapChartCard'\n\n// Sub-components (for advanced composition)\nexport {\n ChatAssistant,\n StreamingTimeline,\n AgentThoughtDisplay,\n ToolCallDisplay,\n RecentConversations,\n ChartHistory,\n SavedMemory,\n ChartView,\n ChartDialog,\n StreamingChartDialog,\n StreamingChatPanel,\n DataTable,\n ButtonWithTooltip,\n BookmarkButton,\n BranchButton,\n FeedbackButtons,\n ModelSelector,\n LogoStandAlone,\n MorphGradient,\n} from './components'\n\n// Store (for direct state access in custom layouts)\nexport {\n PapermapProvider,\n PapermapConfigProvider,\n usePapermapStore,\n usePapermapStoreApi,\n usePapermapStoreApiOptional,\n usePapermapConnection,\n usePapermapConnectionOptional,\n createPapermapStore,\n createPapermapServices,\n CHAT_MODAL_TAB,\n openPapermapChatAssistant,\n} from './store'\nexport type {\n PapermapStore,\n PapermapState,\n PapermapActions,\n PapermapStoreConfig,\n PapermapStoreApi,\n ChatModalTabType,\n OpenPapermapChatAssistantOptions,\n PapermapConnectionValue,\n PapermapHttpServices,\n} from './store'\n\n// Hooks\nexport { useAnalyticsStream, useKeyboardShortcuts, useAutoResize, useAutoFade } from './hooks'\n\n// API (for advanced usage)\nexport { createApiClient, decodeToken, buildAuthHeaders } from './api'\nexport type { DecodedToken } from './api'\n\n// Types\nexport type { Message } from './types'\nexport type {\n AgentThought,\n ToolCall,\n TimelineEvent,\n StreamState,\n FinalResponse,\n} from './types/streaming'\nexport type { TChartResponse, TChartMeta, ChartResponse, ConversationHistory } from './types/chart'\n\n// Grid dashboard\nexport { PapermapGridDashboard } from './features/GridDashboard'\nexport type {\n DashboardTheme,\n PapermapGridDashboardLayouts,\n TLayout as PapermapGridLayoutItem,\n} from './types/dashboard'\n\n// Theme customization\nexport { ThemeCustomizationSettings } from './components/theme/ThemeCustomizationSettings'\nexport type {\n ThemeCustomizationSettingsProps,\n ThemeSaveMeta,\n} from './components/theme/ThemeCustomizationSettings'\nexport { themePresets, themePresetList, defaultTheme, presetDisplayNames } from './components/theme'\nexport type { ThemePreset } from './components/theme'\nexport { resolveDashboardThemeFromWorkspace } from './utils/resolve-dashboard-theme'\n\n// Standalone chart card persistence (host `id` ↔ backend `chatId`)\nexport {\n CHART_CARD_CHAT_MAP_KEY,\n getChartCardIdLink,\n upsertChartCardIdLink,\n removeChartCardIdLink,\n resolveChartFetchChatId,\n} from './utils/chart-card-storage'\nexport type { ChartCardIdLink, ChartCardStorageNamespace } from './utils/chart-card-storage'\n","'use client'\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { ArrowUp, Clock, Eye, EyeOff, Square } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { useAutoFade } from '../hooks/useAutoFade'\nimport { useKeyboardShortcuts } from '../hooks/useKeyboardShortcuts'\nimport {\n PapermapProvider,\n usePapermapConnectionOptional,\n usePapermapStore,\n usePapermapStoreApi,\n usePapermapStoreApiOptional,\n CHAT_MODAL_TAB,\n} from '../store'\nimport { ChatAssistant } from './ChatAssistant'\nimport { ShineBorder } from './ui/ShineBorder'\nimport { Separator } from './ui/separator'\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from './ui/hover-card'\nimport { Switch } from './ui/switch'\nimport { AddNewChatBtn, SearchWebBtn, ChartHistoryBtn } from './common/ToolbarButtons'\nimport { ModelSelector } from './common/ModelSelector'\nimport { ButtonWithTooltip } from './common/ButtonWithTooltip'\n\nconst SPRING = { type: 'spring' as const, stiffness: 400, damping: 35, duration: 0.2 }\nconst EASE = [0.23, 1, 0.32, 1] as const\n\nexport interface PapermapChatProps {\n token?: string\n workspaceId?: string\n dashboardId?: string\n apiUrl?: string\n /**\n * Called whenever the toolbar height changes (including multiline expansion).\n * Host apps can use this to add bottom padding/margin to their chart area,\n * mirroring how the main app dashboard layout reacts to toolbar height.\n */\n onToolbarHeightChange?: (height: number) => void\n placeholder?: string\n shortcutKey?: string\n autoFade?: boolean\n fadeDelay?: number\n className?: string\n /**\n * Controls whether the fixed bottom chat toolbar (input + quick actions) is rendered.\n * Defaults to `true`.\n */\n showToolbar?: boolean\n}\n\nexport function PapermapChat({\n token,\n workspaceId,\n dashboardId,\n apiUrl,\n onToolbarHeightChange,\n showToolbar = true,\n ...uiProps\n}: PapermapChatProps) {\n const parentStore = usePapermapStoreApiOptional()\n const connection = usePapermapConnectionOptional()\n const resolvedToken = token ?? connection?.token\n const resolvedWorkspaceId = workspaceId ?? connection?.workspaceId\n const resolvedDashboardId = dashboardId ?? connection?.dashboardId\n const resolvedApiUrl = apiUrl ?? connection?.apiUrl\n\n if (parentStore) {\n if (!resolvedToken || !resolvedWorkspaceId || !resolvedDashboardId) {\n throw new Error(\n 'PapermapChat requires token, workspaceId, and dashboardId from props or PapermapProvider.'\n )\n }\n return (\n <PapermapChatInner\n onToolbarHeightChange={onToolbarHeightChange}\n showToolbar={showToolbar}\n {...uiProps}\n />\n )\n }\n\n if (!resolvedToken || !resolvedWorkspaceId || !resolvedDashboardId) {\n throw new Error(\n 'PapermapChat requires token, workspaceId, and dashboardId when used outside PapermapProvider.'\n )\n }\n\n return (\n <PapermapProvider\n token={resolvedToken}\n workspaceId={resolvedWorkspaceId}\n dashboardId={resolvedDashboardId}\n apiUrl={resolvedApiUrl}\n >\n <PapermapChatInner\n onToolbarHeightChange={onToolbarHeightChange}\n showToolbar={showToolbar}\n {...uiProps}\n />\n </PapermapProvider>\n )\n}\n\n// ── Inner component (reads from store) ──────────────────────────────\n\ninterface InnerProps {\n placeholder?: string\n shortcutKey?: string\n autoFade?: boolean\n fadeDelay?: number\n onToolbarHeightChange?: (height: number) => void\n className?: string\n showToolbar?: boolean\n}\n\nfunction PapermapChatInner({\n placeholder = 'Ask anything...',\n shortcutKey = 'k',\n autoFade = false,\n fadeDelay = 5000,\n onToolbarHeightChange,\n className,\n showToolbar = true,\n}: InnerProps) {\n const [isMounted, setIsMounted] = useState(false)\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n const isFocused = usePapermapStore((s) => s.isFocused)\n const isOpen = usePapermapStore((s) => s.isOpen)\n const inputValue = usePapermapStore((s) => s.inputValue)\n const isMultiline = usePapermapStore((s) => s.isMultiline)\n const isLoading = usePapermapStore((s) => s.isLoading)\n const messages = usePapermapStore((s) => s.messages)\n const chatId = usePapermapStore((s) => s.chatId)\n const useSSEStreaming = usePapermapStore((s) => s.useSSEStreaming)\n\n const setIsFocused = usePapermapStore((s) => s.setIsFocused)\n const setIsOpen = usePapermapStore((s) => s.setIsOpen)\n const setInputValue = usePapermapStore((s) => s.setInputValue)\n const setIsMultiline = usePapermapStore((s) => s.setIsMultiline)\n const handleSubmit = usePapermapStore((s) => s.handleSubmit)\n const handleCancel = usePapermapStore((s) => s.handleCancel)\n const handleNewChat = usePapermapStore((s) => s.handleNewChat)\n const setChatModalTab = usePapermapStore((s) => s.setChatModalTab)\n const setUseSSEStreaming = usePapermapStore((s) => s.setUseSSEStreaming)\n const editChatId = usePapermapStore((s) => s.editChatId)\n const setEditChatId = usePapermapStore((s) => s.setEditChatId)\n\n const storeApi = usePapermapStoreApi()\n const refs = storeApi.getState().getRefs()\n\n const { isFaded, resetFadeTimer } = useAutoFade(autoFade, fadeDelay, isOpen || isFocused)\n\n const toolbarRef = useRef<HTMLDivElement>(null)\n const [toolbarHeight, setToolbarHeight] = useState(0)\n\n useEffect(() => {\n if (!showToolbar) {\n setToolbarHeight(0)\n onToolbarHeightChange?.(0)\n }\n }, [showToolbar, onToolbarHeightChange])\n\n useEffect(() => {\n if (!showToolbar) return\n // If ResizeObserver is not available, fall back to polling.\n if (typeof ResizeObserver === 'undefined') {\n let lastHeight = 0\n const intervalId = window.setInterval(() => {\n if (!toolbarRef.current) return\n const height = toolbarRef.current.offsetHeight\n if (height !== lastHeight) {\n lastHeight = height\n\n setToolbarHeight(height)\n onToolbarHeightChange?.(height)\n }\n }, 250)\n\n return () => {\n window.clearInterval(intervalId)\n }\n }\n\n if (!toolbarRef.current) {\n return\n }\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height = entry.contentRect.height\n setToolbarHeight(height)\n onToolbarHeightChange?.(height)\n }\n })\n observer.observe(toolbarRef.current)\n return () => observer.disconnect()\n }, [onToolbarHeightChange, showToolbar])\n\n // Fallback: actively measure height when key UI state changes, mirroring main app behavior.\n useEffect(() => {\n if (!showToolbar) return\n if (!toolbarRef.current) return\n const height = toolbarRef.current.offsetHeight\n setToolbarHeight(height)\n onToolbarHeightChange?.(height)\n }, [isMultiline, inputValue, isFocused, isOpen, onToolbarHeightChange, showToolbar])\n\n useEffect(() => {\n if (!(isFocused || isOpen)) return\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = prev\n }\n }, [isFocused, isOpen])\n\n useEffect(() => {\n if (isOpen && refs.messagesEndRef.current) {\n refs.messagesEndRef.current.scrollIntoView({ behavior: 'smooth' })\n }\n }, [messages.length, isOpen, refs.messagesEndRef])\n\n const openChat = useCallback(() => {\n setIsFocused(true)\n setIsOpen(true)\n }, [setIsFocused, setIsOpen])\n\n const closeChat = useCallback(() => {\n setIsFocused(false)\n setIsMultiline(false)\n setIsOpen(false)\n if (editChatId) {\n setEditChatId(null)\n }\n refs.inputRef.current?.blur()\n refs.textareaRef.current?.blur()\n }, [setIsFocused, setIsMultiline, setIsOpen, editChatId, setEditChatId, refs])\n\n const handleFormSubmit = useCallback(() => {\n const msg = inputValue.trim()\n if (!msg || isLoading) return\n // Ensure we're on the main chat tab when sending a message\n setChatModalTab(CHAT_MODAL_TAB.CHAT)\n handleSubmit(msg)\n }, [inputValue, isLoading, handleSubmit, setChatModalTab])\n\n useKeyboardShortcuts({\n shortcutKey,\n onToggle: () => {\n if (isOpen || isFocused) closeChat()\n else {\n openChat()\n setTimeout(() => refs.inputRef.current?.focus(), 50)\n }\n },\n onEscape: closeChat,\n })\n\n const debouncedCheckOverflow = useMemo(() => {\n let tid: ReturnType<typeof setTimeout>\n return () => {\n clearTimeout(tid)\n tid = setTimeout(() => {\n if (\n refs.inputRef.current &&\n refs.inputRef.current.scrollWidth > refs.inputRef.current.clientWidth\n ) {\n setIsMultiline(true)\n }\n }, 100)\n }\n }, [refs.inputRef, setIsMultiline])\n\n useEffect(() => {\n if (isMultiline && refs.textareaRef.current && isFocused) {\n const ta = refs.textareaRef.current\n ta.focus()\n const len = ta.value.length\n ta.setSelectionRange(len, len)\n }\n }, [isMultiline, isFocused, refs.textareaRef])\n\n useEffect(() => {\n // Match main app behavior: collapse back to single-line whenever the toolbar\n // loses focus. The overflow check in handleFocus will immediately restore\n // multiline when appropriate (e.g. long existing text), so UX stays in sync.\n if (!isFocused && isMultiline) {\n setIsMultiline(false)\n }\n }, [isFocused, isMultiline, setIsMultiline])\n\n useEffect(() => {\n if (!inputValue.trim() && isMultiline) setIsMultiline(false)\n }, [inputValue, isMultiline, setIsMultiline])\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const value = e.target.value\n setInputValue(value)\n if (!isMultiline) debouncedCheckOverflow()\n else if (!value.trim()) setIsMultiline(false)\n if (isMultiline && refs.textareaRef.current) {\n const ta = refs.textareaRef.current\n ta.style.height = 'auto'\n ta.style.height = Math.min(Math.max(40, ta.scrollHeight), 120) + 'px'\n }\n },\n [setInputValue, isMultiline, setIsMultiline, debouncedCheckOverflow, refs.textareaRef]\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key !== 'Enter') return\n if (e.shiftKey) {\n e.preventDefault()\n if (!isMultiline) {\n setInputValue((prev: string) => prev + '\\n')\n setIsMultiline(true)\n }\n } else {\n e.preventDefault()\n if (inputValue.trim() && isFocused) handleFormSubmit()\n }\n },\n [isMultiline, setInputValue, setIsMultiline, inputValue, isFocused, handleFormSubmit]\n )\n\n const handleFocus = useCallback(() => {\n // Focusing the input should always return to the main chat view\n setChatModalTab(CHAT_MODAL_TAB.CHAT)\n setIsFocused(true)\n setIsOpen(true)\n // When refocusing, re-check for overflow so a long existing value\n // correctly switches back into multiline mode (mirrors main app behavior).\n if (!isMultiline) {\n debouncedCheckOverflow()\n }\n }, [setChatModalTab, setIsFocused, setIsOpen, isMultiline, debouncedCheckOverflow])\n const handleBlur = useCallback(() => {\n if (!isOpen) {\n setIsFocused(false)\n setIsMultiline(false)\n }\n }, [isOpen, setIsFocused, setIsMultiline])\n\n const onNewChat = useCallback(() => {\n handleNewChat()\n setIsOpen(true)\n setIsFocused(true)\n setTimeout(() => refs.inputRef.current?.focus(), 100)\n }, [handleNewChat, setIsOpen, setIsFocused, refs.inputRef])\n\n const handleOpenModalTab = useCallback(\n (tab: (typeof CHAT_MODAL_TAB)[keyof typeof CHAT_MODAL_TAB]) => {\n setChatModalTab(tab)\n setIsOpen(true)\n setIsFocused(true)\n },\n [setChatModalTab, setIsOpen, setIsFocused]\n )\n\n const showOnToolbar = !!chatId\n\n const submitButtonWithHoverCard = (\n <AnimatePresence>\n {(isFocused || inputValue.trim()) && (\n <HoverCard openDelay={200} closeDelay={100}>\n <HoverCardTrigger asChild>\n <motion.button\n type={isLoading ? 'button' : 'submit'}\n disabled={!isLoading && (!inputValue.trim() || !isFocused)}\n onClick={isLoading ? handleCancel : handleFormSubmit}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.15, ease: EASE }}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-full',\n 'transition-colors bg-primary text-primary-foreground hover:bg-primary/90 cursor-pointer',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n isMultiline ? 'absolute right-2 -bottom-10' : 'absolute right-1.5'\n )}\n >\n {isLoading ? (\n <Square className=\"h-4 w-4 fill-current\" />\n ) : (\n <ArrowUp className=\"h-4 w-4\" />\n )}\n </motion.button>\n </HoverCardTrigger>\n <HoverCardContent side=\"left\" align=\"end\" className=\"w-52 p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n {useSSEStreaming ? (\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <EyeOff className=\"h-4 w-4 text-muted-foreground\" />\n )}\n <span className=\"text-sm font-medium\">View Execution</span>\n </div>\n <Switch checked={useSSEStreaming} onCheckedChange={setUseSSEStreaming} />\n </div>\n <p className=\"text-xs text-muted-foreground mt-2\">\n {useSSEStreaming\n ? 'See real-time phases, thoughts & tool calls'\n : 'Show only final results'}\n </p>\n </HoverCardContent>\n </HoverCard>\n )}\n </AnimatePresence>\n )\n\n if (!isMounted) return null\n\n const shouldHideShineBorder = autoFade && isFaded && !(isOpen || isFocused)\n\n const content = (\n <>\n <AnimatePresence>\n {(isFocused || isOpen) && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.6, ease: EASE, exit: { duration: 0.8, ease: EASE } }}\n className=\"fixed inset-0 bg-neutral-800/80 backdrop-blur-md z-[45]\"\n onClick={closeChat}\n />\n )}\n </AnimatePresence>\n\n {isOpen && (\n <div\n className=\"fixed inset-0 flex items-end justify-center z-[47]\"\n style={{ bottom: `${Math.max(80, toolbarHeight + 20)}px` }}\n >\n <div className=\"absolute inset-0\" onClick={closeChat} />\n <div className=\"relative pb-3\">\n <AnimatePresence>\n <ChatAssistant />\n </AnimatePresence>\n </div>\n </div>\n )}\n\n {showToolbar && (\n <div\n ref={toolbarRef}\n className={cn(\n 'group fixed bottom-[16px] left-1/2 z-[48] -translate-x-1/2',\n 'backdrop-blur-sm shadow-all-around dark:bg-neutral-900/90',\n 'transition-all duration-500 ease-[0.23,1,0.32,1]',\n isMultiline\n ? 'w-[95vw] md:w-[75vw] lg:w-[65vw] xl:w-[55vw] 2xl:w-[45vw] max-w-[1100px] rounded-2xl'\n : isFocused\n ? 'w-[64vw] md:w-[52vw] lg:w-[44vw] xl:w-[36vw] 2xl:w-[32vw] max-w-[720px] rounded-full'\n : 'w-[65vw] md:w-[55vw] lg:w-[45vw] xl:w-[32vw] 2xl:w-[28vw] max-w-[850px] rounded-full',\n autoFade && isFaded && !(isOpen || isFocused)\n ? 'shadow-none bg-white dark:bg-neutral-900 hover:shadow-all-around hover:bg-white/65 hover:dark:bg-neutral-900/90'\n : '',\n className\n )}\n onMouseEnter={() => autoFade && resetFadeTimer()}\n onMouseLeave={() => autoFade && !isOpen && !isFocused && resetFadeTimer()}\n onClick={(e) => {\n if (autoFade) resetFadeTimer()\n if (e.target === e.currentTarget || e.target === toolbarRef.current) {\n if (isMultiline && refs.textareaRef.current) refs.textareaRef.current.focus()\n else if (refs.inputRef.current) refs.inputRef.current.focus()\n }\n }}\n >\n {!shouldHideShineBorder && <ShineBorder shineColor={['#A07CFE', '#FE8FB5', '#FFBE7B']} />}\n\n <motion.div\n layout\n transition={SPRING}\n className={cn(\n 'flex w-full text-muted-foreground/70 transition-opacity duration-500',\n isFocused && 'bg-background/95 backdrop-blur-lg opacity-85',\n autoFade &&\n isFaded &&\n !(isOpen || isFocused) &&\n '!opacity-20 group-hover:!opacity-100',\n isMultiline\n ? 'flex-col gap-1 py-3 px-4 rounded-2xl'\n : 'items-center gap-3 px-4 py-2 rounded-full'\n )}\n >\n <motion.div\n layout\n transition={SPRING}\n className={cn('flex w-full', isMultiline ? 'flex-col gap-1' : 'items-center gap-2')}\n >\n {!isMultiline && (\n <>\n <div className=\"flex items-center gap-1 sm:gap-2 flex-shrink-0\">\n <AddNewChatBtn onClick={onNewChat} />\n <ButtonWithTooltip\n onClick={() => handleOpenModalTab(CHAT_MODAL_TAB.RECENT_CONVERSATIONS)}\n tooltipText=\"Recent Conversations\"\n className=\"h-8 w-8 hidden sm:flex\"\n >\n <Clock className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n </div>\n <Separator\n orientation=\"vertical\"\n className=\"hidden md:block h-5 sm:h-6 flex-shrink-0\"\n />\n </>\n )}\n\n <form\n onSubmit={(e) => {\n e.preventDefault()\n handleFormSubmit()\n }}\n className=\"flex items-center flex-1 w-full min-w-0\"\n >\n <div\n className=\"relative flex items-center w-full flex-1 min-w-0 cursor-text max-w-none\"\n onClick={() => {\n if (!isMultiline && refs.inputRef.current) refs.inputRef.current.focus()\n else if (isMultiline && refs.textareaRef.current)\n refs.textareaRef.current.focus()\n }}\n >\n {!isMultiline ? (\n <>\n <input\n ref={refs.inputRef as React.RefObject<HTMLInputElement>}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onClick={(e) => e.stopPropagation()}\n placeholder={placeholder}\n className={cn(\n 'h-9 sm:h-10 text-sm rounded-full transition-all duration-300 border-none shadow-none',\n 'ring-0 focus-visible:ring-0 focus:ring-0 outline-none',\n 'placeholder:text-sm placeholder:text-muted-foreground/70',\n 'w-full pl-4 sm:pl-5 pr-12 bg-transparent flex-1 min-w-0 max-w-none text-foreground'\n )}\n />\n {submitButtonWithHoverCard}\n <AnimatePresence>\n {!isFocused && !inputValue.trim() && (\n <motion.kbd\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"pointer-events-none absolute right-4 top-1/2 -translate-y-1/2 hidden lg:inline-flex h-5 select-none items-center gap-1 rounded border border-border/70 bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground\"\n >\n <span className=\"text-xs\">⌘</span>\n {shortcutKey.toUpperCase()}\n </motion.kbd>\n )}\n </AnimatePresence>\n </>\n ) : (\n <div className=\"relative w-full flex-1 min-w-0\">\n <textarea\n ref={refs.textareaRef as React.RefObject<HTMLTextAreaElement>}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onInput={(e: React.FormEvent<HTMLTextAreaElement>) => {\n const ta = e.currentTarget\n ta.style.height = 'auto'\n ta.style.height = Math.min(Math.max(40, ta.scrollHeight), 80) + 'px'\n }}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onClick={(e) => e.stopPropagation()}\n placeholder={placeholder}\n rows={1}\n className={cn(\n 'w-full text-sm rounded-2xl p-3 pr-12 transition-all duration-200 border-none shadow-none',\n 'ring-0 focus-visible:ring-0 focus:ring-0 outline-none',\n 'placeholder:text-sm placeholder:text-muted-foreground/70',\n 'resize-none min-h-[40px] max-h-[80px] bg-transparent flex-1 min-w-0 text-foreground',\n 'scrollbar-hover-only'\n )}\n />\n {submitButtonWithHoverCard}\n </div>\n )}\n </div>\n </form>\n\n {!isMultiline && (\n <>\n <Separator\n orientation=\"vertical\"\n className=\"hidden lg:block h-5 sm:h-6 flex-shrink-0\"\n />\n <div className=\"hidden lg:flex items-center gap-1 sm:gap-2 flex-shrink-0\">\n <SearchWebBtn />\n <ModelSelector />\n {showOnToolbar && (\n <ChartHistoryBtn\n onClick={() => handleOpenModalTab(CHAT_MODAL_TAB.CHAT_HISTORY)}\n />\n )}\n </div>\n </>\n )}\n </motion.div>\n\n {isMultiline && (\n <motion.div\n layout\n transition={SPRING}\n className=\"flex items-center justify-between w-full mt-0\"\n >\n <div className=\"flex items-center gap-1 sm:gap-2 flex-wrap\">\n <AddNewChatBtn onClick={onNewChat} />\n <SearchWebBtn />\n <ButtonWithTooltip\n onClick={() => handleOpenModalTab(CHAT_MODAL_TAB.RECENT_CONVERSATIONS)}\n tooltipText=\"Recent Conversations\"\n className=\"h-8 w-8 hidden sm:flex\"\n >\n <Clock className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n <ModelSelector />\n {showOnToolbar && (\n <ChartHistoryBtn\n onClick={() => handleOpenModalTab(CHAT_MODAL_TAB.CHAT_HISTORY)}\n />\n )}\n </div>\n </motion.div>\n )}\n </motion.div>\n </div>\n )}\n\n {showToolbar && isMultiline && <div style={{ height: 48 }} />}\n </>\n )\n\n return createPortal(content, document.body)\n}\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\n\nexport function useAutoFade(enabled: boolean, delay: number = 5000, suppressWhen: boolean = false) {\n const [isFaded, setIsFaded] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const resetFadeTimer = useCallback(() => {\n if (!enabled) return\n setIsFaded(false)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => setIsFaded(true), delay)\n }, [enabled, delay])\n\n useEffect(() => {\n if (!enabled) return\n if (suppressWhen) {\n setIsFaded(false)\n if (timerRef.current) clearTimeout(timerRef.current)\n return\n }\n resetFadeTimer()\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [enabled, suppressWhen, resetFadeTimer])\n\n return { isFaded, resetFadeTimer }\n}\n","'use client'\n\nimport { useEffect } from 'react'\n\ninterface KeyboardShortcutHandlers {\n onToggle?: () => void\n onEscape?: () => void\n shortcutKey?: string\n}\n\nexport function useKeyboardShortcuts({\n onToggle,\n onEscape,\n shortcutKey = 'k',\n}: KeyboardShortcutHandlers) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === shortcutKey) {\n e.preventDefault()\n onToggle?.()\n }\n if (e.key === 'Escape') {\n onEscape?.()\n }\n }\n\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [onToggle, onEscape, shortcutKey])\n}\n","'use client'\n\nimport React, { createContext, useContext, useEffect, useMemo, useRef } from 'react'\nimport { useStore } from 'zustand'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport {\n createPapermapStore,\n type PapermapStore,\n type PapermapStoreApi,\n type PapermapStoreConfig,\n} from './papermap-store'\nimport { createPapermapServices, type PapermapHttpServices } from './papermap-services'\nimport { papermapQueryClient } from '../queryClient'\nimport { useAnalyticsStream } from '../hooks/useAnalyticsStream'\nimport { Toaster } from '../components/ui/toaster'\nimport { ThemeProvider } from '../components/ThemeProvider'\n\n// ── Context ─────────────────────────────────────────────────────────\n\nexport type PapermapConnectionValue = {\n token: string\n workspaceId: string\n dashboardId: string\n apiUrl?: string\n services: PapermapHttpServices\n}\n\nconst PapermapConnectionContext = createContext<PapermapConnectionValue | null>(null)\n\nconst PapermapStoreContext = createContext<PapermapStoreApi | null>(null)\n\n// ── Provider ────────────────────────────────────────────────────────\n\ninterface PapermapProviderProps extends PapermapStoreConfig {\n children: React.ReactNode\n}\n\nexport function PapermapProvider({\n children,\n token,\n workspaceId,\n dashboardId,\n apiUrl,\n initialModel,\n onModelChange,\n}: PapermapProviderProps) {\n const services = useMemo(() => createPapermapServices({ token, apiUrl }), [token, apiUrl])\n const connection = useMemo<PapermapConnectionValue>(\n () => ({ token, workspaceId, dashboardId, apiUrl, services }),\n [token, workspaceId, dashboardId, apiUrl, services]\n )\n\n const storeRef = useRef<PapermapStoreApi | null>(null)\n const queryClientRef = useRef<QueryClient | null>(null)\n\n if (!storeRef.current) {\n storeRef.current = createPapermapStore(\n { token, workspaceId, dashboardId, apiUrl, initialModel, onModelChange },\n services\n )\n }\n if (!queryClientRef.current) {\n queryClientRef.current = papermapQueryClient\n }\n\n return (\n <QueryClientProvider client={queryClientRef.current}>\n <ThemeProvider theme=\"light\">\n <PapermapConnectionContext.Provider value={connection}>\n <PapermapStoreContext.Provider value={storeRef.current}>\n <SSESync store={storeRef.current} />\n <ConversationLoader store={storeRef.current} />\n {children}\n <Toaster />\n </PapermapStoreContext.Provider>\n </PapermapConnectionContext.Provider>\n </ThemeProvider>\n </QueryClientProvider>\n )\n}\n\n// ── SSE sync (bridges useAnalyticsStream hook → store) ──────────────\n\nfunction SSESync({ store }: { store: PapermapStoreApi }) {\n const sseRequestId = useStore(store, (s) => s.sseRequestId)\n const services = store.getState().getServices()\n\n const {\n thoughts,\n toolCalls,\n timeline,\n currentPhase,\n isConnected,\n isStreaming,\n isComplete,\n error,\n markRequestAsCompleted: _mark,\n } = useAnalyticsStream(sseRequestId, services.authHeaders, services.baseUrl, {\n onComplete: () => store.getState().setSseRequestId(null),\n onError: () => store.getState().setSseRequestId(null),\n })\n\n useEffect(() => {\n store.getState().syncSseDisplay({\n thoughts,\n toolCalls,\n timeline,\n phase: currentPhase,\n isConnected,\n isStreaming,\n isComplete,\n error,\n })\n }, [\n thoughts,\n toolCalls,\n timeline,\n currentPhase,\n isConnected,\n isStreaming,\n isComplete,\n error,\n store,\n ])\n\n return null\n}\n\n// ── Conversation loader (replaces the useEffect in usePapermapChat) ──\n// When active chat id (editChatId || chatId) changes, clear persisted chart and messages\n// so the new conversation loads fresh (mirrors main app toolbar useEffect on activeChatId).\nfunction ConversationLoader({ store }: { store: PapermapStoreApi }) {\n const isOpen = useStore(store, (s) => s.isOpen)\n const chatId = useStore(store, (s) => s.chatId)\n const editChatId = useStore(store, (s) => s.editChatId)\n const activeChatId = useMemo(() => editChatId || chatId, [editChatId, chatId])\n const previousActiveChatIdRef = useRef<string | null>(null)\n\n useEffect(() => {\n const prev = previousActiveChatIdRef.current\n if (prev && activeChatId && prev !== activeChatId) {\n const state = store.getState()\n state.setMessages([])\n state.clearLatestChart()\n }\n previousActiveChatIdRef.current = activeChatId ?? null\n }, [activeChatId, store])\n\n useEffect(() => {\n store.getState().loadConversations()\n }, [isOpen, chatId, editChatId, store])\n\n return null\n}\n\n// ── Selector hook ───────────────────────────────────────────────────\n\nexport function usePapermapStore<T>(selector: (state: PapermapStore) => T): T {\n const store = useContext(PapermapStoreContext)\n if (!store) {\n throw new Error('usePapermapStore must be used within <PapermapProvider>')\n }\n return useStore(store, selector)\n}\n\n/**\n * Access the raw store API (for refs, services, imperative calls).\n * Does NOT subscribe to re-renders -- use usePapermapStore for reactive state.\n */\nexport function usePapermapStoreApi(): PapermapStoreApi {\n const store = useContext(PapermapStoreContext)\n if (!store) {\n throw new Error('usePapermapStoreApi must be used within <PapermapProvider>')\n }\n return store\n}\n\n/**\n * Like usePapermapStoreApi but returns null when outside a provider.\n * Use this to detect if a component is already inside a PapermapProvider\n * (e.g. to avoid nesting a second provider and share the same store).\n */\nexport function usePapermapStoreApiOptional(): PapermapStoreApi | null {\n return useContext(PapermapStoreContext)\n}\n\nexport function usePapermapConnection(): PapermapConnectionValue {\n const ctx = useContext(PapermapConnectionContext)\n if (!ctx) {\n throw new Error('usePapermapConnection must be used within <PapermapProvider>')\n }\n return ctx\n}\n\nexport function usePapermapConnectionOptional(): PapermapConnectionValue | null {\n return useContext(PapermapConnectionContext)\n}\n","import { createStore } from 'zustand/vanilla'\nimport { STREAM_STATUS } from '../api/endpoints'\nimport { generateChartRequestId } from '../services/streaming'\nimport { papermapQueryClient } from '../queryClient'\nimport { createPapermapServices, type PapermapHttpServices } from './papermap-services'\nimport type { Message } from '../types'\nimport type { AgentThought, ToolCall, TimelineEvent } from '../types/streaming'\nimport type { TChartMeta, TChartResponse } from '../types/chart'\n\n// ── Constants ─────────────────────────────────────────────────────────\n\nexport const CHAT_MODAL_TAB = {\n CHAT: 'CHAT',\n SAVED_MEMORY: 'SAVED_MEMORY',\n RECENT_CONVERSATIONS: 'RECENT_CONVERSATIONS',\n CHAT_HISTORY: 'CHAT_HISTORY',\n} as const\n\nexport type ChatModalTabType = (typeof CHAT_MODAL_TAB)[keyof typeof CHAT_MODAL_TAB]\n\n// ── Types ─────────────────────────────────────────────────────────────\n\nexport interface PapermapStoreConfig {\n token: string\n workspaceId: string\n dashboardId: string\n apiUrl?: string\n /**\n * Optional: use your own state (e.g. Redux) to control the selected model.\n * When provided, this value is used as the initial model instead of sessionStorage.\n */\n initialModel?: string | null\n /**\n * Optional: called whenever the selected model changes.\n * Ideal place to dispatch a Redux action in the host app.\n */\n onModelChange?: (model: string | null) => void\n}\n\ntype Services = PapermapHttpServices\n\ninterface Refs {\n inputRef: { current: HTMLInputElement | null }\n textareaRef: { current: HTMLTextAreaElement | null }\n scrollRef: { current: HTMLDivElement | null }\n messagesEndRef: { current: HTMLDivElement | null }\n activeChatIdRef: { current: string | null }\n loadedConversationChatIdRef: { current: string | null }\n}\n\nexport interface PapermapState {\n // Core\n messages: Message[]\n isLoading: boolean\n isBranching: boolean\n isFocused: boolean\n isOpen: boolean\n inputValue: string\n isMultiline: boolean\n\n // Chat tracking\n chatId: string | null\n editChatId: string | null\n currentRequestId: string | null\n\n // UI tabs & panels\n chatModalTab: ChatModalTabType\n browserUse: boolean\n selectedModel: string | null\n viewExecution: boolean\n\n // Chart state\n chartData: any[]\n allMeta: TChartMeta\n selectedChartType: string\n chartVisuals: Record<string, any>\n\n // Pagination\n totalPages: number\n currentPage: number\n isLoadingMore: boolean\n\n // SSE (controlled by store, synced from useAnalyticsStream via provider)\n useSSEStreaming: boolean\n sseRequestId: string | null\n sseChatId: string | null\n\n // SSE display state (written by the provider's sync effect)\n sseThoughts: AgentThought[]\n sseToolCalls: ToolCall[]\n sseTimeline: TimelineEvent[]\n ssePhase: string | undefined\n sseIsConnected: boolean\n sseIsStreaming: boolean\n sseIsComplete: boolean\n sseError: string | null\n}\n\nexport interface PapermapActions {\n // Setters\n setMessages: (messages: Message[] | ((prev: Message[]) => Message[])) => void\n setIsLoading: (v: boolean) => void\n setIsBranching: (v: boolean) => void\n setIsFocused: (v: boolean) => void\n setIsOpen: (v: boolean) => void\n setInputValue: (v: string | ((prev: string) => string)) => void\n setIsMultiline: (v: boolean) => void\n setIsLoadingMore: (v: boolean) => void\n setChatId: (v: string | null) => void\n setEditChatId: (v: string | null) => void\n\n // UI tab & panel setters\n setChatModalTab: (v: ChatModalTabType) => void\n setBrowserUse: (v: boolean) => void\n updateBrowserUse: (v: boolean) => void\n setSelectedModel: (v: string | null) => void\n setViewExecution: (v: boolean) => void\n\n // Chart state setters\n updateChartData: (data: any[]) => void\n updateAllMeta: (meta: TChartMeta) => void\n updateChartType: (v: string) => void\n updateChartVisuals: (v: Record<string, any>) => void\n updateLatestChart: (result: any) => void\n clearLatestChart: () => void\n\n // SSE control\n setUseSSEStreaming: (v: boolean) => void\n setSseRequestId: (v: string | null) => void\n setSseChatId: (v: string | null) => void\n clearStreamingState: () => void\n\n // SSE display sync (called by the provider)\n syncSseDisplay: (data: {\n thoughts: AgentThought[]\n toolCalls: ToolCall[]\n timeline: TimelineEvent[]\n phase: string | undefined\n isConnected: boolean\n isStreaming: boolean\n isComplete: boolean\n error: string | null\n }) => void\n\n // Computed\n shouldShowSSE: () => boolean\n\n // Core actions\n handleSubmit: (userMessage: string) => Promise<void>\n handleCancel: () => Promise<void>\n handleNewChat: () => void\n handleScroll: (event: React.UIEvent<HTMLDivElement>) => Promise<void>\n scrollToBottom: () => void\n loadConversations: () => Promise<void>\n\n // Access non-reactive internals\n getRefs: () => Refs\n getServices: () => Services\n getConfig: () => PapermapStoreConfig\n}\n\nexport type PapermapStore = PapermapState & PapermapActions\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\nconst MODEL_STORAGE_KEY = 'papermap_plugin_selected_model'\n\nfunction loadInitialModel(): string | null {\n if (typeof window === 'undefined') return null\n try {\n const stored = window.sessionStorage.getItem(MODEL_STORAGE_KEY)\n return stored || null\n } catch {\n return null\n }\n}\n\nfunction persistModel(model: string | null) {\n if (typeof window === 'undefined') return\n try {\n if (model) {\n window.sessionStorage.setItem(MODEL_STORAGE_KEY, model)\n } else {\n window.sessionStorage.removeItem(MODEL_STORAGE_KEY)\n }\n } catch {\n // Ignore storage errors (e.g. disabled cookies)\n }\n}\n\ninterface Conversation {\n text_response?: string\n user_query?: string\n code?: string\n thoughts?: string\n llm_data_id?: string\n bookmarked?: boolean\n bookmark_id?: string\n is_inherited?: boolean\n progress_events?: { event_type?: string; data?: Record<string, any> }[]\n}\n\nfunction formatConversations(conversations: Conversation[]): Message[] {\n const formatted: Message[] = conversations.flatMap((item) => {\n let thought = item.thoughts?.trim()\n if (!thought && item.progress_events) {\n thought =\n item.progress_events\n .filter((evt) => evt.event_type === 'agent_thought')\n .map((evt) => evt.data?.content || '')\n .join('')\n .trim() || undefined\n }\n return [\n {\n role: 'assistant' as const,\n content: (item.text_response || '') as string,\n code: item.code || undefined,\n thought,\n status: 'done' as const,\n id: item.llm_data_id,\n bookmarked: item.bookmarked ?? false,\n bookmark_id: item.bookmark_id,\n progress_events: item.progress_events,\n },\n {\n role: 'user' as const,\n content: (item.user_query || '') as string,\n id: item.llm_data_id,\n },\n ]\n })\n return formatted.reverse()\n}\n\n// ── Store factory ─────────────────────────────────────────────────────\n\nexport function createPapermapStore(config: PapermapStoreConfig, injectedServices?: PapermapHttpServices) {\n const services: Services = injectedServices ?? createPapermapServices(config)\n const { chartSvc, streamingSvc } = services\n\n const refs: Refs = {\n inputRef: { current: null },\n textareaRef: { current: null },\n scrollRef: { current: null },\n messagesEndRef: { current: null },\n activeChatIdRef: { current: null },\n loadedConversationChatIdRef: { current: null },\n }\n\n const GREETING: Message = {\n role: 'assistant',\n content: 'Hello! How can I help you analyze your data today?',\n status: 'done',\n noIcons: true,\n }\n\n const initialModel = config.initialModel ?? loadInitialModel()\n\n return createStore<PapermapStore>()((set, get) => ({\n // ── Initial state ───────────────────────────────────────────────\n messages: [GREETING],\n isLoading: false,\n isBranching: false,\n isFocused: false,\n isOpen: false,\n inputValue: '',\n isMultiline: false,\n chatId: null,\n editChatId: null,\n currentRequestId: null,\n chatModalTab: CHAT_MODAL_TAB.CHAT,\n browserUse:\n typeof window !== 'undefined' &&\n window.sessionStorage.getItem('papermap_plugin_browser_use') === 'true',\n selectedModel: initialModel,\n viewExecution: true,\n chartData: [],\n allMeta: {},\n selectedChartType: '',\n chartVisuals: {},\n totalPages: 0,\n currentPage: 1,\n isLoadingMore: false,\n useSSEStreaming: true,\n sseRequestId: null,\n sseChatId: null,\n sseThoughts: [],\n sseToolCalls: [],\n sseTimeline: [],\n ssePhase: undefined,\n sseIsConnected: false,\n sseIsStreaming: false,\n sseIsComplete: false,\n sseError: null,\n\n // ── Setters ─────────────────────────────────────────────────────\n setMessages: (v) =>\n set((s) => ({\n messages: typeof v === 'function' ? v(s.messages) : v,\n })),\n setIsLoading: (v) => set({ isLoading: v }),\n setIsBranching: (v) => set({ isBranching: v }),\n setIsFocused: (v) => set({ isFocused: v }),\n setIsOpen: (v) => set({ isOpen: v }),\n setInputValue: (v) =>\n set((s) => ({\n inputValue: typeof v === 'function' ? v(s.inputValue) : v,\n })),\n setIsMultiline: (v) => set({ isMultiline: v }),\n setIsLoadingMore: (v) => set({ isLoadingMore: v }),\n setChatId: (v) => set({ chatId: v }),\n setEditChatId: (v) => set({ editChatId: v }),\n\n // ── UI tab & panel setters ───────────────────────────────────────\n setChatModalTab: (v) => set({ chatModalTab: v }),\n setBrowserUse: (v) => {\n set({ browserUse: v })\n if (typeof window !== 'undefined') {\n try {\n window.sessionStorage.setItem('papermap_plugin_browser_use', v ? 'true' : 'false')\n } catch {\n // ignore storage errors\n }\n }\n },\n updateBrowserUse: (v) => {\n set({ browserUse: v })\n if (typeof window !== 'undefined') {\n try {\n window.sessionStorage.setItem('papermap_plugin_browser_use', v ? 'true' : 'false')\n } catch {\n // ignore storage errors\n }\n }\n },\n setSelectedModel: (v) => {\n set({ selectedModel: v })\n persistModel(v)\n if (typeof config.onModelChange === 'function') {\n config.onModelChange(v)\n }\n },\n setViewExecution: (v) => set({ viewExecution: v }),\n\n // ── Chart state setters ──────────────────────────────────────────\n updateChartData: (data) => set({ chartData: data }),\n updateAllMeta: (meta) => set({ allMeta: meta }),\n updateChartType: (v) => set({ selectedChartType: v }),\n updateChartVisuals: (v) => set({ chartVisuals: v }),\n updateLatestChart: (result) => {\n if (result?.chart_type && result?.data?.length) {\n set({ chartData: result.data, selectedChartType: `${result.chart_type}` })\n }\n if (result?.visualization_config) {\n set({ chartVisuals: result.visualization_config })\n }\n console.log('meta: ', result?.meta)\n // Persist meta (including variant) so ChartView shows the correct variation (mirrors main app)\n if (result?.meta && typeof result.meta === 'object') {\n set({ allMeta: result.meta })\n } else if (result?.visualization_config?.variant !== undefined) {\n get().updateAllMeta({ ...get().allMeta, variant: result.visualization_config.variant })\n }\n },\n clearLatestChart: () =>\n set({ chartData: [], selectedChartType: '', chartVisuals: {}, allMeta: {} }),\n\n // ── SSE control ─────────────────────────────────────────────────\n setUseSSEStreaming: (v) => set({ useSSEStreaming: v }),\n setSseRequestId: (v) => set({ sseRequestId: v }),\n setSseChatId: (v) => set({ sseChatId: v }),\n clearStreamingState: () => set({ sseRequestId: null, sseChatId: null }),\n\n syncSseDisplay: (data) => {\n const s = get()\n const show = !!s.sseRequestId && !!s.chatId && s.sseChatId === s.chatId\n set({\n sseThoughts: show ? data.thoughts : [],\n sseToolCalls: show ? data.toolCalls : [],\n sseTimeline: show ? data.timeline : [],\n ssePhase: show ? data.phase : undefined,\n sseIsConnected: show ? data.isConnected : false,\n sseIsStreaming: show ? data.isStreaming : false,\n sseIsComplete: show ? data.isComplete : false,\n sseError: show ? data.error : null,\n })\n },\n\n shouldShowSSE: () => {\n const s = get()\n return !!s.sseRequestId && !!s.chatId && s.sseChatId === s.chatId\n },\n\n // ── Non-reactive access ─────────────────────────────────────────\n getRefs: () => refs,\n getServices: () => services,\n getConfig: () => config,\n\n // ── Scroll ──────────────────────────────────────────────────────\n scrollToBottom: () => {\n refs.messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n },\n\n // ── Load conversations ──────────────────────────────────────────\n // Use editChatId || chatId (like main app) so we get conversation by that id when editing.\n loadConversations: async () => {\n const { isOpen, chatId, editChatId } = get()\n const chatIdToUse = editChatId || chatId\n if ((!isOpen && !editChatId) || !chatIdToUse) {\n refs.loadedConversationChatIdRef.current = null\n set({ isLoadingMore: false })\n if (!chatIdToUse) get().clearLatestChart()\n return\n }\n if (refs.loadedConversationChatIdRef.current === chatIdToUse) return\n\n set({ isLoadingMore: true })\n const chatIdToLoad = chatIdToUse\n\n // Fetch chart in parallel with conversations (like main app toolbar)\n chartSvc\n .getLatestChart(chatIdToLoad)\n .then((result) => {\n const current = get()\n if ((current.editChatId || current.chatId) !== chatIdToLoad) return\n if (result?.success === false && (result?.data as any)?.is_multi_source) {\n return\n }\n const chartPayload = result?.data\n if (chartPayload?.chart_type && chartPayload?.data?.length) {\n get().updateLatestChart(chartPayload)\n } else {\n get().clearLatestChart()\n }\n })\n .catch(() => {\n // Silently ignore chart fetch errors; keep previous chart\n })\n\n try {\n const result = await chartSvc.getConversations({\n chat_id: chatIdToUse,\n per_page: 4,\n page: 1,\n })\n const formatted = formatConversations(result.data.conversations)\n set({\n totalPages: result.data.total_pages,\n currentPage: 1,\n messages: formatted,\n isLoadingMore: false,\n })\n refs.loadedConversationChatIdRef.current = chatIdToUse\n } catch {\n set({ isLoadingMore: false })\n }\n },\n\n // ── Submit ──────────────────────────────────────────────────────\n handleSubmit: async (userMessage: string) => {\n const s = get()\n if (!userMessage.trim() || s.isLoading) return\n\n const requestId = generateChartRequestId()\n set({ inputValue: '' })\n get().clearStreamingState()\n\n const currentMessages: Message[] = [...s.messages, { role: 'user', content: userMessage }]\n\n const tempMessages: Message[] = [\n ...currentMessages,\n { role: 'assistant', content: '', status: 'thinking', thought: 'Thinking...' },\n ]\n set({ isLoading: true, messages: tempMessages })\n get().scrollToBottom()\n\n let chatIdToUse = s.editChatId || s.chatId\n\n if (!chatIdToUse) {\n try {\n const data = await chartSvc.createChat({\n name: '',\n dashboard_id: config.dashboardId,\n })\n chatIdToUse = data.data.llm_data_chat_id\n set({ chatId: chatIdToUse })\n refs.loadedConversationChatIdRef.current = chatIdToUse\n // Invalidate conversation history so new chat appears in RecentConversations\n papermapQueryClient.invalidateQueries({\n queryKey: ['conversationHistory', config.dashboardId],\n })\n } catch (err) {\n console.error('Failed to create chat:', err)\n set({\n messages: [\n ...currentMessages,\n { role: 'error', content: 'Failed to start a new chat. Please try again.' },\n ],\n isLoading: false,\n })\n return\n }\n }\n\n if (!chatIdToUse) return\n refs.activeChatIdRef.current = chatIdToUse\n\n try {\n set({ currentRequestId: requestId })\n\n const responsePromise = streamingSvc.streamChartWithSSE({\n prompt: userMessage,\n workspace_id: config.workspaceId,\n chat_id: chatIdToUse,\n request_id: requestId,\n llm_model: s.selectedModel || undefined,\n stream_execution: true,\n use_search: s.browserUse,\n })\n\n await new Promise((resolve) => setTimeout(resolve, 150))\n\n set({ sseChatId: chatIdToUse, sseRequestId: requestId })\n\n const response = await responsePromise\n const chartData = response.data.data\n\n const lastIdx = tempMessages.length - 1\n const updatedMessages = [...tempMessages]\n if (updatedMessages[lastIdx - 1]) {\n updatedMessages[lastIdx - 1] = {\n ...updatedMessages[lastIdx - 1],\n id: chartData.llm_data_id || chatIdToUse,\n }\n }\n updatedMessages[lastIdx] = {\n role: 'assistant',\n content: chartData.text_response || '',\n thought: chartData.thoughts,\n progress_events: chartData.progress_events,\n openThought: false,\n status: 'done',\n code: chartData.code || '',\n id: chartData.llm_data_id || '',\n bookmarked: chartData.bookmarked ?? false,\n bookmark_id: chartData.bookmark_id,\n }\n\n if (\n chartData.status !== STREAM_STATUS.CANCELLED &&\n refs.activeChatIdRef.current === chatIdToUse\n ) {\n set({ messages: updatedMessages })\n get().updateLatestChart(chartData)\n }\n\n set({ isLoading: false, currentRequestId: null })\n } catch (error: any) {\n console.error('Error streaming chart:', error)\n const errorMsg =\n error?.response?.data?.message ||\n error?.message ||\n 'Oops! Something went wrong. Please try again.'\n set({\n messages: [...currentMessages, { role: 'error', content: errorMsg }],\n isLoading: false,\n currentRequestId: null,\n })\n get().scrollToBottom()\n get().clearStreamingState()\n }\n },\n\n // ── Cancel ──────────────────────────────────────────────────────\n handleCancel: async () => {\n const s = get()\n if (!s.currentRequestId) return\n try {\n await streamingSvc.cancelChartRequest(s.currentRequestId)\n set({\n messages: s.messages.filter((msg) => msg.status !== 'thinking'),\n })\n } catch (err) {\n console.error('Cancel failed:', err)\n }\n set({ isLoading: false, currentRequestId: null })\n get().clearStreamingState()\n },\n\n // ── New chat ────────────────────────────────────────────────────\n handleNewChat: () => {\n get().clearStreamingState()\n get().clearLatestChart()\n set({\n isLoading: false,\n isLoadingMore: false,\n chatId: null,\n editChatId: null,\n messages: [GREETING],\n inputValue: '',\n allMeta: {},\n chatModalTab: CHAT_MODAL_TAB.CHAT,\n })\n refs.loadedConversationChatIdRef.current = null\n },\n\n // ── Scroll handler (pagination) ─────────────────────────────────\n handleScroll: async (event: React.UIEvent<HTMLDivElement>) => {\n const target = event.target as HTMLDivElement\n const isNearTop = target.scrollTop <= 100\n const s = get()\n\n const chatIdToUse = s.editChatId || s.chatId\n if (\n isNearTop &&\n s.currentPage < s.totalPages &&\n !s.isLoading &&\n !s.isLoadingMore &&\n chatIdToUse\n ) {\n set({ isLoadingMore: true })\n const previousScrollHeight = target.scrollHeight\n\n try {\n const nextPage = s.currentPage + 1\n const result = await chartSvc.getConversations({\n chat_id: chatIdToUse,\n per_page: 4,\n page: nextPage,\n })\n const formatted = formatConversations(result.data.conversations)\n const MAX_MESSAGES = 200\n const combined = [...formatted, ...s.messages]\n set({\n messages: combined.length > MAX_MESSAGES ? combined.slice(0, MAX_MESSAGES) : combined,\n currentPage: nextPage,\n })\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const newScrollHeight = target.scrollHeight\n target.scrollTop = newScrollHeight - previousScrollHeight\n })\n })\n } catch (err) {\n console.error('Error loading more messages:', err)\n } finally {\n set({ isLoadingMore: false })\n }\n }\n },\n }))\n}\n\nexport type PapermapStoreApi = ReturnType<typeof createPapermapStore>\n\n// ── Imperative open/close chat assistant (e.g. from Edit Chart button) ───────\n\nexport interface OpenPapermapChatAssistantOptions {\n /** When provided, opens the assistant in edit mode for this chart/chat. */\n editChartId?: string | null\n /**\n * Full chart to prime the store with (like main app openEditChartModal).\n * When provided, sets meta, chart data, type, and visuals immediately so\n * variant and chart display correctly before loadConversations/getLatestChart run.\n */\n chart?: TChartResponse | null\n /**\n * When true, do not open/focus the floating PapermapChat assistant.\n * This is useful for streaming variants that render their own embedded\n * chart+conversation panel instead of the global UI.\n */\n suppressOpen?: boolean\n}\n\n/**\n * Opens the chart assistant (chat modal) from outside React, e.g. when the user\n * clicks the Edit Chart icon. Call with the store API from a component that has\n * access to it (e.g. via usePapermapStoreApi). Optionally pass editChartId to\n * open in edit mode for that chart.\n *\n * When chart is provided (e.g. from ChartCard), primes the store like the main\n * app openEditChartModal: setMessages([]), updateAllMeta(chart.meta),\n * updateChartData/Type/Visuals(chart.chart_response), then set editChatId and open.\n * ConversationLoader still runs loadConversations() for messages; variant shows\n * immediately from chart.meta.\n */\nexport function openPapermapChatAssistant(\n storeApi: PapermapStoreApi,\n options?: OpenPapermapChatAssistantOptions\n): void {\n const state = storeApi.getState()\n state.setChatModalTab(CHAT_MODAL_TAB.CHAT)\n\n const chart = options?.chart\n const id = options?.editChartId ?? chart?.llm_data_chat_id ?? null\n\n if (chart) {\n state.setMessages([])\n if (chart.meta && typeof chart.meta === 'object') {\n state.updateAllMeta(chart.meta)\n }\n if (chart.chart_response) {\n const cr = chart.chart_response\n state.updateChartData(cr.data || [])\n state.updateChartType(cr.chart_type || '')\n if (cr.visualization_config) {\n state.updateChartVisuals(cr.visualization_config)\n if (cr.visualization_config.variant !== undefined && !(chart.meta?.variant !== undefined)) {\n const currentMeta = (state as PapermapStore).allMeta ?? {}\n state.updateAllMeta({ ...currentMeta, variant: cr.visualization_config.variant })\n }\n }\n }\n }\n\n if (id !== undefined && id !== null) {\n state.setEditChatId(id)\n const refs = state.getRefs()\n refs.loadedConversationChatIdRef.current = null\n }\n\n // For streaming variants, callers can pass suppressOpen to avoid opening\n // the floating PapermapChat assistant and only prime the store.\n if (!options?.suppressOpen) {\n state.setIsFocused(true)\n state.setIsOpen(true)\n const refs = state.getRefs()\n setTimeout(() => {\n refs.inputRef.current?.focus()\n }, 50)\n }\n}\n\nexport function closePapermapChatAssistant(storeApi: PapermapStoreApi): void {\n const state = storeApi.getState()\n state.setEditChatId(null)\n state.setIsOpen(false)\n state.setIsFocused(false)\n}\n","const API_V1 = '/api/v1'\n\nexport const DEFAULT_API_URL = 'https://dev.dataapi.papermap.ai'\n\nexport const ENDPOINTS = {\n dashboards: `${API_V1}/analytics/dashboards`,\n dashboardLayout: (dashboardId: string) => `${API_V1}/analytics/dashboards/${dashboardId}/layout`,\n charts: `${API_V1}/analytics/chats`,\n streamChat: `${API_V1}/analytics/chats/stream`,\n chartsPaginated: `${API_V1}/analytics/chats/paginate`,\n streamChart: `${API_V1}/analytics/charts/stream`,\n cancelChartRequest: `${API_V1}/analytics/charts/cancel`,\n editChatMessage: (llmDataId: string) => `${API_V1}/analytics/conversations/${llmDataId}/edit`,\n streamRequest: `${API_V1}/analytics/requests/stream`,\n conversationHistory: `${API_V1}/analytics/chats-history`,\n chartHistory: (chatId: string) => `${API_V1}/analytics/chats/${chatId}/get-all-charts`,\n chartById: (chartId: string) => `${API_V1}/analytics/chats/${chartId}`,\n bookmarkConversation: `${API_V1}/analytics/chart-bookmarks`,\n getBookmarkedCharts: `${API_V1}/analytics/chart-bookmarks/paginate`,\n deleteBookmark: `${API_V1}/analytics/chart-bookmarks`,\n getChatDataWithBookmark: `${API_V1}/analytics/charts`,\n updateResponseLabel: `${API_V1}/analytics/charts/update-label`,\n\n // Branch Conversation\n branchConversation: (llm_data_id: string) =>\n `${API_V1}/analytics/conversations/${llm_data_id}/branch`,\n\n models: `${API_V1}/options/models`,\n generateProactiveDashboard: `${API_V1}/analytics/proactive-dashboard/generate`,\n\n /** Workspace CRUD (theme lives on `meta.theme` keyed by dashboard id) */\n workspace: (workspaceId: string) => `${API_V1}/analytics/workspaces/${workspaceId}`,\n} as const\n\nexport const STREAM_STATUS = {\n PENDING: 'pending',\n PROCESSING: 'processing',\n COMPLETED: 'completed',\n FAILED: 'failed',\n CANCELLED: 'cancelled',\n} as const\n","import type { AxiosInstance } from 'axios'\nimport { ENDPOINTS } from '../api/endpoints'\n\ntype StreamChartWithSSEData = {\n prompt: string\n workspace_id: string\n chat_id: string\n request_id: string\n llm_model?: string\n use_search?: boolean\n stream_execution?: boolean\n}\n\ntype EditMessageWithSSEData = StreamChartWithSSEData & {\n llm_data_id: string\n}\n\nexport function createStreamingService(client: AxiosInstance) {\n const streamChartWithSSE = async (data: StreamChartWithSSEData) => {\n const res = await client.post(ENDPOINTS.streamChart, {\n ...data,\n use_search: data.use_search ?? false,\n stream_execution: data.stream_execution ?? true,\n })\n return res\n }\n\n const editMessageWithSSE = async (data: EditMessageWithSSEData) => {\n const res = await client.post(ENDPOINTS.editChatMessage(data.llm_data_id), {\n prompt: data.prompt,\n workspace_id: data.workspace_id,\n chat_id: data.chat_id,\n request_id: data.request_id,\n use_search: data.use_search,\n llm_model: data.llm_model,\n stream_execution: data.stream_execution ?? true,\n })\n return res\n }\n\n const cancelChartRequest = async (request_id: string, reason = 'user_cancelled') => {\n const res = await client.post(ENDPOINTS.cancelChartRequest, { request_id, reason })\n return res.data\n }\n\n return { streamChartWithSSE, editMessageWithSSE, cancelChartRequest }\n}\n\nexport const generateChartRequestId = () => `chat_${Date.now()}_${crypto.randomUUID().slice(0, 8)}`\n","import { QueryClient } from '@tanstack/react-query'\n\nexport const papermapQueryClient = new QueryClient({\n defaultOptions: {\n queries: { staleTime: 5 * 60 * 1000 }, // 5 min\n },\n})\n","import Axios from 'axios'\nimport { DEFAULT_API_URL } from './endpoints'\n\nexport interface DecodedToken {\n api_key_id: string\n workspace_id: string\n valid_until: number\n signature: string\n dashboard_id?: string\n tenant_id?: string\n}\n\nexport function decodeToken(token: string): DecodedToken {\n try {\n return JSON.parse(atob(token))\n } catch {\n throw new Error('Invalid Papermap token: could not decode base64 JSON')\n }\n}\n\nexport function buildAuthHeaders(decoded: DecodedToken): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-API-Key-ID': decoded.api_key_id,\n 'X-Workspace-ID': decoded.workspace_id,\n 'X-Valid-Until': decoded.valid_until.toString(),\n 'X-Signature': decoded.signature,\n 'X-Tenant-ID': decoded.tenant_id || 'da-app',\n }\n return headers\n}\n\nexport function createApiClient(token: string, apiUrl?: string) {\n const decoded = decodeToken(token)\n const authHeaders = buildAuthHeaders(decoded)\n\n const client = Axios.create({\n baseURL: apiUrl || DEFAULT_API_URL,\n responseType: 'json',\n timeout: 200_000,\n })\n\n client.interceptors.request.use((config) => {\n Object.entries(authHeaders).forEach(([key, value]) => {\n config.headers[key] = value\n })\n return config\n })\n\n return { client, decoded, authHeaders }\n}\n","import type { AxiosInstance } from 'axios'\nimport type { TLayout } from '../types/dashboard'\nimport { ENDPOINTS } from '../api/endpoints'\n\nexport function createChartService(client: AxiosInstance) {\n const getDashboards = async (params: { workspace_id: string }) => {\n const res = await client.get(ENDPOINTS.dashboards, {\n params: { workspace_id: params.workspace_id },\n })\n return res.data\n }\n\n const updateDashboardLayout = async (dashboardId: string, layout: TLayout[]) => {\n const res = await client.post(ENDPOINTS.dashboardLayout(dashboardId), { meta: layout })\n return res.data\n }\n\n const createChat = async (data: { name: string; dashboard_id: string }) => {\n const res = await client.post(ENDPOINTS.charts, data)\n return res.data\n }\n\n const getCharts = async (params: {\n dashboard_id: string\n page?: number\n per_page?: number\n pin?: boolean\n }) => {\n const res = await client.get(ENDPOINTS.chartsPaginated, {\n params: {\n dashboard_id: params.dashboard_id,\n page: params.page ?? 1,\n per_page: params.per_page ?? 20,\n pin: params.pin ?? false,\n },\n })\n return res.data\n }\n\n const getConversations = async (params: {\n chat_id: string\n per_page?: number\n page?: number\n }) => {\n const res = await client.get(`${ENDPOINTS.charts}/${params.chat_id}/conversations`, {\n params: {\n chat_id: params.chat_id,\n per_page: params.per_page ?? 4,\n page: params.page ?? 1,\n },\n })\n return res.data\n }\n\n const getLatestChart = async (chat_id: string) => {\n const res = await client.get(`${ENDPOINTS.charts}/${chat_id}/latest-chart`)\n return res.data\n }\n\n const getConversationHistory = async (params: {\n dashboard_id?: string\n per_page?: number\n page?: number\n }) => {\n const res = await client.get(ENDPOINTS.conversationHistory, { params })\n return res.data\n }\n\n const deleteChart = async (chatId: string) => {\n const res = await client.delete(`${ENDPOINTS.charts}/${chatId}`)\n return res.data\n }\n\n const getChartHistory = async (params: { chat_id: string; per_page?: number; page?: number }) => {\n const res = await client.get(ENDPOINTS.chartHistory(params.chat_id), {\n params: { per_page: params.per_page ?? 4, page: params.page ?? 1 },\n })\n return res.data\n }\n\n const getChartById = async (chartId: string) => {\n const res = await client.get(ENDPOINTS.chartById(chartId))\n return res.data\n }\n\n const updateChartMeta = async (chatId: string, meta: Record<string, any>) => {\n const res = await client.patch(`${ENDPOINTS.charts}/${chatId}`, { meta })\n return res.data\n }\n\n const updateChartPin = async (chatId: string, pin: boolean) => {\n const res = await client.patch(`${ENDPOINTS.charts}/${chatId}`, { pin })\n return res.data\n }\n\n const bookmarkConversation = async (data: { llm_data_id: string; dashboard_id: string }) => {\n const res = await client.post(ENDPOINTS.bookmarkConversation, data)\n return res.data\n }\n\n const removeBookmark = async (bookmarkId: string) => {\n const res = await client.delete(`${ENDPOINTS.bookmarkConversation}/${bookmarkId}`)\n return res.data\n }\n\n const updateResponseLabel = async (llm_data_id: string, label: 'positive' | 'negative') => {\n const res = await client.post(ENDPOINTS.updateResponseLabel, { label, llm_data_id })\n return res.data\n }\n\n const branchConversation = async (dashboard_id: string, llm_data_id: string) => {\n const res = await client.post(ENDPOINTS.branchConversation(llm_data_id), {\n dashboard_id,\n llm_data_id,\n })\n return res.data\n }\n\n const getModels = async () => {\n const res = await client.get(ENDPOINTS.models)\n return res.data\n }\n\n const generateProactiveDashboard = async (payload: {\n workspace_id: string\n dashboard_id?: string\n color_scheme?: string\n }) => {\n const res = await client.post(ENDPOINTS.generateProactiveDashboard, payload)\n return res.data\n }\n\n return {\n getDashboards,\n updateDashboardLayout,\n createChat,\n getCharts,\n getConversations,\n getLatestChart,\n getConversationHistory,\n deleteChart,\n getChartHistory,\n getChartById,\n updateChartMeta,\n updateChartPin,\n bookmarkConversation,\n removeBookmark,\n updateResponseLabel,\n branchConversation,\n getModels,\n generateProactiveDashboard,\n }\n}\n","import type { AxiosInstance } from 'axios'\nimport { ENDPOINTS } from '../api/endpoints'\n\n/** API may return `{ data: workspace }` or the workspace object directly */\nexport function unwrapWorkspacePayload(res: unknown): Record<string, any> {\n if (res && typeof res === 'object' && 'data' in res && (res as any).data != null) {\n return (res as { data: Record<string, any> }).data\n }\n return res as Record<string, any>\n}\n\nexport function createWorkspaceService(client: AxiosInstance) {\n const getWorkspace = async (workspaceId: string) => {\n const res = await client.get(ENDPOINTS.workspace(workspaceId))\n return res.data\n }\n\n const updateWorkspace = async (workspaceId: string, workspace: Record<string, any>) => {\n const res = await client.put(ENDPOINTS.workspace(workspaceId), workspace)\n return res.data\n }\n\n return { getWorkspace, updateWorkspace }\n}\n","import { createApiClient, buildAuthHeaders, decodeToken } from '../api/client'\nimport { DEFAULT_API_URL } from '../api/endpoints'\nimport { createStreamingService } from '../services/streaming'\nimport { createChartService } from '../services/chart.service'\nimport { createWorkspaceService } from '../services/workspace.service'\n\nexport type PapermapHttpServices = {\n authHeaders: Record<string, string>\n streamingSvc: ReturnType<typeof createStreamingService>\n chartSvc: ReturnType<typeof createChartService>\n workspaceSvc: ReturnType<typeof createWorkspaceService>\n baseUrl: string\n}\n\nexport function createPapermapServices(config: { token: string; apiUrl?: string }): PapermapHttpServices {\n const baseUrl = config.apiUrl || DEFAULT_API_URL\n const authHeaders = buildAuthHeaders(decodeToken(config.token))\n const { client } = createApiClient(config.token, baseUrl)\n return {\n authHeaders,\n streamingSvc: createStreamingService(client),\n chartSvc: createChartService(client),\n workspaceSvc: createWorkspaceService(client),\n baseUrl,\n }\n}\n","'use client'\n\nimport { useEffect, useState, useCallback, useRef } from 'react'\nimport { AnalyticsSSEClient } from '../api/analytics-sse'\nimport { EVENT_NAME } from '../types/streaming'\nimport type {\n AgentThought,\n ToolCall,\n ToolOutput,\n ToolCallComplete,\n ToolCallAnnounced,\n ToolCallArgsDelta,\n ToolCallArgsComplete,\n FinalResponse,\n StreamState,\n TimelineEvent,\n} from '../types/streaming'\n\ninterface UseAnalyticsStreamOptions {\n onComplete?: (data: any) => void\n onError?: (error: string) => void\n onThought?: (thought: AgentThought) => void\n onToolCall?: (toolCall: ToolCall) => void\n}\n\n/**\n * Adapted from papermap's useAnalyticsStream.\n * Instead of Redux for auth, receives `authHeaders` and `apiUrl` directly.\n */\nexport function useAnalyticsStream(\n requestId: string | null,\n authHeaders: Record<string, string>,\n apiUrl: string,\n options: UseAnalyticsStreamOptions = {}\n) {\n const [state, setState] = useState<StreamState>({\n thoughts: [],\n toolCalls: [],\n timeline: [],\n currentPhase: 'Analyzing your request...',\n error: null,\n finalResponse: null,\n isComplete: false,\n isConnected: false,\n isStreaming: false,\n })\n\n const clientRef = useRef<AnalyticsSSEClient | null>(null)\n const currentToolCallIndexRef = useRef<Map<string, number>>(new Map())\n const completedRequestIdsRef = useRef<Set<string>>(new Set())\n const MAX_COMPLETED_IDS = 50\n const previousRequestIdRef = useRef<string | null>(null)\n\n const onCompleteRef = useRef(options.onComplete)\n const onErrorRef = useRef(options.onError)\n const onThoughtRef = useRef(options.onThought)\n const onToolCallRef = useRef(options.onToolCall)\n\n useEffect(() => {\n onCompleteRef.current = options.onComplete\n onErrorRef.current = options.onError\n onThoughtRef.current = options.onThought\n onToolCallRef.current = options.onToolCall\n }, [options.onComplete, options.onError, options.onThought, options.onToolCall])\n\n const addCompletedId = useCallback((id: string) => {\n const set = completedRequestIdsRef.current\n if (set.size >= MAX_COMPLETED_IDS) {\n const oldest = set.values().next().value\n if (oldest !== undefined) set.delete(oldest)\n }\n set.add(id)\n }, [])\n\n type StateUpdater = (prev: StreamState) => StreamState\n const pendingUpdatesRef = useRef<StateUpdater[]>([])\n const rafIdRef = useRef<number | null>(null)\n\n const scheduleFlush = useCallback(() => {\n if (rafIdRef.current !== null) return\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null\n const updates = pendingUpdatesRef.current\n if (updates.length === 0) return\n pendingUpdatesRef.current = []\n setState((prev) => updates.reduce((s, fn) => fn(s), prev))\n })\n }, [])\n\n const enqueueUpdate = useCallback((updater: StateUpdater) => {\n pendingUpdatesRef.current.push(updater)\n scheduleFlush()\n }, [scheduleFlush])\n\n const flushAndApply = useCallback((updater: StateUpdater) => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n const pending = pendingUpdatesRef.current\n pendingUpdatesRef.current = []\n setState((prev) => {\n const intermediate = pending.reduce((s, fn) => fn(s), prev)\n return updater(intermediate)\n })\n }, [])\n\n const cleanup = useCallback(() => {\n if (clientRef.current) {\n clientRef.current.abort()\n clientRef.current = null\n }\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n pendingUpdatesRef.current = []\n setState((prev) => ({ ...prev, isConnected: false, isStreaming: false }))\n currentToolCallIndexRef.current.clear()\n }, [])\n\n useEffect(() => {\n const isExplicitClear = !requestId && previousRequestIdRef.current !== null\n\n if (!requestId) {\n if (isExplicitClear) {\n setState({\n thoughts: [],\n toolCalls: [],\n timeline: [],\n currentPhase: 'Analyzing your request...',\n error: null,\n finalResponse: null,\n isComplete: false,\n isConnected: false,\n isStreaming: false,\n })\n }\n return\n }\n\n previousRequestIdRef.current = requestId\n\n if (completedRequestIdsRef.current.has(requestId)) return\n\n setState({\n thoughts: [],\n toolCalls: [],\n timeline: [],\n currentPhase: 'Analyzing your request...',\n error: null,\n finalResponse: null,\n isComplete: false,\n isConnected: false,\n isStreaming: false,\n })\n currentToolCallIndexRef.current.clear()\n\n const client = new AnalyticsSSEClient()\n clientRef.current = client\n\n client.onOpen(() => {\n if (completedRequestIdsRef.current.has(requestId)) {\n client.abort()\n return\n }\n setState((prev) => ({ ...prev, isConnected: true, isStreaming: true, error: null }))\n })\n\n client.on(EVENT_NAME.AGENT_THOUGHT, (data) => {\n try {\n const parsed: AgentThought = JSON.parse(data)\n enqueueUpdate((prev) => ({\n ...prev,\n thoughts: [...prev.thoughts, parsed],\n timeline: [...prev.timeline, {\n type: 'thought' as const,\n timestamp: parsed.timestamp,\n iteration: parsed.iteration,\n thoughtData: parsed,\n }],\n }))\n onThoughtRef.current?.(parsed)\n } catch { /* ignore parse errors */ }\n })\n\n client.on(EVENT_NAME.TOOL_CALL_ANNOUNCED, (data) => {\n try {\n const parsed: ToolCallAnnounced = JSON.parse(data)\n const toolCall: ToolCall = {\n tool_name: parsed.tool_name,\n tool_display_name: parsed.tool_display_name,\n args_preview: '',\n status: 'announced',\n code: '',\n isStreamingArgs: false,\n timestamp: parsed.timestamp,\n ...(parsed.tool_call_id != null && { tool_call_id: parsed.tool_call_id }),\n }\n enqueueUpdate((prev) => {\n const newToolCalls = [...prev.toolCalls, toolCall]\n const newIndex = newToolCalls.length - 1\n const uniqueKey = `${parsed.tool_name}-${parsed.timestamp}-${newIndex}`\n currentToolCallIndexRef.current.set(uniqueKey, newIndex)\n currentToolCallIndexRef.current.set(parsed.tool_name, newIndex)\n return {\n ...prev,\n toolCalls: newToolCalls,\n timeline: [...prev.timeline, {\n type: 'tool' as const,\n timestamp: parsed.timestamp,\n iteration: parsed.iteration,\n toolData: toolCall,\n }],\n }\n })\n onToolCallRef.current?.(toolCall)\n } catch { /* ignore */ }\n })\n\n const getToolIndex = (toolCalls: ToolCall[], tool_name: string, tool_call_id?: string): number => {\n if (tool_call_id) {\n const idx = toolCalls.findIndex(t => t.tool_call_id === tool_call_id)\n if (idx >= 0) return idx\n }\n const incomplete = toolCalls.findIndex(\n t => t.tool_name === tool_name && t.status !== 'success' && t.status !== 'error'\n )\n if (incomplete >= 0) return incomplete\n const fallback = currentToolCallIndexRef.current.get(tool_name)\n return fallback !== undefined && fallback >= 0 && fallback < toolCalls.length ? fallback : -1\n }\n\n const findTimelineIndex = (timeline: TimelineEvent[], tool: ToolCall): number => {\n return timeline.findIndex(\n e => e.type === 'tool' && e.toolData && (\n (tool.tool_call_id && e.toolData.tool_call_id === tool.tool_call_id) ||\n (e.toolData.tool_name === tool.tool_name && e.toolData.timestamp === tool.timestamp)\n )\n )\n }\n\n client.on(EVENT_NAME.TOOL_CALL_ARGS_DELTA, (data) => {\n try {\n const parsed: ToolCallArgsDelta = JSON.parse(data)\n enqueueUpdate((prev) => {\n const toolCalls = [...prev.toolCalls]\n const timeline = [...prev.timeline]\n const toolIndex = getToolIndex(toolCalls, parsed.tool_name, parsed.tool_call_id)\n if (toolIndex >= 0) {\n toolCalls[toolIndex] = {\n ...toolCalls[toolIndex],\n code: (toolCalls[toolIndex].code || '') + parsed.args_delta,\n args_preview: parsed.args_preview || toolCalls[toolIndex].args_preview,\n status: 'streaming',\n isStreamingArgs: true,\n hasPrivateArgs: parsed.private_args ?? toolCalls[toolIndex].hasPrivateArgs,\n ...(parsed.tool_call_id != null && { tool_call_id: parsed.tool_call_id }),\n }\n const ti = findTimelineIndex(timeline, toolCalls[toolIndex])\n if (ti !== -1 && timeline[ti].toolData) {\n timeline[ti] = { ...timeline[ti], toolData: toolCalls[toolIndex] }\n }\n }\n return { ...prev, toolCalls, timeline }\n })\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.TOOL_CALL_ARGS_COMPLETE, (data) => {\n try {\n const parsed: ToolCallArgsComplete = JSON.parse(data)\n enqueueUpdate((prev) => {\n const toolCalls = [...prev.toolCalls]\n const timeline = [...prev.timeline]\n const toolIndex = getToolIndex(toolCalls, parsed.tool_name, parsed.tool_call_id)\n if (toolIndex >= 0) {\n let fullCode = parsed.full_args.code_str || parsed.full_args.query || parsed.full_args.user_query || ''\n if (!fullCode && Object.keys(parsed.full_args).length > 0) {\n fullCode = JSON.stringify(parsed.full_args, null, 2)\n }\n toolCalls[toolIndex] = {\n ...toolCalls[toolIndex],\n code: fullCode,\n args_preview: parsed.args_preview || toolCalls[toolIndex].args_preview,\n status: 'ready',\n isStreamingArgs: false,\n hasPrivateArgs: parsed.private_args || false,\n ...(parsed.tool_call_id != null && { tool_call_id: parsed.tool_call_id }),\n }\n const ti = findTimelineIndex(timeline, toolCalls[toolIndex])\n if (ti !== -1 && timeline[ti].toolData) {\n timeline[ti] = { ...timeline[ti], toolData: toolCalls[toolIndex] }\n }\n }\n return { ...prev, toolCalls, timeline }\n })\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.TOOL_OUTPUT, (data) => {\n try {\n const parsed: ToolOutput = JSON.parse(data)\n enqueueUpdate((prev) => {\n const toolCalls = [...prev.toolCalls]\n const timeline = [...prev.timeline]\n const toolIndex = getToolIndex(toolCalls, parsed.tool_name, parsed.tool_call_id)\n if (toolIndex >= 0) {\n toolCalls[toolIndex] = {\n ...toolCalls[toolIndex],\n output: parsed.content,\n status: 'executing',\n hasPrivateOutput: parsed.private_output || false,\n }\n const ti = findTimelineIndex(timeline, toolCalls[toolIndex])\n if (ti !== -1 && timeline[ti].toolData) {\n timeline[ti] = { ...timeline[ti], toolData: toolCalls[toolIndex] }\n }\n }\n return { ...prev, toolCalls, timeline }\n })\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.TOOL_CALL_COMPLETE, (data) => {\n try {\n const parsed: ToolCallComplete = JSON.parse(data)\n enqueueUpdate((prev) => {\n const toolCalls = [...prev.toolCalls]\n const timeline = [...prev.timeline]\n const toolIndex = getToolIndex(toolCalls, parsed.tool_name, parsed.tool_call_id)\n if (toolIndex >= 0) {\n toolCalls[toolIndex] = {\n ...toolCalls[toolIndex],\n status: parsed.status,\n duration_ms: parsed.duration_ms,\n ...(parsed.error_message != null && { error_message: parsed.error_message }),\n }\n const ti = findTimelineIndex(timeline, toolCalls[toolIndex])\n if (ti !== -1 && timeline[ti].toolData) {\n timeline[ti] = { ...timeline[ti], toolData: toolCalls[toolIndex] }\n }\n }\n return { ...prev, toolCalls, timeline }\n })\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.PHASE_UPDATE, (data) => {\n try {\n const parsed = JSON.parse(data)\n setState((prev) => ({ ...prev, currentPhase: parsed.message || parsed.phase }))\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.FINAL_RESPONSE, (data) => {\n try {\n const parsed: FinalResponse = JSON.parse(data)\n flushAndApply((prev) => ({ ...prev, finalResponse: parsed.response_data }))\n onCompleteRef.current?.(parsed.response_data)\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.COMPLETE, (data) => {\n try {\n JSON.parse(data)\n flushAndApply((prev) => ({ ...prev, isComplete: true, isStreaming: false }))\n } catch { /* ignore */ }\n })\n\n client.onError((error) => {\n if (requestId) addCompletedId(requestId)\n const errorMsg = 'Unable to establish connection - using HTTP fallback response'\n setState((prev) => ({ ...prev, error: errorMsg, isConnected: false, isStreaming: false }))\n onErrorRef.current?.(errorMsg)\n cleanup()\n })\n\n client.onComplete(() => {\n if (requestId) addCompletedId(requestId)\n setTimeout(() => cleanup(), 100)\n })\n\n client.connect({\n url: `${apiUrl}/api/v1/analytics/requests/stream`,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders,\n },\n body: JSON.stringify({ request_id: requestId }),\n })\n\n return () => { cleanup() }\n }, [requestId, authHeaders, apiUrl, cleanup, enqueueUpdate, flushAndApply, addCompletedId])\n\n const markRequestAsCompleted = useCallback((reqId: string) => {\n addCompletedId(reqId)\n }, [addCompletedId])\n\n return {\n ...state,\n disconnect: cleanup,\n markRequestAsCompleted,\n }\n}\n","type SSEEvent = {\n type?: string\n data?: string\n id?: string\n retry?: number\n}\n\ntype EventHandler = (data: string, event: SSEEvent) => void\ntype ErrorHandler = (error: Error) => void\ntype CompleteHandler = () => void\n\ninterface SSEStreamOptions {\n url: string\n headers?: Record<string, string>\n signal?: AbortSignal\n method?: string\n body?: string\n}\n\nexport class SSEStreamClient {\n private eventHandlers = new Map<string, EventHandler>()\n private errorHandler?: ErrorHandler\n private completeHandler?: CompleteHandler\n private abortController?: AbortController\n private isStreaming = false\n\n on(eventType: string, handler: EventHandler): this {\n this.eventHandlers.set(eventType, handler)\n return this\n }\n\n onError(handler: ErrorHandler): this {\n this.errorHandler = handler\n return this\n }\n\n onComplete(handler: CompleteHandler): this {\n this.completeHandler = handler\n return this\n }\n\n off(eventType: string): this {\n this.eventHandlers.delete(eventType)\n return this\n }\n\n private parseSSEEvents(buffer: string): { events: SSEEvent[]; remainingBuffer: string } {\n const events: SSEEvent[] = []\n let remainingBuffer = ''\n\n const eventBlocks = buffer.split('\\n\\n')\n\n for (let i = 0; i < eventBlocks.length; i++) {\n const block = eventBlocks[i]\n\n if (i === eventBlocks.length - 1 && !buffer.endsWith('\\n\\n')) {\n remainingBuffer = block\n break\n }\n\n if (!block.trim()) continue\n\n const event: SSEEvent = {}\n const lines = block.split('\\n')\n const dataLines: string[] = []\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n event.type = line.slice(7)\n } else if (line.startsWith('data: ')) {\n dataLines.push(line.slice(6))\n } else if (line.startsWith('id: ')) {\n event.id = line.slice(4)\n } else if (line.startsWith('retry: ')) {\n event.retry = parseInt(line.slice(7))\n }\n }\n\n if (dataLines.length > 0) {\n event.data = dataLines.join('\\n')\n events.push(event)\n }\n }\n\n return { events, remainingBuffer }\n }\n\n async stream(options: SSEStreamOptions, retryCount = 0): Promise<void> {\n if (this.isStreaming && retryCount === 0) {\n throw new Error('Stream is already active. Call abort() first.')\n }\n\n this.isStreaming = true\n\n let signal: AbortSignal\n if (options.signal) {\n signal = options.signal\n signal.addEventListener('abort', () => { this.isStreaming = false }, { once: true })\n } else {\n this.abortController = new AbortController()\n signal = this.abortController.signal\n }\n\n const defaultHeaders = {\n Accept: 'text/event-stream',\n 'Cache-Control': 'no-cache',\n }\n\n try {\n const response = await fetch(options.url, {\n method: options.method || 'POST',\n headers: { ...defaultHeaders, ...options.headers },\n signal,\n ...(options.body && { body: options.body }),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`)\n }\n\n const reader = response.body?.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n if (!reader) {\n throw new Error('Failed to get response reader')\n }\n\n while (this.isStreaming) {\n if (signal.aborted) break\n\n const { done, value } = await reader.read()\n if (done) break\n if (signal.aborted) break\n\n buffer += decoder.decode(value, { stream: true })\n\n const { events, remainingBuffer } = this.parseSSEEvents(buffer)\n buffer = remainingBuffer\n\n for (const event of events) {\n if (event.data !== undefined) {\n const eventType = event.type || 'message'\n const handler = this.eventHandlers.get(eventType)\n if (handler) {\n try {\n handler(event.data, event)\n } catch (handlerError) {\n console.error(`Error in event handler for ${eventType}:`, handlerError)\n }\n }\n }\n }\n }\n\n this.completeHandler?.()\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Stream was intentionally aborted\n } else if (this.errorHandler && error instanceof Error) {\n this.errorHandler(error)\n } else {\n console.error('Stream error:', error)\n }\n } finally {\n this.isStreaming = false\n this.abortController = undefined\n }\n }\n\n abort(): void {\n this.abortController?.abort()\n this.isStreaming = false\n }\n\n get streaming(): boolean {\n return this.isStreaming\n }\n\n clearHandlers(): this {\n this.eventHandlers.clear()\n this.errorHandler = undefined\n this.completeHandler = undefined\n return this\n }\n\n getRegisteredEvents(): string[] {\n return Array.from(this.eventHandlers.keys())\n }\n}\n","import { SSEStreamClient } from './sse-client'\n\ntype EventHandler = (data: string, event: { type?: string; data?: string; id?: string; retry?: number }) => void\ntype ErrorHandler = (error: Error) => void\ntype CompleteHandler = () => void\ntype OpenHandler = () => void\n\ninterface ConnectionOptions {\n url: string\n method: string\n headers: Record<string, string>\n body: string\n}\n\nexport class AnalyticsSSEClient {\n private client: SSEStreamClient | null = null\n private retryCount = 0\n private maxRetries = 5\n private didConnect = false\n private retryTimeout?: ReturnType<typeof setTimeout>\n private isRetrying = false\n private eventHandlers = new Map<string, EventHandler>()\n private errorHandler?: ErrorHandler\n private completeHandler?: CompleteHandler\n private openHandler?: OpenHandler\n private connectionOptions?: ConnectionOptions\n private isAborted = false\n\n on(eventType: string, handler: EventHandler): this {\n this.eventHandlers.set(eventType, handler)\n return this\n }\n\n onOpen(handler: OpenHandler): this {\n this.openHandler = handler\n return this\n }\n\n onError(handler: ErrorHandler): this {\n this.errorHandler = handler\n return this\n }\n\n onComplete(handler: CompleteHandler): this {\n this.completeHandler = handler\n return this\n }\n\n async connect(options: ConnectionOptions): Promise<void> {\n this.connectionOptions = options\n this.isAborted = false\n this.retryCount = 0\n this.didConnect = false\n this.isRetrying = false\n return this.attemptConnection()\n }\n\n private async attemptConnection(): Promise<void> {\n if (this.isAborted) return\n\n this.client = new SSEStreamClient()\n\n this.eventHandlers.forEach((handler, eventType) => {\n this.client!.on(eventType, (data, event) => {\n if (!this.didConnect && eventType !== 'error') {\n this.didConnect = true\n this.isRetrying = false\n this.openHandler?.()\n }\n handler(data, event)\n })\n })\n\n this.client.on('error', (data) => {\n try {\n const parsed = JSON.parse(data)\n if (parsed.message?.includes('Request not found') && this.retryCount < this.maxRetries) {\n this.isRetrying = true\n this.handleRetry('Request not ready')\n return\n }\n } catch {\n // Not JSON, ignore\n }\n })\n\n this.client.onError((error) => {\n if (!this.didConnect && this.retryCount < this.maxRetries) {\n this.isRetrying = true\n this.handleRetry('Connection failed')\n } else if (this.errorHandler) {\n this.errorHandler(error)\n }\n })\n\n if (this.completeHandler) {\n this.client.onComplete(() => {\n if (this.isRetrying) return\n this.completeHandler!()\n })\n }\n\n try {\n await this.client.stream({\n url: this.connectionOptions!.url,\n method: this.connectionOptions!.method,\n headers: this.connectionOptions!.headers,\n body: this.connectionOptions!.body,\n })\n\n if (!this.didConnect) {\n this.didConnect = true\n this.openHandler?.()\n }\n } catch (error) {\n if (!this.didConnect && this.retryCount < this.maxRetries && !this.isAborted) {\n this.isRetrying = true\n this.handleRetry('Connection error during stream')\n } else if (this.errorHandler && !this.isAborted) {\n this.errorHandler(error instanceof Error ? error : new Error(String(error)))\n }\n }\n }\n\n private handleRetry(reason: string): void {\n this.client?.abort()\n this.retryCount++\n const retryDelay = 200\n\n console.log(`⏳ ${reason}, retrying in ${retryDelay}ms (attempt ${this.retryCount}/${this.maxRetries})...`)\n\n this.retryTimeout = setTimeout(() => {\n if (!this.isAborted) {\n this.attemptConnection()\n }\n }, retryDelay)\n }\n\n abort(): void {\n this.isAborted = true\n if (this.retryTimeout) {\n clearTimeout(this.retryTimeout)\n this.retryTimeout = undefined\n }\n if (this.client) {\n this.client.abort()\n this.client = null\n }\n }\n\n get streaming(): boolean {\n return this.client?.streaming || false\n }\n\n get currentRetryCount(): number {\n return this.retryCount\n }\n\n get isConnected(): boolean {\n return this.didConnect\n }\n}\n","export const EVENT_NAME = {\n CHART: 'chart_ready',\n STREAM: 'stream',\n COMPLETE: 'complete',\n FINAL: 'final',\n ERROR: 'error',\n OPEN: 'open',\n MESSAGE: 'message',\n AGENT_THOUGHT: 'agent_thought',\n TOOL_CALL_ANNOUNCED: 'tool_call_announced',\n TOOL_CALL_ARGS_DELTA: 'tool_call_args_delta',\n TOOL_CALL_ARGS_COMPLETE: 'tool_call_args_complete',\n TOOL_OUTPUT: 'tool_output',\n TOOL_CALL_COMPLETE: 'tool_call_complete',\n PHASE_UPDATE: 'phase_update',\n FINAL_RESPONSE: 'final_response',\n} as const\n\nexport interface AgentThought {\n type: 'agent_thought'\n content: string\n is_complete: boolean\n iteration: number\n timestamp: string\n}\n\nexport interface ToolCallAnnounced {\n type: 'tool_call_announced'\n tool_name: string\n tool_display_name: string\n iteration: number\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface ToolCallArgsDelta {\n type: 'tool_call_args_delta'\n tool_name: string\n args_delta: string\n args_preview?: string\n private_args?: boolean\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface ToolCallArgsComplete {\n type: 'tool_call_args_complete'\n tool_name: string\n full_args: Record<string, any>\n args_preview?: string\n private_args?: boolean\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface ToolOutput {\n type: 'tool_output'\n tool_name: string\n content: string\n content_type: 'code' | 'sql' | 'json' | 'text'\n is_complete: boolean\n private_output?: boolean\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface ToolCallComplete {\n type: 'tool_call_complete'\n tool_name: string\n status: 'success' | 'error'\n duration_ms: number\n result_preview?: string\n error_message?: string\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface FinalResponse {\n type: 'final_response'\n response_data: {\n response_type: string\n generated_text: string\n chart_type?: string\n data?: any[]\n pandas_code?: string\n thoughts?: string\n [key: string]: any\n }\n llm_data_id: string\n total_iterations: number\n total_duration_ms: number\n token_usage?: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n timestamp: string\n}\n\nexport interface ToolCall {\n tool_name: string\n tool_display_name: string\n args_preview: string\n status: 'announced' | 'streaming' | 'ready' | 'executing' | 'success' | 'error'\n output?: string\n code?: string\n isStreamingArgs?: boolean\n hasPrivateArgs?: boolean\n hasPrivateOutput?: boolean\n duration_ms?: number\n error_message?: string\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface TimelineEvent {\n type: 'thought' | 'tool'\n timestamp: string\n iteration?: number\n thoughtData?: AgentThought\n toolData?: ToolCall\n}\n\nexport interface PhaseUpdate {\n type: 'phase_update'\n phase: string\n message: string\n iteration?: number\n max_iterations?: number\n timestamp: string\n}\n\nexport interface StreamError {\n type: 'error'\n error_type: string\n message: string\n action: 'retrying' | 'failed'\n iteration?: number\n timestamp: string\n}\n\nexport interface CompleteEvent {\n type: 'complete'\n status: 'success' | 'cancelled' | 'error'\n message: string\n timestamp: string\n}\n\nexport type StreamEvent =\n | AgentThought\n | ToolCallAnnounced\n | ToolCallArgsDelta\n | ToolCallArgsComplete\n | ToolOutput\n | ToolCallComplete\n | PhaseUpdate\n | StreamError\n | FinalResponse\n | CompleteEvent\n\nexport const TOOL_DISPLAY_NAMES: Record<string, string> = {\n execute_python_code: 'Python Analysis',\n generate_sql_tool: 'SQL Query Generation',\n web_search: 'Web Search',\n explore_data_tool: 'Database Exploration',\n workspace_tool: 'Workspace Selection',\n slack_tool: 'Slack Integration',\n internal_information_lookup: 'Knowledge Base Lookup',\n}\n\nexport const EXECUTION_PHASES = {\n INITIALIZING: 'initializing',\n PROMPT_PREP: 'prompt_prep',\n AGENT_EXEC: 'agent_exec',\n TOOL_CALL: 'tool_call',\n RESPONSE_PROC: 'response_proc',\n COMPLETE: 'complete',\n} as const\n\nexport type ExecutionPhase = (typeof EXECUTION_PHASES)[keyof typeof EXECUTION_PHASES]\n\nexport type TimelineRenderItem =\n | { kind: 'thought'; events: TimelineEvent[]; key: string }\n | { kind: 'collapsed-tools'; toolCalls: ToolCall[]; key: string }\n | { kind: 'tool'; event: TimelineEvent; isLatest: boolean; key: string }\n\nexport interface StreamState {\n thoughts: AgentThought[]\n toolCalls: ToolCall[]\n timeline: TimelineEvent[]\n currentPhase: string\n error: string | null\n finalResponse: any | null\n isComplete: boolean\n isConnected: boolean\n isStreaming: boolean\n}\n","import * as React from 'react'\n\nimport type { ToastActionElement, ToastProps } from '../components/ui/toast'\n\nconst TOAST_LIMIT = 1\nconst TOAST_REMOVE_DELAY = 1000000\n\ntype ToasterToast = ToastProps & {\n id: string\n title?: React.ReactNode\n description?: React.ReactNode\n action?: ToastActionElement\n}\n\nlet count = 0\n\nfunction genId() {\n count = (count + 1) % Number.MAX_SAFE_INTEGER\n return count.toString()\n}\n\ntype Action =\n | { type: 'ADD_TOAST'; toast: ToasterToast }\n | { type: 'UPDATE_TOAST'; toast: Partial<ToasterToast> }\n | { type: 'DISMISS_TOAST'; toastId?: string }\n | { type: 'REMOVE_TOAST'; toastId: string }\n\ninterface State {\n toasts: ToasterToast[]\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) return\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId)\n dispatch({ type: 'REMOVE_TOAST', toastId })\n }, TOAST_REMOVE_DELAY)\n toastTimeouts.set(toastId, timeout)\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case 'ADD_TOAST':\n return { ...state, toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT) }\n case 'UPDATE_TOAST':\n return { ...state, toasts: state.toasts.map((t) => (t.id === action.toast.id ? { ...t, ...action.toast } : t)) }\n case 'DISMISS_TOAST': {\n const { toastId } = action\n if (toastId) {\n addToRemoveQueue(toastId)\n } else {\n state.toasts.forEach((t) => addToRemoveQueue(t.id))\n }\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined ? { ...t, open: false } : t\n ),\n }\n }\n case 'REMOVE_TOAST':\n if (action.toastId === undefined) return { ...state, toasts: [] }\n return { ...state, toasts: state.toasts.filter((t) => t.id !== action.toastId) }\n }\n}\n\nconst listeners: Array<(state: State) => void> = []\nlet memoryState: State = { toasts: [] }\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action)\n listeners.forEach((listener) => listener(memoryState))\n}\n\ntype Toast = Omit<ToasterToast, 'id'>\n\nfunction toast({ ...props }: Toast) {\n const id = genId()\n const update = (props: ToasterToast) => dispatch({ type: 'UPDATE_TOAST', toast: { ...props, id } })\n const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id })\n\n dispatch({\n type: 'ADD_TOAST',\n toast: { ...props, id, open: true, onOpenChange: (open) => { if (!open) dismiss() } },\n })\n\n return { id, dismiss, update }\n}\n\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState)\n\n React.useEffect(() => {\n listeners.push(setState)\n return () => {\n const index = listeners.indexOf(setState)\n if (index > -1) listeners.splice(index, 1)\n }\n }, [state])\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }),\n }\n}\n\nexport { useToast, toast }\n","import * as React from 'react'\nimport * as ToastPrimitives from '@radix-ui/react-toast'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { X } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\nconst ToastProvider = ToastPrimitives.Provider\n\nconst ToastViewport = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Viewport>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Viewport\n ref={ref}\n className={cn(\n 'fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]',\n className\n )}\n {...props}\n />\n))\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\n\nconst toastVariants = cva(\n 'group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',\n {\n variants: {\n variant: {\n default: 'border-white/20 bg-background text-foreground',\n destructive: 'destructive group border-destructive bg-destructive text-destructive-foreground',\n },\n },\n defaultVariants: { variant: 'default' },\n }\n)\n\nconst Toast = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => (\n <ToastPrimitives.Root ref={ref} className={cn(toastVariants({ variant }), className)} {...props} />\n))\nToast.displayName = ToastPrimitives.Root.displayName\n\nconst ToastAction = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Action>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Action\n ref={ref}\n className={cn(\n 'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive',\n className\n )}\n {...props}\n />\n))\nToastAction.displayName = ToastPrimitives.Action.displayName\n\nconst ToastClose = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Close>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Close\n ref={ref}\n className={cn(\n 'absolute right-1 top-1 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600',\n className\n )}\n toast-close=\"\"\n {...props}\n >\n <X className=\"h-4 w-4\" />\n </ToastPrimitives.Close>\n))\nToastClose.displayName = ToastPrimitives.Close.displayName\n\nconst ToastTitle = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Title>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Title ref={ref} className={cn('text-sm font-semibold [&+div]:text-xs', className)} {...props} />\n))\nToastTitle.displayName = ToastPrimitives.Title.displayName\n\nconst ToastDescription = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Description>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Description ref={ref} className={cn('text-sm opacity-90', className)} {...props} />\n))\nToastDescription.displayName = ToastPrimitives.Description.displayName\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\n\nexport {\n type ToastProps,\n type ToastActionElement,\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n}\n","import { useToast } from '../../hooks/use-toast'\nimport {\n Toast,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastTitle,\n ToastViewport,\n} from './toast'\n\nexport function Toaster() {\n const { toasts } = useToast()\n\n return (\n <ToastProvider>\n {toasts.map(({ id, title, description, action, ...props }) => (\n <Toast key={id} {...props}>\n <div className=\"grid gap-1\">\n {title && <ToastTitle>{title}</ToastTitle>}\n {description && <ToastDescription>{description}</ToastDescription>}\n </div>\n {action}\n <ToastClose />\n </Toast>\n ))}\n <ToastViewport />\n </ToastProvider>\n )\n}\n","'use client'\n\nimport * as React from 'react'\n\nexport interface ThemeProviderProps {\n children: React.ReactNode\n theme: 'light' | 'dark'\n}\n\n/**\n * Minimal theme provider for the plugin.\n *\n * This does not enforce any specific theming library. Host apps can\n * wrap PapermapChat with their own providers (e.g. next-themes,\n * custom context, CSS variables). This exists mainly for API parity\n * with the main app and as a convenient wrapper.\n */\nexport function ThemeProvider({ children, theme }: ThemeProviderProps) {\n return <div className={theme}>{children}</div>\n}\n","'use client'\n\nimport React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport {\n ArrowDown,\n Brain,\n Copy,\n Edit2,\n Eye,\n FullscreenIcon,\n Loader2,\n Split,\n Terminal,\n User,\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { usePapermapStore, usePapermapStoreApi, CHAT_MODAL_TAB } from '../store'\nimport type { Message } from '../types'\n\nimport { Alert, AlertDescription, AlertTitle } from './ui/alert'\nimport { Button } from './ui/button'\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'\nimport { MarkdownRenderer } from './ui/markdown'\nimport { ThinkingMessage } from './ui/ThinkingMessage'\nimport { ChatCodeBlock } from './ui/chat-code-block'\nimport { ButtonWithTooltip } from './common/ButtonWithTooltip'\nimport { BookmarkButton } from './common/BookmarkButton'\nimport { BranchButton } from './common/BranchButton'\nimport { FeedbackButtons } from './common/FeedbackButtons'\nimport { ThinkingLogo } from './common/ThinkingLogo'\nimport LogoStandAlone from './LogoStandAlone'\nimport MorphGradient from './MorphGradient'\nimport { StreamingTimeline } from './dashboard/StreamingTimeline'\nimport { RecentConversations } from './dashboard/RecentConversations'\nimport { ChartHistory } from './dashboard/ChartHistory'\nimport { SavedMemory } from './dashboard/SavedMemory'\nimport { ChartView } from './charts/ChartView'\nimport { ChartDialog } from './charts/ChartDialog'\nimport { DataTable } from './charts/DataTable'\nimport { toast } from '../hooks/use-toast'\n\nconst EASE = [0.23, 1, 0.32, 1] as const\nconst APP_NAME = 'Papermap'\n\nasync function copyToClipboard({\n value,\n successMessage = 'Copied to clipboard successfully',\n}: {\n value: string\n successMessage?: string\n}) {\n try {\n await navigator.clipboard.writeText(value)\n toast({ title: 'Success', description: successMessage })\n return true\n } catch (error) {\n console.error('Failed to copy to clipboard:', error)\n toast({ title: 'Error', description: 'Failed to copy to clipboard', variant: 'destructive' })\n return false\n }\n}\n\nfunction detectLanguage(code: string): string {\n if (/^\\s*(import |from |def |class |if __name__)/.test(code)) return 'python'\n if (/^\\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|ALTER|DROP)\\b/i.test(code)) return 'sql'\n try {\n JSON.parse(code)\n return 'json'\n } catch {\n /* noop */\n }\n return 'text'\n}\n\nconst SUGGESTIONS = [\n 'Show me revenue trends for the last quarter',\n 'What are my top performing products?',\n 'Compare sales month over month',\n 'Summarize the key metrics',\n]\n\nfunction getRandomSuggestions(count = 3) {\n return [...SUGGESTIONS].sort(() => Math.random() - 0.5).slice(0, count)\n}\n\nfunction getAssistantDimensions(\n selectedType: 'chart' | null,\n options?: { expanded?: boolean; toolbarHeight?: number }\n) {\n const expanded = options?.expanded === true\n const toolbarHeight = options?.toolbarHeight || 0\n const topEdgeGapPx = 48\n const bottomExtraGapPx = 16\n const fallbackBottomGapPx = 80\n const bottomGap = toolbarHeight > 0 ? toolbarHeight + bottomExtraGapPx : fallbackBottomGapPx\n const defaultHeightExpanded = expanded\n ? `calc(100vh - ${topEdgeGapPx + bottomGap}px)`\n : 'calc(100vh - 110px)'\n\n const isMobile = typeof window !== 'undefined' && window.innerWidth < 768\n if (isMobile) {\n return { width: expanded ? '95vw' : '90vw', height: expanded ? defaultHeightExpanded : '60vh' }\n }\n\n const screenWidth = typeof window !== 'undefined' ? window.innerWidth : 1024\n let width: string | number\n if (screenWidth >= 1536) width = expanded ? '96vw' : '45vw'\n else if (screenWidth >= 1280) width = expanded ? '97vw' : '55vw'\n else if (screenWidth >= 1024) width = expanded ? '98vw' : '65vw'\n else if (screenWidth >= 768) width = expanded ? '98vw' : '75vw'\n else width = expanded ? '95vw' : '90vw'\n\n const maxWidth = expanded ? 1920 : 1100\n if (typeof width === 'string' && width.includes('vw')) {\n const vwValue = parseInt(width)\n if ((screenWidth * vwValue) / 100 > maxWidth) width = maxWidth\n }\n\n if (selectedType === 'chart') {\n const chartMaxWidth = expanded ? 1920 : 1400\n let chartWidth: string | number\n if (screenWidth >= 1736) chartWidth = expanded ? '98vw' : '1400px'\n else if (screenWidth >= 1280) chartWidth = expanded ? '97vw' : '68vw'\n else if (screenWidth >= 1024) chartWidth = expanded ? '98vw' : '90vw'\n else if (screenWidth >= 768) chartWidth = expanded ? '98vw' : '92vw'\n else chartWidth = expanded ? '95vw' : '95vw'\n if (typeof chartWidth === 'string' && chartWidth.includes('vw')) {\n const vwValue = parseInt(chartWidth)\n if ((screenWidth * vwValue) / 100 > chartMaxWidth) chartWidth = chartMaxWidth\n }\n return { width: chartWidth, height: expanded ? defaultHeightExpanded : '65vh' }\n }\n\n return { width, height: expanded ? defaultHeightExpanded : '60vh' }\n}\n\n// ── RundownBubble ────────────────────────────────────────────────────\n\nfunction RundownBubble({\n message,\n isExpanded,\n isChartVisible,\n initialMessage,\n children,\n}: {\n message: Message\n isExpanded?: boolean\n isChartVisible?: boolean\n initialMessage?: Message\n children: React.ReactNode\n}) {\n return (\n <div\n className={cn(\n 'rounded-2xl text-sm break-words',\n message.role === 'user'\n ? 'bg-primary ml-auto text-primary-foreground rounded-tr-sm max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px] px-4 py-2.5'\n : isExpanded && !isChartVisible\n ? 'bg-muted/50 rounded-tl-sm max-w-full w-full px-4 py-2.5'\n : initialMessage && message.content === initialMessage.content\n ? 'bg-muted/50 rounded-tl-sm max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px] px-6 py-4 [&_h1]:text-xl [&_h1]:font-semibold [&_h1]:mb-3 [&_h2]:text-lg [&_h2]:font-semibold [&_h2]:mt-4 [&_h2]:mb-2 [&_p]:mb-2 [&_ul]:list-disc [&_ul]:ml-4 [&_ul]:mb-2 [&_li]:mb-1 [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_pre]:bg-muted [&_pre]:p-3 [&_pre]:rounded-lg [&_pre]:overflow-x-auto [&_pre]:my-2'\n : 'bg-muted/50 rounded-tl-sm max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px] px-4 py-2.5'\n )}\n >\n {children}\n </div>\n )\n}\n\n// ── MessageItem ──────────────────────────────────────────────────────\n\nconst MessageItem = memo(function MessageItem({\n message,\n index,\n isThinking,\n isLastMessage,\n onBookmarkMessage,\n onCollapseThought,\n bookmarkLoading,\n feedbackLoading,\n feedbackLoadingType,\n tempChartData,\n onFeedback,\n onBranch,\n onEditSave,\n initialMessage,\n hideAvatar = false,\n hideThinkingProcess = false,\n isExpanded = false,\n isChartVisible = false,\n isViewer = false,\n}: {\n message: Message\n index: number\n isThinking: boolean\n isLastMessage: boolean\n onBookmarkMessage: (index: number) => void\n onCollapseThought: (index: number) => void\n bookmarkLoading: number | null\n feedbackLoading: number | null\n feedbackLoadingType: 'positive' | 'negative' | null\n tempChartData: any[]\n onFeedback: (index: number, type: 'positive' | 'negative') => void\n onBranch: (index: number) => void\n onEditSave: (message: Message) => void\n initialMessage?: Message\n hideAvatar?: boolean\n hideThinkingProcess?: boolean\n isExpanded?: boolean\n isChartVisible?: boolean\n isViewer?: boolean\n}) {\n const [isEditing, setIsEditing] = useState(false)\n const [editedContent, setEditedContent] = useState(message.content)\n const [originalContent] = useState(message.content)\n\n const handleEditClick = () => {\n setIsEditing(true)\n setEditedContent(message.content)\n }\n const handleCancel = () => {\n setIsEditing(false)\n setEditedContent(message.content)\n }\n const handleSave = () => {\n if (editedContent.trim()) {\n onEditSave({ ...message, content: editedContent, originalContent } as any)\n setIsEditing(false)\n }\n }\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className={cn(\n 'flex gap-3 group/message',\n message.role === 'user' ? 'flex-row-reverse items-start' : 'items-start',\n hideAvatar && 'gap-0'\n )}\n >\n {!hideAvatar && (\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n 'bg-primary',\n isLastMessage && isThinking && 'bg-transparent'\n )}\n >\n {message.role === 'user' ? (\n <User className=\"h-4 w-4 text-primary-foreground\" />\n ) : isLastMessage && isThinking ? (\n <ThinkingLogo size=\"md\" />\n ) : (\n <LogoStandAlone className=\"h-4 w-4\" />\n )}\n </div>\n )}\n <div\n className={cn(\n 'flex flex-col min-w-0',\n message.role === 'user' ? 'items-end gap-0' : 'gap-1',\n message.role === 'assistant' && isExpanded && !isChartVisible\n ? 'max-w-full w-full flex-1'\n : 'max-w-[90%]',\n message.role === 'user' && 'max-w-[90%]',\n hideAvatar && 'max-w-full'\n )}\n >\n {message.role === 'error' ? (\n <Alert variant=\"destructive\">\n <Terminal className=\"h-3.5 w-3.5\" />\n <AlertTitle />\n <AlertDescription>{message?.content}</AlertDescription>\n </Alert>\n ) : (\n <div className={cn('flex flex-col', message.role === 'user' ? 'gap-0' : 'gap-2')}>\n {message.thought && message.role === 'assistant' && !hideThinkingProcess && (\n <Collapsible open={message.openThought} onOpenChange={() => onCollapseThought(index)}>\n <CollapsibleTrigger className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <Brain className=\"h-3.5 w-3.5\" />\n View thinking process\n </CollapsibleTrigger>\n <CollapsibleContent className=\"text-xs bg-muted/30 p-2\">\n <div className=\"pl-3 border-l-2 border-gray-500 text-gray-700 dark:text-white/80\">\n <MarkdownRenderer>{message.thought}</MarkdownRenderer>\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n <div className={cn('relative', message.role === 'user' && 'group')}>\n {isEditing && message.role === 'user' ? (\n <div className=\"flex flex-col gap-2 w-full max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]\">\n <textarea\n value={editedContent}\n onChange={(e) => setEditedContent(e.target.value)}\n className=\"w-full rounded-xl border border-border/50 bg-background px-4 py-3 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary/50 resize-none min-h-[80px]\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSave()\n }\n if (e.key === 'Escape') handleCancel()\n }}\n />\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleCancel} className=\"h-8 px-3\">\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={handleSave}\n className=\"h-8 px-3\"\n disabled={!editedContent.trim()}\n >\n Send\n </Button>\n </div>\n </div>\n ) : (\n <>\n <RundownBubble\n message={message}\n isExpanded={isExpanded}\n isChartVisible={isChartVisible}\n initialMessage={initialMessage}\n >\n <MarkdownRenderer>{message.content}</MarkdownRenderer>\n {isThinking ? null : (\n <div className=\"flex justify-between items-center gap-2 mt-2\">\n <div className=\"flex items-center gap-1\">\n {message.role === 'assistant' &&\n message.bookmarked !== undefined &&\n !isViewer &&\n !message?.noIcons ? (\n <BookmarkButton\n onToggle={() => onBookmarkMessage(index)}\n isLoading={Boolean(bookmarkLoading === index)}\n isBookmarked={message.bookmarked || false}\n />\n ) : null}\n\n {message.role === 'assistant' && !message?.noIcons && (\n <ButtonWithTooltip\n onClick={() =>\n copyToClipboard({\n value: message.content,\n successMessage: 'Message copied to clipboard',\n })\n }\n tooltipText=\"Copy message\"\n className=\"h-6 w-6 hover:bg-muted/80 transition-colors\"\n >\n <Copy className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </ButtonWithTooltip>\n )}\n\n {message.role === 'assistant' && !message?.noIcons && (\n <BranchButton onBranch={() => onBranch(index)} />\n )}\n\n {message.role === 'assistant' && !message?.noIcons && (\n <ChatCodeBlock\n code={message.code}\n language={detectLanguage(message.code || 'text')}\n progressEvents={message.progress_events}\n >\n {tempChartData?.length ? (\n <div className=\"h-[400px]\">\n <DataTable data={tempChartData} />\n </div>\n ) : null}\n </ChatCodeBlock>\n )}\n </div>\n\n {message.role === 'assistant' && !message?.noIcons ? (\n <FeedbackButtons\n onFeedback={(type) => onFeedback(index, type)}\n isLoading={Boolean(feedbackLoading === index)}\n selectedFeedback={message.feedback || null}\n loadingType={feedbackLoading === index ? feedbackLoadingType : null}\n />\n ) : null}\n </div>\n )}\n </RundownBubble>\n {message.role === 'user' && !isEditing && (\n <div className=\"max-h-0 overflow-hidden group-hover/message:max-h-10 transition-all duration-200 ease-out\">\n <div className=\"flex items-center gap-1 mt-1 justify-end opacity-0 group-hover/message:opacity-100 transition-opacity duration-200\">\n {!message?.is_inherited && !message?.is_rundown ? (\n <ButtonWithTooltip\n onClick={handleEditClick}\n tooltipText=\"Edit message\"\n className=\"h-6 w-6 hover:bg-muted/80 transition-colors\"\n >\n <Edit2 className=\"h-3.5 w-3.5\" />\n </ButtonWithTooltip>\n ) : null}\n\n <ButtonWithTooltip\n onClick={() =>\n copyToClipboard({\n value: message.content,\n successMessage: 'Message copied to clipboard',\n })\n }\n tooltipText=\"Copy message\"\n className=\"h-6 w-6 hover:bg-muted/80 transition-colors\"\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </ButtonWithTooltip>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n )}\n {message.status === 'done' && (\n <span className=\"text-[10px] text-muted-foreground px-2\">\n {message.role === 'user' ? 'You' : `${APP_NAME} AI`}\n </span>\n )}\n </div>\n </motion.div>\n )\n})\n\nMessageItem.displayName = 'MessageItem'\n\n// ── ChatAssistant (zero props - reads from store) ────────────────────\n\nexport function ChatAssistant() {\n const messages = usePapermapStore((s) => s.messages)\n const isThinking = usePapermapStore((s) => s.isLoading)\n const isLoadingMore = usePapermapStore((s) => s.isLoadingMore)\n const inputValue = usePapermapStore((s) => s.inputValue)\n const handleScroll = usePapermapStore((s) => s.handleScroll)\n const setInputValue = usePapermapStore((s) => s.setInputValue)\n const handleSubmit = usePapermapStore((s) => s.handleSubmit)\n const setIsFocused = usePapermapStore((s) => s.setIsFocused)\n const setIsOpen = usePapermapStore((s) => s.setIsOpen)\n const chatModalTab = usePapermapStore((s) => s.chatModalTab)\n const chatId = usePapermapStore((s) => s.chatId)\n const editChatId = usePapermapStore((s) => s.editChatId)\n const chartData = usePapermapStore((s) => s.chartData)\n const allMeta = usePapermapStore((s) => s.allMeta)\n const selectedChartType = usePapermapStore((s) => s.selectedChartType)\n const chartVisuals = usePapermapStore((s) => s.chartVisuals)\n\n const sseTimeline = usePapermapStore((s) => s.sseTimeline)\n const ssePhase = usePapermapStore((s) => s.ssePhase)\n const sseIsStreaming = usePapermapStore((s) => s.sseIsStreaming)\n const sseIsComplete = usePapermapStore((s) => s.sseIsComplete)\n const sseToolCalls = usePapermapStore((s) => s.sseToolCalls)\n const sseThoughts = usePapermapStore((s) => s.sseThoughts)\n\n const storeApi = usePapermapStoreApi()\n const refs = storeApi.getState().getRefs()\n const { chartSvc } = storeApi.getState().getServices()\n const config = storeApi.getState().getConfig()\n\n const scrollViewportRef = useRef<HTMLDivElement>(null)\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const userIsScrolledUp = useRef(false)\n const previousMessagesLength = useRef(0)\n const hasScrolledToBottomForInitial = useRef(false)\n const previousChatIdRef = useRef<string>('')\n\n const [showScrollButton, setShowScrollButton] = useState(false)\n const [isMaximized, setIsMaximized] = useState(false)\n const [isExpanded, setIsExpanded] = useState(false)\n const [tempChartData, setTempChartData] = useState(chartData)\n const [isChartVisible, setIsChartVisible] = useState(true)\n const [bookmarkLoading, setBookmarkLoading] = useState<number | null>(null)\n const [feedbackLoading, setFeedbackLoading] = useState<number | null>(null)\n const [feedbackLoadingType, setFeedbackLoadingType] = useState<'positive' | 'negative' | null>(\n null\n )\n const [isBranching, setIsBranching] = useState(false)\n\n const chatIdToUse = editChatId || chatId\n\n const suggestedPrompts = useMemo(() => getRandomSuggestions(3), [])\n const hasActiveSSE = sseIsStreaming || sseTimeline.length > 0\n\n const dimensions = getAssistantDimensions(chartData?.length && isChartVisible ? 'chart' : null, {\n expanded: isExpanded,\n })\n\n const floatingActionButtonClasses =\n 'h-8 px-3 backdrop-blur-md border border-border/50 shadow-lg hover:shadow-xl transition-all duration-200 flex items-center justify-center gap-2 text-sm font-medium'\n\n const scrollToBottom = useCallback(() => {\n if (refs.scrollRef?.current) {\n refs.scrollRef.current.scrollTo({\n top: refs.scrollRef.current.scrollHeight,\n behavior: 'smooth',\n })\n } else {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }\n }, [refs.scrollRef])\n\n const toggleExpanded = useCallback(() => setIsExpanded((p) => !p), [])\n\n useEffect(() => {\n const currentId = chatIdToUse\n if (currentId !== previousChatIdRef.current) {\n hasScrolledToBottomForInitial.current = false\n previousMessagesLength.current = 0\n userIsScrolledUp.current = false\n previousChatIdRef.current = currentId || ''\n }\n }, [chatIdToUse])\n\n useEffect(() => {\n if (chatIdToUse && messages.length > 0 && !hasScrolledToBottomForInitial.current) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (refs.scrollRef?.current) {\n refs.scrollRef.current.scrollTop = refs.scrollRef.current.scrollHeight\n hasScrolledToBottomForInitial.current = true\n }\n })\n })\n }\n }, [chatIdToUse, messages.length, refs.scrollRef])\n\n useEffect(() => {\n if (messages.length === 0) {\n hasScrolledToBottomForInitial.current = false\n previousMessagesLength.current = 0\n userIsScrolledUp.current = false\n }\n }, [messages.length])\n\n useEffect(() => {\n if (chartData?.length) setTempChartData(chartData)\n else {\n setTempChartData([])\n setIsChartVisible(true)\n }\n }, [chartData])\n\n useEffect(() => {\n if (isLoadingMore) return\n const isInitialLoad = previousMessagesLength.current === 0 && messages.length > 0\n if (isInitialLoad && !hasScrolledToBottomForInitial.current) {\n hasScrolledToBottomForInitial.current = true\n requestAnimationFrame(() => scrollToBottom())\n previousMessagesLength.current = messages.length\n return\n }\n previousMessagesLength.current = messages.length\n if (refs.scrollRef?.current) {\n const { scrollTop, scrollHeight, clientHeight } = refs.scrollRef.current\n if (scrollHeight - scrollTop - clientHeight < 200) scrollToBottom()\n } else {\n scrollToBottom()\n }\n }, [messages, scrollToBottom, isLoadingMore, refs.scrollRef])\n\n useEffect(() => {\n if (userIsScrolledUp.current) return\n if (sseIsStreaming || sseToolCalls.length > 0 || sseThoughts.length > 0) {\n const timer = setTimeout(() => {\n if (!userIsScrolledUp.current && refs.scrollRef?.current) {\n const { scrollTop, scrollHeight, clientHeight } = refs.scrollRef.current\n if (scrollHeight - scrollTop - clientHeight <= 200) scrollToBottom()\n }\n }, 100)\n return () => clearTimeout(timer)\n }\n }, [sseIsStreaming, sseToolCalls, sseThoughts, sseTimeline, scrollToBottom])\n\n const handleChartToggle = (open: boolean) => {\n setIsChartVisible(open)\n if (open) {\n storeApi.getState().updateChartData(tempChartData)\n }\n }\n\n const collapseThought = useCallback(\n (index: number) => {\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((msg, i) => (i === index ? { ...msg, openThought: !msg.openThought } : msg))\n )\n },\n [storeApi]\n )\n\n const handleBookmarkMessage = useCallback(\n async (messageIndex: number) => {\n const msg = messages[messageIndex]\n if (!msg) return\n setBookmarkLoading(messageIndex)\n try {\n if (msg.bookmarked) {\n await chartSvc.removeBookmark(msg.bookmark_id || '')\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) => (i === messageIndex ? { ...m, bookmarked: false } : m))\n )\n } else {\n const result = await chartSvc.bookmarkConversation({\n llm_data_id: msg.id || msg.llm_data_id || '',\n dashboard_id: config.dashboardId,\n })\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) =>\n i === messageIndex\n ? { ...m, bookmarked: true, bookmark_id: result.data?.bookmark_id }\n : m\n )\n )\n }\n } catch (error) {\n console.error('Bookmark error:', error)\n toast({ title: 'Error', description: 'Failed to bookmark', variant: 'destructive' })\n } finally {\n setBookmarkLoading(null)\n }\n },\n [messages, chartSvc, storeApi, config.dashboardId]\n )\n\n const handleFeedback = useCallback(\n async (messageIndex: number, feedbackType: 'positive' | 'negative') => {\n const msg = messages[messageIndex]\n if (!msg || !msg.id) return\n setFeedbackLoading(messageIndex)\n setFeedbackLoadingType(feedbackType)\n try {\n await chartSvc.updateResponseLabel(msg.id, feedbackType)\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) => (i === messageIndex ? { ...m, feedback: feedbackType } : m))\n )\n toast({ title: 'Success', description: 'Feedback recorded successfully!' })\n } catch (error) {\n console.error('Feedback error:', error)\n toast({ title: 'Error', description: 'Failed to record feedback', variant: 'destructive' })\n } finally {\n setFeedbackLoading(null)\n setFeedbackLoadingType(null)\n }\n },\n [messages, chartSvc, storeApi]\n )\n\n const handleBranch = useCallback(\n async (messageIndex: number) => {\n const msg = messages[messageIndex]\n const llmDataId = msg?.llm_data_id || msg?.id\n if (!msg || !llmDataId || !chatIdToUse) return\n setIsBranching(true)\n try {\n const response = await chartSvc.branchConversation(config.dashboardId, llmDataId)\n const newChatId = response?.data?.new_chat_id || ''\n storeApi.getState().clearStreamingState()\n storeApi.getState().setChatId(newChatId)\n storeApi.getState().setEditChatId(null)\n // Mark as loaded so ConversationLoader doesn't overwrite our messages when chatId changes\n refs.loadedConversationChatIdRef.current = newChatId\n const branchMsg: Message = {\n role: 'branch' as any,\n content: 'Branched from Conversation',\n status: 'done',\n }\n const inherited = messages.map((m) => ({ ...m, is_inherited: true, noIcons: true }))\n storeApi.getState().setMessages([...inherited.slice(0, messageIndex + 1), branchMsg])\n toast({\n title: 'Success',\n description: `Branch created successfully! ${response?.data?.inherited_message_count || 0} messages inherited.`,\n })\n } catch (error) {\n console.error('Branch error:', error)\n toast({ title: 'Error', description: 'Failed to create branch', variant: 'destructive' })\n } finally {\n setIsBranching(false)\n }\n },\n [messages, chatIdToUse, chartSvc, storeApi, refs, config.dashboardId]\n )\n\n const handleEditSave = useCallback(\n (editedMessage: Message) => {\n // For now, a simplified edit handler\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m) => (m.id === editedMessage.id ? editedMessage : m))\n )\n },\n [storeApi]\n )\n\n const onScrollInternal = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (refs.scrollRef?.current) {\n const { scrollTop, scrollHeight, clientHeight } = refs.scrollRef.current\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight\n userIsScrolledUp.current = distanceFromBottom > 200\n setShowScrollButton(distanceFromBottom > 200)\n }\n handleScroll(e)\n },\n [handleScroll, refs.scrollRef]\n )\n\n const visibleMessages = useMemo(() => {\n if (messages.length <= 50) return messages\n return messages.slice(-50)\n }, [messages])\n\n const onSuggestionClick = useCallback(\n async (suggestion: string) => {\n setInputValue(suggestion)\n await handleSubmit(suggestion)\n },\n [setInputValue, handleSubmit]\n )\n\n const renderChart = () => {\n if (!tempChartData?.length) return null\n return (\n <div className=\"w-full h-full\">\n <ChartView\n data={tempChartData}\n chartId={chatIdToUse || undefined}\n chartMeta={allMeta}\n chartType={selectedChartType || ''}\n visualizationConfig={chartVisuals}\n variant=\"\"\n onClose={() => handleChartToggle(false)}\n onMaximize={() => setIsMaximized(true)}\n showIcons={true}\n />\n </div>\n )\n }\n\n return (\n <motion.div\n initial={{ opacity: 0, scale: 0.98, width: 400, height: 0 }}\n animate={{\n opacity: 1,\n scale: 1,\n width: typeof dimensions.width === 'string' ? dimensions.width : `${dimensions.width}px`,\n height:\n typeof dimensions.height === 'string' ? dimensions.height : `${dimensions.height}px`,\n transition: {\n duration: 0.3,\n ease: EASE,\n opacity: { duration: 0.2 },\n scale: { duration: 0.3, ease: EASE },\n width: { duration: 0.3, ease: EASE },\n height: { duration: 0.3, ease: EASE },\n },\n }}\n exit={{\n opacity: 0,\n scale: 0.98,\n width: 400,\n height: 0,\n transition: { duration: 0.2, ease: EASE },\n }}\n className={cn(\n 'rounded-3xl bg-background/85 border border-border/50 backdrop-blur-lg overflow-hidden flex flex-col w-[95vw] md:w-[75vw] lg:w-[65vw] xl:w-[55vw]',\n isExpanded ? 'max-w-none' : 'max-w-[1300px]',\n chartData?.length && isChartVisible\n ? isExpanded\n ? 'h-[65vh] md:h-[70vh] lg:h-[calc(100vh-90px)] xl:h-[calc(100vh-90px)]'\n : 'h-[55vh] md:h-[60vh] lg:h-[62vh] xl:h-[65vh] max-h-[650px] md:max-h-[700px] lg:max-h-[720px] xl:max-h-[750px]'\n : isExpanded\n ? 'h-[calc(100vh-90px)]'\n : 'h-[70vh] max-h-[600px]'\n )}\n style={{ transformOrigin: 'bottom center' }}\n onClick={(e) => {\n if (!(e.target instanceof HTMLAnchorElement)) {\n e.stopPropagation()\n e.preventDefault()\n }\n }}\n >\n <div className=\"absolute inset-0 bg-gradient-to-b from-background/10 via-background/50 to-background/10 opacity-50\" />\n <MorphGradient />\n\n <div className={cn('absolute bottom-4 right-4 z-20 flex items-center gap-2')}>\n <Button\n variant=\"outline\"\n onClick={toggleExpanded}\n className={cn(floatingActionButtonClasses, 'w-full')}\n >\n <FullscreenIcon className=\"h-4 w-4\" />\n {isExpanded ? 'Exit Full Screen' : 'Full Screen'}\n </Button>\n </div>\n\n <motion.div\n className=\"relative flex w-full h-full z-10\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1, transition: { delay: 0.1, duration: 0.2 } }}\n >\n {chatModalTab === CHAT_MODAL_TAB.RECENT_CONVERSATIONS && <RecentConversations />}\n {chatModalTab === CHAT_MODAL_TAB.SAVED_MEMORY && <SavedMemory />}\n {chatModalTab === CHAT_MODAL_TAB.CHAT_HISTORY && <ChartHistory />}\n {chatModalTab === CHAT_MODAL_TAB.CHAT && (\n <>\n {chartData?.length && isChartVisible ? (\n <motion.div className=\"flex-1 py-7 px-6 flex items-center justify-center border-b md:border-b-0 md:border-r border-border/50\">\n <div className=\"w-full h-full overflow-auto scrollbar-hide\">{renderChart()}</div>\n </motion.div>\n ) : null}\n\n <ChartDialog\n isOpen={isMaximized}\n onOpenChange={setIsMaximized}\n title={allMeta?.title}\n data={tempChartData}\n chartId={chatIdToUse || ''}\n chartMeta={allMeta}\n chartType={selectedChartType || ''}\n visualizationConfig={chartVisuals}\n onMetaChange={() => {}}\n variant=\"\"\n onClose={() => setIsMaximized(false)}\n />\n\n <motion.div\n className={cn(\n 'flex flex-col relative h-full',\n isChartVisible && chartData?.length ? 'md:w-[35%] w-full' : 'w-full'\n )}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1, transition: { delay: 0.15, duration: 0.3, ease: EASE } }}\n >\n <div className=\"flex-1 overflow-hidden\">\n <div\n ref={refs.scrollRef as React.RefObject<HTMLDivElement>}\n onScroll={onScrollInternal}\n className=\"h-full overflow-y-auto scrollbar-hide [mask-image:linear-gradient(to_bottom,transparent_0,black_8%,black_92%,transparent_100%)] min-h-0\"\n >\n <div\n className={cn(\n 'space-y-2 py-2 pt-4',\n tempChartData?.length\n ? isExpanded && !(isChartVisible && chartData?.length)\n ? 'px-32 md:px-48 lg:px-[320px] xl:px-[448px]'\n : 'px-4'\n : isExpanded && !(isChartVisible && chartData?.length)\n ? 'mx-auto px-32 md:px-48 lg:px-[320px] xl:px-[448px]'\n : 'mx-auto px-4'\n )}\n >\n {isLoadingMore && (\n <div className=\"flex justify-center py-2\">\n <div className=\"size-4 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n )}\n\n {visibleMessages.map((message, index) => {\n const actualIndex = messages.length - visibleMessages.length + index\n const isLastAssistantMessage =\n message.role === 'assistant' && actualIndex === messages.length - 1\n const showStreamingBlock =\n hasActiveSSE ||\n (isLastAssistantMessage && (sseTimeline.length > 0 || isThinking))\n\n if (message.role === ('branch' as any)) {\n return (\n <motion.div\n key={`branch-${actualIndex}`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex justify-center my-4\"\n >\n <div className=\"flex items-center gap-2 px-4 py-2 rounded-full bg-white dark:bg-muted border border-primary/20 dark:border-border\">\n <Split className=\"h-4 w-4 text-primary rotate-90\" />\n <span className=\"text-sm font-medium text-foreground\">\n {message.content}\n </span>\n </div>\n </motion.div>\n )\n }\n\n if (\n (isLastAssistantMessage && hasActiveSSE) ||\n (message.status === 'thinking' && hasActiveSSE)\n )\n return null\n\n return (\n <MessageItem\n key={`${message.id || actualIndex}-${(message.content || '').slice(0, 50)}`}\n message={message}\n index={actualIndex}\n isThinking={isThinking}\n isLastMessage={actualIndex === messages.length - 1}\n onBookmarkMessage={handleBookmarkMessage}\n onCollapseThought={collapseThought}\n bookmarkLoading={bookmarkLoading}\n feedbackLoading={feedbackLoading}\n feedbackLoadingType={feedbackLoadingType}\n tempChartData={tempChartData}\n onFeedback={handleFeedback}\n onBranch={handleBranch}\n onEditSave={handleEditSave}\n initialMessage={messages.find((m) => m.role === 'assistant')}\n isExpanded={isExpanded}\n isChartVisible={isChartVisible && !!chartData?.length}\n />\n )\n })}\n\n {(() => {\n const lastMessage = messages[messages.length - 1]\n const hasAssistantMessage = lastMessage && lastMessage.role === 'assistant'\n if (hasActiveSSE || (hasAssistantMessage && sseTimeline.length > 0)) {\n const actualIndex = hasAssistantMessage ? messages.length - 1 : -1\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex gap-3 items-start\"\n key={`sse-combined-${actualIndex}`}\n >\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n sseIsStreaming ? 'bg-transparent' : 'bg-primary'\n )}\n >\n {sseIsStreaming ? (\n <ThinkingLogo size=\"md\" />\n ) : (\n <LogoStandAlone className=\"h-4 w-4\" />\n )}\n </div>\n <div\n className={cn(\n 'flex flex-col gap-3 w-full min-w-0',\n isExpanded\n ? 'max-w-full'\n : 'max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]'\n )}\n >\n {(isThinking || sseIsStreaming || (ssePhase && !sseIsComplete)) && (\n <div className=\"flex flex-col gap-1 w-fit\">\n <div className=\"rounded-2xl rounded-tl-sm bg-muted/50 px-4 py-3 text-sm break-words max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]\">\n <ThinkingMessage\n isThinking={isThinking || sseIsStreaming || !!ssePhase}\n currentPhase={ssePhase || 'Analyzing your request...'}\n />\n </div>\n <span className=\"text-[10px] text-muted-foreground pl-2\">\n {APP_NAME} AI\n </span>\n </div>\n )}\n <StreamingTimeline\n timeline={sseTimeline}\n collapseThreshold={3}\n recentFullCount={1}\n />\n {hasAssistantMessage && lastMessage && (\n <MessageItem\n key={`${lastMessage.id || actualIndex}-final`}\n message={lastMessage}\n index={actualIndex}\n isThinking={isThinking}\n isLastMessage={true}\n onBookmarkMessage={handleBookmarkMessage}\n onCollapseThought={collapseThought}\n bookmarkLoading={bookmarkLoading}\n feedbackLoading={feedbackLoading}\n feedbackLoadingType={feedbackLoadingType}\n tempChartData={tempChartData}\n onFeedback={handleFeedback}\n onBranch={handleBranch}\n onEditSave={handleEditSave}\n initialMessage={messages.find((m) => m.role === 'assistant')}\n hideAvatar\n hideThinkingProcess={hasActiveSSE}\n isExpanded={isExpanded}\n isChartVisible={isChartVisible && !!chartData?.length}\n />\n )}\n </div>\n </motion.div>\n )\n }\n return null\n })()}\n\n <div ref={messagesEndRef} className=\"h-8\" />\n </div>\n </div>\n </div>\n\n <AnimatePresence>\n {showScrollButton && (\n <div className=\"absolute inset-x-0 bottom-4 flex justify-center\">\n <motion.button\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 20 }}\n transition={{ duration: 0.2 }}\n onClick={scrollToBottom}\n className=\"px-3 py-1.5 rounded-full bg-background/70 hover:bg-background/90 text-foreground/70 hover:text-foreground border border-border/50 hover:border-border/70 backdrop-blur-md shadow-sm hover:shadow-md transition-all duration-200 flex gap-1.5 justify-center items-center text-xs font-medium group z-50\"\n >\n <ArrowDown className=\"h-3.5 w-3.5 transition-transform duration-200 group-hover:translate-y-0.5\" />\n Scroll to bottom\n </motion.button>\n </div>\n )}\n </AnimatePresence>\n\n <AnimatePresence>\n {!isChartVisible && tempChartData?.length && chartData?.length ? (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.3, ease: EASE }}\n className={cn('absolute bottom-4 z-50', isChartVisible ? 'right-4' : 'left-4')}\n >\n <Button\n variant=\"outline\"\n onClick={() => handleChartToggle(true)}\n className={floatingActionButtonClasses}\n >\n <Eye className=\"h-4 w-4\" />\n Show Chart\n </Button>\n </motion.div>\n ) : null}\n </AnimatePresence>\n\n {!isLoadingMore && !inputValue && messages.length <= 1 && (\n <AnimatePresence>\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.3, ease: EASE }}\n className=\"p-4\"\n >\n <div className=\"flex gap-2 justify-center flex-wrap\">\n {suggestedPrompts.map((suggestion, index) => (\n <motion.button\n key={index}\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, delay: index * 0.05, ease: EASE }}\n onClick={() => onSuggestionClick(suggestion)}\n className={cn(\n 'relative px-4 py-2.5 rounded-xl transition-all duration-200 text-xs font-medium',\n 'bg-muted/50 hover:bg-muted dark:hover:bg-muted/80',\n 'border border-border/[0.15] hover:border-border/30',\n 'text-foreground/70 hover:text-foreground',\n 'max-w-[320px] text-center leading-relaxed truncate'\n )}\n >\n {suggestion}\n </motion.button>\n ))}\n </div>\n </motion.div>\n </AnimatePresence>\n )}\n </motion.div>\n </>\n )}\n </motion.div>\n\n <AnimatePresence>\n {isBranching && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0 bg-background/60 backdrop-blur-md z-50 flex items-center justify-center rounded-3xl\"\n >\n <motion.div\n initial={{ scale: 0.9, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.9, opacity: 0 }}\n transition={{ duration: 0.3, ease: EASE }}\n className=\"flex flex-col items-center gap-4\"\n >\n <div className=\"size-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-lg font-medium text-foreground\">\n Branching into a new conversation\n </p>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )\n}\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../../utils/cn'\n\nconst alertVariants = cva(\n 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7',\n {\n variants: {\n variant: {\n default: 'bg-background text-foreground',\n destructive: 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div ref={ref} role=\"alert\" className={cn(alertVariants({ variant }), className)} {...props} />\n))\nAlert.displayName = 'Alert'\n\nconst AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h5 ref={ref} className={cn('mb-1 font-medium leading-none tracking-tight', className)} {...props} />\n )\n)\nAlertTitle.displayName = 'AlertTitle'\n\nconst AlertDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('text-sm [&_p]:leading-relaxed', className)} {...props} />\n )\n)\nAlertDescription.displayName = 'AlertDescription'\n\nexport { Alert, AlertTitle, AlertDescription }\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Loader2 } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n outline: 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, loading = false, children, disabled, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n disabled={disabled || loading}\n {...props}\n >\n {loading ? (\n <>\n <Loader2 className=\"size-4 animate-spin\" />\n {children}\n </>\n ) : (\n children\n )}\n </Comp>\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","import React, { memo } from 'react'\nimport Markdown from 'react-markdown'\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { atomDark } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport rehypeRaw from 'rehype-raw'\nimport remarkGfm from 'remark-gfm'\n\ntype MarkdownRendererProps = {\n children: string\n theme?: 'light' | 'dark'\n}\n\nfunction getResolvedTheme(preference?: 'light' | 'dark'): 'light' | 'dark' {\n if (preference) return preference\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches)\n return 'dark'\n return 'light'\n}\n\nexport const MarkdownRenderer = memo(function MarkdownRenderer({\n children: markdown,\n theme,\n}: MarkdownRendererProps) {\n const resolvedTheme = getResolvedTheme(theme)\n\n return (\n <div className=\"prose prose-base prose-gray dark:prose-invert max-w-none\">\n <Markdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={{\n h1: ({ children }) => (\n <h1 className=\"mt-6 first:mt-0 mb-3 text-2xl font-bold text-gray-900 dark:text-white\">\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"mt-6 first:mt-0 mb-3 text-xl font-semibold text-gray-800 dark:text-gray-300\">\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"mt-5 first:mt-0 mb-2 text-lg font-medium text-gray-700 dark:text-gray-400\">\n {children}\n </h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"mt-4 first:mt-0 mb-2 text-base font-medium text-gray-600 dark:text-gray-500\">\n {children}\n </h4>\n ),\n p: ({ children }) => {\n const hasContent = React.Children.toArray(children).some((child) => {\n if (typeof child === 'string') {\n const trimmed = child.trim()\n if (\n trimmed.length === 0 ||\n trimmed === '\\u00A0' ||\n trimmed === \"'\" ||\n trimmed === '\"'\n )\n return false\n return trimmed.length > 0\n }\n return true\n })\n if (!hasContent) return null\n return <p className=\"mt-3 text-sm leading-relaxed\">{children}</p>\n },\n ul: ({ children }) => (\n <ul className=\"mt-3 list-disc pl-5 text-sm space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"mt-3 list-decimal pl-5 text-sm space-y-1\">{children}</ol>\n ),\n hr: () => (\n <hr className=\"my-4 border-t border-border/60 dark:border-white/30 transition-colors\" />\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-4 border-gray-500 pl-3 italic text-gray-600 dark:text-gray-400 text-sm\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <table className=\"w-full border-collapse border border-gray-300 dark:border-gray-600 text-sm\">\n {children}\n </table>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-gray-100 dark:bg-gray-700\">{children}</thead>\n ),\n tbody: ({ children }) => (\n <tbody className=\"divide-y divide-gray-300 dark:divide-gray-600\">{children}</tbody>\n ),\n th: ({ children }) => (\n <th className=\"p-2 border border-gray-300 dark:border-gray-600 text-left font-semibold text-sm\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"p-2 border border-gray-300 dark:border-gray-600 text-sm\">{children}</td>\n ),\n a: ({ href = '', children }) => (\n <a\n href={href}\n className=\"text-blue-600 dark:text-blue-400 underline hover:opacity-80\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ),\n code({ inline, className, children, ...props }: any) {\n const match = /language-(\\w+)/.exec(className || '')\n return !inline && match ? (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n <SyntaxHighlighter\n style={resolvedTheme === 'dark' ? atomDark : oneLight}\n PreTag=\"div\"\n wrapLongLines\n language={match[1]}\n {...props}\n >\n {children}\n </SyntaxHighlighter>\n ) : (\n <code className={className} {...props}>\n {children}\n </code>\n )\n },\n }}\n >\n {markdown}\n </Markdown>\n </div>\n )\n})\n","import { motion } from 'framer-motion'\n\ninterface ThinkingMessageProps {\n isThinking: boolean\n currentPhase?: string\n className?: string\n}\n\nexport function ThinkingMessage({ isThinking, currentPhase, className = '' }: ThinkingMessageProps) {\n if (!isThinking) return null\n\n const displayText = currentPhase || 'Analyzing your request...'\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 5 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -5 }}\n transition={{ duration: 0.2 }}\n className={`text-sm leading-relaxed ${className}`}\n >\n <motion.span\n key={displayText}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.15 }}\n className=\"inline-block bg-gradient-to-r from-foreground/50 via-primary to-foreground/50 text-transparent bg-clip-text\"\n style={{\n backgroundSize: '200% 100%',\n animation: 'shimmer 2s linear infinite',\n }}\n >\n {displayText}\n </motion.span>\n </motion.div>\n )\n}\n","import React from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from './dialog'\nimport { CopyIcon, FileSearch } from 'lucide-react'\nimport { Prism as _SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { atomDark } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'\nconst SyntaxHighlighter = _SyntaxHighlighter as any\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\nimport { toast } from '../../hooks/use-toast'\nimport { buildTimelineFromProgressEvents } from '../../lib/analytics-stream-replay'\nimport { StreamingTimeline } from '../dashboard/StreamingTimeline'\n\nfunction getResolvedTheme(): 'light' | 'dark' {\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches)\n return 'dark'\n return 'light'\n}\n\nexport function ChatCodeBlock({\n children,\n language,\n code,\n progressEvents,\n}: {\n children: React.ReactNode\n language: string\n code?: string\n progressEvents?: {\n event_type?: string\n data?: Record<string, any>\n timestamp?: string\n }[]\n}) {\n const resolvedTheme = getResolvedTheme()\n const safeCode = code || ''\n const onCopy = () => {\n if (!safeCode.trim()) return\n navigator.clipboard.writeText(safeCode)\n toast({ title: 'Code Copied' })\n }\n const replayTimeline = React.useMemo(\n () => buildTimelineFromProgressEvents(progressEvents),\n [progressEvents]\n )\n const replayHasCode = React.useMemo(\n () =>\n replayTimeline.some(\n (event) =>\n event.type === 'tool' && !!event.toolData?.code && event.toolData.code.trim().length > 0\n ),\n [replayTimeline]\n )\n\n return (\n <Dialog>\n <DialogTrigger asChild>\n <ButtonWithTooltip className=\"h-6 w-6\" tooltipText=\"Audit Log\" onClick={() => {}}>\n <FileSearch className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </ButtonWithTooltip>\n </DialogTrigger>\n <DialogContent className=\"sm:max-w-[760px] p-0 max-h-[85vh] overflow-hidden flex flex-col\">\n <DialogHeader className=\"px-5 pt-4 pb-3 border-b border-border/60 space-y-0\">\n <DialogTitle className=\"text-base font-semibold leading-normal\">Audit Log</DialogTitle>\n </DialogHeader>\n <div className=\"flex-1 overflow-y-auto scrollbar-hide px-3 py-3 space-y-3\">\n <div className=\"space-y-2 border border-border/60 rounded-lg p-3 bg-muted/20\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n Execution Replay\n </p>\n {replayTimeline.length > 0 ? (\n <StreamingTimeline\n timeline={replayTimeline}\n collapseThreshold={3}\n recentFullCount={1}\n />\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n No execution replay is available for this historical run.\n </p>\n )}\n </div>\n {!replayHasCode ? (\n <>\n {safeCode.trim() ? (\n <SyntaxHighlighter\n wrapLines\n showLineNumbers\n language={language}\n style={resolvedTheme === 'dark' ? atomDark : oneLight}\n >\n {safeCode}\n </SyntaxHighlighter>\n ) : (\n <div className=\"rounded-md border border-border/60 bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n No executable code was produced for this response.\n </div>\n )}\n <div className=\"flex justify-end\">\n {safeCode.trim() ? (\n <ButtonWithTooltip tooltipText=\"Copy\" onClick={onCopy}>\n <CopyIcon className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n ) : null}\n </div>\n </>\n ) : null}\n {React.Children.count(children) > 0 ? (\n <div className=\"space-y-2 pt-2\">\n <p className=\"pl-3 text-xs uppercase tracking-wide text-muted-foreground\">\n Result Data\n </p>\n {children}\n </div>\n ) : null}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\nconst Dialog = ({\n open,\n onOpenChange,\n children,\n ...props\n}: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>) => {\n React.useEffect(() => {\n if (!open) {\n document.body.style.pointerEvents = ''\n document.body.style.overflow = ''\n }\n }, [open])\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange} {...props}>\n {children}\n </DialogPrimitive.Root>\n )\n}\nDialog.displayName = DialogPrimitive.Root.displayName\n\nconst DialogTrigger = DialogPrimitive.Trigger\nconst DialogPortal = DialogPrimitive.Portal\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/30 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border/70 bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n className\n )}\n onCloseAutoFocus={() => {\n document.body.style.pointerEvents = ''\n document.body.style.overflow = ''\n }}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)} {...props} />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props} />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","import * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\nimport { cn } from '../../utils/cn'\n\nconst TooltipProvider = TooltipPrimitive.Provider\nconst Tooltip = TooltipPrimitive.Root\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React from 'react'\nimport { Button, type ButtonProps } from '../ui/button'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { cn } from '../../utils/cn'\n\ntype ButtonWithTooltipProps = {\n onClick: () => void\n children: React.ReactNode\n tooltipText: string\n className?: string\n} & ButtonProps\n\nexport function ButtonWithTooltip({\n onClick,\n children,\n tooltipText,\n className,\n ...props\n}: ButtonWithTooltipProps) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n 'flex items-center justify-center hover:bg-accent/50 transition-colors duration-200',\n className\n )}\n onClick={onClick}\n {...props}\n >\n {children}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltipText}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n}\n","import { TimelineEvent, ToolCall, TOOL_DISPLAY_NAMES } from '../types/streaming'\n\ntype ProgressEvent = {\n event_type?: string\n data?: Record<string, any>\n timestamp?: string\n}\n\nconst ACTIVE_TOOL_STATES = new Set(['announced', 'streaming', 'ready', 'executing'])\n\nconst getToolDisplayName = (toolName: string) => {\n return TOOL_DISPLAY_NAMES[toolName] || toolName.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nconst getToolIndex = (toolCalls: ToolCall[], toolName: string, toolCallId?: string): number => {\n if (toolCallId) {\n const idx = toolCalls.findIndex((t) => t.tool_call_id === toolCallId)\n if (idx >= 0) return idx\n }\n const activeIdx = toolCalls.findIndex((t) => t.tool_name === toolName && ACTIVE_TOOL_STATES.has(t.status))\n if (activeIdx >= 0) return activeIdx\n for (let i = toolCalls.length - 1; i >= 0; i--) {\n if (toolCalls[i].tool_name === toolName) return i\n }\n return -1\n}\n\nconst findTimelineToolIndex = (timeline: TimelineEvent[], tool: ToolCall): number => {\n return timeline.findIndex(\n (entry) =>\n entry.type === 'tool' &&\n entry.toolData &&\n ((tool.tool_call_id && entry.toolData.tool_call_id === tool.tool_call_id) ||\n (entry.toolData.tool_name === tool.tool_name && entry.toolData.timestamp === tool.timestamp))\n )\n}\n\nconst parseToolCodeFromArgs = (fullArgs: Record<string, any>): string => {\n const explicit = fullArgs?.code_str || fullArgs?.query || fullArgs?.user_query || ''\n if (explicit) return String(explicit)\n if (fullArgs && Object.keys(fullArgs).length) return JSON.stringify(fullArgs, null, 2)\n return ''\n}\n\nexport const buildTimelineFromProgressEvents = (progressEvents?: ProgressEvent[]): TimelineEvent[] => {\n if (!Array.isArray(progressEvents) || !progressEvents.length) return []\n\n const toolCalls: ToolCall[] = []\n const timeline: TimelineEvent[] = []\n\n for (const event of progressEvents) {\n const type = event?.event_type || event?.data?.type\n const timestamp = event?.timestamp || event?.data?.timestamp || new Date().toISOString()\n const data = event?.data || {}\n\n if (type === 'agent_thought') {\n timeline.push({\n type: 'thought',\n timestamp,\n iteration: data?.iteration,\n thoughtData: {\n type: 'agent_thought',\n content: data?.content || '',\n is_complete: Boolean(data?.is_complete),\n iteration: data?.iteration || 1,\n timestamp,\n },\n })\n continue\n }\n\n if (type === 'tool_call_announced') {\n const tool: ToolCall = {\n tool_name: String(data?.tool_name || ''),\n tool_display_name: String(data?.tool_display_name || getToolDisplayName(String(data?.tool_name || 'tool'))),\n args_preview: '',\n status: 'announced',\n code: '',\n isStreamingArgs: false,\n ...(data?.tool_call_id != null && { tool_call_id: String(data.tool_call_id) }),\n timestamp,\n }\n toolCalls.push(tool)\n timeline.push({ type: 'tool', timestamp, iteration: data?.iteration, toolData: tool })\n continue\n }\n\n if (type === 'tool_call_args_delta') {\n const idx = getToolIndex(toolCalls, String(data?.tool_name || ''), data?.tool_call_id)\n if (idx >= 0) {\n toolCalls[idx] = {\n ...toolCalls[idx],\n code: (toolCalls[idx].code || '') + String(data?.args_delta || ''),\n args_preview: String(data?.args_preview || toolCalls[idx].args_preview || ''),\n status: 'streaming',\n isStreamingArgs: true,\n hasPrivateArgs: data?.private_args ?? toolCalls[idx].hasPrivateArgs,\n ...(data?.tool_call_id != null && { tool_call_id: String(data.tool_call_id) }),\n }\n const timelineIdx = findTimelineToolIndex(timeline, toolCalls[idx])\n if (timelineIdx >= 0) timeline[timelineIdx] = { ...timeline[timelineIdx], toolData: toolCalls[idx] }\n }\n continue\n }\n\n if (type === 'tool_call_args_complete') {\n const idx = getToolIndex(toolCalls, String(data?.tool_name || ''), data?.tool_call_id)\n if (idx >= 0) {\n const fullArgs = (data?.full_args || {}) as Record<string, any>\n toolCalls[idx] = {\n ...toolCalls[idx],\n code: parseToolCodeFromArgs(fullArgs),\n args_preview: String(data?.args_preview || toolCalls[idx].args_preview || ''),\n status: 'ready',\n isStreamingArgs: false,\n hasPrivateArgs: Boolean(data?.private_args) || toolCalls[idx].hasPrivateArgs,\n ...(data?.tool_call_id != null && { tool_call_id: String(data.tool_call_id) }),\n }\n const timelineIdx = findTimelineToolIndex(timeline, toolCalls[idx])\n if (timelineIdx >= 0) timeline[timelineIdx] = { ...timeline[timelineIdx], toolData: toolCalls[idx] }\n }\n continue\n }\n\n if (type === 'tool_output') {\n const idx = getToolIndex(toolCalls, String(data?.tool_name || ''), data?.tool_call_id)\n if (idx >= 0) {\n toolCalls[idx] = {\n ...toolCalls[idx],\n output: String(data?.content || ''),\n status: 'executing',\n hasPrivateOutput: Boolean(data?.private_output) || toolCalls[idx].hasPrivateOutput,\n }\n const timelineIdx = findTimelineToolIndex(timeline, toolCalls[idx])\n if (timelineIdx >= 0) timeline[timelineIdx] = { ...timeline[timelineIdx], toolData: toolCalls[idx] }\n }\n continue\n }\n\n if (type === 'tool_call_complete') {\n const idx = getToolIndex(toolCalls, String(data?.tool_name || ''), data?.tool_call_id)\n if (idx >= 0) {\n const status = data?.status === 'error' ? 'error' : 'success'\n toolCalls[idx] = {\n ...toolCalls[idx],\n status,\n duration_ms: Number(data?.duration_ms || 0),\n ...(data?.error_message ? { error_message: String(data.error_message) } : {}),\n }\n const timelineIdx = findTimelineToolIndex(timeline, toolCalls[idx])\n if (timelineIdx >= 0) timeline[timelineIdx] = { ...timeline[timelineIdx], toolData: toolCalls[idx] }\n }\n }\n }\n\n return timeline\n}\n","import { useMemo } from 'react'\nimport { AgentThoughtDisplay } from './AgentThoughtDisplay'\nimport { CollapsedToolCalls, ToolCallDisplay } from './ToolCallDisplay'\nimport type { TimelineRenderItem, TimelineEvent, ToolCall } from '../../types/streaming'\n\nexport function StreamingTimeline({\n timeline,\n collapseThreshold = 3,\n recentFullCount = 1,\n}: {\n timeline: TimelineEvent[]\n collapseThreshold?: number\n recentFullCount?: number\n}) {\n const renderPlan = useMemo<TimelineRenderItem[]>(() => {\n if (!timeline?.length) return []\n\n const toolEvents = timeline.filter((e) => e.type === 'tool' && e.toolData)\n const shouldCollapse = toolEvents.length > collapseThreshold\n const recentToolTimestamps = new Set(toolEvents.slice(-recentFullCount).map((e) => e.timestamp))\n\n const plan: TimelineRenderItem[] = []\n let pendingCollapsed: ToolCall[] = []\n\n const flushCollapsed = () => {\n if (!pendingCollapsed.length) return\n plan.push({\n kind: 'collapsed-tools',\n toolCalls: [...pendingCollapsed],\n key: `collapsed-${pendingCollapsed[0].timestamp}`,\n })\n pendingCollapsed = []\n }\n\n for (let i = 0; i < timeline.length; i++) {\n const event = timeline[i]\n\n if (event.type === 'thought' && event.thoughtData) {\n flushCollapsed()\n const isFirstOfIteration =\n i === 0 || timeline[i - 1].type !== 'thought' || timeline[i - 1].iteration !== event.iteration\n\n if (isFirstOfIteration) {\n const iterationThoughts = timeline\n .slice(i)\n .filter((e) => e.type === 'thought' && e.iteration === event.iteration)\n\n plan.push({\n kind: 'thought',\n events: iterationThoughts,\n key: `thought-${event.iteration}-${i}`,\n })\n }\n continue\n }\n\n if (event.type === 'tool' && event.toolData) {\n const isRecent = recentToolTimestamps.has(event.timestamp)\n const isCollapsible = shouldCollapse && !isRecent\n\n if (isCollapsible) {\n pendingCollapsed.push(event.toolData)\n } else {\n flushCollapsed()\n const hasNextExecutionElement = timeline\n .slice(i + 1)\n .some(\n (e) =>\n (e.type === 'tool' && e.toolData?.status !== 'announced') ||\n (e.type === 'thought' && e.thoughtData)\n )\n\n plan.push({\n kind: 'tool',\n event,\n isLatest: !hasNextExecutionElement,\n key: `tool-${event.toolData.tool_name}-${event.timestamp}`,\n })\n }\n }\n }\n\n flushCollapsed()\n return plan\n }, [timeline, collapseThreshold, recentFullCount])\n\n if (!renderPlan.length) return null\n\n return (\n <>\n {renderPlan.map((item) => {\n if (item.kind === 'thought') {\n const thoughtData = item.events.map((e) => e.thoughtData!)\n return (\n <AgentThoughtDisplay\n key={item.key}\n thoughts={thoughtData}\n maxThoughts={1}\n showOnlyLast={false}\n />\n )\n }\n\n if (item.kind === 'collapsed-tools') {\n return <CollapsedToolCalls key={item.key} toolCalls={item.toolCalls} />\n }\n\n return (\n <ToolCallDisplay\n key={item.key}\n toolCalls={[item.event.toolData!]}\n showAll={true}\n isLatest={item.isLatest}\n />\n )\n })}\n </>\n )\n}\n","import React, { useEffect, useState, useRef } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Brain, Loader2, ChevronDown, ChevronRight } from 'lucide-react'\nimport { AgentThought } from '../../types/streaming'\nimport { cn } from '../../utils/cn'\n\ninterface AgentThoughtDisplayProps {\n thoughts: AgentThought[]\n className?: string\n showOnlyLast?: boolean\n maxThoughts?: number\n}\n\nexport function AgentThoughtDisplay({ thoughts, className, showOnlyLast = false, maxThoughts = 5 }: AgentThoughtDisplayProps) {\n const [accumulatedThoughts, setAccumulatedThoughts] = useState<Map<number, { content: string; isComplete: boolean; lastUpdate: string }>>(new Map())\n const processedIndices = useRef(new Set<string>())\n\n useEffect(() => {\n if (!thoughts.length) {\n processedIndices.current.clear()\n setAccumulatedThoughts(new Map())\n return\n }\n const newThoughts = thoughts.filter((thought, idx) => !processedIndices.current.has(`${thought.timestamp}-${idx}`))\n if (newThoughts.length === 0) return\n\n setAccumulatedThoughts((prevMap) => {\n const newMap = new Map(prevMap)\n newThoughts.forEach((thought) => {\n const thoughtIndex = thoughts.indexOf(thought)\n processedIndices.current.add(`${thought.timestamp}-${thoughtIndex}`)\n const iteration = thought.iteration || 0\n const existing = newMap.get(iteration)\n if (!existing) {\n newMap.set(iteration, { content: thought.content, isComplete: thought.is_complete, lastUpdate: thought.timestamp })\n } else {\n newMap.set(iteration, { content: existing.content + thought.content, isComplete: thought.is_complete, lastUpdate: thought.timestamp })\n }\n })\n return newMap\n })\n }, [thoughts])\n\n const thoughtsArray = Array.from(accumulatedThoughts.entries())\n .map(([iteration, data]) => ({ iteration, ...data }))\n .sort((a, b) => a.iteration - b.iteration)\n\n const displayThoughts = showOnlyLast ? thoughtsArray.slice(-1) : thoughtsArray.slice(-maxThoughts)\n\n if (!displayThoughts.length) return null\n\n return (\n <div className={cn('space-y-2', className)}>\n <AnimatePresence mode=\"popLayout\">\n {displayThoughts.map((thought, index) => {\n const isLatest = index === displayThoughts.length - 1\n const isActivelyStreaming = isLatest && !thought.isComplete\n return <ThoughtItem key={`iteration-${thought.iteration}`} thought={thought} isActivelyStreaming={isActivelyStreaming} />\n })}\n </AnimatePresence>\n {!showOnlyLast && thoughtsArray.length > maxThoughts && (\n <div className=\"text-xs text-center text-muted-foreground py-1\">\n Showing last {maxThoughts} of {thoughtsArray.length} iterations\n </div>\n )}\n </div>\n )\n}\n\nfunction ThoughtItem({ thought, isActivelyStreaming }: { thought: { iteration: number; content: string; isComplete: boolean }; isActivelyStreaming: boolean }) {\n const [isExpanded, setIsExpanded] = useState(true)\n return (\n <motion.div initial={{ opacity: 0, y: -10 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -10 }} transition={{ duration: 0.2 }}\n className={cn('rounded-lg border overflow-hidden bg-muted/30 dark:bg-muted/10 border-border dark:border-white/10', isActivelyStreaming && 'ring-1 ring-blue-500/20')}>\n <div className=\"flex items-center gap-2 p-3 cursor-pointer hover:bg-muted/50 transition-colors\" onClick={() => setIsExpanded(!isExpanded)}>\n <div className=\"flex-shrink-0\">\n {isActivelyStreaming ? <Loader2 className=\"h-4 w-4 text-muted-foreground animate-spin\" /> : <Brain className=\"h-4 w-4 text-muted-foreground\" />}\n </div>\n <span className=\"text-xs font-medium text-muted-foreground flex-1\">Agent Thinking</span>\n {isExpanded ? <ChevronDown className=\"h-4 w-4 text-muted-foreground\" /> : <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />}\n </div>\n <AnimatePresence>\n {isExpanded && (\n <motion.div initial={{ height: 0, opacity: 0 }} animate={{ height: 'auto', opacity: 1 }} exit={{ height: 0, opacity: 0 }} transition={{ duration: 0.2 }} className=\"overflow-hidden\">\n <div className=\"px-3 pb-3 pt-0\">\n <p className=\"text-sm text-foreground leading-relaxed whitespace-pre-wrap\">\n {thought.content}\n {isActivelyStreaming && <span className=\"inline-block w-1 h-4 ml-0.5 bg-blue-500 animate-pulse\" />}\n </p>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )\n}\n\nexport function AgentThoughtCompact({ thoughts }: { thoughts: AgentThought[] }) {\n const latestThought = thoughts[thoughts.length - 1]\n if (!latestThought) return null\n return (\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-xs text-muted-foreground bg-muted/30 rounded\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n <span className=\"truncate max-w-[300px]\">{latestThought.content}</span>\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n Code2,\n Database,\n Search,\n Wrench,\n CheckCircle2,\n RotateCcw,\n Loader2,\n ChevronDown,\n Clock,\n Copy,\n} from 'lucide-react'\nimport { ToolCall } from '../../types/streaming'\nimport { cn } from '../../utils/cn'\nimport { Prism as _SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { atomDark } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'\nconst SyntaxHighlighter = _SyntaxHighlighter as any\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\nimport { toast } from '../../hooks/use-toast'\n\nfunction getResolvedTheme(): 'light' | 'dark' {\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches)\n return 'dark'\n return 'light'\n}\n\nconst getToolIcon = (toolName: string) => {\n if (toolName.includes('python')) return Code2\n if (toolName.includes('sql')) return Database\n if (toolName.includes('search')) return Search\n return Wrench\n}\n\nconst getStatusIcon = (status: ToolCall['status']) => {\n switch (status) {\n case 'announced':\n return Wrench\n case 'streaming':\n case 'ready':\n case 'executing':\n return Loader2\n case 'success':\n return CheckCircle2\n case 'error':\n return RotateCcw\n default:\n return Clock\n }\n}\n\nconst getStatusColor = (status: ToolCall['status']) => {\n switch (status) {\n case 'announced':\n return 'text-gray-400'\n case 'streaming':\n return 'text-blue-400'\n case 'ready':\n case 'executing':\n return 'text-blue-500'\n case 'success':\n return 'text-green-500'\n case 'error':\n return 'text-muted-foreground'\n default:\n return 'text-gray-500'\n }\n}\n\nfunction ToolCallItem({ toolCall, isLatest = false }: { toolCall: ToolCall; isLatest?: boolean }) {\n const [isExpanded, setIsExpanded] = useState(false)\n const resolvedTheme = getResolvedTheme()\n const ToolIcon = getToolIcon(toolCall.tool_name)\n const StatusIcon = getStatusIcon(toolCall.status)\n const statusColor = getStatusColor(toolCall.status)\n const prevIsLatestRef = React.useRef(isLatest)\n const codeContainerRef = React.useRef<HTMLDivElement>(null)\n\n const hasCode = toolCall.code && toolCall.code.trim().length > 0 && !toolCall.hasPrivateArgs\n const hasOutput =\n toolCall.output && toolCall.output.trim().length > 0 && !toolCall.hasPrivateOutput\n const hasExpandableContent = hasCode || hasOutput\n\n React.useEffect(() => {\n if (toolCall.isStreamingArgs && hasCode) setIsExpanded(true)\n }, [toolCall.isStreamingArgs, hasCode])\n\n const prevStatusRef = React.useRef(toolCall.status)\n React.useEffect(() => {\n if (\n prevIsLatestRef.current &&\n !isLatest &&\n (toolCall.status === 'success' || toolCall.status === 'error')\n )\n setIsExpanded(false)\n prevIsLatestRef.current = isLatest\n }, [isLatest, toolCall.status])\n\n React.useEffect(() => {\n const wasRunning = ['streaming', 'ready', 'executing'].includes(prevStatusRef.current)\n const nowDone = toolCall.status === 'success' || toolCall.status === 'error'\n if (wasRunning && nowDone && !isLatest) {\n const timer = setTimeout(() => setIsExpanded(false), 300)\n prevStatusRef.current = toolCall.status\n return () => clearTimeout(timer)\n }\n prevStatusRef.current = toolCall.status\n }, [toolCall.status, isLatest])\n\n React.useEffect(() => {\n if (codeContainerRef.current && toolCall.isStreamingArgs) {\n codeContainerRef.current.scrollLeft = 0\n codeContainerRef.current.scrollTop = codeContainerRef.current.scrollHeight\n }\n }, [toolCall.code, toolCall.isStreamingArgs])\n\n const getLanguage = () => {\n if (toolCall.tool_name.includes('python')) return 'python'\n if (toolCall.tool_name.includes('sql')) {\n const sqlKeywords = /\\b(SELECT|INSERT|UPDATE|DELETE|CREATE|ALTER|DROP|FROM|WHERE|JOIN)\\b/i\n if (toolCall.code && sqlKeywords.test(toolCall.code)) return 'sql'\n return 'text'\n }\n if (\n toolCall.code &&\n (toolCall.code.trim().startsWith('{') || toolCall.code.trim().startsWith('['))\n ) {\n try {\n JSON.parse(toolCall.code)\n return 'json'\n } catch {\n return 'text'\n }\n }\n return 'javascript'\n }\n\n const handleCopyCode = () => {\n if (toolCall.code) {\n navigator.clipboard.writeText(toolCall.code)\n toast({ title: 'Code Copied' })\n }\n }\n\n const isActive =\n toolCall.status === 'streaming' ||\n toolCall.status === 'ready' ||\n toolCall.status === 'executing'\n\n return (\n <motion.div\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n transition={{ duration: 0.2 }}\n className={cn(\n 'border rounded-lg overflow-hidden bg-card dark:bg-card/50 border-border dark:border-white/10',\n isActive && 'ring-1 ring-blue-500/20'\n )}\n >\n <div\n className={cn(\n 'flex items-center gap-3 p-3',\n hasExpandableContent && 'cursor-pointer hover:bg-muted/50 transition-colors'\n )}\n onClick={() => hasExpandableContent && setIsExpanded(!isExpanded)}\n >\n <div className=\"flex-shrink-0\">\n <div className=\"p-1.5 rounded-lg bg-muted/50\">\n <ToolIcon className=\"h-4 w-4 text-foreground\" />\n </div>\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {toolCall.tool_display_name}\n </span>\n {toolCall.duration_ms != null &&\n toolCall.duration_ms >= 1 &&\n toolCall.status === 'success' && (\n <span className=\"text-xs text-muted-foreground\">\n {toolCall.duration_ms.toFixed(0)}ms\n </span>\n )}\n </div>\n {toolCall.status === 'error' && toolCall.error_message && (\n <p className=\"text-xs text-muted-foreground mt-0.5\">{toolCall.error_message}</p>\n )}\n {toolCall.args_preview && (\n <p className=\"text-xs text-muted-foreground truncate\">{toolCall.args_preview}</p>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={cn('h-4 w-4', statusColor, isActive && 'animate-spin')} />\n {hasExpandableContent && (\n <ChevronDown\n className={cn(\n 'h-4 w-4 text-muted-foreground transition-transform',\n isExpanded && 'rotate-180'\n )}\n />\n )}\n </div>\n </div>\n <AnimatePresence>\n {isExpanded && hasExpandableContent && (\n <motion.div\n initial={{ height: 0 }}\n animate={{ height: 'auto' }}\n exit={{ height: 0 }}\n transition={{ duration: 0.2 }}\n className=\"overflow-hidden\"\n >\n <div className=\"border-t border-border dark:border-white/10 bg-muted/30 p-3 space-y-3\">\n {hasCode && (\n <div className=\"relative group\">\n <ButtonWithTooltip\n tooltipText=\"Copy code\"\n onClick={handleCopyCode}\n variant=\"ghost\"\n className=\"h-7 w-7 p-1 absolute top-2 right-2 z-10 bg-background/80 hover:bg-background opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </ButtonWithTooltip>\n <div\n ref={codeContainerRef}\n className=\"rounded relative overflow-auto scrollbar-hide max-w-full\"\n >\n <SyntaxHighlighter\n language={getLanguage()}\n style={resolvedTheme === 'dark' ? atomDark : oneLight}\n showLineNumbers={!toolCall.isStreamingArgs}\n wrapLines\n wrapLongLines\n className=\"scrollbar-hide\"\n customStyle={{\n margin: 0,\n borderRadius: '0.375rem',\n fontSize: '0.75rem',\n maxHeight: '400px',\n minWidth: '600px',\n }}\n >\n {toolCall.code!}\n </SyntaxHighlighter>\n {toolCall.isStreamingArgs && (\n <span\n className=\"absolute bottom-4 right-4 text-blue-400 font-bold animate-pulse\"\n style={{ fontSize: '1rem', zIndex: 10 }}\n >\n |\n </span>\n )}\n </div>\n </div>\n )}\n {toolCall.status === 'ready' && !hasOutput && (\n <div className=\"flex items-center gap-2 p-3 bg-blue-500/10 rounded border border-blue-500/20\">\n <Loader2 className=\"h-4 w-4 text-blue-500 animate-spin\" />\n <span className=\"text-sm text-blue-500 font-medium\">Executing...</span>\n </div>\n )}\n {hasOutput && (\n <div>\n <pre className=\"text-xs bg-background rounded p-2 overflow-x-auto overflow-y-auto max-h-[200px] scrollbar-hide\">\n <code className=\"text-foreground\">{toolCall.output}</code>\n </pre>\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )\n}\n\ninterface ToolCallDisplayProps {\n toolCalls: ToolCall[]\n className?: string\n showAll?: boolean\n isLatest?: boolean\n}\n\nexport function ToolCallDisplay({\n toolCalls,\n className,\n showAll = false,\n isLatest = false,\n}: ToolCallDisplayProps) {\n const displayedToolCalls = showAll ? toolCalls : toolCalls.slice(-3)\n if (!toolCalls.length) return null\n return (\n <div className={cn('space-y-2', className)}>\n <div className=\"space-y-2\">\n <AnimatePresence mode=\"popLayout\">\n {displayedToolCalls.map((toolCall, index) => (\n <ToolCallItem\n key={`${toolCall.timestamp}-${index}`}\n toolCall={toolCall}\n isLatest={isLatest}\n />\n ))}\n </AnimatePresence>\n </div>\n {!showAll && toolCalls.length > 3 && (\n <div className=\"text-xs text-center text-muted-foreground py-1\">\n Showing last 3 of {toolCalls.length} tool calls\n </div>\n )}\n </div>\n )\n}\n\nexport function ToolCallPill({ toolCall }: { toolCall: ToolCall }) {\n const ToolIcon = getToolIcon(toolCall.tool_name)\n const StatusIcon = getStatusIcon(toolCall.status)\n const statusColor = getStatusColor(toolCall.status)\n const isActive =\n toolCall.status === 'streaming' ||\n toolCall.status === 'ready' ||\n toolCall.status === 'executing'\n return (\n <div\n className={cn(\n 'inline-flex items-center gap-1.5 px-2.5 py-1.5 h-auto rounded-md text-xs border bg-card dark:bg-card/50 border-border dark:border-white/10 whitespace-nowrap',\n isActive && 'ring-1 ring-blue-500/20'\n )}\n >\n <ToolIcon className=\"h-3 w-3 text-muted-foreground flex-shrink-0\" />\n <span className=\"font-medium text-foreground truncate max-w-[140px]\">\n {toolCall.tool_display_name}\n </span>\n {toolCall.duration_ms != null &&\n toolCall.duration_ms >= 1 &&\n toolCall.status === 'success' && (\n <span className=\"text-muted-foreground\">{toolCall.duration_ms.toFixed(0)}ms</span>\n )}\n <StatusIcon\n className={cn('h-3 w-3 flex-shrink-0', statusColor, isActive && 'animate-spin')}\n />\n </div>\n )\n}\n\nexport function CollapsedToolCalls({\n toolCalls,\n className,\n}: {\n toolCalls: ToolCall[]\n className?: string\n}) {\n const [expanded, setExpanded] = useState(false)\n if (!toolCalls.length) return null\n const successCount = toolCalls.filter((t) => t.status === 'success').length\n const errorCount = toolCalls.filter((t) => t.status === 'error').length\n const activeCount = toolCalls.filter((t) =>\n ['streaming', 'ready', 'executing'].includes(t.status)\n ).length\n const allDone = activeCount === 0\n return (\n <div className={cn('space-y-1.5', className)}>\n <button\n onClick={() => setExpanded((v) => !v)}\n className=\"flex items-center gap-2 text-xs text-muted-foreground hover:text-foreground transition-colors py-0.5\"\n >\n <ChevronDown className={cn('h-3.5 w-3.5 transition-transform', expanded && 'rotate-180')} />\n <span>\n {toolCalls.length} tool call{toolCalls.length > 1 ? 's' : ''}\n {allDone ? ' completed' : activeCount > 0 ? ` (${activeCount} running)` : ''}\n {errorCount > 0 && ` · ${errorCount} self-healed`}\n </span>\n {!expanded && allDone && successCount > 0 && (\n <CheckCircle2 className=\"h-3 w-3 text-green-500\" />\n )}\n {!expanded && activeCount > 0 && <Loader2 className=\"h-3 w-3 text-blue-500 animate-spin\" />}\n </button>\n {expanded ? (\n <div className=\"space-y-2\">\n {toolCalls.map((tc, i) => (\n <ToolCallItem key={`${tc.timestamp}-${i}`} toolCall={tc} />\n ))}\n </div>\n ) : (\n <div className=\"flex flex-wrap items-start gap-1.5\">\n {toolCalls.map((tc, i) => (\n <ToolCallPill key={`pill-${tc.timestamp}-${i}`} toolCall={tc} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport function ToolCallCompact({ toolCalls }: { toolCalls: ToolCall[] }) {\n const activeTool = toolCalls.find((t) => ['streaming', 'ready', 'executing'].includes(t.status))\n const toolToShow = activeTool || toolCalls[toolCalls.length - 1]\n if (!toolToShow) return null\n const ToolIcon = getToolIcon(toolToShow.tool_name)\n const StatusIcon = getStatusIcon(toolToShow.status)\n const statusColor = getStatusColor(toolToShow.status)\n const isActive = ['streaming', 'ready', 'executing'].includes(toolToShow.status)\n return (\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-xs bg-muted/30 rounded\">\n <ToolIcon className=\"h-3 w-3 text-muted-foreground\" />\n <span className=\"font-medium\">{toolToShow.tool_display_name}</span>\n <StatusIcon className={cn('h-3 w-3', statusColor, isActive && 'animate-spin')} />\n </div>\n )\n}\n","import React from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { BookmarkFilledIcon, BookmarkIcon } from '@radix-ui/react-icons'\nimport { ButtonWithTooltip } from './ButtonWithTooltip'\nimport ConfettiEffect from './ConfettiEffect'\n\ninterface BookmarkButtonProps {\n isBookmarked: boolean\n onToggle: () => void\n isLoading?: boolean\n}\n\nexport function BookmarkButton({ isBookmarked, onToggle, isLoading }: BookmarkButtonProps) {\n return (\n <div className=\"relative\">\n <ButtonWithTooltip\n tooltipText={isBookmarked ? 'Remove bookmark' : 'Bookmark'}\n onClick={onToggle}\n disabled={isLoading}\n variant=\"ghost\"\n className=\"h-6 w-6\"\n >\n {isLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : isBookmarked ? (\n <BookmarkFilledIcon className=\"h-3.5 w-3.5 text-primary\" />\n ) : (\n <BookmarkIcon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </ButtonWithTooltip>\n <ConfettiEffect showGlobeConfetti={isBookmarked} />\n </div>\n )\n}\n","import React from 'react'\nimport { AnimatePresence, motion } from 'framer-motion'\n\nconst rainbowColors = [\n 'bg-red-400', 'bg-orange-400', 'bg-yellow-400', 'bg-green-400',\n 'bg-blue-400', 'bg-indigo-400', 'bg-purple-400', 'bg-pink-400',\n 'bg-red-500', 'bg-orange-500', 'bg-yellow-500', 'bg-green-500',\n 'bg-blue-500', 'bg-indigo-500', 'bg-purple-500', 'bg-pink-500',\n]\n\nexport default function ConfettiEffect({ showGlobeConfetti }: { showGlobeConfetti: boolean }) {\n return (\n <AnimatePresence>\n {showGlobeConfetti && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"absolute inset-0 pointer-events-none\"\n >\n {Array.from({ length: 25 }).map((_, i) => (\n <motion.div\n key={i}\n className={`absolute w-1.5 h-1.5 ${rainbowColors[Math.floor(Math.random() * rainbowColors.length)]} rounded-full`}\n style={{ top: '50%', left: '50%' }}\n animate={{\n x: [0, (Math.random() - 0.5) * 100],\n y: [0, -Math.random() * 100],\n opacity: [1, 0],\n scale: [0, 1],\n }}\n transition={{ duration: 1 + Math.random(), ease: 'easeOut' }}\n />\n ))}\n </motion.div>\n )}\n </AnimatePresence>\n )\n}\n","import React from 'react'\nimport { ButtonWithTooltip } from './ButtonWithTooltip'\nimport { Loader2, Split } from 'lucide-react'\n\ninterface BranchButtonProps {\n onBranch: () => void\n isLoading?: boolean\n tooltipText?: string\n}\n\nexport function BranchButton({ onBranch, isLoading, tooltipText = 'Branch conversation' }: BranchButtonProps) {\n return (\n <ButtonWithTooltip\n tooltipText={tooltipText}\n onClick={onBranch}\n disabled={isLoading}\n variant=\"ghost\"\n className=\"h-6 w-6\"\n >\n {isLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : (\n <Split className=\"h-3.5 w-3.5 rotate-90 text-muted-foreground\" />\n )}\n </ButtonWithTooltip>\n )\n}\n","import React, { useState } from 'react'\nimport { Loader2, ThumbsDown, ThumbsUp } from 'lucide-react'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { Button } from '../ui/button'\nimport ConfettiEffect from './ConfettiEffect'\nimport { cn } from '../../utils/cn'\n\ninterface FeedbackButtonsProps {\n onFeedback: (type: 'positive' | 'negative') => void\n className?: string\n isLoading?: boolean\n selectedFeedback?: 'positive' | 'negative' | null\n loadingType?: 'positive' | 'negative' | null\n}\n\nexport function FeedbackButtons({\n onFeedback,\n className,\n isLoading = false,\n selectedFeedback = null,\n loadingType = null,\n}: FeedbackButtonsProps) {\n const [showConfetti, setShowConfetti] = useState(false)\n\n const handlePositiveFeedback = () => {\n setShowConfetti(true)\n onFeedback('positive')\n setTimeout(() => setShowConfetti(false), 2000)\n }\n\n if (selectedFeedback) {\n return (\n <TooltipProvider>\n <div className={cn('flex items-center gap-1', className)}>\n {selectedFeedback === 'positive' ? (\n <div className=\"relative\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0 cursor-default\" disabled>\n <ThumbsUp className=\"h-3.5 w-3.5 fill-current\" />\n </Button>\n </div>\n </TooltipTrigger>\n <TooltipContent><p>Good response</p></TooltipContent>\n </Tooltip>\n <ConfettiEffect showGlobeConfetti={false} />\n </div>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <div>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0 cursor-default\" disabled>\n <ThumbsDown className=\"h-3.5 w-3.5 fill-current\" />\n </Button>\n </div>\n </TooltipTrigger>\n <TooltipContent><p>Bad response</p></TooltipContent>\n </Tooltip>\n )}\n </div>\n </TooltipProvider>\n )\n }\n\n return (\n <TooltipProvider>\n <div className={cn('flex items-center gap-1', className)}>\n <div className=\"relative\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn('h-6 w-6 p-0 hover:bg-muted/50', isLoading && 'opacity-50 cursor-not-allowed')}\n onClick={handlePositiveFeedback}\n disabled={isLoading}\n >\n {isLoading && loadingType === 'positive' ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : (\n <ThumbsUp className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent><p>Good response</p></TooltipContent>\n </Tooltip>\n <ConfettiEffect showGlobeConfetti={showConfetti} />\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn('h-6 w-6 p-0 hover:bg-muted/50', isLoading && 'opacity-50 cursor-not-allowed')}\n onClick={() => onFeedback('negative')}\n disabled={isLoading}\n >\n {isLoading && loadingType === 'negative' ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : (\n <ThumbsDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent><p>Bad response</p></TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n )\n}\n","import Lottie from 'lottie-react'\nimport { cn } from '../../utils/cn'\nimport loadingAnimation from '../../assets/loading.json'\n\ninterface ThinkingLogoProps {\n className?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst sizeClasses = {\n sm: { container: 'h-7 w-7', logo: 'h-3 w-3' },\n md: { container: 'h-8 w-8', logo: 'h-4 w-4' },\n lg: { container: 'h-10 w-10', logo: 'h-5 w-5' },\n}\n\nexport function ThinkingLogo({ className, size = 'md' }: ThinkingLogoProps) {\n return (\n <div\n className={cn(\n 'relative flex items-center justify-center',\n sizeClasses[size].container,\n className\n )}\n >\n {/* Circular spinner */}\n <div className=\"absolute inset-0 rounded-full border-2 border-y-primary/80 border-x-transparent animate-spin\" />\n\n {/* Lottie animation - position relative to container */}\n <div className=\"absolute inset-0 flex items-center justify-center border-none\">\n <Lottie\n animationData={loadingAnimation}\n loop={true}\n renderer=\"svg\"\n style={{\n width: '70%',\n height: '70%',\n background: 'transparent',\n border: 'none !important',\n outline: 'none',\n }}\n />\n </div>\n </div>\n )\n}\n","{\"assets\":[{\"id\":\"7\",\"layers\":[{\"ind\":6,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[44,43]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[88,86]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-12.07,0.13],[0.8,-17.21],[16.87,0.13],[0.04,0],[-0.04,0],[0.4,16.91]],\"o\":[[0.93,23.47],[-19.83,1.5],[-0.73,-18.8],[-0.04,0],[0.04,0],[17.47,0.07],[0,0]],\"v\":[[33.27,0.16],[65.78,32.11],[33.14,64.19],[0.75,32.24],[0.64,32.24],[0.75,32.24],[33.27,0.16]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"12\",\"layers\":[{\"ind\":11,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[26,25.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[52,51]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-7.06,0.08],[0.46,-10.07],[9.88,0.07],[0.23,9.9]],\"o\":[[0.54,13.73],[-11.61,0.88],[-0.43,-11],[10.22,0.04],[0,0]],\"v\":[[19.55,0.71],[38.57,19.41],[19.47,38.18],[0.52,19.49],[19.55,0.71]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"16\",\"layers\":[{\"ind\":15,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[49.5,49]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[99,98]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-13.7,0.15],[0.91,-19.54],[19.14,0.14],[0.04,0],[-0.04,0],[0.45,19.2]],\"o\":[[1.05,26.64],[-22.51,1.7],[-0.82,-21.34],[-0.04,0],[0.04,0],[19.82,0.07],[0,0]],\"v\":[[37.11,0.41],[73.99,36.66],[36.95,73.07],[0.2,36.81],[0.07,36.81],[0.2,36.81],[37.11,0.41]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"19\",\"layers\":[{\"ind\":18,\"ty\":0,\"ks\":{},\"w\":99,\"h\":98,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"16\"}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[152.5,166]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[305,332]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[-2.54,0],[-2.21,-1.23],[0,0],[-1.23,-2.15],[0.02,-2.46],[1.27,-2.13],[2.18,-1.24],[0,0],[1.27,-2.18],[-0.02,-2.51],[0,0],[1.27,-2.13],[2.18,-1.24],[2.52,-0.02],[2.2,1.21],[0,0],[1.27,2.15],[0.01,2.48],[0,0],[0,0],[5.61,0],[0.11,-5.42],[0,0],[0,0],[-1.69,-2.9],[-2.93,-1.71],[0,0],[-3.5,0.02],[-3,1.77],[0,0],[-1.7,2.9],[0,3.34],[0,0],[1.71,2.92],[2.96,1.7],[0,0],[3.47,0],[2.99,-1.71],[0,0],[0,0],[0,0],[-2.69,-5.17],[-5.49,3.19],[0,0]],\"o\":[[0,0],[2.21,-1.23],[2.54,0],[0,0],[2.16,1.27],[1.23,2.15],[-0.02,2.46],[-1.26,2.13],[0,0],[-2.22,1.25],[-1.28,2.18],[0,0],[-0.02,2.47],[-1.27,2.13],[-2.18,1.23],[-2.52,0.02],[0,0],[-2.2,-1.24],[-1.27,-2.15],[0,0],[0,0],[0,-5.51],[-5.54,0],[0,0],[0,0],[0.01,3.34],[1.69,2.9],[0,0],[3.02,1.73],[3.5,-0.02],[0,0],[2.94,-1.7],[1.69,-2.9],[0,0],[0.01,-3.36],[-1.71,-2.92],[0,0],[-2.99,-1.71],[-3.47,0],[0,0],[0,0],[0,0],[-5.12,2.89],[2.9,5.59],[0,0],[0,0]],\"v\":[[94.61,34.31],[98.2,32.29],[105.44,30.41],[112.68,32.29],[142.51,49.54],[147.68,54.75],[149.53,61.8],[147.57,68.81],[142.32,73.95],[86.59,104.67],[81.25,109.9],[79.32,117.05],[79.32,179.32],[77.36,186.33],[72.1,191.47],[64.94,193.38],[57.75,191.56],[27.89,174.9],[22.6,169.73],[20.65,162.66],[20.65,152.33],[20.7,152.33],[10.55,142.35],[0.4,152.13],[0.4,152.13],[0.4,175.18],[3,184.7],[10.05,191.73],[104.84,245.68],[114.8,248.29],[124.73,245.55],[218.86,190.92],[225.93,183.91],[228.51,174.38],[228.51,73.62],[225.92,64.03],[218.79,56.98],[124.65,3.34],[114.78,0.71],[104.91,3.34],[89.52,12.1],[89.52,12.07],[82.46,16.05],[78.11,30.43],[93.6,34.85],[94.59,34.27]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[0,0],[-1.21,2.01],[-2.09,1.11],[0,0],[-1.17,1.95],[-0.02,2.26],[1.14,1.97],[1.99,1.15],[0,0],[2.32,0],[2.02,-1.13],[0,0],[1.16,-1.96],[0,-2.27],[0,0],[-1.17,-1.97],[-2.02,-1.12],[0,0],[-2.31,0.01],[-1.99,1.14],[-1.15,1.96],[0.01,2.26]],\"o\":[[0,0],[0,0],[-0.02,-2.33],[1.21,-2.01],[0,0],[2.01,-1.11],[1.17,-1.95],[0.02,-2.26],[-1.14,-1.97],[0,0],[-2.02,-1.13],[-2.32,0],[0,0],[-2.01,1.14],[-1.16,1.96],[0,0],[-0.01,2.28],[1.17,1.97],[0,0],[2.01,1.12],[2.31,-0.01],[2,-1.14],[1.15,-1.96],[0,0]],\"v\":[[144.49,189.36],[144.49,147.77],[144.45,147.91],[146.26,141.27],[151.3,136.5],[188.54,115.96],[193.4,111.29],[195.21,104.86],[193.51,98.41],[188.73,93.66],[170.85,83.3],[164.24,81.58],[157.62,83.3],[106.94,111.85],[102.11,116.59],[100.35,123.05],[100.35,179.41],[102.11,185.9],[106.98,190.61],[124.8,200.61],[131.39,202.3],[137.95,200.54],[142.75,195.81],[144.49,189.36]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,2.27],[0,0],[1.12,1.93],[1.95,1.14],[2.26,0.05],[2,-1.04],[0,0],[1.22,-1.99],[0,-2.32],[0,0],[-1.14,-1.95],[-1.98,-1.13],[-2.29,-0.02],[-2,1.1],[0,0],[-1.17,1.95]],\"o\":[[1.17,-1.96],[0,0],[0,-2.22],[-1.12,-1.93],[-1.94,-1.14],[-2.27,-0.05],[0,0],[-2.09,1.1],[-1.22,2],[0,0],[0,2.24],[1.14,1.94],[1.98,1.13],[2.29,0.02],[0,0],[2.02,-1.11],[0,0]],\"v\":[[206.57,173.62],[208.36,167.17],[208.38,147.91],[206.67,141.59],[202,136.91],[195.58,135.09],[189.07,136.59],[171.12,146.05],[166.06,150.77],[164.19,157.36],[164.19,177.12],[165.94,183.51],[170.7,188.2],[177.22,189.95],[183.76,188.3],[201.7,178.3],[206.57,173.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"r\":2,\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":660,\"ip\":0,\"layers\":[{\"ind\":9,\"ty\":0,\"parent\":5,\"ks\":{},\"w\":88,\"h\":86,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"7\"},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[44,43]},\"p\":{\"a\":0,\"k\":[50.398,115.453]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":28.2,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":58.2,\"s\":[150,150],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":106.2,\"s\":[117,117],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":117,\"s\":[117,117],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":165,\"s\":[85,85],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":192.6,\"s\":[30,30],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":225,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":240,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":14,\"ty\":0,\"parent\":10,\"ks\":{},\"w\":52,\"h\":51,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"12\"},{\"ind\":10,\"ty\":3,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[26,25.5]},\"p\":{\"a\":0,\"k\":[25.398,31.953]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":48,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":96,\"s\":[150,150],\"i\":{\"x\":[0.013,0.013],\"y\":[0.975,0.975]},\"o\":{\"x\":[0.513,0.513],\"y\":[0,0]}},{\"t\":142.2,\"s\":[40.05,40.05],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":190.2,\"s\":[150,150],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":238.2,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":240,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":21,\"ty\":0,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[49.5,49]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100],\"h\":1},{\"t\":157.2,\"s\":[100],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":205.2,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":217.8,\"s\":[100],\"h\":1},{\"t\":240,\"s\":[100],\"h\":1}]},\"p\":{\"a\":0,\"k\":[102.898,48.453]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[0.013,0.013],\"y\":[0.975,0.975]},\"o\":{\"x\":[0.513,0.513],\"y\":[0,0]}},{\"t\":46.2,\"s\":[149.98,149.98],\"h\":1},{\"t\":46.2,\"s\":[150,150],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":94.2,\"s\":[50,50],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":142.2,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":190.2,\"s\":[25,25],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":205.2,\"s\":[25,25],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":217.8,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":240,\"s\":[100,100],\"h\":1}]}},\"w\":99,\"h\":98,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"19\"},{\"ind\":4,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[-0.088,21.594]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":26,\"ty\":0,\"parent\":22,\"ks\":{},\"w\":305,\"h\":332,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"24\"},{\"ind\":22,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[35.313,-0.953]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[149.691,164.954]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":27,\"ty\":4,\"parent\":2,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[330,330]},\"r\":{\"a\":0,\"k\":206229.375},\"s\":{\"a\":0,\"k\":[660,660]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.243,0.698,0.459]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":2,\"ty\":3,\"parent\":1,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":1,\"ty\":3,\"parent\":0,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":0,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":240,\"v\":\"5.7.4\",\"w\":660}","import React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface LogoStandAloneProps {\n className?: string\n}\n\nconst LogoStandAlone = ({ className }: LogoStandAloneProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"45\"\n height=\"51\"\n viewBox=\"0 0 45 51\"\n fill=\"none\"\n className={cn(className)}\n >\n <path\n d=\"M43.0811 11.7987L24.5117 0.964833C23.921 0.617926 23.2488 0.435059 22.5643 0.435059C21.8797 0.435059 21.2075 0.617926 20.6169 0.964833L1.90456 11.875C1.32501 12.2182 0.844612 12.7067 0.510658 13.2925C0.176703 13.8783 0.000708569 14.5412 0 15.2158V35.6712C0.00211576 36.3456 0.178704 37.008 0.512521 37.5935C0.846338 38.1791 1.32597 38.6678 1.90456 39.0121L20.6026 49.9079C21.1985 50.2571 21.8772 50.4392 22.5675 50.435C23.2578 50.4308 23.9343 50.2405 24.526 49.8841L43.0954 38.8498C43.6759 38.5077 44.1571 38.0195 44.4912 37.4334C44.8253 36.8474 45.0007 36.1839 45 35.509V15.1586C45.0016 14.4792 44.8252 13.8112 44.4885 13.2216C44.1518 12.632 43.6665 12.1413 43.0811 11.7987ZM15.5698 23.9306V36.5064C15.5656 37.0043 15.4321 37.4924 15.1822 37.9227C14.9324 38.353 14.575 38.7106 14.1453 38.9602C13.7155 39.2098 13.2283 39.3427 12.7316 39.346C12.235 39.3492 11.746 39.2226 11.3131 38.9787L5.42323 35.614C4.99007 35.3633 4.63015 35.003 4.37948 34.5692C4.1288 34.1353 3.99616 33.6431 3.99481 33.1418V17.3015C3.99616 16.8001 4.1288 16.3079 4.37948 15.8741C4.63015 15.4402 4.99007 15.0799 5.42323 14.8293L19.2932 6.81128C19.7286 6.56317 20.2208 6.43273 20.7216 6.43273C21.2224 6.43273 21.7147 6.56317 22.15 6.81128L28.0351 10.2953C28.4606 10.5518 28.812 10.9151 29.0547 11.3493C29.2974 11.7835 29.423 12.2736 29.4192 12.7712C29.4153 13.2689 29.2822 13.757 29.0328 14.1873C28.7834 14.6177 28.4264 14.9755 27.997 15.2254L17.003 21.4298C16.5647 21.6823 16.2011 22.0468 15.9493 22.4861C15.6975 22.9255 15.5666 23.424 15.5698 23.9306ZM28.4256 30.135V38.5348C28.4268 38.9914 28.3082 39.4403 28.0819 39.8365C27.8555 40.2328 27.5292 40.5624 27.1358 40.7925C26.7423 41.0226 26.2954 41.145 25.8399 41.1474C25.3844 41.1499 24.9362 41.0324 24.5403 40.8066L21.0263 38.7878C20.6269 38.5617 20.2949 38.2328 20.0647 37.8351C19.8346 37.4374 19.7145 36.9853 19.717 36.5255V25.1429C19.716 24.6845 19.8357 24.234 20.0639 23.8368C20.2921 23.4396 20.6208 23.1098 21.0168 22.8807L31.0158 17.1153C31.4127 16.8867 31.8626 16.7664 32.3204 16.7664C32.7782 16.7664 33.228 16.8867 33.625 17.1153L37.1532 19.2057C37.5458 19.4374 37.8707 19.7685 38.0951 20.1659C38.3196 20.5632 38.4357 21.0128 38.4319 21.4694C38.428 21.9261 38.3043 22.3736 38.0731 22.7671C37.842 23.1606 37.5116 23.4862 37.1151 23.7111L29.7683 27.8585C29.3554 28.0836 29.0115 28.4171 28.7733 28.8231C28.5351 29.2292 28.4116 29.6926 28.416 30.1637L28.4256 30.135ZM41.0242 34.0533C41.0237 34.5112 40.9017 34.9606 40.6708 35.3556C40.4398 35.7506 40.1083 36.077 39.7101 36.3012L36.1724 38.32C35.7786 38.5424 35.3336 38.6576 34.8817 38.6542C34.4297 38.6508 33.9865 38.5289 33.5961 38.3007C33.2057 38.0725 32.8816 37.7458 32.6562 37.3532C32.4307 36.9606 32.3117 36.5156 32.3109 36.0626V32.0727C32.3118 31.6035 32.4393 31.1434 32.6798 30.7409C32.9204 30.3384 33.2651 30.0087 33.6774 29.7866L37.2199 27.8776C37.6142 27.6668 38.0562 27.5618 38.5029 27.5729C38.9497 27.584 39.386 27.7108 39.7694 27.9409C40.1528 28.171 40.4703 28.4966 40.691 28.8861C40.9117 29.2756 41.0282 29.7157 41.029 30.1637L41.0242 34.0533Z\"\n fill=\"url(#paint0_angular_258_754)\"\n />\n <defs>\n <radialGradient\n id=\"paint0_angular_258_754\"\n cx=\"0\"\n cy=\"0\"\n r=\"1\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"translate(-6.41239e-07 13.5597) rotate(27.8141) scale(51.1419 51.2099)\"\n >\n <stop stopColor=\"#3ECF8E\" />\n <stop offset=\"0.5\" stopColor=\"#218759\" />\n <stop offset=\"1\" stopColor=\"#43E09A\" />\n </radialGradient>\n </defs>\n </svg>\n )\n}\n\nexport default LogoStandAlone\n","import { useEffect, useState } from 'react'\nimport { cn } from '../utils/cn'\n\ninterface MorphGradientProps {\n className?: string\n}\n\nexport default function MorphGradient({ className }: MorphGradientProps) {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) return null\n\n return (\n <div className={cn('absolute inset-0 rounded-lg overflow-hidden', className)}>\n <div className=\"absolute inset-0 bg-background/80\" />\n <div className=\"absolute inset-0\">\n <div className=\"absolute h-[40%] aspect-square top-[20%] left-[30%] animate-morph-slow border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(139,92,246,0.3)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[45%] aspect-square bottom-[25%] right-[20%] animate-morph-medium border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(16,185,129,0.25)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[35%] aspect-square top-[30%] right-[35%] animate-morph-fast border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(248,113,113,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[50%] aspect-square bottom-[15%] left-[25%] animate-morph-slower border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(79,70,229,0.25)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[30%] aspect-square top-[40%] left-[45%] animate-morph-fast border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(236,72,153,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[25%] aspect-square top-[15%] right-[40%] animate-morph-medium border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(234,179,8,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[20%] aspect-square bottom-[40%] left-[15%] animate-bounce-slow border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(139,92,246,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[15%] aspect-square top-[45%] right-[15%] animate-bounce-slow border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(16,185,129,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[35%] aspect-square -left-[10%] top-[30%] animate-edge-float border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(99,102,241,0.25)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[40%] aspect-square -right-[15%] bottom-[40%] animate-edge-float-reverse border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(244,114,182,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[30%] aspect-square -top-[10%] -left-[10%] animate-corner-float border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(34,197,94,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[25%] aspect-square -bottom-[5%] -right-[5%] animate-corner-float border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(249,115,22,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[20%] aspect-square -top-[5%] right-[20%] animate-edge-float border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(168,85,247,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[15%] aspect-square -bottom-[8%] left-[30%] animate-edge-float-reverse border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(59,130,246,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n </div>\n <div className=\"absolute inset-0 backdrop-blur-[40px]\" />\n </div>\n )\n}\n","import React, { useCallback, useRef, useState } from 'react'\nimport { Clock, Loader2, MessageSquare } from 'lucide-react'\nimport { usePapermapStoreApi, CHAT_MODAL_TAB } from '../../store'\nimport { RecentConversationItem } from '../common/RecentConversationItem'\nimport { DeleteConfirmationModal } from './DeleteConfirmationModal'\nimport { toast } from '../../hooks/use-toast'\nimport type { ConversationHistory } from '../../types/chart'\nimport { useInfiniteQuery, useQueryClient } from '@tanstack/react-query'\n\nexport function RecentConversations() {\n const storeApi = usePapermapStoreApi()\n const config = storeApi.getState().getConfig()\n const { chartSvc } = storeApi.getState().getServices()\n\n const [chatToDelete, setChatToDelete] = useState<ConversationHistory | null>(null)\n const [isDeleting, setIsDeleting] = useState(false)\n const scrollRef = useRef<HTMLDivElement>(null)\n const queryClient = useQueryClient()\n\n const dashboardId = config.dashboardId\n\n const fetchPage = useCallback(\n async ({ pageParam = 1 }: { pageParam?: number }) => {\n const result = await chartSvc.getConversationHistory({\n dashboard_id: dashboardId,\n per_page: 10,\n page: pageParam,\n })\n const chats = result?.data?.chats || []\n const pages = result?.data?.total_pages || 0\n return {\n chats,\n nextPage: pageParam + 1,\n totalPages: pages,\n }\n },\n [chartSvc, dashboardId]\n )\n\n const { data, isLoading, isRefetching, isFetchingNextPage, fetchNextPage, hasNextPage } =\n useInfiniteQuery({\n queryKey: ['conversationHistory', dashboardId],\n queryFn: fetchPage,\n getNextPageParam: (lastPage) => {\n if (lastPage.nextPage <= lastPage.totalPages) {\n return lastPage.nextPage\n }\n return undefined\n },\n initialPageParam: 1,\n enabled: !!dashboardId,\n // Avoid infinite retries on persistent failures; user can manually retry.\n retry: 1,\n retryDelay: 1000,\n })\n\n const cachedConversations = data?.pages.flatMap((page) => page.chats) || []\n\n const handleScroll = useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollHeight, clientHeight } = event.currentTarget\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100\n if (isNearBottom && hasNextPage && !isFetchingNextPage) {\n fetchNextPage()\n }\n },\n [fetchNextPage, hasNextPage, isFetchingNextPage]\n )\n\n const handleConversationClick = (conversation: ConversationHistory) => {\n const state = storeApi.getState()\n state.setEditChatId(null)\n state.setChatId(conversation.llm_data_chat_id)\n state.setChatModalTab(CHAT_MODAL_TAB.CHAT)\n state.updateAllMeta(conversation.meta || {})\n state.updateChartData([])\n state.setMessages([])\n }\n\n const handleDeleteChart = async (id: string) => {\n try {\n setIsDeleting(true)\n await chartSvc.deleteChart(id)\n await queryClient.invalidateQueries({ queryKey: ['conversationHistory', dashboardId] })\n toast({ title: 'Success', description: 'Conversation deleted successfully' })\n setChatToDelete(null)\n } catch (error) {\n console.error('error', error)\n toast({\n title: 'Error',\n description: 'Failed to delete conversation',\n variant: 'destructive',\n })\n } finally {\n setIsDeleting(false)\n }\n }\n\n const handleDeleteClick = (\n e: React.MouseEvent<HTMLButtonElement>,\n conversation: ConversationHistory\n ) => {\n e.stopPropagation()\n setChatToDelete(conversation)\n }\n\n return (\n <div className=\"flex flex-col w-full h-full\">\n <div className=\"flex items-center justify-between p-4 border-b border-border/50\">\n <div className=\"flex items-center gap-2 text-foreground\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-sm font-medium\">Recent Conversations</span>\n </div>\n <div className=\"flex gap-2\">\n {isRefetching && (\n <div className=\"flex items-center mx-auto gap-2 text-xs text-muted-foreground\">\n <Loader2 className=\"size-3 animate-spin\" />\n <p>Refreshing</p>\n </div>\n )}\n <span className=\"text-xs text-muted-foreground\">\n {cachedConversations.length} conversations\n </span>\n </div>\n </div>\n\n {isLoading && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <Loader2 className=\"h-6 w-6 text-muted-foreground animate-spin\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">Loading chats...</h3>\n <p className=\"text-xs text-muted-foreground\">\n Please wait while we fetch your conversation history\n </p>\n </div>\n )}\n\n {!isLoading && (\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"flex-1 overflow-auto scrollbar-hide\"\n >\n <div className=\"flex flex-col gap-1 p-2\">\n {cachedConversations.map((conversation, index) => (\n <RecentConversationItem\n key={conversation.llm_data_chat_id}\n conversation={conversation}\n index={index}\n handleConversationClick={handleConversationClick}\n handleDeleteClick={handleDeleteClick}\n />\n ))}\n </div>\n {isFetchingNextPage && (\n <div className=\"flex justify-center py-4\">\n <div className=\"size-4 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n )}\n </div>\n )}\n\n {!isLoading && cachedConversations.length === 0 && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <MessageSquare className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">No Recent Conversations yet</h3>\n <p className=\"text-xs text-muted-foreground\">\n Start a new chat to see your recent conversations here\n </p>\n </div>\n )}\n\n <DeleteConfirmationModal\n isOpen={!!chatToDelete}\n onClose={() => setChatToDelete(null)}\n isDeleting={isDeleting}\n onConfirm={() => chatToDelete && handleDeleteChart(chatToDelete.llm_data_chat_id)}\n title=\"Delete Conversation\"\n description=\"Are you sure you want to delete this conversation? This action cannot be undone.\"\n />\n </div>\n )\n}\n","import React from 'react'\nimport { MessageSquare, Trash2 } from 'lucide-react'\nimport { motion } from 'framer-motion'\nimport { cn } from '../../utils/cn'\nimport type { ConversationHistory } from '../../types/chart'\n\ntype RecentConversationItemProps = {\n conversation: ConversationHistory\n index: number\n handleConversationClick: (conversation: ConversationHistory) => void\n handleDeleteClick: (e: React.MouseEvent<HTMLButtonElement>, conversation: ConversationHistory) => void\n}\n\nexport function RecentConversationItem({\n conversation,\n index,\n handleConversationClick,\n handleDeleteClick,\n}: RecentConversationItemProps) {\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={cn(\n 'flex items-start gap-3 p-3 rounded-xl transition-all duration-200',\n 'hover:bg-muted/50 group cursor-pointer',\n 'border border-transparent hover:border-border/50',\n 'relative overflow-hidden'\n )}\n onClick={() => handleConversationClick(conversation)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleConversationClick(conversation)\n }}\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 ring-1 ring-inset ring-primary/5\">\n <MessageSquare className=\"size-4 text-primary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">\n {conversation?.name || `Untitled ${index + 1}`}\n </span>\n </div>\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground/80 leading-relaxed\">\n {conversation?.meta?.subtitle || 'No description'}\n </p>\n {conversation?.latest_user_name ? (\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Last from {conversation.latest_user_name}\n </p>\n ) : null}\n </div>\n <span className=\"text-[10px] text-muted-foreground shrink-0 tabular-nums\">\n {conversation?.created_at\n ? new Date(conversation.created_at).toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n : ''}\n </span>\n </div>\n </div>\n <div\n className={cn(\n 'absolute right-2 top-1 opacity-0 group-hover:opacity-100',\n 'transition-all duration-200 ease-in-out transform translate-x-4 group-hover:translate-x-0'\n )}\n >\n <motion.button\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.95 }}\n onClick={(e) => handleDeleteClick(e as any, conversation)}\n className=\"p-2 rounded-full hover:bg-muted flex items-center justify-center group/delete\"\n >\n <Trash2 className=\"h-4 w-4 text-muted-foreground group-hover/delete:text-destructive transition-colors\" />\n </motion.button>\n </div>\n </motion.div>\n )\n}\n","import React from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { Dialog, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription } from '../ui/dialog'\nimport { Button } from '../ui/button'\n\ninterface DeleteConfirmationModalProps {\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title?: string\n description?: string\n isDeleting?: boolean\n}\n\nexport function DeleteConfirmationModal({\n isOpen,\n onClose,\n onConfirm,\n title = 'Are you sure?',\n description = 'This action cannot be undone.',\n isDeleting,\n}: DeleteConfirmationModalProps) {\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={isDeleting}>Cancel</Button>\n <Button variant=\"destructive\" onClick={onConfirm} disabled={isDeleting}>\n {isDeleting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Deleting...\n </>\n ) : (\n 'Delete'\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { Clock, Loader2, MessageSquare } from 'lucide-react'\nimport { Card, CardContent, CardHeader } from '../ui/card'\nimport { HistoryChartCard } from './HistoryChartCard'\nimport { usePapermapStore, usePapermapStoreApi, openPapermapChatAssistant } from '../../store'\nimport { toast } from '../../hooks/use-toast'\nimport type { ChartResponse, TChartResponse } from '../../types/chart'\n\nexport function ChartHistory() {\n const chatId = usePapermapStore((s) => s.chatId)\n const storeApi = usePapermapStoreApi()\n const { chartSvc } = storeApi.getState().getServices()\n\n const [charts, setCharts] = useState<ChartResponse[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isLoadingMore, setIsLoadingMore] = useState(false)\n const [totalPages, setTotalPages] = useState(0)\n const [currentPage, setCurrentPage] = useState(1)\n const scrollRef = useRef<HTMLDivElement>(null)\n\n const chatIdToUse = chatId\n\n const fetchCharts = async (page: number) => {\n try {\n const result = await chartSvc.getChartHistory({\n chat_id: chatIdToUse ?? '',\n per_page: 4,\n page,\n })\n\n if (page === 1) {\n setCharts(result?.data?.charts || [])\n } else {\n setCharts((prev) => [...prev, ...(result?.data?.charts || [])])\n }\n setTotalPages(result?.data?.total_pages || 0)\n setCurrentPage(page)\n } catch (error) {\n console.error('Error fetching charts:', error)\n } finally {\n setIsLoading(false)\n setIsLoadingMore(false)\n }\n }\n\n useEffect(() => {\n if (chatIdToUse) {\n setIsLoading(true)\n setIsLoadingMore(true)\n fetchCharts(1)\n }\n }, [chatIdToUse])\n\n const handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollHeight, clientHeight } = event.currentTarget\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 50\n if (isNearBottom && !isLoadingMore && currentPage < totalPages) {\n setIsLoadingMore(true)\n fetchCharts(currentPage + 1)\n }\n }\n\n const handleEditChart = (chartId: string, chart?: TChartResponse) => {\n openPapermapChatAssistant(storeApi, { editChartId: chartId, chart: chart ?? undefined })\n }\n\n const handleDeleteChart = (chart: TChartResponse) => {\n toast({\n title: 'Delete Chart',\n description: `Deleting chart with ID: ${chart.llm_data_chat_id}`,\n })\n }\n\n const handleRefetch = () => {\n fetchCharts(1)\n }\n\n return (\n <div className=\"flex flex-col w-full h-full p-6\">\n <div className=\"flex items-center justify-between p-3 border-b border-border/50\">\n <div className=\"flex items-center gap-2 text-foreground\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-sm font-medium\">Charts History</span>\n </div>\n </div>\n\n {isLoading && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <Loader2 className=\"h-6 w-6 text-muted-foreground animate-spin\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">Loading charts...</h3>\n <p className=\"text-xs text-muted-foreground\">\n Please wait while we fetch your chart history\n </p>\n </div>\n )}\n\n {!isLoading && (\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"flex-1 overflow-auto scrollbar-hide [mask-image:linear-gradient(to_bottom,transparent_0,black_8%,black_92%,transparent_100%)]\"\n >\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4 p-4\">\n {charts.map((chart, index) => (\n <Card\n key={index}\n className=\"overflow-hidden hover:shadow-md transition-shadow group border-0\"\n >\n <CardHeader className=\"p-4 pb-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex h-6 w-6 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <span className=\"text-xs font-medium\">{index + 1}</span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium\">\n {chart.visualization_config?.title || 'Untitled Chart'}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {new Date().toLocaleDateString()}\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"rounded-full bg-muted px-2 py-1 text-xs font-medium text-muted-foreground\">\n {chart.chart_type?.toUpperCase()}\n </span>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"p-4 pt-0\">\n <div className=\"w-full h-[300px]\">\n <HistoryChartCard\n chart={{\n chart_response: chart as any,\n llm_data_chat_id: chatIdToUse ?? '',\n name: `Chart ${index + 1}`,\n meta: {\n title: `Chart ${index + 1}`,\n description: chart.text_response,\n footer: '',\n showLegend: true,\n },\n pin: false,\n }}\n onDeleteClick={handleDeleteChart}\n onEditClick={handleEditChart}\n triggerRefetch={handleRefetch}\n />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n {isLoadingMore && (\n <div className=\"flex justify-center py-4\">\n <div className=\"size-4 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n )}\n </div>\n )}\n\n {!isLoading && charts.length === 0 && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <MessageSquare className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">No Charts History yet</h3>\n <p className=\"text-xs text-muted-foreground\">\n Start a new chat to see your charts history here\n </p>\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('rounded-xl border bg-card text-card-foreground shadow', className)} {...props} />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn('font-semibold leading-none tracking-tight', className)} {...props} />\n))\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(({ className, ...props }, ref) => (\n <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...props} />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import React, { useState } from 'react'\nimport { Loader2, Maximize2, Pencil, Trash2 } from 'lucide-react'\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\nimport { ChartDialog } from '../charts/ChartDialog'\nimport { ChartView } from '../charts/ChartView'\nimport { DeleteConfirmationModal } from './DeleteConfirmationModal'\nimport { cn } from '../../utils/cn'\nimport { toast } from '../../hooks/use-toast'\nimport type { TChartResponse } from '../../types/chart'\n\ninterface HistoryChartCardProps {\n chart: TChartResponse\n onDeleteClick: (chart: TChartResponse) => void\n /** Called with chart id; can optionally pass full chart for variant/metadata (plugin passes chart). */\n onEditClick: (chartId: string, chart?: TChartResponse) => void\n onToggleActive?: (id: string) => void\n triggerRefetch?: () => void\n isActive?: boolean\n}\n\nexport function HistoryChartCard({\n chart,\n onDeleteClick,\n onEditClick,\n isActive = false,\n}: HistoryChartCardProps) {\n const [showDeleteDialog, setShowDeleteDialog] = useState(false)\n const [showMaximized, setShowMaximized] = useState(false)\n const [isDeleting, setIsDeleting] = useState(false)\n\n const handleDelete = async () => {\n setIsDeleting(true)\n try {\n await onDeleteClick(chart)\n setShowDeleteDialog(false)\n toast({ title: 'Success', description: 'Chart deleted successfully' })\n } catch (error) {\n console.error('Error deleting chart:', error)\n toast({ title: 'Error', description: 'Failed to delete chart', variant: 'destructive' })\n } finally {\n setIsDeleting(false)\n }\n }\n\n return (\n <>\n <div\n className={cn(\n 'group relative flex h-full flex-col overflow-hidden transition-all duration-200 resize-handle',\n isActive && 'opacity-75 grayscale hover:opacity-100 hover:grayscale-0'\n )}\n >\n <div className=\"flex-1 min-h-0 mt-4 px-0 w-[120%] translate-x-[-10%] pb-0\">\n <ChartView\n data={chart?.chart_response?.data || []}\n chartMeta={chart?.meta}\n visualizationConfig={chart?.chart_response?.visualization_config || {}}\n chartType={chart?.chart_response?.chart_type || ''}\n variant=\"default\"\n className=\"h-full w-full\"\n chartId={chart.llm_data_chat_id}\n hideTitleAndSubtitle={true}\n error={chart?.chart_response?.error}\n />\n </div>\n\n <div className=\"absolute top-1 right-1 z-30 flex h-8 w-auto items-center justify-center bg-gradient-to-t from-background via-background to-transparent px-1\">\n <div className=\"flex items-center gap-3\">\n <ButtonWithTooltip onClick={() => setShowMaximized(true)} tooltipText=\"Maximize Chart\">\n <Maximize2 className=\"size-3\" />\n </ButtonWithTooltip>\n <ButtonWithTooltip\n onClick={() => onEditClick(chart.llm_data_chat_id, chart)}\n tooltipText=\"Edit Chart\"\n >\n <Pencil className=\"size-3\" />\n </ButtonWithTooltip>\n <ButtonWithTooltip\n onClick={() => setShowDeleteDialog(true)}\n tooltipText=\"Delete Chart\"\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 className=\"size-3 animate-spin\" />\n ) : (\n <Trash2 className=\"size-3\" />\n )}\n </ButtonWithTooltip>\n </div>\n </div>\n </div>\n\n <DeleteConfirmationModal\n isOpen={showDeleteDialog}\n onClose={() => setShowDeleteDialog(false)}\n onConfirm={handleDelete}\n isDeleting={isDeleting}\n title=\"Are you sure you want to delete this chart?\"\n description=\"This action cannot be undone. This will permanently delete the chart.\"\n />\n\n <ChartDialog\n isOpen={showMaximized}\n onOpenChange={setShowMaximized}\n title={chart?.meta?.title}\n data={chart?.chart_response?.data || []}\n chartId={chart.llm_data_chat_id}\n chartMeta={chart?.meta}\n chartType={chart?.chart_response?.chart_type || ''}\n visualizationConfig={chart?.chart_response?.visualization_config || {}}\n onMetaChange={() => {}}\n variant=\"default\"\n onClose={() => setShowMaximized(false)}\n />\n </>\n )\n}\n","import { Dialog, DialogContent, DialogTitle } from '../ui/dialog'\nimport { Camera, Loader2, Minimize2 } from 'lucide-react'\nimport { useState } from 'react'\n\nimport { Button } from '../ui/button'\nimport { ChartView, type TChartMeta } from './ChartView'\nimport { takeScreenshot } from '../../lib/screenshot'\nimport { useToast } from '../../hooks/use-toast'\nimport { cn } from '../../utils/cn'\nimport {\n PapermapProvider,\n usePapermapConnectionOptional,\n usePapermapStoreApiOptional,\n} from '../../store'\n\nexport interface ChartDialogProps {\n token?: string\n workspaceId?: string\n dashboardId?: string\n apiUrl?: string\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n title?: string\n data: any[]\n chartId: string\n chartMeta: TChartMeta\n chartType: string\n visualizationConfig: Record<string, any>\n onMetaChange: (key: 'title' | 'description' | 'footer' | 'subtitle', value: string) => void\n variant?: string\n onClose?: () => void\n}\n\nexport function ChartDialog(props: ChartDialogProps) {\n const parentStore = usePapermapStoreApiOptional()\n const connection = usePapermapConnectionOptional()\n const resolvedToken = props.token ?? connection?.token\n const resolvedWorkspaceId = props.workspaceId ?? connection?.workspaceId\n const resolvedDashboardId = props.dashboardId ?? connection?.dashboardId\n const resolvedApiUrl = props.apiUrl ?? connection?.apiUrl\n\n if (!resolvedToken || !resolvedWorkspaceId || !resolvedDashboardId) {\n throw new Error(\n 'ChartDialog requires token, workspaceId, and dashboardId from props or PapermapProvider.'\n )\n }\n if (parentStore) {\n return <ChartDialogInner {...props} />\n }\n\n return (\n <PapermapProvider\n token={resolvedToken}\n workspaceId={resolvedWorkspaceId}\n dashboardId={resolvedDashboardId}\n apiUrl={resolvedApiUrl}\n >\n <ChartDialogInner {...props} />\n </PapermapProvider>\n )\n}\n\nfunction ChartDialogInner({ isOpen, onOpenChange, title, onClose, ...rest }: ChartDialogProps) {\n const [isTakingScreenshot, setIsTakingScreenshot] = useState(false)\n const { toast } = useToast()\n\n const takeScreenshotAsync = async () => {\n try {\n setIsTakingScreenshot(true)\n await takeScreenshot({\n selector: '.chart',\n additionalWidth: 30,\n fileName: title || 'View chart',\n additionalHeight: 50,\n })\n toast({\n title: 'Success',\n description: 'Screenshot taken successfully',\n })\n } catch (error) {\n console.error(error)\n toast({\n title: 'Error',\n description: 'Failed to take screenshot.',\n variant: 'destructive',\n })\n } finally {\n setIsTakingScreenshot(false)\n }\n }\n\n return (\n <Dialog open={isOpen} onOpenChange={onOpenChange}>\n <DialogContent\n className={cn(\n 'max-w-[75vw] h-[92vh] flex flex-col justify-center items-center p-0 [&>button]:hidden chart'\n )}\n >\n <div className=\"flex justify-between items-center w-full relative\">\n <div className=\"sr-only\">\n <DialogTitle>{title || 'Chart View'}</DialogTitle>\n </div>\n <Button\n onClick={takeScreenshotAsync}\n variant=\"ghost\"\n size=\"icon\"\n className={cn('fixed top-5 right-14 h-8 w-8')}\n disabled={isTakingScreenshot}\n >\n {isTakingScreenshot ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Camera className=\"size-4\" />\n )}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n onClose?.()\n onOpenChange(false)\n }}\n className={cn('h-8 w-8 absolute top-5 right-5')}\n >\n <Minimize2 className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div className=\"flex-1 w-[70vw] p-10 overflow-hidden\">\n <ChartView isDialog className=\"h-full\" {...rest} />\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","import { Maximize2, Pencil, Save, X, AlertTriangle } from 'lucide-react'\nimport { usePapermapStoreApi } from '../../store'\nimport { useToast } from '../../hooks/use-toast'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'\nimport { Button } from '../ui/button'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nimport { AreaChart } from './AreaChart'\nimport { BarChart } from './BarChart'\nimport { DataTable } from './DataTable'\nimport { LineChart } from './LineChart'\nimport { NoDataCard } from './NoDataCard'\nimport { PieChart } from './PieChart'\nimport { RadarChart } from './RadarChart'\nimport { ScatterChart } from './ScatterChart'\nimport { Tile } from './Tile'\nimport { cn } from '../../utils/cn'\nimport { getXYKeys, unwrapNestedChartData } from '../../lib/chart-utils'\n\nexport interface TChartMeta {\n title?: string\n subtitle?: string\n footer?: string\n variant?: string\n showLegend?: boolean\n}\n\nconst CHART_VARIATIONS: Record<string, string[]> = {\n bar: [\n 'default',\n 'horizontal',\n 'stacked',\n 'multiple',\n 'negative',\n 'triangular',\n 'value-on-top',\n 'triangular-with-value',\n 'brush',\n ],\n line: ['default', 'linear', 'step', 'multiple', 'dots', 'dashed', 'curved'],\n area: ['default', 'linear', 'step', 'stacked', 'gradient'],\n pie: ['default', 'donut', 'stacked', 'percentage', 'percentage-with-label'],\n radar: ['default', 'dots', 'multiple', 'lines', 'filled'],\n scatter: ['default'],\n table: ['default'],\n tile: ['default', 'horizontal', 'vertical', 'colored', 'centered'],\n}\n\nexport interface ChartViewProps {\n data: any[]\n chartMeta: TChartMeta\n error?: boolean\n chartType: string\n variant?: string\n className?: string\n containerClassName?: string\n visualizationConfig?: Record<string, any>\n previewMode?: boolean\n onMetaChange?: (key: 'title' | 'description' | 'footer' | 'subtitle', value: string) => void\n chartId?: string\n onClose?: () => void\n isDialog?: boolean\n onMaximize?: () => void\n showIcons?: boolean\n hideTitleAndSubtitle?: boolean\n hideVariants?: boolean\n pin?: boolean\n /** Called when the user clicks the edit action on the chart header. */\n onEditClick?: () => void\n /**\n * Override the built-in save-to-dashboard handler. When provided, this\n * callback is invoked instead of the internal pin+meta-update logic.\n */\n onSaveToDashboard?: () => void\n /**\n * Render the save button as a compact pill in the chart header instead\n * of the default bottom-left outline button. Used in streaming layouts.\n */\n compactSave?: boolean\n}\n\nexport function ChartView(props: ChartViewProps) {\n const {\n data: rawData,\n chartMeta,\n chartType = 'bar',\n className,\n visualizationConfig = {},\n chartId,\n onClose,\n isDialog = false,\n onMaximize,\n hideTitleAndSubtitle = false,\n hideVariants = false,\n showIcons = false,\n pin = false,\n onEditClick,\n onSaveToDashboard,\n compactSave = false,\n } = props\n\n const storeApi = usePapermapStoreApi()\n const { chartSvc } = storeApi.getState().getServices()\n const dashboardId = storeApi.getState().getConfig().dashboardId\n const { toast } = useToast()\n const [isSaving, setIsSaving] = useState(false)\n\n const data = useMemo(() => unwrapNestedChartData(rawData || []), [rawData])\n const isAxisChart = ['bar', 'line', 'area', 'scatter', 'radar'].includes(chartType)\n const hasNoPlottableData = useMemo(() => {\n if (!isAxisChart || !Array.isArray(data) || !data.length) return false\n const { y_keys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n return y_keys.length === 0\n }, [data, isAxisChart, visualizationConfig?.x_key, visualizationConfig?.y_key])\n\n const normalizedProps = useMemo(() => ({ ...props, data }), [props, data])\n const isMultiTile = chartType === 'tile' && (data?.length || 0) > 1\n\n const getDefaultVariant = (type: string, metaVariant?: string) => {\n if (metaVariant) return metaVariant\n if (type === 'pie') return 'percentage-with-label'\n return ''\n }\n\n const [selectedVariation, setSelectedVariation] = useState(\n getDefaultVariant(chartType, chartMeta?.variant)\n )\n const [headerHeight, setHeaderHeight] = useState(70)\n const headerRef = useRef<HTMLDivElement>(null)\n const scrollContainerRef = useRef<HTMLDivElement>(null)\n const [isScrolling, setIsScrolling] = useState(false)\n\n const chartVariations = (() => {\n const variations = CHART_VARIATIONS[chartType] || ['default']\n if (chartType === 'tile' && !isMultiTile)\n return variations.filter((v) => !['horizontal', 'vertical'].includes(v))\n return variations\n })()\n\n useEffect(() => {\n if (chartMeta?.variant) setSelectedVariation(chartMeta.variant)\n else setSelectedVariation(getDefaultVariant(chartType, undefined))\n }, [chartMeta, chartType])\n\n useEffect(() => {\n const updateHeaderHeight = () => {\n if (headerRef.current) setHeaderHeight(headerRef.current.offsetHeight + 16)\n }\n updateHeaderHeight()\n const resizeObserver = new ResizeObserver(updateHeaderHeight)\n if (headerRef.current) resizeObserver.observe(headerRef.current)\n return () => resizeObserver.disconnect()\n }, [chartMeta?.title, chartMeta?.subtitle, hideTitleAndSubtitle])\n\n // Enable scroll behavior for multi-tile layouts, similar to main app\n useEffect(() => {\n const scrollContainer = scrollContainerRef.current\n if (!scrollContainer || !isMultiTile) return\n\n let scrollTimeout: ReturnType<typeof setTimeout>\n\n const handleScroll = () => {\n setIsScrolling(true)\n clearTimeout(scrollTimeout)\n scrollTimeout = setTimeout(() => {\n setIsScrolling(false)\n }, 1000)\n }\n\n scrollContainer.addEventListener('scroll', handleScroll, { passive: true })\n\n return () => {\n scrollContainer.removeEventListener('scroll', handleScroll)\n clearTimeout(scrollTimeout)\n }\n }, [isMultiTile])\n\n const handleSaveToDashboard = async () => {\n if (onSaveToDashboard) {\n onSaveToDashboard()\n return\n }\n if (!chartId || !dashboardId) return\n try {\n setIsSaving(true)\n const title = chartMeta?.title || visualizationConfig?.title || 'Chart'\n if (chartMeta?.variant !== selectedVariation) {\n await chartSvc.updateChartMeta(chartId, {\n ...chartMeta,\n variant: selectedVariation,\n })\n }\n await chartSvc.updateChartPin(chartId, true)\n toast({\n title: `Chart ${title} saved to dashboard`,\n description: '',\n })\n } catch (error) {\n console.error('Failed to save chart:', error)\n toast({\n title: 'Failed to save chart',\n description: '',\n variant: 'destructive',\n })\n } finally {\n setIsSaving(false)\n }\n }\n\n const renderChart = () => (\n <>\n {!Array.isArray(data) || !data.length ? (\n <div className=\"absolute inset-0 bottom-12 flex items-center justify-center\">\n <NoDataCard\n message={\n chartId\n ? 'No data available for this chart'\n : 'Tell me what kind of chart you want to create...'\n }\n />\n </div>\n ) : hasNoPlottableData ? (\n <div className=\"absolute inset-0 bottom-12 flex items-center justify-center\">\n <div className=\"flex flex-col items-center justify-center gap-4 p-8 text-muted-foreground/70 max-w-sm text-center\">\n <div className=\"relative\">\n <div className=\"absolute -inset-4 bg-foreground/5 blur-xl rounded-full\" />\n <AlertTriangle className=\"size-12 relative opacity-60\" />\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium text-foreground/80\">\n This data doesn't contain numeric values to chart\n </p>\n <p className=\"text-xs text-muted-foreground/60\">\n Try asking the AI to calculate or aggregate the data into numbers, or request a\n table view instead.\n </p>\n </div>\n </div>\n </div>\n ) : (\n <>\n {chartType === 'bar' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <BarChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'pie' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <PieChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'line' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <LineChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'area' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <AreaChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'radar' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <RadarChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'scatter' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <ScatterChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'table' && (\n <div className=\"absolute inset-0 flex flex-col\">\n <DataTable data={data} />\n </div>\n )}\n </>\n )}\n </>\n )\n\n const headerContent = !hideTitleAndSubtitle && (\n <div ref={headerRef} className=\"flex-none space-y-2 px-4 pt-3 pb-2\">\n <div className=\"flex justify-between items-start\">\n <div className=\"flex flex-col w-[70%] min-w-0\">\n {visualizationConfig?.title && (\n <h1 className=\"text-lg font-medium px-2 -mx-2 py-0.5\">{visualizationConfig.title}</h1>\n )}\n {visualizationConfig?.subtitle && (\n <p className=\"text-[13px] px-2 -mx-2 py-0.5 opacity-80\">\n {visualizationConfig.subtitle}\n </p>\n )}\n </div>\n <div className=\"flex-shrink-0 relative z-10\">\n <div className=\"flex items-center gap-2\">\n {!isDialog && !hideVariants && chartVariations.length > 1 && (\n <Select value={selectedVariation || ''} onValueChange={setSelectedVariation}>\n <SelectTrigger className=\"w-[160px] h-8 border-white/20\">\n <SelectValue placeholder=\"Chart Variations\" />\n </SelectTrigger>\n <SelectContent className=\"border-white/20\">\n {chartVariations.map((variation, index) => (\n <SelectItem key={index} value={variation}>\n {variation.charAt(0).toUpperCase() + variation.slice(1)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {compactSave && !pin && showIcons && chartId && dashboardId && !hasNoPlottableData && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleSaveToDashboard}\n disabled={isSaving}\n className=\"h-7 px-3 rounded-full text-xs font-medium gap-1.5\"\n >\n <Save className=\"h-3 w-3\" />\n {isSaving ? 'Saving...' : 'Save'}\n </Button>\n )}\n {!isDialog && onEditClick && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onEditClick} className=\"h-8 w-8\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n )}\n {!isDialog && onMaximize && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onMaximize} className=\"h-8 w-8\">\n <Maximize2 className=\"h-4 w-4\" />\n </Button>\n )}\n {onClose && !isDialog && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose} className=\"h-8 w-8\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n\n const saveButton =\n !isDialog &&\n !pin &&\n showIcons &&\n chartId &&\n dashboardId &&\n !hasNoPlottableData &&\n !compactSave ? (\n <div className=\"absolute bottom-0 left-2\">\n <div className=\"flex justify-start\">\n <Button\n variant=\"outline\"\n onClick={handleSaveToDashboard}\n className=\"gap-2 bg-inherit\"\n disabled={isSaving}\n loading={isSaving}\n >\n <Save className=\"h-4 w-4\" />\n Save to Dashboard\n </Button>\n </div>\n </div>\n ) : null\n\n if (chartType === 'tile') {\n return (\n <div className=\"h-full overflow-hidden relative\">\n <div className=\"relative h-full w-full\">\n {headerContent}\n <div\n ref={scrollContainerRef}\n className={cn(\n 'absolute inset-x-0 bottom-4 m-0 px-0',\n isMultiTile && 'overflow-y-auto scrollbar-auto-hide',\n isMultiTile && isScrolling && 'scrolling'\n )}\n style={{ top: hideTitleAndSubtitle ? 0 : `${headerHeight}px` }}\n >\n <div className={cn('w-full', isMultiTile && 'pb-4')}>\n <Tile\n data={data}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n isMultiTile={isMultiTile}\n />\n </div>\n </div>\n {saveButton}\n </div>\n </div>\n )\n }\n\n return (\n <div className={cn('h-full overflow-hidden relative', isDialog && 'overflow-hidden')}>\n <div className={cn('flex flex-col h-full', className)}>\n {headerContent}\n <div\n className=\"absolute inset-x-0 bottom-4 m-0 px-0\"\n style={{ top: hideTitleAndSubtitle ? 0 : `${headerHeight}px` }}\n >\n {renderChart()}\n </div>\n {saveButton}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\nconst Select = SelectPrimitive.Root\nconst SelectGroup = SelectPrimitive.Group\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton ref={ref} className={cn('flex cursor-default items-center justify-center py-1', className)} {...props}>\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton ref={ref} className={cn('flex cursor-default items-center justify-center py-1', className)} {...props}>\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn('p-1', position === 'popper' && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]')}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', className)} {...props} />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import {\n Area,\n CartesianGrid,\n Legend,\n AreaChart as RechartsAreaChart,\n ResponsiveContainer,\n XAxis,\n YAxis,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nexport function AreaChart({\n data,\n chartMeta,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const { x_key, y_keys, primaryYKey, contextKeys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const parsedData = normalizeNumericStrings(data)\n const getAreaType = () => {\n if (visualizationConfig?.variant === 'step') return 'step'\n if (visualizationConfig?.variant === 'linear') return 'linear'\n return 'monotone'\n }\n const isStacked = visualizationConfig?.variant === 'stacked'\n const useGradient = visualizationConfig?.variant === 'gradient'\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsAreaChart data={parsedData} margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <defs>\n {useGradient &&\n y_keys.map((key, index) => (\n <linearGradient key={key} id={`gradient-${key}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop\n offset=\"0%\"\n stopColor={\n visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n }\n stopOpacity={0.8}\n />\n <stop\n offset=\"100%\"\n stopColor={\n visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n }\n stopOpacity={0.1}\n />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis\n dataKey={visualizationConfig?.x_key || x_key}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n dataKey={y_keys.length <= 1 ? primaryYKey : undefined}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent contextKeys={contextKeys} />}\n />\n {chartMeta?.showLegend !== false && <Legend />}\n {y_keys.map((key, index) => {\n const color = visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n return (\n <Area\n key={key}\n type={getAreaType()}\n dataKey={key}\n stroke={color}\n fill={useGradient ? `url(#gradient-${key})` : color}\n fillOpacity={useGradient ? 1 : 0.4}\n stackId={isStacked ? '1' : undefined}\n />\n )\n })}\n </RechartsAreaChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as RechartsPrimitive from 'recharts'\nimport { cn } from '../../utils/cn'\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n}\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />')\n }\n\n return context\n}\n\nconst ChartContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> & {\n config: ChartConfig\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children']\n }\n>(({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId()\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>{children}</RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n})\nChartContainer.displayName = 'Chart'\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(([_, config]) => config.theme || config.color)\n\n if (!colorConfig.length) {\n return null\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] || itemConfig.color\n return color ? ` --color-${key}: ${color};` : null\n })\n .join('\\n')}\n}\n`\n )\n .join('\\n'),\n }}\n />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nconst ChartTooltipContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<'div'> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: 'line' | 'dot' | 'dashed'\n nameKey?: string\n labelKey?: string\n contextKeys?: string[]\n }\n>(\n (\n {\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n contextKeys,\n },\n ref\n ) => {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey || item.dataKey || item.name || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === 'string'\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn('font-medium text-foreground', labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n if (!value) return null\n return <div className={cn('font-medium text-foreground', labelClassName)}>{value}</div>\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot'\n\n return (\n <div\n ref={ref}\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background text-foreground px-2.5 py-1.5 text-xs shadow-xl',\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color || item.payload.fill || item.color\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n indicator === 'dot' && 'items-center'\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent':\n indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n }\n )}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between gap-4 leading-none',\n nestLabel ? 'items-end' : 'items-center'\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-foreground\">{itemConfig?.label || item.name}</span>\n </div>\n {item.value && (\n <span className=\"font-mono font-medium tabular-nums text-foreground\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n {contextKeys && contextKeys.length > 0 && payload?.[0]?.payload && (\n <div className=\"border-t border-border/30 mt-1.5 pt-1.5 grid gap-1\">\n {contextKeys.map((key) => {\n const value = payload[0].payload[key]\n if (value == null) return null\n return (\n <div key={key} className=\"flex justify-between gap-4 text-[11px]\">\n <span className=\"text-muted-foreground capitalize\">{key.replace(/_/g, ' ')}</span>\n <span className=\"font-mono text-foreground/80 truncate max-w-[160px]\">\n {String(value)}\n </span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n }\n)\nChartTooltipContent.displayName = 'ChartTooltip'\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nconst ChartLegendContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> &\n Pick<RechartsPrimitive.LegendProps, 'payload' | 'verticalAlign'> & {\n hideIcon?: boolean\n nameKey?: string\n }\n>(({ className, hideIcon = false, payload, verticalAlign = 'bottom', nameKey }, ref) => {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center justify-center gap-4',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n className\n )}\n >\n {payload.map((item) => {\n const key = `${nameKey || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n return (\n <div\n key={item.value}\n className={cn(\n 'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground'\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n )\n })}\n </div>\n )\n})\nChartLegendContent.displayName = 'ChartLegend'\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n 'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (key in payload && typeof payload[key as keyof typeof payload] === 'string') {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config]\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n}\n","export function normalizeNumericStrings<T extends Record<string, any>>(data: T[]): T[] {\n return data.map((item) => {\n const normalizedItem: Record<string, any> = { ...item }\n for (const key in normalizedItem) {\n const value = normalizedItem[key]\n if (typeof value === 'string' && !isNaN(Number(value))) {\n normalizedItem[key] = Number(value)\n }\n }\n return normalizedItem as T\n })\n}\n\nexport function unwrapNestedChartData(data: any[]): any[] {\n if (\n Array.isArray(data) &&\n data.length === 1 &&\n data[0] != null &&\n typeof data[0] === 'object' &&\n Array.isArray(data[0].chart_data)\n ) {\n return data[0].chart_data\n }\n return data\n}\n\nexport const getXYKeys = ({ data, x, y }: { data: any[]; x?: string; y?: string | string[] }) => {\n if (!Array.isArray(data) || !data.length)\n return {\n x_key: '',\n y_keys: [] as string[],\n primaryYKey: undefined as string | undefined,\n contextKeys: [] as string[],\n }\n const keys = Object.keys(data[0] || {})\n const x_key = x || keys[0]\n const allNonXKeys = keys.filter((key) => key !== x_key)\n const y_keys = allNonXKeys.filter((key) => {\n const sample = data.find((row) => row[key] != null)?.[key]\n return (\n typeof sample === 'number' ||\n (typeof sample === 'string' && !isNaN(Number(sample)) && sample.trim() !== '')\n )\n })\n const contextKeys = allNonXKeys.filter((key) => !y_keys.includes(key))\n let primaryYKey: string | undefined\n if (Array.isArray(y)) {\n primaryYKey = undefined\n } else {\n primaryYKey = y && y_keys.includes(y) ? y : undefined\n }\n return { x_key, y_keys, primaryYKey, contextKeys }\n}\n\nexport const formatePieChartData = ({\n data,\n visualizationConfig,\n}: {\n data: any[]\n visualizationConfig: any\n}) => {\n if (!Array.isArray(data) || !data.length) return []\n const { x_key, primaryYKey } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const numericKeys = Object.keys(data[0]).filter((key) => typeof data[0][key] === 'number')\n if (!x_key || !numericKeys.length) return []\n return numericKeys.map((valueKey) => ({\n label: valueKey,\n x_key,\n y_key: primaryYKey || '',\n data: data.map((item) => ({\n [x_key]: item[x_key],\n [String(primaryYKey)]: item[valueKey],\n })),\n }))\n}\n\nexport const formatChartData = (data: any[]) => {\n if (!Array.isArray(data) || !data.length) return []\n const numericKeys = Object.keys(data[0]).filter((key) => typeof data[0][key] === 'number')\n const nameKey = Object.keys(data[0]).find((key) => key.toLowerCase())\n if (!nameKey || !numericKeys.length) return []\n return numericKeys.map((valueKey) => ({\n label: valueKey,\n data: data.map((item) => ({ name: item[nameKey], value: item[valueKey] })),\n }))\n}\n\nexport function formatNumericValue(value: any): string {\n if (value == null) return ''\n const num = Number(value)\n if (isNaN(num)) return String(value)\n if (Math.abs(num) >= 1_000_000_000) return `${(num / 1_000_000_000).toFixed(1)}B`\n if (Math.abs(num) >= 1_000_000) return `${(num / 1_000_000).toFixed(1)}M`\n if (Math.abs(num) >= 1_000) return `${(num / 1_000).toFixed(1)}K`\n if (Number.isInteger(num)) return num.toLocaleString()\n return num.toFixed(2)\n}\n\nexport function downloadCSV(data: any[], filename = 'data.csv') {\n if (!data.length) return\n const headers = Object.keys(data[0])\n const rows = data.map((row) => headers.map((h) => JSON.stringify(row[h] ?? '')).join(','))\n const csv = [headers.join(','), ...rows].join('\\n')\n const blob = new Blob([csv], { type: 'text/csv' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\nexport function generateChartConfig(keys: string[]) {\n const chartConfig: Record<string, { label: string; color: string }> = {}\n keys.forEach((key, index) => {\n chartConfig[key] = {\n label: key.charAt(0).toUpperCase() + key.slice(1),\n color: `hsl(var(--chart-${(index % 5) + 1}))`,\n }\n })\n return chartConfig\n}\n","import {\n Bar,\n CartesianGrid,\n Legend,\n BarChart as RechartsBarChart,\n XAxis,\n YAxis,\n BarProps,\n LabelList,\n Brush,\n ReferenceLine,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nconst getPath = (x: number, y: number, width: number, height: number) =>\n `M${x},${y + height}C${x + width / 3},${y + height} ${x + width / 2},${y + height / 3} ${x + width / 2}, ${y} C${x + width / 2},${y + height / 3} ${x + (2 * width) / 3},${y + height} ${x + width}, ${y + height} Z`\n\nconst TriangleBar = (props: BarProps) => {\n const { fill, x, y, width, height } = props\n return (\n <path\n d={getPath(Number(x), Number(y), Number(width), Number(height))}\n stroke=\"none\"\n fill={fill}\n />\n )\n}\n\nconst ValueLabel = (props: { x: number; y: number; value: number; width: number }) => {\n const { x, y, value, width } = props\n const centerX = x + width / 2\n const radius = 16\n const padding = 4\n return (\n <g>\n <circle\n cx={centerX}\n cy={y - radius - padding}\n r={radius}\n fill=\"hsl(var(--background))\"\n stroke=\"hsl(var(--border))\"\n strokeWidth={1}\n />\n <text\n x={centerX}\n y={y - radius - padding}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n style={{ fill: 'hsl(var(--foreground))', fontSize: '12px', fontWeight: 500 }}\n >\n {value.toLocaleString()}\n </text>\n </g>\n )\n}\n\nexport function BarChart({\n data,\n chartMeta,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const { x_key, y_keys, primaryYKey, contextKeys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const parsedData = normalizeNumericStrings(data)\n const isHorizontal = visualizationConfig?.variant === 'horizontal'\n const isStacked = visualizationConfig?.variant === 'stacked'\n const isTriangular =\n visualizationConfig?.variant === 'triangular' ||\n visualizationConfig?.variant === 'triangular-with-value'\n const showValueOnTop =\n visualizationConfig?.variant === 'value-on-top' ||\n visualizationConfig?.variant === 'triangular-with-value'\n const isBrush = visualizationConfig?.variant === 'brush'\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <RechartsBarChart\n data={parsedData}\n margin={{ top: 20, right: 30, left: 20, bottom: isBrush ? 50 : 20 }}\n layout={isHorizontal ? 'vertical' : 'horizontal'}\n >\n <CartesianGrid vertical={false} strokeDasharray=\"4\" stroke=\"hsl(var(--border))\" />\n <XAxis\n dataKey={isHorizontal ? (y_keys.length <= 1 ? primaryYKey : undefined) : x_key}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n type={isHorizontal ? 'number' : 'category'}\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n dataKey={isHorizontal ? x_key : y_keys.length <= 1 ? primaryYKey : undefined}\n stroke=\"hsl(var(--muted-foreground))\"\n type={isHorizontal ? 'category' : 'number'}\n />\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent contextKeys={contextKeys} />}\n />\n {chartMeta?.showLegend !== false && <Legend />}\n {isBrush && <ReferenceLine y={0} stroke=\"hsl(var(--border))\" />}\n {y_keys.map((key, index) => (\n <Bar\n key={key}\n dataKey={key}\n name={key}\n fill={visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`}\n radius={4}\n stackId={isStacked ? '1' : undefined}\n shape={isTriangular ? (TriangleBar as any) : undefined}\n >\n {showValueOnTop && (\n <LabelList\n dataKey={key}\n position=\"top\"\n content={({ x, y, value, width }) => (\n <ValueLabel\n x={Number(x)}\n y={Number(y)}\n value={Number(value)}\n width={Number(width)}\n />\n )}\n />\n )}\n </Bar>\n ))}\n {isBrush && (\n <Brush\n dataKey={x_key}\n height={30}\n stroke=\"hsl(var(--chart-1))\"\n fill=\"hsl(var(--background))\"\n />\n )}\n </RechartsBarChart>\n </ChartContainer>\n )\n}\n","import { useState, useMemo } from 'react'\nimport {\n useReactTable,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n type VisibilityState,\n} from '@tanstack/react-table'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'\nimport { Button } from '../ui/button'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'\nimport { ArrowUpDown, ChevronLeft, ChevronRight, Download, Search } from 'lucide-react'\nimport { downloadCSV } from '../../lib/chart-utils'\n\ninterface DataTableProps {\n data: any[]\n dashboardTheme?: any\n}\n\nexport function DataTable({ data, dashboardTheme }: DataTableProps) {\n const [sorting, setSorting] = useState<SortingState>([])\n const [globalFilter, setGlobalFilter] = useState('')\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n\n const columns = useMemo<ColumnDef<any>[]>(() => {\n if (!data.length) return []\n return Object.keys(data[0]).map((key) => ({\n accessorKey: key,\n header: ({ column }) => (\n <Button\n variant=\"ghost\"\n onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}\n className=\"px-0 hover:bg-transparent\"\n >\n {key} <ArrowUpDown className=\"ml-2 h-3 w-3\" />\n </Button>\n ),\n cell: ({ row }) => {\n const value = row.getValue(key)\n return <div className=\"truncate max-w-[200px]\">{value == null ? '' : String(value)}</div>\n },\n }))\n }, [data])\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n onSortingChange: setSorting,\n onColumnVisibilityChange: setColumnVisibility,\n onGlobalFilterChange: setGlobalFilter,\n state: { sorting, columnVisibility, globalFilter },\n initialState: { pagination: { pageSize: 10 } },\n })\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-border/40\">\n <div className=\"flex items-center gap-2 flex-1\">\n <Search className=\"h-4 w-4 text-muted-foreground\" />\n <input\n placeholder=\"Search...\"\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n className=\"flex-1 bg-transparent border-none outline-none text-sm placeholder:text-muted-foreground\"\n />\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => downloadCSV(data)} className=\"gap-1\">\n <Download className=\"h-3.5 w-3.5\" /> CSV\n </Button>\n </div>\n <div className=\"flex-1 overflow-auto scrollbar-hide\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id}>\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow key={row.id}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n <div className=\"flex items-center justify-between px-4 py-2 border-t border-border/40\">\n <div className=\"text-xs text-muted-foreground\">\n {table.getFilteredRowModel().rows.length} row(s)\n </div>\n <div className=\"flex items-center gap-2\">\n <Select\n value={String(table.getState().pagination.pageSize)}\n onValueChange={(v) => table.setPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-7 w-[70px] text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {[10, 20, 30, 40, 50].map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n className=\"h-7 w-7 p-0\"\n >\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </Button>\n <span className=\"text-xs\">\n {table.getState().pagination.pageIndex + 1} / {table.getPageCount()}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n className=\"h-7 w-7 p-0\"\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\n\nconst Table = React.forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto scrollbar-hide\">\n <table ref={ref} className={cn('w-full caption-bottom text-sm', className)} {...props} />\n </div>\n )\n)\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n))\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className\n )}\n {...props}\n />\n )\n)\nTableRow.displayName = 'TableRow'\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = 'TableHead'\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption ref={ref} className={cn('mt-4 text-sm text-muted-foreground', className)} {...props} />\n))\nTableCaption.displayName = 'TableCaption'\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }\n","import {\n CartesianGrid,\n Legend,\n Line,\n LineChart as RechartsLineChart,\n ResponsiveContainer,\n XAxis,\n YAxis,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nexport function LineChart({\n data,\n chartMeta,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const { x_key, y_keys, primaryYKey, contextKeys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const parsedData = normalizeNumericStrings(data)\n const getLineType = () => {\n if (visualizationConfig?.variant === 'step') return 'step'\n if (visualizationConfig?.variant === 'linear') return 'linear'\n if (visualizationConfig?.variant === 'curved') return 'basis'\n return 'monotone'\n }\n const showDots = visualizationConfig?.variant === 'dots'\n const isDashed = visualizationConfig?.variant === 'dashed'\n const useGradient = visualizationConfig?.variant === 'gradient'\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsLineChart data={parsedData} margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <defs>\n {useGradient &&\n y_keys.map((key, index) => (\n <linearGradient key={key} id={`gradient-${key}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop\n offset=\"0%\"\n stopColor={\n visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n }\n stopOpacity={0.8}\n />\n <stop\n offset=\"100%\"\n stopColor={\n visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n }\n stopOpacity={0.2}\n />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid vertical={false} strokeDasharray=\"4\" stroke=\"hsl(var(--border))\" />\n <XAxis\n dataKey={x_key}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n dataKey={y_keys.length <= 1 ? primaryYKey : undefined}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent contextKeys={contextKeys} />}\n />\n {chartMeta?.showLegend !== false && <Legend />}\n {y_keys.map((key, index) => {\n const color = visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n return (\n <Line\n key={key}\n type={getLineType()}\n dataKey={key}\n name={key}\n stroke={useGradient ? `url(#gradient-${key})` : color}\n strokeWidth={2}\n strokeDasharray={isDashed ? '5 5' : '0'}\n dot={showDots ? { r: 3, fill: color, strokeWidth: 0 } : false}\n />\n )\n })}\n </RechartsLineChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","import { BarChart2 } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\ninterface NoDataCardProps {\n message?: string\n className?: string\n}\n\nexport function NoDataCard({ message = 'Tell me what kind of chart you want to create...', className }: NoDataCardProps) {\n const isCreationMessage = message.toLowerCase().includes('create')\n return (\n <div className={cn('flex flex-col items-center justify-center gap-6 p-12 text-muted-foreground/60 bg-muted/5 transition-all hover:border-muted-foreground/30 hover:bg-muted/10 rounded-lg', className)}>\n <div className=\"relative\">\n <div className=\"absolute -inset-4 bg-foreground/5 blur-xl rounded-full\" />\n <BarChart2 className={cn('size-16 relative', isCreationMessage ? 'animate-pulse' : 'opacity-80')} />\n </div>\n <p className=\"text-lg font-medium tracking-tight text-center\">{message}</p>\n </div>\n )\n}\n","import {\n Cell,\n Tooltip as ChartTooltip,\n Legend,\n Pie,\n PieChart as RechartsPieChart,\n ResponsiveContainer,\n Sector,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent } from '../ui/chart'\nimport { formatePieChartData, normalizeNumericStrings } from '../../lib/chart-utils'\nimport { useState } from 'react'\n\nexport function PieChart({\n data,\n chartMeta,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const [activeIndex, setActiveIndex] = useState<number | undefined>(undefined)\n const formattedData = normalizeNumericStrings(formatePieChartData({ data, visualizationConfig }))\n const x_key = formattedData.length ? formattedData[0]?.x_key : 'name'\n\n const variant =\n !visualizationConfig?.variant || visualizationConfig.variant === 'default'\n ? 'percentage-with-label'\n : visualizationConfig.variant\n const isDonut = variant === 'donut'\n const isStacked = variant === 'stacked' || formattedData.length > 1\n const showPercentage = variant === 'percentage' || variant === 'percentage-with-label'\n const showLabel = variant === 'percentage-with-label'\n const colors = visualizationConfig?.colors || []\n\n const maxRadius = 120\n const minRadius = 30\n const totalSpace = maxRadius - minRadius\n const numRings = formattedData.length\n const ringThickness = Math.max(15, Math.min(40, Math.floor(totalSpace / (numRings || 1))))\n const ringGap = Math.max(3, Math.min(8, Math.floor(ringThickness / 5)))\n const innerRadius = isDonut ? 60 : undefined\n\n const renderActiveShape = (props: any) => {\n const RADIAN = Math.PI / 180\n const {\n cx,\n cy,\n midAngle,\n innerRadius,\n outerRadius,\n startAngle,\n endAngle,\n fill,\n payload,\n percent,\n } = props\n const sin = Math.sin(-RADIAN * midAngle)\n const cos = Math.cos(-RADIAN * midAngle)\n const sx = cx + (outerRadius + 10) * cos\n const sy = cy + (outerRadius + 10) * sin\n const mx = cx + (outerRadius + 30) * cos\n const my = cy + (outerRadius + 30) * sin\n const ex = mx + (cos >= 0 ? 1 : -1) * 22\n const ey = my\n const textAnchor = cos >= 0 ? 'start' : 'end'\n return (\n <g>\n <Sector\n cx={cx}\n cy={cy}\n innerRadius={innerRadius}\n outerRadius={outerRadius}\n startAngle={startAngle}\n endAngle={endAngle}\n fill={fill}\n />\n <Sector\n cx={cx}\n cy={cy}\n startAngle={startAngle}\n endAngle={endAngle}\n innerRadius={outerRadius + 6}\n outerRadius={outerRadius + 10}\n fill={fill}\n />\n <path d={`M${sx},${sy}L${mx},${ey}L${ex},${ey}`} stroke={fill} fill=\"none\" />\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\n <text\n x={ex + (cos >= 0 ? 1 : -1) * 12}\n y={ey}\n textAnchor={textAnchor}\n fill=\"hsl(var(--foreground))\"\n >\n {payload[x_key]}\n </text>\n <text\n x={ex + (cos >= 0 ? 1 : -1) * 12}\n y={ey}\n dy={18}\n textAnchor={textAnchor}\n fill=\"hsl(var(--muted-foreground))\"\n >{`${(percent * 100).toFixed(0)}%`}</text>\n </g>\n )\n }\n\n const renderCustomizedLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent }: any) => {\n const RADIAN = Math.PI / 180\n const radius = innerRadius + (outerRadius - innerRadius) * 0.5\n const x = cx + radius * Math.cos(-midAngle * RADIAN)\n const y = cy + radius * Math.sin(-midAngle * RADIAN)\n if (!showLabel)\n return (\n <text\n x={x}\n y={y}\n fill=\"white\"\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n style={{ fontSize: '12px', fontWeight: 'bold' }}\n >{`${(percent * 100).toFixed(0)}%`}</text>\n )\n return null\n }\n\n const getActiveIndex = () => {\n if (showLabel) return Array.from({ length: formattedData[0]?.data?.length || 0 }, (_, i) => i)\n return activeIndex\n }\n\n return (\n <ChartContainer config={{}} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsPieChart margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent />}\n />\n {formattedData.map(({ x_key: xk, y_key, data: pieData }, index) => (\n <Pie\n key={`pie-${index}`}\n data={pieData}\n dataKey={y_key}\n nameKey={xk}\n cx=\"50%\"\n cy=\"50%\"\n labelLine={false}\n outerRadius={isStacked ? maxRadius - index * (ringThickness + ringGap) : undefined}\n innerRadius={\n isStacked\n ? maxRadius - ((index + 1) * ringThickness + index * ringGap)\n : innerRadius\n }\n label={showPercentage ? renderCustomizedLabel : false}\n activeShape={renderActiveShape as any}\n {...({ activeIndex: getActiveIndex() } as any)}\n onMouseEnter={(_, i: number) => {\n if (!showLabel) setActiveIndex(i)\n }}\n onMouseLeave={() => {\n if (!showLabel) setActiveIndex(undefined)\n }}\n >\n {pieData.map((_: any, i: number) => (\n <Cell\n key={`cell-${i}`}\n fill={colors[i] ? colors[i] : `hsl(var(--chart-${(i % 5) + 1}))`}\n />\n ))}\n </Pie>\n ))}\n <Legend verticalAlign=\"bottom\" align=\"center\" layout=\"horizontal\" />\n </RechartsPieChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","import { Legend, PolarAngleAxis, PolarGrid, PolarRadiusAxis, Radar, RadarChart as RechartsRadarChart, ResponsiveContainer } from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nexport function RadarChart({ data, chartMeta, visualizationConfig }: { data: any[]; chartMeta: { showLegend?: boolean }; visualizationConfig: Record<string, any> }) {\n const { x_key, y_keys, contextKeys } = getXYKeys({ data, x: visualizationConfig?.x_key })\n const parsedData = normalizeNumericStrings(data)\n const showDots = visualizationConfig?.variant === 'dots'\n const showLines = visualizationConfig?.variant === 'lines' || visualizationConfig?.variant === 'default'\n const isFilled = visualizationConfig?.variant === 'filled'\n const useGradient = visualizationConfig?.variant === 'gradient'\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsRadarChart cx=\"50%\" cy=\"50%\" outerRadius=\"80%\" data={parsedData} margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <defs>\n {useGradient && y_keys.map((key, index) => (\n <linearGradient key={key} id={`gradient-${key}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`} stopOpacity={0.8} />\n <stop offset=\"100%\" stopColor={visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`} stopOpacity={0.2} />\n </linearGradient>\n ))}\n </defs>\n <PolarGrid stroke=\"hsl(var(--border))\" />\n <PolarAngleAxis dataKey={x_key} tick={{ fill: 'hsl(var(--muted-foreground))' }} />\n <PolarRadiusAxis angle={30} domain={[0, 'auto']} tick={{ fill: 'hsl(var(--muted-foreground))' }} />\n <ChartTooltip content={<ChartTooltipContent contextKeys={contextKeys} />} />\n {chartMeta?.showLegend !== false && <Legend />}\n {y_keys.map((key, index) => {\n const color = visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n return <Radar key={key} name={key} dataKey={key} stroke={color} fill={useGradient ? `url(#gradient-${key})` : color} fillOpacity={isFilled ? 0.6 : useGradient ? 1 : 0.1} dot={showDots ? { r: 3 } : false} strokeWidth={showLines ? 2 : 0} />\n })}\n </RechartsRadarChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","import {\n CartesianGrid,\n Legend,\n ScatterChart as RechartsScatterChart,\n ResponsiveContainer,\n Scatter,\n XAxis,\n YAxis,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nexport function ScatterChart({\n data,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const { x_key, y_keys, primaryYKey, contextKeys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const parsedData = normalizeNumericStrings(data)\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsScatterChart margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <CartesianGrid vertical={false} strokeDasharray=\"4\" stroke=\"hsl(var(--border))\" />\n <XAxis\n dataKey={x_key}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n dataKey={y_keys?.length <= 1 ? primaryYKey : undefined}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent contextKeys={contextKeys} />}\n />\n <Legend />\n {y_keys?.map((key, index) => (\n <Scatter\n key={key}\n dataKey={key}\n name={key}\n data={parsedData}\n fill={visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`}\n strokeWidth={2}\n />\n ))}\n </RechartsScatterChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","export const waitForChartsToLoad = async (maxWaitTime = 5000) => {\n const startTime = Date.now()\n\n while (Date.now() - startTime < maxWaitTime) {\n const loadingElements = document.querySelectorAll(\n '[data-loading=\"true\"], .animate-spin, .loading'\n )\n const emptyCharts = document.querySelectorAll('.chart-container:empty, .recharts-wrapper:empty')\n\n const canvasElements = document.querySelectorAll('canvas')\n let allCanvasReady = true\n canvasElements.forEach((canvas) => {\n const ctx = canvas.getContext('2d')\n if (ctx && canvas.width === 0 && canvas.height === 0) {\n allCanvasReady = false\n }\n })\n\n if (loadingElements.length === 0 && emptyCharts.length === 0 && allCanvasReady) {\n await new Promise((resolve) => setTimeout(resolve, 500))\n return true\n }\n\n await new Promise((resolve) => setTimeout(resolve, 200))\n }\n}\n\nexport const takeScreenshot = async ({\n selector,\n fileName = 'dashboard',\n additionalWidth = 30,\n additionalHeight = 0,\n}: {\n selector: string\n fileName?: string\n additionalWidth?: number\n additionalHeight?: number\n}) => {\n const layoutElement = document.querySelector(selector) as HTMLElement\n if (!layoutElement) {\n console.error('No element with class layout found!')\n return\n }\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const toolIcons = layoutElement.querySelectorAll('.tool-icons')\n const originalStyles = new Map<HTMLElement, string>()\n\n toolIcons.forEach((el) => {\n const htmlEl = el as HTMLElement\n originalStyles.set(htmlEl, htmlEl.style.display)\n htmlEl.style.display = 'none'\n })\n\n const html2canvas = (await import('html2canvas')).default\n const canvas = await html2canvas(layoutElement, {\n useCORS: true,\n scrollY: -window.scrollY,\n width: layoutElement.scrollWidth + additionalWidth,\n height: layoutElement.scrollHeight + additionalHeight,\n scale: 2,\n logging: false,\n allowTaint: true,\n })\n\n toolIcons.forEach((el) => {\n const htmlEl = el as HTMLElement\n htmlEl.style.display = originalStyles.get(htmlEl) || ''\n })\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const padding = 50\n const newCanvas = document.createElement('canvas')\n newCanvas.width = canvas.width + padding * 2\n newCanvas.height = canvas.height + padding * 2\n\n const ctx = newCanvas.getContext('2d')!\n ctx.fillStyle = '#ffffff'\n ctx.fillRect(0, 0, newCanvas.width, newCanvas.height)\n ctx.drawImage(canvas, padding, padding)\n\n layoutElement.scrollIntoView({ behavior: 'auto' })\n const imageData = newCanvas.toDataURL('image/png')\n const link = document.createElement('a')\n link.href = imageData\n link.download = `${fileName}.png`\n link.click()\n}\n","import React from 'react'\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from '../ui/card'\nimport { cn } from '../../utils'\nimport { formatNumericValue } from '../../lib/chart-utils'\n\nexport function Tile({\n data,\n visualizationConfig,\n isMultiTile,\n}: {\n data: any[]\n visualizationConfig: any\n isMultiTile: boolean\n}) {\n const parsedData = data.flatMap((obj) =>\n Object.entries(obj).map(([key, value]) => ({\n label:\n typeof key === 'string'\n ? key.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())\n : null,\n value: typeof value === 'string' || typeof value === 'number' ? value : null,\n }))\n )\n\n const variant = visualizationConfig?.variant || 'vertical'\n const colors = visualizationConfig?.colors\n\n return (\n <div\n className={cn(\n 'flex gap-4',\n isMultiTile ? 'flex-col' : 'flex-wrap',\n variant === 'horizontal' ? 'flex-row' : 'flex-col'\n )}\n >\n {parsedData.map((item, index) => {\n const color = colors[index % colors.length]\n const cardStyle: React.CSSProperties | undefined =\n variant === 'colored'\n ? {\n backgroundColor: color,\n }\n : undefined\n\n return (\n <Card\n key={index}\n className={cn(\n // In grid dashboards, tiles can be resized smaller than the original design size.\n // Allow them to shrink instead of forcing a fixed min-width.\n 'border-0 shadow-none min-w-0',\n 'border border-border/70 dark:border-0',\n isMultiTile && 'border w-full',\n variant === 'horizontal' ? 'flex-1' : '',\n variant === 'colored' && 'rounded-lg',\n variant === 'centered' && 'flex flex-col items-center justify-center text-center'\n )}\n style={cardStyle}\n >\n {visualizationConfig.title ? (\n <CardHeader\n className={cn(\n 'flex flex-row items-center justify-between space-y-0 pb-1',\n variant === 'centered' && 'w-full justify-center pb-1'\n )}\n >\n <CardTitle\n className={cn('text-sm font-medium', variant === 'centered' && 'text-center')}\n style={variant === 'colored' ? { color: 'white' } : undefined}\n >\n {parsedData.length === 1 ? visualizationConfig?.title || item.label : item.label}\n </CardTitle>\n </CardHeader>\n ) : null}\n <CardContent\n className={cn(\n variant === 'centered' && 'flex flex-col items-center justify-center flex-1 py-1'\n )}\n >\n <div\n className={cn(\n 'text-2xl font-bold',\n variant === 'centered' && 'text-center text-4xl'\n )}\n style={variant === 'colored' ? { color: 'white' } : undefined}\n >\n {typeof item.value === 'number' ||\n (typeof item.value === 'string' && !isNaN(Number(item.value)))\n ? formatNumericValue(item.value)\n : item.value}\n </div>\n </CardContent>\n <CardFooter className={cn(variant === 'centered' && 'w-full justify-center pb-3')}>\n {visualizationConfig.subtitle ? (\n <div\n className={cn('text-sm', variant === 'centered' && 'text-center')}\n style={\n variant === 'colored'\n ? {\n color: 'rgba(255, 255, 255, 0.8)',\n }\n : undefined\n }\n >\n {visualizationConfig?.subtitle}\n </div>\n ) : null}\n </CardFooter>\n </Card>\n )\n })}\n </div>\n )\n}\n","/**\n * Captures an element as PNG and triggers a download.\n * Mirrors main app takeScreenshot (utils.ts) for chart dialog.\n */\nexport async function takeScreenshot({\n selector,\n fileName = 'chart',\n additionalWidth = 0,\n additionalHeight = 0,\n hideSelectors = ['.tool-icons'],\n}: {\n selector: string\n fileName?: string\n additionalWidth?: number\n additionalHeight?: number\n /** Selectors to hide during capture (e.g. buttons); restored after. */\n hideSelectors?: string[]\n}): Promise<void> {\n const element = document.querySelector(selector) as HTMLElement\n\n if (!element) {\n console.error('Screenshot target not found:', selector)\n throw new Error('Screenshot target not found')\n }\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const originalStyles = new Map<HTMLElement, string>()\n hideSelectors.forEach((sel) => {\n element.querySelectorAll(sel).forEach((el) => {\n const htmlEl = el as HTMLElement\n originalStyles.set(htmlEl, htmlEl.style.display)\n htmlEl.style.display = 'none'\n })\n })\n\n const html2canvas = (await import('html2canvas')).default\n const canvas = await html2canvas(element, {\n useCORS: true,\n scrollY: -window.scrollY,\n width: element.scrollWidth + additionalWidth,\n height: element.scrollHeight + additionalHeight,\n scale: 2,\n logging: false,\n allowTaint: true,\n backgroundColor: '#ffffff',\n })\n\n hideSelectors.forEach((sel) => {\n element.querySelectorAll(sel).forEach((el) => {\n const htmlEl = el as HTMLElement\n htmlEl.style.display = originalStyles.get(htmlEl) ?? ''\n })\n })\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const padding = 50\n const newCanvas = document.createElement('canvas')\n newCanvas.width = canvas.width + padding * 2\n newCanvas.height = canvas.height + padding * 2\n\n const ctx = newCanvas.getContext('2d')\n if (!ctx) throw new Error('Could not get canvas context')\n\n ctx.fillStyle = '#ffffff'\n ctx.fillRect(0, 0, newCanvas.width, newCanvas.height)\n ctx.drawImage(canvas, padding, padding)\n\n element.scrollIntoView({ behavior: 'auto' })\n const imageData = newCanvas.toDataURL('image/png')\n const link = document.createElement('a')\n link.href = imageData\n link.download = `${fileName}.png`\n link.click()\n}\n","import React from 'react'\nimport { BrainCircuit, Clock, MessageSquare, Trash2 } from 'lucide-react'\nimport { cn } from '../../utils/cn'\nimport { motion } from 'framer-motion'\n\ninterface SavedMemoryItem {\n id: string\n title: string\n preview: string\n type: string\n timestamp: string\n}\n\nconst MOCK_MEMORIES: SavedMemoryItem[] = [\n {\n id: '1',\n title: 'User Engagement Analytics Report',\n preview:\n 'Detailed analysis of user behavior patterns, session duration metrics, and conversion rates across different platforms...',\n type: 'analytics',\n timestamp: '2 hours ago',\n },\n {\n id: '2',\n title: 'Revenue Growth Trends Q2 2024',\n preview:\n 'Comprehensive breakdown of revenue metrics, MRR growth, customer acquisition costs, and churn rate analysis...',\n type: 'analytics',\n timestamp: '1 day ago',\n },\n {\n id: '3',\n title: 'Marketing Campaign Performance',\n preview:\n 'ROI analysis of multi-channel campaigns, click-through rates, and customer segment performance metrics...',\n type: 'analytics',\n timestamp: '2 days ago',\n },\n]\n\nexport function SavedMemory() {\n const handleConversationClick = (item: SavedMemoryItem) => {\n console.log('Clicked memory:', item.id)\n }\n\n const handleDeleteClick = (e: React.MouseEvent, item: SavedMemoryItem) => {\n e.stopPropagation()\n console.log('Delete memory:', item.id)\n }\n\n return (\n <div className=\"flex flex-col w-full h-full\">\n <div className=\"flex items-center justify-between p-4 border-b border-border/50\">\n <div className=\"flex items-center gap-2 text-foreground\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-sm font-medium\">Saved Memory</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">{MOCK_MEMORIES.length} items</span>\n </div>\n\n <div className=\"flex-1 overflow-auto scrollbar-hide\">\n <div className=\"flex flex-col gap-1 p-2\">\n {MOCK_MEMORIES.map((item, index) => (\n <motion.div\n key={item.id}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, delay: index * 0.05, ease: [0.23, 1, 0.32, 1] }}\n className={cn(\n 'flex items-start gap-3 p-3 rounded-xl transition-all duration-200',\n 'hover:bg-muted/50 group cursor-pointer',\n 'border border-transparent hover:border-border/50',\n 'relative overflow-hidden'\n )}\n onClick={() => handleConversationClick(item)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleConversationClick(item)\n }}\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 ring-1 ring-inset ring-primary/5\">\n <BrainCircuit className=\"size-4 text-primary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">{item.title}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <p className=\"text-xs text-muted-foreground/80 truncate leading-relaxed flex-1\">\n {item.preview}\n </p>\n <span className=\"text-[10px] text-muted-foreground shrink-0 tabular-nums ml-2\">\n {item.timestamp}\n </span>\n </div>\n </div>\n <div\n className={cn(\n 'absolute right-2 top-1 opacity-0 group-hover:opacity-100',\n 'transition-all duration-200 ease-in-out transform translate-x-4 group-hover:translate-x-0'\n )}\n >\n <motion.button\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.95 }}\n onClick={(e) => handleDeleteClick(e, item)}\n className=\"p-2 rounded-full hover:bg-muted flex items-center justify-center group/delete\"\n >\n <Trash2 className=\"h-4 w-4 text-muted-foreground group-hover/delete:text-destructive transition-colors\" />\n </motion.button>\n </div>\n </motion.div>\n ))}\n </div>\n </div>\n\n {MOCK_MEMORIES.length === 0 && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <MessageSquare className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">No saved memories yet</h3>\n <p className=\"text-xs text-muted-foreground\">\n Start a new chat to see your saved memories here\n </p>\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\ninterface ShineBorderProps extends React.HTMLAttributes<HTMLDivElement> {\n borderWidth?: number\n duration?: number\n shineColor?: string | string[]\n}\n\nexport function ShineBorder({\n borderWidth = 1,\n duration = 14,\n shineColor = '#000000',\n className,\n style,\n ...props\n}: ShineBorderProps) {\n return (\n <div\n style={\n {\n '--border-width': `${borderWidth}px`,\n '--duration': `${duration}s`,\n '--mask-linear-gradient': `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,\n '--background-radial-gradient': `radial-gradient(transparent,transparent, ${Array.isArray(shineColor) ? shineColor.join(',') : shineColor},transparent,transparent)`,\n backgroundImage: 'var(--background-radial-gradient)',\n backgroundSize: '300% 300%',\n mask: 'var(--mask-linear-gradient)',\n WebkitMaskComposite: 'xor',\n maskComposite: 'exclude',\n animation: `shine var(--duration) infinite linear`,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'pointer-events-none absolute inset-0 size-full rounded-[inherit] p-[--border-width] will-change-[background-position]',\n className\n )}\n {...props}\n />\n )\n}\n","import * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\nimport { cn } from '../../utils/cn'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n))\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","import * as React from 'react'\nimport * as HoverCardPrimitive from '@radix-ui/react-hover-card'\nimport { cn } from '../../utils/cn'\n\nconst HoverCard = HoverCardPrimitive.Root\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\nconst HoverCardContent = React.forwardRef<\n React.ElementRef<typeof HoverCardPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <HoverCardPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","import * as React from 'react'\nimport * as SwitchPrimitives from '@radix-ui/react-switch'\nimport { cn } from '../../utils/cn'\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0'\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","import React, { useState } from 'react'\nimport { PlusCircle, Globe, ChartArea } from 'lucide-react'\nimport { ButtonWithTooltip } from './ButtonWithTooltip'\nimport ConfettiEffect from './ConfettiEffect'\nimport { cn } from '../../utils/cn'\nimport { toast } from '../../hooks/use-toast'\nimport { usePapermapStore } from '../../store'\n\ninterface SimpleButtonProps {\n onClick: () => void\n}\n\nexport function AddNewChatBtn({ onClick }: SimpleButtonProps) {\n return (\n <ButtonWithTooltip onClick={onClick} tooltipText=\"New Chat\" className=\"h-8 w-8\">\n <PlusCircle className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n )\n}\n\nexport function ChartHistoryBtn({ onClick }: SimpleButtonProps) {\n return (\n <ButtonWithTooltip onClick={onClick} tooltipText=\"Charts History\" className=\"h-8 w-8\">\n <ChartArea className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n )\n}\n\nexport function SearchWebBtn() {\n const browserUse = usePapermapStore((s) => s.browserUse)\n const updateBrowserUse = usePapermapStore((s) => s.updateBrowserUse)\n const [showGlobeConfetti, setShowGlobeConfetti] = useState(false)\n\n const handleBrowserUse = () => {\n const newBrowserUse = !browserUse\n toast({\n title: 'Search the web',\n description: browserUse ? 'Web search feature disabled' : 'Web search feature activated',\n })\n updateBrowserUse(newBrowserUse)\n\n // Trigger confetti animation when activating browser use\n if (newBrowserUse) {\n setShowGlobeConfetti(true)\n // Hide confetti after animation\n setTimeout(() => {\n setShowGlobeConfetti(false)\n }, 2000)\n }\n }\n\n return (\n <div className=\"relative\">\n <ButtonWithTooltip\n onClick={handleBrowserUse}\n tooltipText={browserUse ? 'Disable Web search' : 'Enable Web search'}\n className=\"h-8 w-8\"\n >\n <Globe\n className={cn(\n 'h-4 w-4 transition-all duration-500 ease-in-out',\n browserUse ? 'text-teal-600 dark:text-teal-400 animate-fade' : 'text-muted-foreground'\n )}\n />\n </ButtonWithTooltip>\n <ConfettiEffect showGlobeConfetti={showGlobeConfetti} />\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { Sparkles, ChevronDown } from 'lucide-react'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectGroup } from '../ui/select'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { cn } from '../../utils/cn'\nimport { usePapermapStore, usePapermapStoreApi } from '../../store'\n\nconst RECOMMENDED_LABELS: Record<string, string> = {\n Default: 'Default (Great for most tasks)',\n Max: 'Max (Most capable model)',\n}\n\nexport function ModelSelector() {\n const selectedModel = usePapermapStore((s) => s.selectedModel)\n const setSelectedModel = usePapermapStore((s) => s.setSelectedModel)\n const storeApi = usePapermapStoreApi()\n\n const [modelGroups, setModelGroups] = useState<Record<string, string[]>>({})\n const [recommendedModels, setRecommendedModels] = useState<Record<string, string>>({})\n const [showAllModels, setShowAllModels] = useState(false)\n const [isDropdownOpen, setIsDropdownOpen] = useState(false)\n const [allowTooltip, setAllowTooltip] = useState(true)\n\n useEffect(() => {\n const services = storeApi.getState().getServices()\n services.chartSvc.getModels().then((data: any) => {\n if (data) {\n setModelGroups(data.all_models || {})\n setRecommendedModels(data.recommended_models || {})\n if (!selectedModel && data.recommended_models?.Default) {\n setSelectedModel(data.recommended_models.Default)\n }\n }\n }).catch(() => {})\n }, [storeApi, selectedModel, setSelectedModel])\n\n return (\n <TooltipProvider>\n <Tooltip open={isDropdownOpen || !allowTooltip ? false : undefined}>\n <div className=\"relative\">\n <Select\n value={selectedModel || ''}\n onValueChange={(value: string) => setSelectedModel(value)}\n onOpenChange={(open) => {\n setIsDropdownOpen(open)\n if (!open) {\n setShowAllModels(false)\n setAllowTooltip(false)\n setTimeout(() => setAllowTooltip(true), 300)\n }\n }}\n >\n <TooltipTrigger asChild>\n <SelectTrigger\n className={cn(\n 'h-8 w-8 p-0 border-none shadow-none ring-0 focus-visible:ring-0 focus:ring-0 focus-within:ring-0',\n 'hover:bg-accent/50 transition-colors duration-200',\n 'rounded-sm flex items-center justify-center'\n )}\n >\n <Sparkles className=\"h-4 w-4 text-muted-foreground\" />\n </SelectTrigger>\n </TooltipTrigger>\n <SelectContent className=\"w-[280px] p-2\" position=\"popper\">\n <SelectGroup>\n {Object.entries(recommendedModels).map(([key, modelValue]) => (\n <SelectItem key={key} value={modelValue} className=\"text-sm cursor-pointer pl-8 pr-3 py-2\">\n {RECOMMENDED_LABELS[key] || key}\n </SelectItem>\n ))}\n </SelectGroup>\n <div\n onClick={() => setShowAllModels(!showAllModels)}\n className=\"flex items-center justify-between pl-8 pr-3 py-2 text-xs text-muted-foreground hover:text-foreground hover:bg-accent/50 cursor-pointer rounded-sm mt-1 transition-colors\"\n >\n <span>{showAllModels ? 'Show less' : 'Show more'}</span>\n <ChevronDown className={cn('h-3 w-3 transition-transform duration-200', showAllModels && 'rotate-180')} />\n </div>\n {showAllModels && (\n <>\n <div className=\"border-t border-border/50 my-2\" />\n {Object.entries(modelGroups).map(([provider, models], index, array) => (\n <React.Fragment key={provider}>\n <SelectGroup>\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground capitalize\">{provider}</div>\n {models.map((model) => (\n <SelectItem key={model} value={model} className=\"text-sm cursor-pointer pl-8 pr-3 py-2\">\n {model}\n </SelectItem>\n ))}\n </SelectGroup>\n {index < array.length - 1 ? <div className=\"border-t border-border/50 my-1\" /> : null}\n </React.Fragment>\n ))}\n </>\n )}\n </SelectContent>\n </Select>\n <TooltipContent>\n <p>{selectedModel ? `Model: ${selectedModel}` : 'Select Model'}</p>\n </TooltipContent>\n </div>\n </Tooltip>\n </TooltipProvider>\n )\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n BarChart3,\n Loader2,\n Maximize2,\n MessageSquare,\n MoveDiagonal2,\n Pencil,\n Trash2,\n} from 'lucide-react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { cn } from '../utils/cn'\nimport {\n PapermapProvider,\n usePapermapConnection,\n usePapermapConnectionOptional,\n usePapermapStoreApiOptional,\n openPapermapChatAssistant,\n closePapermapChatAssistant,\n} from '../store'\nimport { ChartView } from './charts/ChartView'\nimport { ChartDialog } from './charts/ChartDialog'\nimport { StreamingChartDialog } from './charts/StreamingChartDialog'\nimport { DeleteConfirmationModal } from './dashboard/DeleteConfirmationModal'\nimport { ButtonWithTooltip } from './common/ButtonWithTooltip'\nimport { Card } from './ui/card'\nimport { toast } from '../hooks/use-toast'\nimport type { TChartResponse } from '../types/chart'\nimport {\n resolveChartFetchChatId,\n upsertChartCardIdLink,\n removeChartCardIdLink,\n removeChartCardLinksByChatId,\n} from '../utils/chart-card-storage'\nimport type { PapermapHttpServices } from '../store'\n\nfunction normalizeLatestChartPayload(result: any, fallbackChatId: string): TChartResponse | null {\n const chartData = result?.data ?? result\n if (!chartData) return null\n const hasChartShape =\n chartData.chart_response ||\n chartData.chart_type ||\n chartData.response_type === 'chart' ||\n (Array.isArray(chartData.data) && chartData.schema_hints)\n if (!hasChartShape) return null\n if (chartData.chart_response) {\n return {\n llm_data_chat_id: chartData.llm_data_chat_id ?? fallbackChatId,\n name: chartData.name || '',\n meta: chartData.meta || {},\n pin: chartData.pin ?? false,\n chart_response: chartData.chart_response,\n }\n }\n return {\n llm_data_chat_id: chartData.llm_data_chat_id ?? fallbackChatId,\n name: chartData.name || '',\n meta: chartData.meta || {},\n pin: chartData.pin ?? false,\n chart_response: {\n chart_type: chartData.chart_type || '',\n data: chartData.data || [],\n response_type: chartData.response_type || 'chart',\n schema_hints: chartData.schema_hints || { x_key: '', y_key: '', label_key: '' },\n visualization_config: chartData.visualization_config || {\n colors: [],\n width: 0,\n height: 0,\n },\n },\n }\n}\n\n/** Loads chart data for a **backend chat id** only (never a host `cardId`). */\nasync function fetchChartForChatId(\n chartSvc: PapermapHttpServices['chartSvc'],\n chatId: string\n): Promise<TChartResponse | null> {\n try {\n const byId = await chartSvc.getChartById(chatId)\n const fromById = normalizeLatestChartPayload(byId, chatId)\n if (fromById) return fromById\n } catch {\n // fall through to latest-chart\n }\n const latest = await chartSvc.getLatestChart(chatId)\n return normalizeLatestChartPayload(latest, chatId)\n}\n\nfunction persistChartLoaded(\n chart: TChartResponse,\n cardId: string | undefined,\n workspaceId: string,\n dashboardId: string,\n onSave?: (chart: TChartResponse) => void\n): void {\n if (cardId?.trim() && chart.llm_data_chat_id) {\n upsertChartCardIdLink(\n {\n id: cardId.trim(),\n chatId: chart.llm_data_chat_id.trim(),\n },\n { workspaceId, dashboardId }\n )\n }\n if (onSave) {\n try {\n onSave(chart)\n } catch (e) {\n console.error('PapermapChartCard onSave:', e)\n }\n }\n}\n\nexport interface PapermapChartCardProps {\n /**\n * Connection details for API calls. Optional when the card is rendered inside\n * `PapermapProvider` with the same values (or use props to override provider defaults).\n */\n token?: string\n workspaceId?: string\n dashboardId?: string\n apiUrl?: string\n /**\n * Stable id owned by the host (layout slot, widget key, etc.). It is **not** a backend chat id.\n * On successful load, the card persists `{ id, chatId }` to localStorage; on later mounts, that\n * `chatId` is used for API fetches (see `resolveChartFetchChatId` in `chart-card-storage`).\n */\n id?: string\n /**\n * Called after chart state is successfully loaded or when a preloaded `chart` prop\n * is applied with a valid `llm_data_chat_id`. Errors from the host callback are caught\n * and logged only.\n */\n onSave?: (chart: TChartResponse) => void\n /**\n * The chat ID to load a chart for. When provided, the component will\n * fetch the latest chart for this chat on mount (overrides `id` → localStorage map).\n */\n chartId?: string\n /**\n * Pre-loaded chart data. When provided, the component will render this\n * chart instead of fetching from the API.\n */\n chart?: TChartResponse\n /**\n * Visual theme for the chart card. When set, renders in the specified\n * mode independent of the host app. Omit to inherit the host page's theme.\n */\n theme?: 'light' | 'dark'\n /**\n * Called when the user clicks the edit button on the chart card.\n * In streaming variant, if not provided, the built-in StreamingChartDialog opens.\n */\n onEditClick?: (chartId: string) => void\n /**\n * Called when the user confirms chart deletion.\n */\n onDelete?: (chartId: string) => void\n /**\n * Called when the pin state of the chart changes.\n */\n onPinChange?: (chartId: string, pinned: boolean) => void\n /**\n * When true, suppress destructive actions like delete.\n * (Used by viewer mode dashboards.)\n */\n isViewer?: boolean\n /**\n * When true, the chart card will be rendered in wide mode suitable for\n * table-type charts that need more horizontal space.\n */\n wide?: boolean\n /** Hide the chart variation selector. Defaults to true. */\n hideVariants?: boolean\n /** Show the toolbar with edit/delete/maximize buttons. Defaults to true. */\n showToolbar?: boolean\n /** When true, chart toolbar actions are visually disabled during layout editing. */\n isEditMode?: boolean\n /** When true, show resize affordance and disable toolbar actions. */\n // isResizable?: boolean\n /** Optional stable identifier for standalone resize handle instrumentation. */\n // resizeKey?: string\n className?: string\n /**\n * Card variant. When `\"streaming\"`, clicking the edit icon opens an\n * expanded chart+conversation view (StreamingChartDialog) instead of\n * just calling onEditClick or opening the toolbar chat.\n */\n variant?: 'default' | 'streaming'\n}\n\nexport function PapermapChartCard({\n token: tokenProp,\n workspaceId: workspaceIdProp,\n dashboardId: dashboardIdProp,\n apiUrl: apiUrlProp,\n id,\n onSave,\n chartId,\n chart: chartProp,\n theme,\n onEditClick,\n onDelete,\n isViewer = false,\n wide = false,\n hideVariants = true,\n showToolbar = true,\n isEditMode = false,\n // isResizable,\n // resizeKey,\n className,\n variant = 'default',\n}: PapermapChartCardProps) {\n const conn = usePapermapConnectionOptional()\n const token = tokenProp ?? conn?.token\n const workspaceId = workspaceIdProp ?? conn?.workspaceId\n const dashboardId = dashboardIdProp ?? conn?.dashboardId\n const apiUrl = apiUrlProp ?? conn?.apiUrl\n\n if (!token?.trim() || !workspaceId?.trim() || !dashboardId?.trim()) {\n throw new Error(\n 'PapermapChartCard requires token, workspaceId, and dashboardId from props or PapermapProvider.'\n )\n }\n\n const resolvedFetchChatId = useMemo(\n () =>\n resolveChartFetchChatId({\n chartIdProp: chartId,\n cardId: id,\n workspaceId,\n dashboardId,\n }),\n [chartId, id, workspaceId, dashboardId]\n )\n /** Bridges dialog save → local `id`↔`chatId` map + host `onSave` (see `persistChartLoaded`). */\n const saveChart = useCallback(\n (chart: TChartResponse) => {\n persistChartLoaded(chart, id, workspaceId, dashboardId, onSave)\n },\n [onSave, id, workspaceId, dashboardId]\n )\n\n const card = (\n <div\n className={cn(\n 'h-full min-h-0',\n theme === 'dark' ? 'dark' : theme === 'light' ? 'light' : undefined\n )}\n >\n <ChartCardInner\n workspaceId={workspaceId}\n dashboardId={dashboardId}\n cardId={id}\n onSave={saveChart}\n resolvedFetchChatId={resolvedFetchChatId}\n chart={chartProp}\n onEditClick={onEditClick}\n onDelete={onDelete}\n isViewer={isViewer}\n wide={wide}\n hideVariants={hideVariants}\n showToolbar={showToolbar}\n isEditMode={isEditMode}\n // isResizable={isResizable}\n // resizeKey={resizeKey}\n className={className}\n variant={variant}\n />\n </div>\n )\n\n if (conn) {\n return card\n }\n\n return (\n <PapermapProvider\n token={token}\n workspaceId={workspaceId}\n dashboardId={dashboardId}\n apiUrl={apiUrl}\n >\n {card}\n </PapermapProvider>\n )\n}\n\ninterface InnerProps {\n workspaceId: string\n dashboardId: string\n /** Host stable id; paired with backend chat id in local storage when set. */\n cardId?: string\n onSave?: (chart: TChartResponse) => void\n /** Backend chat id from prop or persisted link — always the id passed to chart HTTP APIs. */\n resolvedFetchChatId?: string\n chart?: TChartResponse\n onDelete?: (chartId: string) => void\n isViewer?: boolean\n wide?: boolean\n hideVariants?: boolean\n showToolbar?: boolean\n isEditMode?: boolean\n // isResizable?: boolean\n // resizeKey?: string\n className?: string\n onEditClick?: (chartId: string) => void\n variant?: 'default' | 'streaming'\n}\n\n// const STANDALONE_RESIZE_DIRECTIONS = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'] as const\n\n// const STANDALONE_RESIZE_HANDLE_POSITION: Record<\n// (typeof STANDALONE_RESIZE_DIRECTIONS)[number],\n// string\n// > = {\n// n: 'left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 cursor-n-resize',\n// s: 'left-1/2 bottom-0 -translate-x-1/2 translate-y-1/2 cursor-s-resize',\n// e: 'right-0 top-1/2 -translate-y-1/2 translate-x-1/2 cursor-e-resize',\n// w: 'left-0 top-1/2 -translate-y-1/2 -translate-x-1/2 cursor-w-resize',\n// ne: 'right-0 top-0 translate-x-1/2 -translate-y-1/2 cursor-ne-resize',\n// nw: 'left-0 top-0 -translate-x-1/2 -translate-y-1/2 cursor-nw-resize',\n// se: 'right-0 bottom-0 translate-x-1/2 translate-y-1/2 cursor-se-resize',\n// sw: 'left-0 bottom-0 -translate-x-1/2 translate-y-1/2 cursor-sw-resize',\n// }\n\nfunction ChartCardInner({\n workspaceId,\n dashboardId,\n cardId,\n onSave,\n resolvedFetchChatId,\n chart: chartProp,\n onDelete,\n isViewer = false,\n wide = false,\n hideVariants = true,\n showToolbar = true,\n isEditMode = false,\n // isResizable,\n // resizeKey,\n className,\n onEditClick,\n variant = 'default',\n}: InnerProps) {\n const { services } = usePapermapConnection()\n const { chartSvc } = services\n const storeApi = usePapermapStoreApiOptional()\n const queryClient = useQueryClient()\n\n const [chart, setChart] = useState<TChartResponse | null>(chartProp ?? null)\n const [isLoading, setIsLoading] = useState(!chartProp && !!resolvedFetchChatId)\n const [error, setError] = useState<string | null>(null)\n\n const [isDeleting, setIsDeleting] = useState(false)\n const [showDeleteDialog, setShowDeleteDialog] = useState(false)\n const [showMaximized, setShowMaximized] = useState(false)\n const [showStreamingDialog, setShowStreamingDialog] = useState(false)\n const [cardInstanceKey, setCardInstanceKey] = useState(0)\n\n const chatId = chart?.llm_data_chat_id ?? resolvedFetchChatId ?? null\n // const isResizing = Boolean(isResizable ?? isEditMode)\n // const resizeInstanceKey = useMemo(\n // () => resizeKey?.trim() || cardId?.trim() || chatId?.trim() || 'standalone-chart-card',\n // [resizeKey, cardId, chatId]\n // )\n\n useEffect(() => {\n if (!chartProp) return\n setChart(chartProp)\n setIsLoading(false)\n setError(null)\n if (chartProp.llm_data_chat_id) {\n persistChartLoaded(chartProp, cardId, workspaceId, dashboardId, onSave)\n }\n }, [chartProp, cardId, workspaceId, dashboardId, onSave])\n\n useEffect(() => {\n if (chartProp) return\n if (!resolvedFetchChatId) {\n setIsLoading(false)\n return\n }\n\n let stale = false\n setIsLoading(true)\n setError(null)\n\n fetchChartForChatId(chartSvc, resolvedFetchChatId)\n .then((loaded) => {\n if (stale) return\n if (loaded) {\n setChart(loaded)\n persistChartLoaded(loaded, cardId, workspaceId, dashboardId, onSave)\n } else {\n setError('No chart data found')\n }\n })\n .catch((err: unknown) => {\n if (stale) return\n console.error('Failed to load chart:', err)\n setError(err instanceof Error ? err.message : 'Failed to load chart')\n })\n .finally(() => {\n if (!stale) setIsLoading(false)\n })\n\n return () => {\n stale = true\n }\n }, [chartProp, resolvedFetchChatId, chartSvc, cardId, workspaceId, dashboardId, onSave])\n\n const isPinned = Boolean(chart?.pin)\n const isTile = chart?.chart_response?.chart_type === 'tile'\n const isMultiTile = isTile && (chart?.chart_response?.data?.length ?? 0) > 1\n\n const invalidateChartCards = useCallback(async () => {\n await queryClient.invalidateQueries({ queryKey: ['chartCards', dashboardId] })\n }, [queryClient, dashboardId])\n\n const remountChartCard = useCallback(() => {\n setChart(null)\n setError(null)\n setIsLoading(false)\n setShowDeleteDialog(false)\n setShowMaximized(false)\n setShowStreamingDialog(false)\n setCardInstanceKey((prev) => prev + 1)\n }, [])\n\n const handleDelete = useCallback(async () => {\n if (!chatId) return\n setShowDeleteDialog(false)\n setIsDeleting(true)\n\n try {\n await chartSvc.deleteChart(chatId)\n await queryClient.invalidateQueries({ queryKey: ['conversationHistory', dashboardId] })\n await invalidateChartCards()\n onDelete?.(chatId)\n removeChartCardLinksByChatId(chatId, { workspaceId, dashboardId })\n if (cardId?.trim()) {\n removeChartCardIdLink(cardId.trim(), chatId, { workspaceId, dashboardId })\n }\n try {\n const maybeChart = await fetchChartForChatId(chartSvc, chatId)\n if (!maybeChart) remountChartCard()\n } catch {\n remountChartCard()\n }\n toast({\n title: 'Chart Deleted',\n description: 'The chart has been removed successfully',\n })\n } catch {\n toast({\n title: 'Error',\n description: 'Failed to delete the chart',\n variant: 'destructive',\n })\n } finally {\n setIsDeleting(false)\n }\n }, [\n chatId,\n chartSvc,\n onDelete,\n queryClient,\n dashboardId,\n cardId,\n workspaceId,\n invalidateChartCards,\n remountChartCard,\n ])\n\n const handleOpenStreamingDialog = useCallback(() => {\n if (!storeApi) {\n toast({\n title: 'Chat unavailable',\n description: 'Mount PapermapProvider to use the streaming chart assistant.',\n variant: 'destructive',\n })\n return\n }\n if (chatId) {\n openPapermapChatAssistant(storeApi, {\n editChartId: chatId,\n chart: chart ?? undefined,\n suppressOpen: true,\n })\n }\n setShowStreamingDialog(true)\n }, [chatId, chart, storeApi])\n\n const streamingDialog =\n storeApi && variant === 'streaming' ? (\n <StreamingChartDialog\n isOpen={showStreamingDialog}\n onOpenChange={(open) => {\n setShowStreamingDialog(open)\n if (!open) closePapermapChatAssistant(storeApi)\n }}\n chartId={chatId ?? ''}\n onSave={onSave}\n onClose={() => {\n setShowStreamingDialog(false)\n closePapermapChatAssistant(storeApi)\n }}\n />\n ) : null\n\n if (isLoading) {\n return (\n <Card\n className={cn(\n 'relative flex h-full flex-col items-center justify-center min-h-[200px]',\n className\n )}\n >\n <Loader2 className=\"size-8 animate-spin mb-3\" />\n <p className=\"text-sm text-muted-foreground font-medium\">Fetching data...</p>\n </Card>\n )\n }\n\n if (error) {\n return (\n <Card\n className={cn(\n 'relative flex h-full flex-col items-center justify-center min-h-[200px]',\n className\n )}\n >\n <p className=\"text-sm text-destructive font-medium\">{error}</p>\n </Card>\n )\n }\n\n if (!chart) {\n if (variant !== 'streaming') return null\n\n return (\n <>\n <Card\n className={cn(\n 'group relative flex h-full flex-col items-center justify-center min-h-[300px] cursor-pointer transition-all duration-200 w-[400px]',\n !storeApi && 'cursor-not-allowed opacity-80',\n className\n )}\n onClick={() => {\n if (!storeApi) {\n toast({\n title: 'Chat unavailable',\n description: 'Mount PapermapProvider to use the streaming chart assistant.',\n variant: 'destructive',\n })\n return\n }\n handleOpenStreamingDialog()\n }}\n >\n <div className=\"flex flex-col items-center gap-3 px-6 text-center\">\n <div className=\"flex items-center justify-center size-12 rounded-full bg-muted/60\">\n <BarChart3 className=\"size-5 text-muted-foreground\" />\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">Create a chart</p>\n <p className=\"text-xs text-muted-foreground max-w-[200px]\">\n Click to start a conversation and generate a chart from your data\n </p>\n </div>\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground/70 mt-1\">\n <MessageSquare className=\"size-3\" />\n <span>Ask anything about your data</span>\n </div>\n </div>\n </Card>\n\n {streamingDialog}\n </>\n )\n }\n\n return (\n <>\n <Card\n key={cardInstanceKey}\n data-wide={wide ? 'true' : undefined}\n className={cn(\n 'group relative flex h-full flex-col overflow-hidden transition-all duration-200 pb-0 m-0 shadow-none',\n isTile && '!border-none',\n isMultiTile && 'shadow-none bg-transparent border-none',\n className\n )}\n >\n {chart.isLoading && (\n <div className=\"absolute inset-0 z-50 flex flex-col items-center justify-center bg-background/80 backdrop-blur-sm\">\n <Loader2 className=\"size-8 animate-spin mb-3\" />\n <p className=\"text-sm text-muted-foreground font-medium\">Fetching data...</p>\n </div>\n )}\n {/* \n {isResizing && (\n <div\n className=\"pointer-events-none absolute inset-0 z-20\"\n data-resize-key={resizeInstanceKey}\n data-resizing=\"true\"\n >\n {STANDALONE_RESIZE_DIRECTIONS.map((direction) => (\n <span\n key={`${resizeInstanceKey}:${direction}`}\n className={cn(\n 'pointer-events-auto absolute size-3 rounded-sm border border-primary/80 bg-background/95 shadow-sm',\n STANDALONE_RESIZE_HANDLE_POSITION[direction]\n )}\n data-resize-key={resizeInstanceKey}\n data-resize-direction={direction}\n aria-label={`Resize handle ${direction}`}\n title={`Resize (${direction.toUpperCase()})`}\n />\n ))}\n </div>\n )} */}\n\n {showToolbar && (\n <div\n className={cn(\n 'absolute top-4 right-0 z-30 flex h-10 w-auto items-center justify-end px-4',\n isTile && 'opacity-0 group-hover:opacity-100 transition-opacity'\n )}\n >\n {chart.isFetching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <div className=\"flex items-center gap-2\">\n {/* {isResizing && (\n <div\n className=\"flex size-8 items-center justify-center rounded-md border border-border/60 bg-background/90 text-muted-foreground\"\n aria-label=\"Resize card\"\n title=\"Resize Card\"\n >\n <MoveDiagonal2 className=\"size-4\" />\n </div>\n )} */}\n <div\n className={cn(\n 'flex items-center gap-2'\n // isResizing && 'opacity-30 pointer-events-none'\n )}\n >\n <ButtonWithTooltip\n onClick={() => setShowMaximized(true)}\n tooltipText=\"Maximize Chart\"\n >\n <Maximize2 className=\"size-4\" />\n </ButtonWithTooltip>\n {chatId && (\n <ButtonWithTooltip\n onClick={() => {\n void invalidateChartCards()\n if (variant === 'streaming') {\n if (onEditClick) {\n onEditClick(chatId)\n } else {\n handleOpenStreamingDialog()\n }\n } else if (onEditClick) {\n onEditClick(chatId)\n } else if (storeApi) {\n openPapermapChatAssistant(storeApi, {\n editChartId: chatId,\n chart: chart ?? undefined,\n })\n } else {\n toast({\n title: 'Chat unavailable',\n description: 'Mount PapermapProvider to open the chart assistant.',\n variant: 'destructive',\n })\n }\n }}\n tooltipText=\"Edit Chart\"\n >\n <Pencil className=\"size-4\" />\n </ButtonWithTooltip>\n )}\n {!isViewer && chatId && !isDeleting && (\n <ButtonWithTooltip\n onClick={() => setShowDeleteDialog(true)}\n tooltipText=\"Delete Chart\"\n >\n {isDeleting ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Trash2 className=\"size-4\" />\n )}\n </ButtonWithTooltip>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n\n <div className=\"flex-1 min-h-0 px-1\">\n <ChartView\n data={chart.chart_response?.data || []}\n chartMeta={chart.meta}\n visualizationConfig={chart.chart_response?.visualization_config || {}}\n chartType={chart.chart_response?.chart_type || ''}\n variant=\"default\"\n className=\"h-full w-full\"\n chartId={chatId || undefined}\n hideVariants={hideVariants}\n hideTitleAndSubtitle={isTile}\n pin={isPinned}\n />\n </div>\n </Card>\n\n <DeleteConfirmationModal\n isOpen={showDeleteDialog}\n onClose={() => setShowDeleteDialog(false)}\n onConfirm={handleDelete}\n isDeleting={isDeleting}\n title=\"Are you sure you want to delete this chart?\"\n description=\"This action cannot be undone. This will permanently delete the chart and remove it from the dashboard.\"\n />\n\n {chatId && (\n <ChartDialog\n isOpen={showMaximized}\n onOpenChange={setShowMaximized}\n title={chart.meta?.title}\n data={chart.chart_response?.data || []}\n chartId={chatId}\n chartMeta={chart.meta}\n chartType={chart.chart_response?.chart_type || ''}\n visualizationConfig={chart.chart_response?.visualization_config || {}}\n onMetaChange={() => {}}\n variant=\"default\"\n onClose={() => setShowMaximized(false)}\n />\n )}\n\n {chatId && streamingDialog}\n </>\n )\n}\n","'use client'\n\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { Eye, FullscreenIcon, Loader2, Maximize2, MessageSquare, Save, X } from 'lucide-react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { Button } from '../ui/button'\nimport { ChartView } from './ChartView'\nimport { ChartDialog } from './ChartDialog'\nimport { StreamingChatPanel } from '../StreamingChatPanel'\nimport MorphGradient from '../MorphGradient'\nimport { useToast } from '../../hooks/use-toast'\nimport { usePapermapStore, usePapermapStoreApi } from '../../store'\nimport type { TChartResponse } from '../../types/chart'\nimport { cn } from '../../utils/cn'\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\n\nconst EASE = [0.23, 1, 0.32, 1] as const\n\n/** Snapshot after “Save to dashboard” in the streaming dialog (pinned, store-backed chart state). */\nfunction buildTChartResponseFromStreamingState(args: {\n chartId: string\n chartData: any[]\n allMeta: Record<string, any>\n selectedChartType: string\n chartVisuals: Record<string, any>\n}): TChartResponse {\n const { chartId, chartData, allMeta, selectedChartType, chartVisuals } = args\n const variant =\n (typeof allMeta?.variant === 'string' && allMeta.variant) ||\n (typeof chartVisuals?.variant === 'string' && chartVisuals.variant) ||\n ''\n const title = allMeta?.title || chartVisuals?.title || ''\n return {\n llm_data_chat_id: chartId,\n name: typeof title === 'string' ? title : '',\n meta: { ...allMeta, variant },\n pin: true,\n chart_response: {\n chart_type: selectedChartType,\n data: Array.isArray(chartData) ? chartData : [],\n response_type: 'chart',\n schema_hints: {\n x_key: chartVisuals?.x_key ?? '',\n y_key: chartVisuals?.y_key ?? '',\n label_key: chartVisuals?.label_key ?? '',\n },\n visualization_config: {\n colors: Array.isArray(chartVisuals?.colors) ? chartVisuals.colors : [],\n width: typeof chartVisuals?.width === 'number' ? chartVisuals.width : 0,\n height: typeof chartVisuals?.height === 'number' ? chartVisuals.height : 0,\n ...chartVisuals,\n variant,\n },\n },\n }\n}\n\nfunction getDialogDimensions(hasChart: boolean, options?: { expanded?: boolean }) {\n const expanded = options?.expanded === true\n\n const isMobile = typeof window !== 'undefined' && window.innerWidth < 768\n if (isMobile) {\n return {\n width: expanded ? '95vw' : '90vw',\n height: expanded ? 'calc(100vh - 90px)' : '60vh',\n }\n }\n\n const screenWidth = typeof window !== 'undefined' ? window.innerWidth : 1024\n let width: string | number\n if (screenWidth >= 1536) width = expanded ? '96vw' : '45vw'\n else if (screenWidth >= 1280) width = expanded ? '97vw' : '55vw'\n else if (screenWidth >= 1024) width = expanded ? '98vw' : '65vw'\n else if (screenWidth >= 768) width = expanded ? '98vw' : '75vw'\n else width = expanded ? '95vw' : '90vw'\n\n const maxWidth = expanded ? 1920 : 1100\n if (typeof width === 'string' && width.includes('vw')) {\n const vwValue = parseInt(width)\n if ((screenWidth * vwValue) / 100 > maxWidth) width = maxWidth\n }\n\n if (hasChart) {\n const chartMaxWidth = expanded ? 1920 : 1400\n let chartWidth: string | number\n if (screenWidth >= 1736) chartWidth = expanded ? '98vw' : '1400px'\n else if (screenWidth >= 1280) chartWidth = expanded ? '97vw' : '68vw'\n else if (screenWidth >= 1024) chartWidth = expanded ? '98vw' : '90vw'\n else if (screenWidth >= 768) chartWidth = expanded ? '98vw' : '92vw'\n else chartWidth = expanded ? '95vw' : '95vw'\n if (typeof chartWidth === 'string' && chartWidth.includes('vw')) {\n const vwValue = parseInt(chartWidth)\n if ((screenWidth * vwValue) / 100 > chartMaxWidth) chartWidth = chartMaxWidth\n }\n return { width: chartWidth, height: expanded ? 'calc(100vh - 90px)' : '65vh' }\n }\n\n return { width, height: expanded ? 'calc(100vh - 90px)' : '60vh' }\n}\n\nexport interface StreamingChartDialogProps {\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n chartId: string\n onClose?: () => void\n /** After a successful Save-to-dashboard (pin) from this dialog; errors from the host are caught and logged. */\n onSave?: (chart: TChartResponse) => void\n}\n\nexport function StreamingChartDialog({\n isOpen,\n onOpenChange,\n chartId,\n onClose,\n onSave,\n}: StreamingChartDialogProps) {\n const [isSaving, setIsSaving] = useState(false)\n const [isMaximized, setIsMaximized] = useState(false)\n const [isExpanded, setIsExpanded] = useState(false)\n const [isChartVisible, setIsChartVisible] = useState(true)\n const [isMobileViewport, setIsMobileViewport] = useState(false)\n const { toast } = useToast()\n const storeApi = usePapermapStoreApi()\n\n const chartData = usePapermapStore((s) => s.chartData)\n const isBranching = usePapermapStore((s) => s.isBranching)\n const allMeta = usePapermapStore((s) => s.allMeta)\n const selectedChartType = usePapermapStore((s) => s.selectedChartType)\n const chartVisuals = usePapermapStore((s) => s.chartVisuals)\n const activeChatId = usePapermapStore((s) => s.editChatId || s.chatId)\n\n const title = allMeta?.title\n const hasChart = !!(chartData?.length && isChartVisible)\n const chartSplitActive = isChartVisible && Boolean(chartData?.length && selectedChartType)\n /** On <sm the chart column is hidden; widen chat only when that pane is off (or there is no chart). */\n const expandChatMessagesOnMobile = !chartSplitActive\n const dimensions = getDialogDimensions(hasChart, { expanded: isExpanded })\n const effectiveChartId = chartId || activeChatId || ''\n\n const floatingActionButtonClasses =\n 'h-8 px-3 backdrop-blur-md border border-border/50 shadow-lg hover:shadow-xl transition-all duration-200 flex items-center justify-center gap-2 text-sm font-medium'\n\n const toggleExpanded = useCallback(() => setIsExpanded((prev) => !prev), [])\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n const updateViewport = () => setIsMobileViewport(window.innerWidth < 640)\n updateViewport()\n window.addEventListener('resize', updateViewport)\n return () => window.removeEventListener('resize', updateViewport)\n }, [])\n\n useEffect(() => {\n if (isOpen && isMobileViewport) {\n setIsChartVisible(false)\n }\n }, [isOpen, isMobileViewport])\n\n const handleSaveToDashboard = async () => {\n if (!effectiveChartId) return\n const { chartSvc } = storeApi.getState().getServices()\n const dashboardId = storeApi.getState().getConfig().dashboardId\n if (!dashboardId) return\n\n try {\n setIsSaving(true)\n const chartTitle = allMeta?.title || 'Chart'\n await chartSvc.updateChartPin(effectiveChartId, true)\n toast({ title: `${chartTitle} saved to dashboard`, description: '' })\n if (onSave) {\n try {\n onSave(\n buildTChartResponseFromStreamingState({\n chartId: effectiveChartId,\n chartData,\n allMeta: allMeta || {},\n selectedChartType: selectedChartType || '',\n chartVisuals: chartVisuals || {},\n })\n )\n } catch (e) {\n console.error('StreamingChartDialog onSave:', e)\n }\n }\n } catch (error) {\n console.error('Failed to save chart:', error)\n toast({ title: 'Failed to save chart', description: '', variant: 'destructive' })\n } finally {\n setIsSaving(false)\n }\n }\n\n const handleClose = () => {\n onClose?.()\n onOpenChange(false)\n }\n\n return createPortal(\n <AnimatePresence>\n {isOpen && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0 bg-neutral-800/80 backdrop-blur-md\"\n onClick={handleClose}\n />\n\n {/* Dialog panel */}\n <motion.div\n initial={{ opacity: 0, scale: 0.98, width: 400, height: 0 }}\n animate={{\n opacity: 1,\n scale: 1,\n width:\n typeof dimensions.width === 'string' ? dimensions.width : `${dimensions.width}px`,\n height:\n typeof dimensions.height === 'string'\n ? dimensions.height\n : `${dimensions.height}px`,\n transition: {\n duration: 0.3,\n ease: EASE,\n opacity: { duration: 0.2 },\n scale: { duration: 0.3, ease: EASE },\n width: { duration: 0.3, ease: EASE },\n height: { duration: 0.3, ease: EASE },\n },\n }}\n exit={{\n opacity: 0,\n scale: 0.98,\n width: 400,\n height: 0,\n transition: { duration: 0.2, ease: EASE },\n }}\n className=\"relative rounded-3xl bg-background/85 border border-border/50 backdrop-blur-lg overflow-hidden flex flex-col streaming-chart\"\n style={{ transformOrigin: 'bottom center' }}\n onClick={(e) => {\n if (!(e.target instanceof HTMLAnchorElement)) {\n e.stopPropagation()\n e.preventDefault()\n }\n }}\n role=\"dialog\"\n aria-label={title || 'Chart View'}\n >\n <div className=\"absolute inset-0 bg-gradient-to-b from-background/10 via-background/50 to-background/10 opacity-50\" />\n <MorphGradient />\n\n {/* Content (above gradients) */}\n <motion.div\n className=\"relative flex flex-col w-full h-full z-10\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1, transition: { delay: 0.1, duration: 0.2 } }}\n >\n <AnimatePresence>\n {isBranching && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0 bg-background/60 backdrop-blur-md z-50 flex items-center justify-center rounded-3xl\"\n >\n <motion.div\n initial={{ scale: 0.9, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.9, opacity: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex flex-col items-center gap-4\"\n >\n <div className=\"size-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-lg font-medium text-foreground\">\n Branching into a new conversation\n </p>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Body: chart left, conversation right */}\n <div className=\"flex-1 flex min-h-0\">\n {/* Chart side */}\n {isChartVisible &&\n (chartData?.length && selectedChartType ? (\n <div\n className={cn(\n 'relative flex-1 py-7 px-6',\n isMobileViewport\n ? 'flex flex-col w-full border-b-0 border-r-0'\n : 'hidden sm:flex sm:flex-col border-b md:border-b-0 md:border-r border-border/50'\n )}\n >\n <div className=\"absolute top-4 right-4 z-20 flex items-center gap-1.5\">\n {/* Save */}\n {effectiveChartId ? (\n <ButtonWithTooltip\n onClick={handleSaveToDashboard}\n tooltipText=\"Save to dashboard\"\n className=\"h-8 w-8\"\n disabled={isSaving}\n >\n {isSaving ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Save className=\"h-3.5 w-3.5\" />\n )}\n </ButtonWithTooltip>\n ) : null}\n\n <ButtonWithTooltip\n onClick={() => setIsMaximized(true)}\n tooltipText=\"Maximize chart\"\n className=\"h-8 w-8\"\n disabled={!effectiveChartId}\n >\n <Maximize2 className=\"h-4 w-4\" />\n </ButtonWithTooltip>\n\n {/* Mobile: toggle chart/conversation. Desktop: hide chart. */}\n <ButtonWithTooltip\n onClick={() => setIsChartVisible(false)}\n tooltipText={isMobileViewport ? 'Show conversation' : 'Hide chart'}\n className=\"h-8 w-8\"\n >\n {isMobileViewport ? (\n <MessageSquare className=\"h-4 w-4\" />\n ) : (\n <X className=\"h-4 w-4\" />\n )}\n </ButtonWithTooltip>\n </div>\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"w-full h-full overflow-auto scrollbar-hide\">\n <ChartView\n isDialog\n className=\"h-full\"\n data={chartData}\n chartId={effectiveChartId}\n chartMeta={allMeta}\n chartType={selectedChartType || ''}\n visualizationConfig={chartVisuals}\n variant={allMeta?.variant}\n />\n </div>\n </div>\n </div>\n ) : null)}\n\n {/* Chat side */}\n <div\n className={cn(\n 'flex flex-col relative h-full',\n isMobileViewport\n ? isChartVisible && chartData?.length\n ? 'hidden'\n : 'w-full'\n : isChartVisible && chartData?.length\n ? 'sm:w-[35%] md:w-[35%] w-full'\n : 'w-full'\n )}\n >\n <StreamingChatPanel\n className=\"h-full\"\n expandMessageColumnOnMobile={expandChatMessagesOnMobile}\n autoFocusInput\n inputAction={\n chartData?.length && (isMobileViewport || !isChartVisible) ? (\n <ButtonWithTooltip\n onClick={() => {\n if (isMobileViewport) {\n setIsChartVisible((prev) => !prev)\n return\n }\n setIsChartVisible(true)\n }}\n tooltipText=\"Show chart\"\n className=\"h-9 w-9 bg-background/90 backdrop-blur-sm border rounded-full border-border/60 shadow-none shrink-0\"\n >\n <Eye className=\"h-4 w-4\" />\n </ButtonWithTooltip>\n ) : null\n }\n />\n </div>\n </div>\n\n <ChartDialog\n isOpen={isMaximized}\n onOpenChange={setIsMaximized}\n title={allMeta?.title}\n data={chartData || []}\n chartId={effectiveChartId}\n chartMeta={allMeta || {}}\n chartType={selectedChartType || ''}\n visualizationConfig={chartVisuals || {}}\n onMetaChange={() => {}}\n variant=\"\"\n onClose={() => setIsMaximized(false)}\n />\n </motion.div>\n\n {/* Floating full screen control (match ChatAssistant) */}\n <div\n className={cn('absolute bottom-16 right-4 z-20 hidden sm:flex items-center gap-2')}\n >\n <Button\n variant=\"outline\"\n onClick={toggleExpanded}\n className={cn(floatingActionButtonClasses, 'w-full')}\n >\n <FullscreenIcon className=\"h-4 w-4\" />\n {isExpanded ? 'Exit Full Screen' : 'Full Screen'}\n </Button>\n </div>\n </motion.div>\n </div>\n )}\n </AnimatePresence>,\n document.body\n )\n}\n","'use client'\n\nimport React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport {\n ArrowDown,\n ArrowUp,\n Brain,\n Copy,\n Edit2,\n FileSearch,\n Split,\n Square,\n Terminal,\n User,\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { usePapermapStore, usePapermapStoreApi } from '../store'\nimport type { Message } from '../types'\n\nimport { Alert, AlertDescription, AlertTitle } from './ui/alert'\nimport { Button } from './ui/button'\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'\nimport { MarkdownRenderer } from './ui/markdown'\nimport { ThinkingMessage } from './ui/ThinkingMessage'\nimport { ButtonWithTooltip } from './common/ButtonWithTooltip'\nimport { BookmarkButton } from './common/BookmarkButton'\nimport { BranchButton } from './common/BranchButton'\nimport { FeedbackButtons } from './common/FeedbackButtons'\nimport { ThinkingLogo } from './common/ThinkingLogo'\nimport LogoStandAlone from './LogoStandAlone'\nimport { StreamingTimeline } from './dashboard/StreamingTimeline'\nimport { toast } from '../hooks/use-toast'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from './ui/dialog'\nimport { buildTimelineFromProgressEvents } from '../lib/analytics-stream-replay'\n\nconst APP_NAME = 'Papermap'\n\nasync function copyToClipboard({\n value,\n successMessage = 'Copied to clipboard successfully',\n}: {\n value: string\n successMessage?: string\n}) {\n try {\n await navigator.clipboard.writeText(value)\n toast({ title: 'Success', description: successMessage })\n return true\n } catch (error) {\n console.error('Failed to copy to clipboard:', error)\n toast({ title: 'Error', description: 'Failed to copy to clipboard', variant: 'destructive' })\n return false\n }\n}\n\n// ── Simplified message bubble ──────────────────────────────────────\n\nfunction MessageBubble({\n message,\n children,\n expandAssistantOnMobile,\n}: {\n message: Message\n children: React.ReactNode\n expandAssistantOnMobile?: boolean\n}) {\n return (\n <div\n className={cn(\n 'rounded-2xl text-sm break-words',\n message.role === 'user'\n ? 'bg-primary ml-auto text-primary-foreground rounded-tr-sm max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px] px-4 py-2.5'\n : cn(\n 'bg-muted/50 rounded-tl-sm px-4 py-2.5 [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_pre]:bg-muted [&_pre]:p-3 [&_pre]:rounded-lg [&_pre]:overflow-x-auto [&_pre]:my-2',\n expandAssistantOnMobile\n ? 'max-w-full sm:max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]'\n : 'max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]'\n )\n )}\n >\n {children}\n </div>\n )\n}\n\n// ── PanelMessageItem ─────────────────────────────────────────────\n\nconst PanelMessageItem = memo(function PanelMessageItem({\n message,\n index,\n isThinking,\n isLastMessage,\n onBookmarkMessage,\n onCollapseThought,\n bookmarkLoading,\n feedbackLoading,\n feedbackLoadingType,\n onFeedback,\n onBranch,\n onEditSave,\n onOpenAuditLog,\n hideAvatar = false,\n hideThinkingProcess = false,\n expandMessageColumnOnMobile = false,\n}: {\n message: Message\n index: number\n isThinking: boolean\n isLastMessage: boolean\n onBookmarkMessage: (index: number) => void\n onCollapseThought: (index: number) => void\n bookmarkLoading: number | null\n feedbackLoading: number | null\n feedbackLoadingType: 'positive' | 'negative' | null\n onFeedback: (index: number, type: 'positive' | 'negative') => void\n onBranch: (index: number) => void\n onEditSave: (message: Message) => void\n onOpenAuditLog: () => void\n hideAvatar?: boolean\n hideThinkingProcess?: boolean\n /** Below `sm`, let the message column use full width (streaming dialog when chart pane is hidden). */\n expandMessageColumnOnMobile?: boolean\n}) {\n const [isEditing, setIsEditing] = useState(false)\n const [editedContent, setEditedContent] = useState(message.content)\n const [originalContent] = useState(message.content)\n\n const handleEditClick = () => {\n setIsEditing(true)\n setEditedContent(message.content)\n }\n const handleCancel = () => {\n setIsEditing(false)\n setEditedContent(message.content)\n }\n const handleSave = () => {\n if (editedContent.trim()) {\n onEditSave({ ...message, content: editedContent, originalContent } as any)\n setIsEditing(false)\n }\n }\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className={cn(\n 'flex gap-3 group/message',\n message.role === 'user' ? 'flex-row-reverse items-start' : 'items-start',\n hideAvatar && 'gap-0'\n )}\n >\n {!hideAvatar && (\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n 'bg-primary',\n isLastMessage && isThinking && 'bg-transparent'\n )}\n >\n {message.role === 'user' ? (\n <User className=\"h-4 w-4 text-primary-foreground\" />\n ) : isLastMessage && isThinking ? (\n <ThinkingLogo size=\"md\" />\n ) : (\n <LogoStandAlone className=\"h-4 w-4\" />\n )}\n </div>\n )}\n <div\n className={cn(\n 'flex flex-col min-w-0',\n message.role === 'user' ? 'items-end gap-0' : 'gap-1',\n !hideAvatar &&\n (expandMessageColumnOnMobile ? 'max-sm:max-w-full max-w-[90%]' : 'max-w-[90%]'),\n hideAvatar && 'max-w-full'\n )}\n >\n {message.role === 'error' ? (\n <Alert variant=\"destructive\">\n <Terminal className=\"h-3.5 w-3.5\" />\n <AlertTitle />\n <AlertDescription>{message?.content}</AlertDescription>\n </Alert>\n ) : (\n <div className={cn('flex flex-col', message.role === 'user' ? 'gap-0' : 'gap-2')}>\n {message.thought && message.role === 'assistant' && !hideThinkingProcess && (\n <Collapsible open={message.openThought} onOpenChange={() => onCollapseThought(index)}>\n <CollapsibleTrigger className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <Brain className=\"h-3 w-3\" />\n View thinking\n </CollapsibleTrigger>\n <CollapsibleContent className=\"text-xs bg-muted/30 p-2\">\n <div className=\"pl-3 border-l-2 border-gray-500 text-gray-700 dark:text-white/80\">\n <MarkdownRenderer>{message.thought}</MarkdownRenderer>\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n <div className={cn('relative', message.role === 'user' && 'group')}>\n {isEditing && message.role === 'user' ? (\n <div className=\"flex flex-col gap-2 w-full\">\n <textarea\n value={editedContent}\n onChange={(e) => setEditedContent(e.target.value)}\n className=\"w-full rounded-xl border border-border/50 bg-background px-3 py-2.5 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary/50 resize-none min-h-[60px]\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSave()\n }\n if (e.key === 'Escape') handleCancel()\n }}\n />\n <div className=\"flex items-center justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCancel}\n className=\"h-7 px-2.5 text-xs\"\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={handleSave}\n className=\"h-7 px-2.5 text-xs\"\n disabled={!editedContent.trim()}\n >\n Send\n </Button>\n </div>\n </div>\n ) : (\n <>\n <MessageBubble\n message={message}\n expandAssistantOnMobile={expandMessageColumnOnMobile}\n >\n <MarkdownRenderer>{message.content}</MarkdownRenderer>\n {!isThinking && !message?.noIcons && (\n <div className=\"flex justify-between items-center gap-2 mt-1.5\">\n <div className=\"flex items-center gap-1\">\n {message.role === 'assistant' && message.bookmarked !== undefined && (\n <BookmarkButton\n onToggle={() => onBookmarkMessage(index)}\n isLoading={Boolean(bookmarkLoading === index)}\n isBookmarked={message.bookmarked || false}\n />\n )}\n {message.role === 'assistant' && (\n <ButtonWithTooltip\n onClick={() => copyToClipboard({ value: message.content })}\n tooltipText=\"Copy\"\n className=\"h-5 w-5 hover:bg-muted/80 transition-colors\"\n >\n <Copy className=\"h-3 w-3 text-muted-foreground\" />\n </ButtonWithTooltip>\n )}\n {message.role === 'assistant' && (\n <BranchButton onBranch={() => onBranch(index)} />\n )}\n {message.role === 'assistant' && (\n <ButtonWithTooltip\n onClick={onOpenAuditLog}\n tooltipText=\"Audit Log\"\n className=\"h-5 w-5 hover:bg-muted/80 transition-colors\"\n >\n <FileSearch className=\"h-3 w-3 text-muted-foreground\" />\n </ButtonWithTooltip>\n )}\n </div>\n {message.role === 'assistant' && (\n <FeedbackButtons\n onFeedback={(type) => onFeedback(index, type)}\n isLoading={Boolean(feedbackLoading === index)}\n selectedFeedback={message.feedback || null}\n loadingType={feedbackLoading === index ? feedbackLoadingType : null}\n />\n )}\n </div>\n )}\n </MessageBubble>\n {message.role === 'user' && !isEditing && (\n <div className=\"max-h-0 overflow-hidden group-hover/message:max-h-10 transition-all duration-200 ease-out\">\n <div className=\"flex items-center gap-1 mt-1 justify-end opacity-0 group-hover/message:opacity-100 transition-opacity duration-200\">\n {!message?.is_inherited && !message?.is_rundown && (\n <ButtonWithTooltip\n onClick={handleEditClick}\n tooltipText=\"Edit\"\n className=\"h-5 w-5 hover:bg-muted/80\"\n >\n <Edit2 className=\"h-3 w-3\" />\n </ButtonWithTooltip>\n )}\n <ButtonWithTooltip\n onClick={() => copyToClipboard({ value: message.content })}\n tooltipText=\"Copy\"\n className=\"h-5 w-5 hover:bg-muted/80\"\n >\n <Copy className=\"h-3 w-3\" />\n </ButtonWithTooltip>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n )}\n {message.status === 'done' && (\n <span className=\"text-[10px] text-muted-foreground px-1\">\n {message.role === 'user' ? 'You' : `${APP_NAME} AI`}\n </span>\n )}\n </div>\n </motion.div>\n )\n})\n\n// ── StreamingChatPanel ──────────────────────────────────────────────\n\nexport interface StreamingChatPanelProps {\n className?: string\n /**\n * When true, message rows use full available width below `sm`. Use in the streaming chart\n * dialog when the chart column is hidden so chat isn’t artificially narrow.\n */\n expandMessageColumnOnMobile?: boolean\n /** Auto-focuses the prompt input when this panel mounts (used by dialog hosts). */\n autoFocusInput?: boolean\n /** Optional action rendered beside submit button in the input row. */\n inputAction?: React.ReactNode\n}\n\nexport function StreamingChatPanel({\n className,\n expandMessageColumnOnMobile = false,\n autoFocusInput = false,\n inputAction,\n}: StreamingChatPanelProps) {\n const messages = usePapermapStore((s) => s.messages)\n const isThinking = usePapermapStore((s) => s.isLoading)\n const inputValue = usePapermapStore((s) => s.inputValue)\n const setInputValue = usePapermapStore((s) => s.setInputValue)\n const handleSubmit = usePapermapStore((s) => s.handleSubmit)\n const handleCancel = usePapermapStore((s) => s.handleCancel)\n const isLoadingMore = usePapermapStore((s) => s.isLoadingMore)\n const handleScroll = usePapermapStore((s) => s.handleScroll)\n\n const sseTimeline = usePapermapStore((s) => s.sseTimeline)\n const ssePhase = usePapermapStore((s) => s.ssePhase)\n const sseIsStreaming = usePapermapStore((s) => s.sseIsStreaming)\n const sseIsComplete = usePapermapStore((s) => s.sseIsComplete)\n const sseToolCalls = usePapermapStore((s) => s.sseToolCalls)\n const sseThoughts = usePapermapStore((s) => s.sseThoughts)\n\n const storeApi = usePapermapStoreApi()\n const refs = storeApi.getState().getRefs()\n const { chartSvc } = storeApi.getState().getServices()\n const config = storeApi.getState().getConfig()\n\n const scrollRef = useRef<HTMLDivElement>(null)\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const [showScrollButton, setShowScrollButton] = useState(false)\n const [bookmarkLoading, setBookmarkLoading] = useState<number | null>(null)\n const [feedbackLoading, setFeedbackLoading] = useState<number | null>(null)\n const [feedbackLoadingType, setFeedbackLoadingType] = useState<'positive' | 'negative' | null>(\n null\n )\n const setIsBranching = usePapermapStore((s) => s.setIsBranching)\n\n const hasActiveSSE = sseIsStreaming || sseTimeline.length > 0\n const [auditOpen, setAuditOpen] = useState(false)\n const [auditProgressEvents, setAuditProgressEvents] = useState<\n | {\n event_type?: string\n data?: Record<string, any>\n timestamp?: string\n }[]\n | undefined\n >(undefined)\n\n const auditReplayTimeline = useMemo(\n () => buildTimelineFromProgressEvents(auditProgressEvents),\n [auditProgressEvents]\n )\n\n const scrollToBottom = useCallback(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTo({ top: scrollRef.current.scrollHeight, behavior: 'smooth' })\n } else {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }\n }, [])\n\n // Always keep conversation pinned to bottom\n useEffect(() => {\n if (isLoadingMore) return\n requestAnimationFrame(() => scrollToBottom())\n }, [messages, scrollToBottom, isLoadingMore])\n\n useEffect(() => {\n if (sseIsStreaming || sseToolCalls.length > 0 || sseThoughts.length > 0) {\n const timer = setTimeout(() => {\n scrollToBottom()\n }, 100)\n return () => clearTimeout(timer)\n }\n }, [sseIsStreaming, sseToolCalls, sseThoughts, sseTimeline, scrollToBottom])\n\n useEffect(() => {\n if (!autoFocusInput) return\n const input = inputRef.current\n if (!input) return\n requestAnimationFrame(() => input.focus())\n }, [autoFocusInput])\n\n const collapseThought = useCallback(\n (index: number) => {\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((msg, i) => (i === index ? { ...msg, openThought: !msg.openThought } : msg))\n )\n },\n [storeApi]\n )\n\n const handleBookmarkMessage = useCallback(\n async (messageIndex: number) => {\n const msg = messages[messageIndex]\n if (!msg) return\n setBookmarkLoading(messageIndex)\n try {\n if (msg.bookmarked) {\n await chartSvc.removeBookmark(msg.bookmark_id || '')\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) => (i === messageIndex ? { ...m, bookmarked: false } : m))\n )\n } else {\n const result = await chartSvc.bookmarkConversation({\n llm_data_id: msg.id || msg.llm_data_id || '',\n dashboard_id: config.dashboardId,\n })\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) =>\n i === messageIndex\n ? { ...m, bookmarked: true, bookmark_id: result.data?.bookmark_id }\n : m\n )\n )\n }\n } catch (error) {\n console.error('Bookmark error:', error)\n toast({ title: 'Error', description: 'Failed to bookmark', variant: 'destructive' })\n } finally {\n setBookmarkLoading(null)\n }\n },\n [messages, chartSvc, storeApi, config.dashboardId]\n )\n\n const handleFeedback = useCallback(\n async (messageIndex: number, feedbackType: 'positive' | 'negative') => {\n const msg = messages[messageIndex]\n if (!msg || !msg.id) return\n setFeedbackLoading(messageIndex)\n setFeedbackLoadingType(feedbackType)\n try {\n await chartSvc.updateResponseLabel(msg.id, feedbackType)\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) => (i === messageIndex ? { ...m, feedback: feedbackType } : m))\n )\n toast({ title: 'Success', description: 'Feedback recorded successfully!' })\n } catch (error) {\n console.error('Feedback error:', error)\n toast({ title: 'Error', description: 'Failed to record feedback', variant: 'destructive' })\n } finally {\n setFeedbackLoading(null)\n setFeedbackLoadingType(null)\n }\n },\n [messages, chartSvc, storeApi]\n )\n\n const handleBranch = useCallback(\n async (messageIndex: number) => {\n const msg = messages[messageIndex]\n const llmDataId = msg?.llm_data_id || msg?.id\n const chatIdToUse = storeApi.getState().editChatId || storeApi.getState().chatId\n if (!msg || !llmDataId || !chatIdToUse) return\n setIsBranching(true)\n try {\n const response = await chartSvc.branchConversation(config.dashboardId, llmDataId)\n const newChatId = response?.data?.new_chat_id || ''\n storeApi.getState().clearStreamingState()\n storeApi.getState().setChatId(newChatId)\n storeApi.getState().setEditChatId(null)\n // Mark as loaded so ConversationLoader doesn't overwrite our messages when chatId changes\n refs.loadedConversationChatIdRef.current = newChatId\n const branchMsg: Message = {\n role: 'branch' as any,\n content: 'Branched from Conversation',\n status: 'done',\n }\n const inherited = messages.map((m) => ({ ...m, is_inherited: true, noIcons: true }))\n storeApi.getState().setMessages([...inherited.slice(0, messageIndex + 1), branchMsg])\n toast({\n title: 'Success',\n description: `Branch created! ${response?.data?.inherited_message_count || 0} messages inherited.`,\n })\n } catch (error) {\n console.error('Branch error:', error)\n toast({ title: 'Error', description: 'Failed to create branch', variant: 'destructive' })\n } finally {\n setIsBranching(false)\n }\n },\n [messages, chartSvc, storeApi, refs, config.dashboardId]\n )\n\n const handleEditSave = useCallback(\n (editedMessage: Message) => {\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m) => (m.id === editedMessage.id ? editedMessage : m))\n )\n },\n [storeApi]\n )\n\n const onScrollInternal = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (scrollRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = scrollRef.current\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight\n setShowScrollButton(distanceFromBottom > 200)\n }\n handleScroll(e)\n },\n [handleScroll]\n )\n\n const visibleMessages = useMemo(() => {\n if (messages.length <= 50) return messages\n return messages.slice(-50)\n }, [messages])\n\n const handleFormSubmit = useCallback(() => {\n const msg = inputValue.trim()\n if (!msg || isThinking) return\n handleSubmit(msg)\n }, [inputValue, isThinking, handleSubmit])\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n <Dialog open={auditOpen} onOpenChange={setAuditOpen}>\n <DialogContent className=\"sm:max-w-[540px] p-0 max-h-[85vh] overflow-hidden flex flex-col\">\n <DialogHeader className=\"px-5 pt-4 pb-3 border-b border-border/60 space-y-0\">\n <DialogTitle className=\"text-base font-semibold leading-normal\">Audit Log</DialogTitle>\n </DialogHeader>\n <div className=\"flex-1 overflow-y-auto scrollbar-hide px-3 py-3 space-y-3\">\n {auditReplayTimeline.length > 0 ? (\n <div className=\"space-y-2 border border-border/60 rounded-lg p-3 bg-muted/20\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n Execution Replay\n </p>\n <StreamingTimeline\n timeline={auditReplayTimeline}\n collapseThreshold={3}\n recentFullCount={1}\n />\n </div>\n ) : (\n <div className=\"rounded-lg border border-border/60 bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n No execution replay is available for this message.\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n\n {/* Message list */}\n <div className=\"flex-1 overflow-hidden\">\n <div\n ref={scrollRef}\n onScroll={onScrollInternal}\n className=\"h-full overflow-y-auto scrollbar-hide [mask-image:linear-gradient(to_bottom,transparent_0,black_6%,black_94%,transparent_100%)] min-h-0\"\n >\n <div className=\"space-y-2 py-3 px-4\">\n {isLoadingMore && (\n <div className=\"flex justify-center py-2\">\n <div className=\"size-4 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n )}\n\n {visibleMessages.map((message, index) => {\n const actualIndex = messages.length - visibleMessages.length + index\n const isLastAssistantMessage =\n message.role === 'assistant' && actualIndex === messages.length - 1\n\n if (message.role === ('branch' as any)) {\n return (\n <motion.div\n key={`branch-${actualIndex}`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex justify-center my-3\"\n >\n <div className=\"flex items-center gap-2 px-3 py-1.5 rounded-full bg-white dark:bg-muted border border-primary/20 dark:border-border\">\n <Split className=\"h-3.5 w-3.5 text-primary rotate-90\" />\n <span className=\"text-xs font-medium text-foreground\">{message.content}</span>\n </div>\n </motion.div>\n )\n }\n\n if (\n (isLastAssistantMessage && hasActiveSSE) ||\n (message.status === 'thinking' && hasActiveSSE)\n )\n return null\n\n return (\n <PanelMessageItem\n key={`${message.id || actualIndex}-${(message.content || '').slice(0, 50)}`}\n message={message}\n index={actualIndex}\n isThinking={isThinking}\n isLastMessage={actualIndex === messages.length - 1}\n onBookmarkMessage={handleBookmarkMessage}\n onCollapseThought={collapseThought}\n bookmarkLoading={bookmarkLoading}\n feedbackLoading={feedbackLoading}\n feedbackLoadingType={feedbackLoadingType}\n onFeedback={handleFeedback}\n onBranch={handleBranch}\n onEditSave={handleEditSave}\n onOpenAuditLog={() => {\n setAuditProgressEvents(message.progress_events as any)\n setAuditOpen(true)\n }}\n expandMessageColumnOnMobile={expandMessageColumnOnMobile}\n />\n )\n })}\n\n {/* SSE streaming section */}\n {(() => {\n const lastMessage = messages[messages.length - 1]\n const hasAssistantMessage = lastMessage && lastMessage.role === 'assistant'\n if (hasActiveSSE || (hasAssistantMessage && sseTimeline.length > 0)) {\n const actualIndex = hasAssistantMessage ? messages.length - 1 : -1\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex gap-2.5 items-start\"\n key={`sse-combined-${actualIndex}`}\n >\n <div\n className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-full',\n sseIsStreaming ? 'bg-transparent' : 'bg-primary'\n )}\n >\n {sseIsStreaming ? (\n <ThinkingLogo size=\"sm\" />\n ) : (\n <LogoStandAlone className=\"h-3.5 w-3.5\" />\n )}\n </div>\n <div\n className={cn(\n 'flex flex-col gap-2 w-full min-w-0',\n expandMessageColumnOnMobile ? 'max:max-w-full max-w-[85%]' : 'max-w-[85%]'\n )}\n >\n {(isThinking || sseIsStreaming || (ssePhase && !sseIsComplete)) && (\n <div className=\"flex flex-col gap-1 w-fit\">\n <div className=\"rounded-2xl rounded-tl-sm bg-muted/50 px-3 py-2.5 text-sm break-words\">\n <ThinkingMessage\n isThinking={isThinking || sseIsStreaming || !!ssePhase}\n currentPhase={ssePhase || 'Analyzing your request...'}\n />\n </div>\n <span className=\"text-[10px] text-muted-foreground pl-2\">\n {APP_NAME} AI\n </span>\n </div>\n )}\n <StreamingTimeline\n timeline={sseTimeline}\n collapseThreshold={3}\n recentFullCount={1}\n />\n {hasAssistantMessage && lastMessage && (\n <PanelMessageItem\n key={`${lastMessage.id || actualIndex}-final`}\n message={lastMessage}\n index={actualIndex}\n isThinking={isThinking}\n isLastMessage\n onBookmarkMessage={handleBookmarkMessage}\n onCollapseThought={collapseThought}\n bookmarkLoading={bookmarkLoading}\n feedbackLoading={feedbackLoading}\n feedbackLoadingType={feedbackLoadingType}\n onFeedback={handleFeedback}\n onBranch={handleBranch}\n onEditSave={handleEditSave}\n onOpenAuditLog={() => {\n setAuditProgressEvents(lastMessage.progress_events as any)\n setAuditOpen(true)\n }}\n hideAvatar\n hideThinkingProcess={hasActiveSSE}\n expandMessageColumnOnMobile={expandMessageColumnOnMobile}\n />\n )}\n </div>\n </motion.div>\n )\n }\n return null\n })()}\n\n <div ref={messagesEndRef} className=\"h-4\" />\n </div>\n </div>\n </div>\n\n {/* Scroll-to-bottom button */}\n <AnimatePresence>\n {showScrollButton && (\n <div className=\"relative\">\n <div className=\"absolute -top-10 inset-x-0 flex justify-center z-10\">\n <motion.button\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.2 }}\n onClick={scrollToBottom}\n className=\"px-2.5 py-1 rounded-full bg-background/80 hover:bg-background text-foreground/70 hover:text-foreground border border-border/50 backdrop-blur-md shadow-sm text-xs font-medium flex items-center gap-1\"\n >\n <ArrowDown className=\"h-3 w-3\" />\n Scroll to bottom\n </motion.button>\n </div>\n </div>\n )}\n </AnimatePresence>\n\n {/* Input area */}\n <div className=\"flex-none border-t border-border/30 p-3\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n handleFormSubmit()\n }}\n className=\"flex items-end gap-2\"\n >\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n const ta = e.target\n ta.style.height = 'auto'\n ta.style.height = Math.min(Math.max(36, ta.scrollHeight), 100) + 'px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleFormSubmit()\n }\n }}\n placeholder=\"Ask anything...\"\n rows={1}\n className={cn(\n 'flex-1 text-sm rounded-xl border border-border/40 bg-background/80 px-3 py-2 scrollbar-hide',\n 'ring-0 focus-visible:ring-1 focus-visible:ring-primary/30 focus:ring-0 outline-none',\n 'placeholder:text-sm placeholder:text-muted-foreground/60',\n 'resize-none min-h-[36px] max-h-[120px]'\n )}\n />\n <Button\n type={isThinking ? 'button' : 'submit'}\n size=\"icon\"\n onClick={isThinking ? handleCancel : handleFormSubmit}\n disabled={!isThinking && !inputValue.trim()}\n className=\"h-9 w-9 rounded-full shrink-0\"\n >\n {isThinking ? (\n <Square className=\"h-3.5 w-3.5 fill-current\" />\n ) : (\n <ArrowUp className=\"h-4 w-4\" />\n )}\n </Button>\n {inputAction}\n </form>\n </div>\n </div>\n )\n}\n","/**\n * Persistent link between a host-owned stable id (`id` on {@link PapermapChartCard})\n * and the Papermap backend `chat_id` (`llm_data_chat_id`).\n *\n * Stored in localStorage under a single key to avoid per-card key explosion and to allow\n * future schema upgrades (version field) without breaking hosts.\n */\n\nexport const CHART_CARD_CHAT_MAP_KEY = 'papermap.plugin.chartCardChatMap'\n\nexport type ChartCardStorageNamespace = {\n workspaceId?: string\n dashboardId?: string\n}\n\n/** Canonical link record returned to callers and accepted on upsert. */\nexport type ChartCardIdLink = {\n /** Host key (stable widget / layout / route id). */\n id: string\n /** Backend chat id used exclusively for chart API calls — never use `id` as a chat id. */\n chatId: string\n}\n\nconst STORAGE_VERSION = 1 as const\n\ntype LinkEntry = {\n chatId: string\n /** Epoch ms; useful for sync/conflict hints in future versions. */\n updatedAt?: number\n}\n\ntype ChartCardLinkDocument = {\n v: typeof STORAGE_VERSION\n entries: Record<string, LinkEntry>\n}\n\nfunction emptyDocument(): ChartCardLinkDocument {\n return { v: STORAGE_VERSION, entries: {} }\n}\n\nfunction normalizeKey(id: string): string {\n return id.trim()\n}\n\nfunction normalizeChatId(chatId: string): string {\n return chatId.trim()\n}\n\nfunction parseDocument(raw: string | null): ChartCardLinkDocument {\n if (!raw) return emptyDocument()\n try {\n const parsed = JSON.parse(raw) as unknown\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return emptyDocument()\n }\n const obj = parsed as Record<string, unknown>\n\n if (\n obj.v === STORAGE_VERSION &&\n obj.entries &&\n typeof obj.entries === 'object' &&\n !Array.isArray(obj.entries)\n ) {\n return { v: STORAGE_VERSION, entries: obj.entries as Record<string, LinkEntry> }\n }\n\n // Legacy v0: flat Record<id, chatId string>\n const entries: Record<string, LinkEntry> = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string') {\n const kid = normalizeKey(key)\n const cid = normalizeChatId(value)\n if (kid && cid) entries[kid] = { chatId: cid }\n }\n }\n return { v: STORAGE_VERSION, entries }\n } catch {\n return emptyDocument()\n }\n}\n\nfunction getScopedStorageKey(namespace?: ChartCardStorageNamespace): string {\n const workspaceId = namespace?.workspaceId?.trim()\n const dashboardId = namespace?.dashboardId?.trim()\n if (!workspaceId || !dashboardId) return CHART_CARD_CHAT_MAP_KEY\n return `${CHART_CARD_CHAT_MAP_KEY}:${workspaceId}:${dashboardId}`\n}\n\nfunction readDocument(storageKey: string): ChartCardLinkDocument {\n if (typeof window === 'undefined') return emptyDocument()\n return parseDocument(localStorage.getItem(storageKey))\n}\n\nfunction writeDocument(doc: ChartCardLinkDocument, storageKey: string): void {\n if (typeof window === 'undefined') return\n try {\n localStorage.setItem(storageKey, JSON.stringify(doc))\n } catch {\n // quota / private mode\n }\n}\n\nfunction entryToLink(id: string, entry: LinkEntry | undefined): ChartCardIdLink | null {\n if (!entry) return null\n const chatId = normalizeChatId(entry.chatId)\n if (!chatId) return null\n const nid = normalizeKey(id)\n if (!nid) return null\n return { id: nid, chatId }\n}\n\n/**\n * Returns the persisted link for `id` only if a valid `{ chatId }` entry exists.\n * Does not interpret `id` as a chat id.\n */\nexport function getChartCardIdLink(\n id: string,\n namespace?: ChartCardStorageNamespace\n): ChartCardIdLink | null {\n const nid = normalizeKey(id)\n if (!nid) return null\n const scopedKey = getScopedStorageKey(namespace)\n const scoped = readDocument(scopedKey)\n const scopedLink = entryToLink(nid, scoped.entries[nid])\n if (scopedLink) return scopedLink\n\n if (scopedKey !== CHART_CARD_CHAT_MAP_KEY) {\n const legacy = readDocument(CHART_CARD_CHAT_MAP_KEY)\n return entryToLink(nid, legacy.entries[nid])\n }\n\n return null\n}\n\n/**\n * Saves or updates the mapping `id` → `chatId`. Call after loads that yield a reliable backend chat id.\n */\nexport function upsertChartCardIdLink(\n link: ChartCardIdLink,\n namespace?: ChartCardStorageNamespace\n): void {\n const id = normalizeKey(link.id)\n const chatId = normalizeChatId(link.chatId)\n if (!id || !chatId) return\n const scopedKey = getScopedStorageKey(namespace)\n const doc = readDocument(scopedKey)\n doc.entries[id] = { chatId, updatedAt: Date.now() }\n writeDocument(doc, scopedKey)\n console.log('upsertChartCardIdLink', id, chatId)\n}\n\n/**\n * Removes the entry for `id`. If `expectedChatId` is set, removal happens only when it matches\n * the stored chat id (avoids clearing another conversation after stale swaps).\n */\nexport function removeChartCardIdLink(\n id: string,\n expectedChatId?: string,\n namespace?: ChartCardStorageNamespace\n): void {\n const nid = normalizeKey(id)\n if (!nid) return\n const scopedKey = getScopedStorageKey(namespace)\n const doc = readDocument(scopedKey)\n const entry = doc.entries[nid]\n if (!entry) return\n if (expectedChatId !== undefined) {\n const exp = normalizeChatId(expectedChatId)\n if (exp && normalizeChatId(entry.chatId) !== exp) return\n }\n delete doc.entries[nid]\n writeDocument(doc, scopedKey)\n}\n\n/**\n * Removes all persisted `id -> chatId` links for a given `chatId` in the namespace.\n * Useful after hard-delete so stale card mappings do not point to missing charts.\n */\nexport function removeChartCardLinksByChatId(\n chatId: string,\n namespace?: ChartCardStorageNamespace\n): void {\n const normalizedChatId = normalizeChatId(chatId)\n if (!normalizedChatId) return\n\n const scopedKey = getScopedStorageKey(namespace)\n const doc = readDocument(scopedKey)\n let changed = false\n\n for (const [id, entry] of Object.entries(doc.entries)) {\n if (normalizeChatId(entry.chatId) === normalizedChatId) {\n delete doc.entries[id]\n changed = true\n }\n }\n\n if (changed) writeDocument(doc, scopedKey)\n}\n\n/**\n * Resolves which **chat id** to pass to chart HTTP APIs.\n *\n * Order (host override first):\n * 1. `chartId` prop — treated as an explicit backend chat id.\n * 2. Persisted link for `cardId` — only `entry.chatId` is used for fetch; `cardId` itself is never sent as chat id.\n */\nexport function resolveChartFetchChatId(params: {\n chartIdProp?: string\n cardId?: string\n workspaceId?: string\n dashboardId?: string\n}): string | undefined {\n const fromProp = params.chartIdProp?.trim()\n if (fromProp) return fromProp\n\n const cardId = params.cardId?.trim()\n if (!cardId) return undefined\n\n const link = getChartCardIdLink(cardId, {\n workspaceId: params.workspaceId,\n dashboardId: params.dashboardId,\n })\n return link?.chatId\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport {\n Camera,\n Check,\n LayoutDashboard,\n Loader2,\n Palette,\n Pencil,\n RefreshCcw,\n Undo2,\n} from 'lucide-react'\nimport { motion } from 'framer-motion'\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\nimport { cn } from '../../utils/cn'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\n\nexport interface DashboardToolbarProps {\n isEditMode: boolean\n isSaving: boolean\n isTakingScreenshot: boolean\n resetState: boolean\n onEditModeToggle: () => void\n onResetLayout: () => void\n onTakeScreenshot: () => void\n onGenerateDashboard?: () => void\n isGenerating?: boolean\n isViewer?: boolean\n showToolbar?: boolean\n showScreenshot?: boolean\n showGenerateDashboard?: boolean\n editLayout?: boolean\n setThemeModalOpen?: () => void\n}\n\nconst generationTexts = ['Analyzing your data', 'Creating visuals', 'Optimizing layouts']\n\nexport function DashboardToolbar({\n isEditMode,\n isSaving,\n isTakingScreenshot,\n resetState,\n onEditModeToggle,\n onResetLayout,\n onTakeScreenshot,\n onGenerateDashboard,\n isGenerating = false,\n isViewer = false,\n showToolbar = true,\n showScreenshot = true,\n showGenerateDashboard = true,\n editLayout = true,\n setThemeModalOpen,\n}: DashboardToolbarProps) {\n const [textIndex, setTextIndex] = useState(0)\n\n useEffect(() => {\n if (!isGenerating) {\n setTextIndex(0)\n return\n }\n const interval = setInterval(() => {\n setTextIndex((cur) => (cur + 1) % generationTexts.length)\n }, 3500)\n return () => clearInterval(interval)\n }, [isGenerating])\n\n const currentText = useMemo(() => generationTexts[textIndex], [textIndex])\n\n const getEditButtonIcon = () => {\n if (isSaving) return <Loader2 className=\"size-4 animate-spin\" />\n if (isEditMode) return <Check className=\"size-4\" />\n return <Pencil className=\"size-4\" />\n }\n\n if (!showToolbar) return null\n\n return (\n <div className=\"flex items-center gap-4 rounded-3xl border dark:border-border/50 px-1 py-1 bg-background\">\n {showGenerateDashboard && !isViewer ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n className=\"group relative flex items-center gap-2 px-4 py-2 rounded-3xl bg-gradient-to-r from-violet-500/10 via-purple-500/10 to-indigo-500/10 hover:from-violet-500/20 hover:via-purple-500/20 hover:to-indigo-500/20 border border-violet-200/20 hover:border-violet-300/30 cursor-pointer transition-all duration-500 ease-out backdrop-blur-sm generate-dashboard-btn\"\n onClick={onGenerateDashboard}\n data-tour=\"generate-dashboard\"\n >\n <div className=\"absolute inset-0 rounded-2xl bg-gradient-to-r from-violet-500/5 via-purple-500/5 to-indigo-500/5 opacity-0 group-hover:opacity-100 transition-opacity duration-300\" />\n\n {isGenerating ? (\n <>\n <Loader2 className=\"size-4 animate-spin flex-shrink-0\" />\n <div className=\"w-48 overflow-hidden relative z-10\">\n <motion.span\n key={textIndex}\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n transition={{ duration: 0.4, ease: 'easeOut' }}\n className=\"text-sm font-medium block\"\n >\n {currentText}\n </motion.span>\n </div>\n </>\n ) : (\n <>\n <LayoutDashboard className=\"size-4 text-violet-600 dark:text-violet-400 group-hover:scale-110 transition-transform duration-200 flex-shrink-0\" />\n <span className=\"text-sm font-medium relative z-10 text-violet-700 dark:text-violet-300\">\n Generate Dashboard\n </span>\n </>\n )}\n </div>\n </TooltipTrigger>\n <TooltipContent>\n <p>Experimental feature</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n\n {showScreenshot ? (\n <ButtonWithTooltip\n variant=\"ghost\"\n size=\"icon\"\n onClick={onTakeScreenshot}\n disabled={isTakingScreenshot}\n tooltipText=\"Take Screenshot\"\n data-tour=\"screenshot-btn\"\n >\n {isTakingScreenshot ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Camera className=\"size-4\" />\n )}\n </ButtonWithTooltip>\n ) : null}\n\n {isEditMode ? (\n <ButtonWithTooltip\n variant=\"ghost\"\n size=\"icon\"\n onClick={onResetLayout}\n tooltipText={resetState ? 'Reset Layout' : 'Restore Layout'}\n data-tour=\"reset-layout-btn\"\n >\n {resetState ? <RefreshCcw className=\"size-4\" /> : <Undo2 className=\"size-4\" />}\n </ButtonWithTooltip>\n ) : null}\n\n {editLayout && !isViewer ? (\n <ButtonWithTooltip\n variant=\"ghost\"\n size=\"icon\"\n onClick={onEditModeToggle}\n disabled={isSaving}\n tooltipText={isEditMode ? (isSaving ? 'Saving...' : 'Save Changes') : 'Edit Layout'}\n data-tour=\"edit-mode-btn\"\n >\n {getEditButtonIcon()}\n </ButtonWithTooltip>\n ) : null}\n\n {!isViewer ? (\n <ButtonWithTooltip\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setThemeModalOpen?.()}\n tooltipText=\"Customize dashboard theme\"\n >\n <Palette className=\"size-4\" />\n </ButtonWithTooltip>\n ) : null}\n </div>\n )\n}\n","'use client'\n\nimport { useCallback, type RefObject } from 'react'\n\nexport function useAutoResize(\n textareaRef: RefObject<HTMLTextAreaElement | null>,\n minHeight: number = 40,\n maxHeight: number = 120\n) {\n const resize = useCallback(() => {\n const textarea = textareaRef.current\n if (!textarea) return\n\n textarea.style.height = 'auto'\n const scrollHeight = textarea.scrollHeight\n const newHeight = Math.min(Math.max(minHeight, scrollHeight), maxHeight)\n textarea.style.height = newHeight + 'px'\n }, [textareaRef, minHeight, maxHeight])\n\n return { resize }\n}\n","'use client'\n\nimport 'react-grid-layout/css/styles.css'\nimport 'react-resizable/css/styles.css'\n\nimport { Loader2 } from 'lucide-react'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Responsive, WidthProvider } from 'react-grid-layout'\nimport type { ResponsiveProps } from 'react-grid-layout'\nimport { ENDPOINTS } from '../../api/endpoints'\nimport { SSEStreamClient } from '../../api/sse-client'\nimport { PapermapChartCard } from '../../components/PapermapChartCard'\nimport { PapermapChat } from '../../components/PapermapChat'\nimport {\n ThemeCustomizationSettings,\n type ThemeSaveMeta,\n} from '../../components/theme/ThemeCustomizationSettings'\nimport { Card } from '../../components/ui/card'\nimport { DashboardToolbar } from '../../components/dashboard'\nimport { Dialog, DialogContent } from '../../components/ui/dialog'\nimport {\n PapermapProvider,\n usePapermapConnectionOptional,\n usePapermapStore,\n usePapermapStoreApi,\n usePapermapStoreApiOptional,\n} from '../../store'\nimport type { TChartResponse } from '../../types/chart'\nimport type { DashboardTheme, PapermapGridDashboardLayouts, TLayout } from '../../types/dashboard'\nimport { EVENT_NAME } from '../../types/streaming'\nimport { useToast } from '../../hooks/use-toast'\nimport { unwrapWorkspacePayload } from '../../services/workspace.service'\nimport { cn } from '../../utils/cn'\nimport { generateThemeCSS, generateThemeStyles } from '../../utils/dashboard-theme'\nimport { resolveDashboardThemeFromWorkspace } from '../../utils/resolve-dashboard-theme'\nimport { mergeWorkspaceMetaTheme } from '../../utils/workspace-theme-persist'\nimport { takeScreenshot, waitForChartsToLoad } from '../../utils/screenshot'\nimport { EMPTY_HANDLES, GRID_BREAKPOINTS, GRID_COLS, LAYOUT_HANDLE } from './constants'\nimport { getDefaultLayout, isFallbackLayout } from './layout'\nimport { GRID_RESIZE_HANDLE_STYLES } from './styles'\n\nconst ResponsiveGridLayout = WidthProvider(Responsive) as React.ComponentType<ResponsiveProps>\n\nexport interface PapermapGridDashboardProps {\n token?: string\n workspaceId?: string\n dashboardId?: string\n apiUrl?: string\n charts?: TChartResponse[]\n layouts?: PapermapGridDashboardLayouts\n onLayoutsChange?: (layouts: PapermapGridDashboardLayouts) => void\n isEditMode?: boolean\n showToolbar?: boolean\n showScreenshot?: boolean\n showGenerateDashboard?: boolean\n editLayout?: boolean\n isViewer?: boolean\n onEditChart?: (chartId: string) => void\n onDeleteChart?: (chartId: string) => void\n onPinChange?: (chartId: string, pinned: boolean) => void\n onGenerateDashboard?: () => void\n isGenerating?: boolean\n onTakeScreenshot?: () => void\n onThemeModalOpen?: () => void\n /**\n * Custom content inside the theme dialog. When omitted, the built-in\n * `ThemeCustomizationSettings` UI is used; save updates local theme and calls\n * `onDashboardThemeChange` when provided.\n */\n renderThemeModal?: (close: () => void) => React.ReactNode\n /**\n * Called after a successful save from the built-in theme modal (or local-only save when\n * `persistWorkspaceTheme` is false). `undefined` means the user saved the app-default preset.\n */\n onDashboardThemeChange?: (theme: DashboardTheme | undefined) => void\n /**\n * When true (default), saving from the built-in theme UI GET/PUTs workspace `meta.theme`\n * for this `dashboardId`, matching the main Papermap app.\n */\n persistWorkspaceTheme?: boolean\n /** Custom dashboard theme. Sets CSS variables and scoped overrides on the grid container. */\n dashboardTheme?: DashboardTheme\n showHeader?: boolean\n enableFetch?: boolean\n showChatAssistant?: boolean\n variant?: 'default' | 'streaming'\n}\n\nexport function PapermapGridDashboard({\n token,\n workspaceId,\n dashboardId,\n apiUrl,\n ...rest\n}: PapermapGridDashboardProps) {\n const parentStore = usePapermapStoreApiOptional()\n const connection = usePapermapConnectionOptional()\n const resolvedToken = token ?? connection?.token\n const resolvedWorkspaceId = workspaceId ?? connection?.workspaceId\n const resolvedDashboardId = dashboardId ?? connection?.dashboardId\n const resolvedApiUrl = apiUrl ?? connection?.apiUrl\n\n if (!resolvedToken || !resolvedWorkspaceId || !resolvedDashboardId) {\n throw new Error(\n 'PapermapGridDashboard requires token, workspaceId, and dashboardId from props or PapermapProvider.'\n )\n }\n\n const inner = (\n <GridDashboardInner\n {...rest}\n token={resolvedToken}\n workspaceId={resolvedWorkspaceId}\n dashboardId={resolvedDashboardId}\n apiUrl={resolvedApiUrl}\n />\n )\n\n if (parentStore) return inner\n\n return (\n <PapermapProvider\n token={resolvedToken}\n workspaceId={resolvedWorkspaceId}\n dashboardId={resolvedDashboardId}\n apiUrl={resolvedApiUrl}\n >\n {inner}\n </PapermapProvider>\n )\n}\n\nfunction GridDashboardInner({\n token,\n workspaceId = '',\n dashboardId,\n apiUrl,\n charts: chartsProp,\n layouts: layoutsProp,\n onLayoutsChange,\n isEditMode = false,\n showToolbar = true,\n showScreenshot = true,\n showGenerateDashboard = true,\n editLayout = true,\n isViewer = false,\n onEditChart,\n onDeleteChart,\n onPinChange,\n onGenerateDashboard,\n isGenerating = false,\n onTakeScreenshot,\n onThemeModalOpen,\n renderThemeModal,\n onDashboardThemeChange,\n persistWorkspaceTheme = true,\n dashboardTheme,\n showHeader = true,\n enableFetch = true,\n showChatAssistant = false,\n variant = 'default',\n}: PapermapGridDashboardProps) {\n const storeApi = usePapermapStoreApi()\n const { toast } = useToast()\n const sseIsComplete = usePapermapStore((s) => s.sseIsComplete)\n const sseIsStreaming = usePapermapStore((s) => s.sseIsStreaming)\n const sseRequestId = usePapermapStore((s) => s.sseRequestId)\n const { chartSvc, workspaceSvc } = storeApi.getState().getServices()\n\n const [fetchedCharts, setFetchedCharts] = useState<TChartResponse[]>([])\n const [isLoading, setIsLoading] = useState(enableFetch && !chartsProp?.length)\n const [error, setError] = useState<string | null>(null)\n const [internalLayouts, setInternalLayouts] = useState<PapermapGridDashboardLayouts>({\n lg: [],\n md: [],\n sm: [],\n xs: [],\n xxs: [],\n })\n const [tempLayouts, setTempLayouts] = useState<PapermapGridDashboardLayouts>({})\n const [isEditModeInternal, setIsEditModeInternal] = useState(isEditMode)\n const [isSavingLayout, setIsSavingLayout] = useState(false)\n const [dashboardTitle, setDashboardTitle] = useState<string>('')\n const [isTakingScreenshotInternal, setIsTakingScreenshotInternal] = useState(false)\n const [isGeneratingInternal, setIsGeneratingInternal] = useState(false)\n const [papermapChatToolbarHeight, setPapermapChatToolbarHeight] = useState(0)\n const [themeModalOpen, setThemeModalOpen] = useState(false)\n const [localDashboardTheme, setLocalDashboardTheme] = useState<DashboardTheme | undefined>()\n const [workspaceEntity, setWorkspaceEntity] = useState<Record<string, any> | null>(null)\n const [workspaceThemeLoading, setWorkspaceThemeLoading] = useState(false)\n const [isSavingWorkspaceTheme, setIsSavingWorkspaceTheme] = useState(false)\n\n const resolvedRemoteTheme = useMemo(\n () => resolveDashboardThemeFromWorkspace(workspaceEntity, dashboardId ?? ''),\n [workspaceEntity, dashboardId]\n )\n\n const appliedDashboardTheme = dashboardTheme ?? localDashboardTheme ?? resolvedRemoteTheme\n\n useEffect(() => {\n setLocalDashboardTheme(undefined)\n }, [dashboardId])\n\n useEffect(() => {\n setWorkspaceEntity(null)\n }, [workspaceId])\n\n const handleThemeModalOpen = useCallback(() => {\n setThemeModalOpen(true)\n onThemeModalOpen?.()\n }, [onThemeModalOpen])\n\n // Bootstrap: load workspace so grid theme matches main / embedded dashboard (useDashboardTheme rules)\n useEffect(() => {\n if (!persistWorkspaceTheme) return\n let cancelled = false\n workspaceSvc\n .getWorkspace(workspaceId ?? '')\n .then((raw) => {\n if (cancelled) return\n setWorkspaceEntity(unwrapWorkspacePayload(raw))\n })\n .catch(() => {\n // Silent on mount — token may lack workspace scope; modal save will surface errors\n })\n return () => {\n cancelled = true\n }\n }, [workspaceId, persistWorkspaceTheme, workspaceSvc])\n\n // Refresh workspace when theme modal opens (editor needs current meta)\n useEffect(() => {\n if (!themeModalOpen || renderThemeModal || !persistWorkspaceTheme) {\n if (!themeModalOpen) setWorkspaceThemeLoading(false)\n return\n }\n\n let cancelled = false\n setWorkspaceThemeLoading(true)\n workspaceSvc\n .getWorkspace(workspaceId ?? '')\n .then((raw) => {\n if (cancelled) return\n setWorkspaceEntity(unwrapWorkspacePayload(raw))\n })\n .catch((err: unknown) => {\n if (cancelled) return\n const message = err instanceof Error ? err.message : 'Could not load workspace theme.'\n toast({\n variant: 'destructive',\n title: 'Could not load workspace',\n description: message,\n })\n })\n .finally(() => {\n if (!cancelled) setWorkspaceThemeLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [themeModalOpen, workspaceId, renderThemeModal, persistWorkspaceTheme, workspaceSvc, toast])\n\n const initialThemeForModal = appliedDashboardTheme\n\n const handleBuiltInThemeSave = useCallback(\n async (theme: DashboardTheme, meta: ThemeSaveMeta) => {\n if (persistWorkspaceTheme) {\n setIsSavingWorkspaceTheme(true)\n try {\n const raw = await workspaceSvc.getWorkspace(workspaceId)\n const ws = unwrapWorkspacePayload(raw)\n const nextMeta = mergeWorkspaceMetaTheme(\n ws.meta,\n dashboardId ?? '',\n theme,\n meta.selectedPreset\n )\n await workspaceSvc.updateWorkspace(workspaceId, { ...ws, meta: nextMeta })\n\n try {\n const refreshed = await workspaceSvc.getWorkspace(workspaceId)\n setWorkspaceEntity(unwrapWorkspacePayload(refreshed))\n } catch {\n // Grid still reflects saved theme via local state below\n }\n\n if (meta.selectedPreset === 'default') {\n setLocalDashboardTheme(undefined)\n onDashboardThemeChange?.(undefined)\n } else {\n setLocalDashboardTheme(theme)\n onDashboardThemeChange?.(theme)\n }\n toast({\n title: 'Success',\n description: 'Theme settings saved to workspace preferences.',\n })\n setThemeModalOpen(false)\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to save theme settings'\n toast({\n title: 'Error',\n description: message,\n variant: 'destructive',\n })\n throw err\n } finally {\n setIsSavingWorkspaceTheme(false)\n }\n } else {\n if (meta.selectedPreset === 'default') {\n setLocalDashboardTheme(undefined)\n onDashboardThemeChange?.(undefined)\n } else {\n setLocalDashboardTheme(theme)\n onDashboardThemeChange?.(theme)\n }\n setThemeModalOpen(false)\n }\n },\n [persistWorkspaceTheme, workspaceSvc, workspaceId, dashboardId, onDashboardThemeChange, toast]\n )\n\n const coerceLayout = useCallback((layout: any[]): TLayout[] => {\n if (!Array.isArray(layout)) return []\n return layout\n .map((item) => ({\n ...item,\n i: String(item?.i ?? ''),\n x: Number(item?.x ?? 0),\n y: Number(item?.y ?? 0),\n w: Number(item?.w ?? 0),\n h: Number(item?.h ?? 0),\n }))\n .filter(\n (item) =>\n !!item.i &&\n Number.isFinite(item.x) &&\n Number.isFinite(item.y) &&\n Number.isFinite(item.w) &&\n Number.isFinite(item.h)\n ) as TLayout[]\n }, [])\n\n const prevSseCompleteRef = useRef(false)\n const prevSseStreamingRef = useRef(false)\n const prevSseRequestIdRef = useRef<string | null>(null)\n const streamClientRef = useRef<SSEStreamClient | null>(null)\n const dashboardMetaLayoutRef = useRef<TLayout[]>([])\n const onLayoutsChangeRef = useRef(onLayoutsChange)\n const layoutsPropRef = useRef(layoutsProp)\n const isFetchingRef = useRef(false)\n const [isDashboardChanging, setIsDashboardChanging] = useState(false)\n const previousDashboardIdRef = useRef<string | undefined>(dashboardId)\n\n const isLayoutsControlled = useMemo(() => {\n if (typeof layoutsProp === 'undefined') return false\n return Object.values(layoutsProp ?? {}).some((v) => Array.isArray(v) && v.length > 0)\n }, [layoutsProp])\n\n const isLayoutsControlledRef = useRef(isLayoutsControlled)\n useEffect(() => {\n isLayoutsControlledRef.current = isLayoutsControlled\n }, [isLayoutsControlled])\n\n const availableHandles = useMemo(\n () => (isEditModeInternal || isEditMode ? LAYOUT_HANDLE.RESIZE : EMPTY_HANDLES),\n [isEditModeInternal, isEditMode]\n )\n const availableHandlesRef = useRef(availableHandles)\n\n useEffect(() => {\n onLayoutsChangeRef.current = onLayoutsChange\n }, [onLayoutsChange])\n\n useEffect(() => {\n layoutsPropRef.current = layoutsProp\n }, [layoutsProp])\n\n useEffect(() => {\n availableHandlesRef.current = availableHandles\n }, [availableHandles])\n\n useEffect(() => {\n if (\n previousDashboardIdRef.current !== dashboardId &&\n previousDashboardIdRef.current !== undefined &&\n dashboardId\n ) {\n setIsDashboardChanging(true)\n }\n previousDashboardIdRef.current = dashboardId\n }, [dashboardId])\n\n const fetchDashboardCharts = useCallback(async () => {\n if (!enableFetch || !dashboardId || isFetchingRef.current) return\n isFetchingRef.current = true\n setIsLoading(true)\n setError(null)\n streamClientRef.current?.abort()\n\n try {\n const baseRes = await chartSvc.getCharts({\n dashboard_id: dashboardId,\n page: 1,\n per_page: 40,\n pin: true,\n })\n const basePayload = baseRes?.data ?? baseRes\n const baseCharts = Array.isArray(basePayload?.chats)\n ? basePayload.chats\n : Array.isArray(basePayload)\n ? basePayload\n : []\n const dashboardInfo = basePayload?.dashboardInfo\n const meta = Array.isArray(dashboardInfo?.meta) ? dashboardInfo.meta : []\n const normalizedMeta = coerceLayout(meta)\n const safeMeta = isFallbackLayout(normalizedMeta) ? [] : normalizedMeta\n dashboardMetaLayoutRef.current = safeMeta\n if (dashboardInfo?.title) setDashboardTitle(dashboardInfo.title)\n\n setFetchedCharts(baseCharts)\n if (!isLayoutsControlledRef.current) {\n const mergedLayout = getDefaultLayout({\n items: baseCharts,\n existingLayout: safeMeta,\n availableHandles: availableHandlesRef.current,\n })\n const nextLayouts: PapermapGridDashboardLayouts = {\n lg: [...mergedLayout],\n md: [...mergedLayout],\n sm: [...mergedLayout],\n xs: [...mergedLayout],\n xxs: [...mergedLayout],\n }\n setInternalLayouts(nextLayouts)\n onLayoutsChangeRef.current?.(nextLayouts)\n }\n setIsLoading(false)\n\n const streamUrl = new URL(\n ENDPOINTS.streamChat,\n storeApi.getState().getServices().baseUrl\n ).toString()\n const streamClient = new SSEStreamClient()\n streamClientRef.current = streamClient\n const streamedChartsById = new Map<string, TChartResponse>(\n baseCharts.map((chart: TChartResponse) => [chart.llm_data_chat_id, chart])\n )\n\n const mergeChunk = (raw: string) => {\n try {\n let parsed: any = JSON.parse(raw)\n if (typeof parsed === 'string') parsed = JSON.parse(parsed)\n const nextChat: TChartResponse | undefined = parsed?.chat ?? parsed?.data?.chat ?? parsed\n const chatId = nextChat?.llm_data_chat_id\n if (!chatId) return\n\n streamedChartsById.set(chatId, nextChat)\n const nextCharts = Array.from(streamedChartsById.values())\n setFetchedCharts(nextCharts)\n\n if (!isLayoutsControlledRef.current) {\n setInternalLayouts((prev) => {\n const prevLayout = coerceLayout(prev?.lg ?? [])\n const baseLayout = isFallbackLayout(prevLayout)\n ? dashboardMetaLayoutRef.current\n : prevLayout\n const mergedLayout = getDefaultLayout({\n items: nextCharts,\n existingLayout: baseLayout,\n availableHandles: availableHandlesRef.current,\n })\n const nextLayouts: PapermapGridDashboardLayouts = {\n lg: [...mergedLayout],\n md: [...mergedLayout],\n sm: [...mergedLayout],\n xs: [...mergedLayout],\n xxs: [...mergedLayout],\n }\n onLayoutsChangeRef.current?.(nextLayouts)\n return nextLayouts\n })\n }\n } catch {\n // ignore malformed chunks\n }\n }\n\n streamClient\n .on(EVENT_NAME.CHART, (data) => mergeChunk(data))\n .on(EVENT_NAME.STREAM, (data) => mergeChunk(data))\n .onError((err) => {\n console.error('Grid dashboard stream error:', err)\n })\n .stream({\n url: streamUrl,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...storeApi.getState().getServices().authHeaders,\n },\n body: JSON.stringify({\n dashboard_id: dashboardId,\n pin: true,\n page: 1,\n per_page: 40,\n }),\n })\n } catch (err: any) {\n setError(err?.message || 'Failed to load dashboard charts')\n } finally {\n setIsLoading(false)\n isFetchingRef.current = false\n }\n }, [chartSvc, coerceLayout, dashboardId, enableFetch, storeApi])\n\n useEffect(() => {\n if (!enableFetch || isEditModeInternal || isEditMode) return\n fetchDashboardCharts()\n }, [enableFetch, fetchDashboardCharts, isEditMode, isEditModeInternal])\n\n const handleDeleteChartInternal = useCallback(\n (chartId: string) => {\n // When a chart is deleted from inside the grid, refresh the pinned charts\n // so the removed tile disappears immediately.\n void fetchDashboardCharts().finally(() => {\n onDeleteChart?.(chartId)\n })\n },\n [fetchDashboardCharts, onDeleteChart]\n )\n\n useEffect(() => {\n if (enableFetch || !chartsProp?.length) return\n setIsLoading(false)\n if (!isLayoutsControlledRef.current) {\n const mergedLayout = getDefaultLayout({\n items: chartsProp,\n existingLayout: [],\n availableHandles: availableHandlesRef.current,\n })\n const nextLayouts: PapermapGridDashboardLayouts = {\n lg: [...mergedLayout],\n md: [...mergedLayout],\n sm: [...mergedLayout],\n xs: [...mergedLayout],\n xxs: [...mergedLayout],\n }\n setInternalLayouts(nextLayouts)\n }\n }, [chartsProp, enableFetch])\n\n useEffect(() => () => streamClientRef.current?.abort(), [])\n\n useEffect(() => {\n const transitionedToComplete = sseIsComplete && !prevSseCompleteRef.current\n if (enableFetch && !isEditModeInternal && !isEditMode && transitionedToComplete) {\n fetchDashboardCharts()\n }\n prevSseCompleteRef.current = sseIsComplete\n }, [enableFetch, fetchDashboardCharts, isEditMode, isEditModeInternal, sseIsComplete])\n\n useEffect(() => {\n const requestCleared = !!prevSseRequestIdRef.current && !sseRequestId\n const streamStopped = prevSseStreamingRef.current && !sseIsStreaming\n if (enableFetch && !isEditModeInternal && !isEditMode && (requestCleared || streamStopped)) {\n fetchDashboardCharts()\n }\n prevSseStreamingRef.current = sseIsStreaming\n prevSseRequestIdRef.current = sseRequestId\n }, [\n enableFetch,\n fetchDashboardCharts,\n isEditMode,\n isEditModeInternal,\n sseIsStreaming,\n sseRequestId,\n ])\n\n const charts = useMemo(() => {\n if (enableFetch) return fetchedCharts\n return chartsProp?.length ? chartsProp : fetchedCharts\n }, [chartsProp, enableFetch, fetchedCharts])\n\n const layouts = useMemo(() => {\n return isLayoutsControlled ? (layoutsProp as PapermapGridDashboardLayouts) : internalLayouts\n }, [internalLayouts, layoutsProp, isLayoutsControlled])\n\n useEffect(() => {\n if (!enableFetch || !charts?.length || isLayoutsControlled || isEditModeInternal || isEditMode)\n return\n const mergedLayout = getDefaultLayout({\n items: charts,\n existingLayout: dashboardMetaLayoutRef.current,\n availableHandles: availableHandlesRef.current,\n })\n const nextLayouts: PapermapGridDashboardLayouts = {\n lg: [...mergedLayout],\n md: [...mergedLayout],\n sm: [...mergedLayout],\n xs: [...mergedLayout],\n xxs: [...mergedLayout],\n }\n setInternalLayouts(nextLayouts)\n }, [charts, enableFetch, isEditMode, isEditModeInternal, isLayoutsControlled])\n\n useEffect(() => {\n if (!isLoading && charts?.length) {\n setIsDashboardChanging(false)\n }\n }, [charts, isLoading])\n\n const handleLayoutChange = (_current: TLayout[], allLayouts: { [key: string]: TLayout[] }) => {\n const mergedLayouts = (() => {\n const source = isLayoutsControlled\n ? (layoutsProp as PapermapGridDashboardLayouts)\n : internalLayouts\n const next: PapermapGridDashboardLayouts = { ...allLayouts }\n for (const bp in allLayouts) {\n next[bp] = allLayouts[bp].map((item) => {\n const old = source?.[bp]?.find((l) => l.i === item.i)\n const isPlaceholder = item.w <= 1 && item.h <= 1\n if (isPlaceholder && old) return { ...old }\n return { ...item }\n })\n }\n return next\n })()\n\n if (!isLayoutsControlledRef.current) setInternalLayouts(mergedLayouts)\n onLayoutsChange?.(mergedLayouts)\n }\n\n const randomColorScheme = () => {\n const schemes = ['blue', 'green', 'red', 'yellow', 'purple', 'orange', 'pink', 'teal']\n return schemes[Math.floor(Math.random() * schemes.length)]\n }\n\n const handleGenerateDashboard = useCallback(async () => {\n if (onGenerateDashboard) {\n onGenerateDashboard()\n return\n }\n if (!workspaceId || !dashboardId) return\n setIsGeneratingInternal(true)\n try {\n await chartSvc.generateProactiveDashboard({\n workspace_id: workspaceId,\n dashboard_id: dashboardId,\n color_scheme: randomColorScheme(),\n })\n await fetchDashboardCharts()\n } catch (err: any) {\n console.error('Generate dashboard failed:', err)\n } finally {\n setIsGeneratingInternal(false)\n }\n }, [chartSvc, dashboardId, fetchDashboardCharts, onGenerateDashboard, workspaceId])\n\n const handleTakeScreenshot = useCallback(async () => {\n if (onTakeScreenshot) {\n onTakeScreenshot()\n return\n }\n setIsTakingScreenshotInternal(true)\n await new Promise((resolve) => setTimeout(resolve, 1000))\n await waitForChartsToLoad(5000)\n try {\n await takeScreenshot({ selector: '.layout', additionalWidth: 30, additionalHeight: 0 })\n } catch (err) {\n console.error('Screenshot failed:', err)\n } finally {\n setIsTakingScreenshotInternal(false)\n }\n }, [onTakeScreenshot])\n\n const onClickEditModeToggle = useCallback(async () => {\n const currentlyEditing = isEditModeInternal || isEditMode\n\n if (currentlyEditing) {\n if (!dashboardId) return\n setIsSavingLayout(true)\n try {\n await chartSvc.updateDashboardLayout(dashboardId, layouts.lg ?? [])\n setIsEditModeInternal(false)\n } catch (err) {\n console.error('Save layout failed:', err)\n } finally {\n setIsSavingLayout(false)\n }\n return\n }\n\n const nextLg = (layouts.lg ?? []).map((item) => ({\n ...item,\n resizeHandles: LAYOUT_HANDLE.RESIZE,\n }))\n const nextLayouts: PapermapGridDashboardLayouts = {\n ...layouts,\n lg: nextLg,\n }\n\n if (!layoutsProp) setInternalLayouts(nextLayouts)\n onLayoutsChange?.(nextLayouts)\n setIsEditModeInternal(true)\n }, [chartSvc, dashboardId, isEditMode, isEditModeInternal, layouts, layoutsProp, onLayoutsChange])\n\n const handleResetLayout = useCallback(() => {\n if (Object.keys(tempLayouts).length) {\n setInternalLayouts(tempLayouts)\n setTempLayouts({})\n onLayoutsChangeRef.current?.(tempLayouts)\n return\n }\n\n setTempLayouts(layouts)\n const defaultLayout = getDefaultLayout({\n items: charts,\n existingLayout: [],\n availableHandles: availableHandlesRef.current,\n })\n const resetLayouts: PapermapGridDashboardLayouts = {\n lg: defaultLayout,\n md: defaultLayout,\n sm: defaultLayout,\n xs: defaultLayout,\n xxs: defaultLayout,\n }\n setInternalLayouts(resetLayouts)\n onLayoutsChangeRef.current?.(resetLayouts)\n }, [charts, layouts, tempLayouts])\n\n const themeStyles = useMemo(\n () => generateThemeStyles(appliedDashboardTheme),\n [appliedDashboardTheme]\n )\n const themeCSS = useMemo(() => generateThemeCSS(appliedDashboardTheme), [appliedDashboardTheme])\n\n const showLoader = (isLoading && !charts?.length) || isDashboardChanging\n\n const papermapChat = showChatAssistant ? (\n <PapermapChat\n token={token}\n workspaceId={workspaceId}\n dashboardId={dashboardId}\n onToolbarHeightChange={setPapermapChatToolbarHeight}\n showToolbar={true}\n />\n ) : null\n\n if (error) {\n return (\n <>\n <Card className=\"relative flex h-full min-h-[240px] items-center justify-center\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </Card>\n {papermapChat}\n </>\n )\n }\n\n if (!charts?.length && !isLoading) {\n return (\n <>\n <div className=\"w-full h-full flex items-center justify-center text-sm text-muted-foreground\">\n No charts to display\n </div>\n {papermapChat}\n </>\n )\n }\n\n const effectiveIsGenerating = isGenerating || isGeneratingInternal\n const effectiveIsTakingScreenshot = isTakingScreenshotInternal\n const resetState = Object.keys(tempLayouts).length ? false : true\n const gridKey = `grid-${dashboardId}-${charts.length}-${charts.map((c) => c.llm_data_chat_id).join('-')}`\n\n return (\n <div\n className={cn(\n 'papermap-grid-dashboard w-full h-full overflow-y-auto',\n appliedDashboardTheme && 'dashboard-theme bg-dashboard-bg'\n )}\n style={{\n ...themeStyles,\n paddingBottom: showChatAssistant ? papermapChatToolbarHeight + 60 : undefined,\n }}\n data-dashboard-theme={appliedDashboardTheme ? 'custom' : undefined}\n data-edit-mode={isEditModeInternal || isEditMode ? 'true' : 'false'}\n >\n <style>{GRID_RESIZE_HANDLE_STYLES}</style>\n {themeCSS && appliedDashboardTheme && <style>{themeCSS}</style>}\n <div className=\"space-y-2\">\n <div className=\"px-8 lg:px-16 flex flex-col md:flex-row md:items-center justify-between gap-4 md:gap-8\">\n {showHeader ? (\n <div>\n <h2 className=\"text-2xl lg:text-3xl font-bold tracking-tight\">\n {dashboardTitle || 'Dashboard'} {isLoading ? 'Loading...' : ''}\n </h2>\n </div>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <div data-tour=\"dashboard-toolbar\">\n <DashboardToolbar\n isEditMode={isEditModeInternal || isEditMode}\n isSaving={isSavingLayout}\n isTakingScreenshot={effectiveIsTakingScreenshot}\n resetState={resetState}\n onEditModeToggle={onClickEditModeToggle}\n onResetLayout={handleResetLayout}\n onTakeScreenshot={handleTakeScreenshot}\n onGenerateDashboard={handleGenerateDashboard}\n isGenerating={effectiveIsGenerating}\n setThemeModalOpen={handleThemeModalOpen}\n isViewer={isViewer}\n showToolbar={showToolbar}\n showScreenshot={showScreenshot}\n showGenerateDashboard={showGenerateDashboard}\n editLayout={editLayout}\n />\n </div>\n </div>\n </div>\n <div className=\"px-3 lg:px-12\" data-tour=\"charts-grid\">\n <ResponsiveGridLayout\n key={gridKey}\n className=\"layout\"\n layouts={layouts}\n breakpoints={GRID_BREAKPOINTS}\n cols={GRID_COLS}\n resizeHandles={availableHandles}\n isResizable={(isEditModeInternal || isEditMode) && !isSavingLayout}\n isDraggable={(isEditModeInternal || isEditMode) && !isSavingLayout}\n autoSize={true}\n width={typeof window !== 'undefined' ? window.innerWidth - 100 : 1200}\n draggableHandle=\".drag-handle\"\n margin={[20, 30]}\n compactType=\"vertical\"\n preventCollision={false}\n onLayoutChange={handleLayoutChange}\n >\n {charts.map((chart) => {\n const chatId = chart.llm_data_chat_id\n if (!chatId) return null\n return (\n <div\n key={chatId}\n className={cn(\n (isEditModeInternal || isEditMode) && !isSavingLayout && 'drag-handle'\n )}\n >\n <PapermapChartCard\n token={token}\n workspaceId={workspaceId}\n dashboardId={dashboardId}\n apiUrl={apiUrl}\n chartId={chatId}\n chart={chart}\n showToolbar={showToolbar}\n isEditMode={(isEditModeInternal || isEditMode) && !isSavingLayout}\n isViewer={isViewer}\n variant={variant}\n // onEditClick={onEditChart}\n onDelete={handleDeleteChartInternal}\n onPinChange={onPinChange}\n />\n </div>\n )\n })}\n </ResponsiveGridLayout>\n </div>\n </div>\n {papermapChat}\n\n {!isViewer && showToolbar ? (\n <Dialog open={themeModalOpen} onOpenChange={setThemeModalOpen}>\n <DialogContent className=\"w-[90vw] max-w-[90vw] max-h-[90vh] overflow-y-auto scrollbar-hide\">\n {renderThemeModal ? (\n renderThemeModal(() => setThemeModalOpen(false))\n ) : persistWorkspaceTheme && workspaceThemeLoading ? (\n <div className=\"flex flex-col items-center justify-center gap-3 py-24\">\n <Loader2 className=\"size-10 animate-spin text-primary\" />\n <p className=\"text-sm text-muted-foreground\">Loading workspace…</p>\n </div>\n ) : (\n <ThemeCustomizationSettings\n key={`${dashboardId}-${workspaceId}-${workspaceThemeLoading ? 'loading' : 'ready'}`}\n initialTheme={initialThemeForModal}\n isSaving={isSavingWorkspaceTheme}\n onSave={handleBuiltInThemeSave}\n />\n )}\n </DialogContent>\n </Dialog>\n ) : null}\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Loader2, Palette, Sparkles, Edit2, X, RotateCcw, ChevronDown } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu'\nimport { cn } from '../../utils/cn'\nimport type { DashboardTheme, ThemePreset } from './types'\nimport {\n themePresets,\n themePresetList,\n ThemeColorSection,\n ThemeTypographySection,\n ThemePresetSelector,\n ContrastWarnings,\n ThemePreview,\n useThemeValidation,\n} from './index'\n\nexport type ThemeSaveMeta = { selectedPreset: ThemePreset | 'custom' }\n\nexport interface ThemeCustomizationSettingsProps {\n /** Current theme to edit. Falls back to the default preset when omitted. */\n initialTheme?: DashboardTheme\n /**\n * Called when the user clicks Save. `selectedPreset` is `'default` when saving\n * app default theme (workspace should drop this dashboard from `meta.theme`).\n */\n onSave?: (theme: DashboardTheme, meta: ThemeSaveMeta) => void | Promise<void>\n /** Called when the user clicks Close / X without saving. */\n onClose?: () => void\n /** Show a saving spinner while the host persists. */\n isSaving?: boolean\n}\n\nexport function ThemeCustomizationSettings({\n initialTheme,\n onSave,\n onClose,\n isSaving = false,\n}: ThemeCustomizationSettingsProps) {\n const [theme, setTheme] = React.useState<DashboardTheme>(initialTheme || themePresets.default)\n const [previousTheme, setPreviousTheme] = React.useState<DashboardTheme | null>(\n initialTheme || null\n )\n const [selectedPreset, setSelectedPreset] = React.useState<ThemePreset | 'custom'>(() =>\n findMatchingPreset(initialTheme || themePresets.default)\n )\n const [hasChanges, setHasChanges] = React.useState(false)\n const [isEditingFromPreview, setIsEditingFromPreview] = React.useState(false)\n const [hoveredPreset, setHoveredPreset] = React.useState<ThemePreset | null>(null)\n\n const { contrastWarnings, validateThemeContrast } = useThemeValidation()\n\n // Sync if the host changes initialTheme\n React.useEffect(() => {\n if (initialTheme) {\n setTheme(initialTheme)\n setPreviousTheme(initialTheme)\n setSelectedPreset(findMatchingPreset(initialTheme))\n setHasChanges(false)\n }\n }, [initialTheme])\n\n const handleColorChange = React.useCallback(\n (key: keyof DashboardTheme, value: string | number) => {\n setTheme((prev) => ({ ...prev, [key]: value }))\n setSelectedPreset('custom')\n setHasChanges(true)\n },\n []\n )\n\n const handlePresetSelect = React.useCallback((preset: ThemePreset) => {\n setSelectedPreset(preset)\n setTheme(themePresets[preset])\n setHasChanges(true)\n setHoveredPreset(null)\n }, [])\n\n // Throttle preset hover\n const hoverThrottleRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const hoverLastRef = React.useRef(0)\n const hoverPendingRef = React.useRef<ThemePreset | null>(null)\n const THROTTLE_MS = 80\n const handlePresetHover = React.useCallback((preset: ThemePreset | null) => {\n if (preset === null) {\n if (hoverThrottleRef.current) {\n clearTimeout(hoverThrottleRef.current)\n hoverThrottleRef.current = null\n }\n hoverPendingRef.current = null\n setHoveredPreset(null)\n return\n }\n const now = Date.now()\n const elapsed = now - hoverLastRef.current\n if (elapsed >= THROTTLE_MS || hoverLastRef.current === 0) {\n hoverLastRef.current = now\n setHoveredPreset(preset)\n if (hoverThrottleRef.current) {\n clearTimeout(hoverThrottleRef.current)\n hoverThrottleRef.current = null\n }\n } else {\n hoverPendingRef.current = preset\n if (!hoverThrottleRef.current) {\n hoverThrottleRef.current = setTimeout(() => {\n hoverThrottleRef.current = null\n hoverLastRef.current = Date.now()\n setHoveredPreset(hoverPendingRef.current)\n }, THROTTLE_MS - elapsed)\n }\n }\n }, [])\n\n const previewTheme = React.useMemo(() => {\n if (hoveredPreset) return themePresets[hoveredPreset]\n return theme\n }, [hoveredPreset, theme])\n\n // Debounced preview for the chart / ThemePreview component\n const [debouncedPreviewTheme, setDebouncedPreviewTheme] =\n React.useState<DashboardTheme>(previewTheme)\n const debounceFirstRunRef = React.useRef(true)\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n React.useEffect(() => {\n if (debounceFirstRunRef.current) {\n debounceFirstRunRef.current = false\n setDebouncedPreviewTheme(previewTheme)\n return\n }\n if (hoveredPreset === null) {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n debounceTimeoutRef.current = null\n }\n setDebouncedPreviewTheme(previewTheme)\n return\n }\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current)\n debounceTimeoutRef.current = setTimeout(() => {\n debounceTimeoutRef.current = null\n setDebouncedPreviewTheme(previewTheme)\n }, 200)\n return () => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current)\n }\n }, [previewTheme, hoveredPreset])\n\n const ThemePreviewCard = React.useMemo(\n () => (\n <Card className=\"border-2 shadow-sm lg:col-span-9\">\n <CardHeader className=\"pb-4\">\n <div className=\"space-y-1\">\n <CardTitle className=\"text-lg font-semibold\">Theme Preview</CardTitle>\n <CardDescription className=\"text-sm\">\n See how your theme will look when applied\n </CardDescription>\n </div>\n </CardHeader>\n <CardContent>\n <div\n className=\"p-8 rounded-xl border-2 shadow-lg transition-all duration-500 ease-in-out\"\n style={{\n backgroundColor: previewTheme.dashboardBg,\n borderColor: previewTheme.outline,\n fontFamily: `\"${previewTheme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n transitionProperty: 'background-color, border-color, font-family',\n }}\n >\n <ThemePreview theme={debouncedPreviewTheme} />\n </div>\n </CardContent>\n </Card>\n ),\n [previewTheme, debouncedPreviewTheme]\n )\n\n // Debounced contrast validation\n const validationTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n React.useEffect(() => {\n if (validationTimeoutRef.current) clearTimeout(validationTimeoutRef.current)\n validationTimeoutRef.current = setTimeout(() => {\n validationTimeoutRef.current = null\n validateThemeContrast(theme)\n }, 200)\n return () => {\n if (validationTimeoutRef.current) clearTimeout(validationTimeoutRef.current)\n }\n }, [theme, validateThemeContrast])\n\n const handleSave = React.useCallback(async () => {\n if (isSaving) return\n try {\n await onSave?.(theme, { selectedPreset })\n setPreviousTheme({ ...theme })\n setHasChanges(false)\n } catch {\n // Host handles toasts; keep dirty state so the user can retry\n }\n }, [theme, isSaving, onSave, selectedPreset])\n\n const revertToPreviousTheme = React.useCallback(() => {\n if (previousTheme) {\n setTheme(previousTheme)\n setSelectedPreset(findMatchingPreset(previousTheme))\n setHasChanges(false)\n }\n }, [previousTheme])\n\n const revertToDefaultTheme = React.useCallback(() => {\n setTheme(themePresets.default)\n setSelectedPreset('default')\n setHasChanges(false)\n }, [])\n\n return (\n <div className=\"relative space-y-8 px-0\">\n {isSaving && (\n <div\n className={cn(\n 'absolute inset-0 z-10 flex flex-col items-center justify-center rounded-lg',\n 'bg-background/80 backdrop-blur-sm'\n )}\n >\n <Loader2 className=\"size-10 animate-spin text-primary\" />\n <p className=\"mt-3 text-sm font-medium text-muted-foreground\">Saving theme...</p>\n </div>\n )}\n\n {/* Header */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10\">\n <Palette className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <h3 className=\"text-2xl font-bold tracking-tight\">Theme Customization</h3>\n <p className=\"text-sm text-muted-foreground mt-1\">\n Customize the appearance of this dashboard\n </p>\n </div>\n </div>\n {onClose && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose}>\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-12 gap-6\">\n {!isEditingFromPreview && (\n <>\n <Card className=\"border-2 shadow-sm lg:col-span-3\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-1\">\n <CardTitle className=\"text-lg font-semibold\">Theme Presets</CardTitle>\n <CardDescription className=\"text-sm\">\n Choose a preset theme or customize your own\n </CardDescription>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsEditingFromPreview(true)}\n className=\"shrink-0 shadow-sm\"\n >\n <Edit2 className=\"h-4 w-4 mr-2\" />\n Customize\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"pt-0\">\n <ThemePresetSelector\n value={selectedPreset}\n onValueChange={handlePresetSelect}\n presets={themePresetList}\n themePresets={themePresets}\n onHover={handlePresetHover}\n />\n </CardContent>\n </Card>\n {ThemePreviewCard}\n </>\n )}\n\n {isEditingFromPreview && (\n <>\n <div className=\"space-y-6 animate-fade-in transition-all duration-500 lg:col-span-3\">\n <Card className=\"border-2 shadow-xl bg-gradient-to-br from-background via-background to-primary/5 relative overflow-hidden\">\n <CardHeader className=\"pb-6 relative z-10\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-2\">\n <CardTitle className=\"text-xl font-bold flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-primary/20 to-primary/10 border border-primary/20 shadow-lg\">\n <Sparkles className=\"h-5 w-5 text-primary\" />\n </div>\n <span className=\"bg-gradient-to-r from-foreground to-foreground/70 bg-clip-text text-transparent\">\n Theme Settings\n </span>\n </CardTitle>\n <CardDescription className=\"text-sm ml-[52px] font-medium\">\n Customize colors, typography, and styling\n </CardDescription>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setIsEditingFromPreview(false)}\n className=\"shrink-0 h-10 w-10 rounded-lg hover:bg-destructive/10 hover:text-destructive transition-all duration-200 hover:scale-110\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"pt-2 relative z-10\">\n <div className=\"max-h-[calc(100vh-14rem)] overflow-y-auto pr-2 space-y-6 scrollbar-hide\">\n <div className=\"space-y-6\">\n <div className=\"flex items-center gap-3 pb-2\">\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-border to-transparent\" />\n <div className=\"flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/5 border border-primary/10\">\n <Palette className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold text-primary\">Colors</span>\n </div>\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-border to-transparent\" />\n </div>\n <div className=\"pl-2\">\n <ThemeColorSection theme={theme} onColorChange={handleColorChange} />\n </div>\n </div>\n\n <ContrastWarnings warnings={contrastWarnings} />\n\n <div className=\"space-y-6\">\n <div className=\"flex items-center gap-3 pb-2\">\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-border to-transparent\" />\n <div className=\"flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/5 border border-primary/10\">\n <Edit2 className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold text-primary\">\n Typography & Styling\n </span>\n </div>\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-border to-transparent\" />\n </div>\n <div className=\"pl-2\">\n <ThemeTypographySection\n theme={theme}\n onFontFamilyChange={(value) => handleColorChange('fontFamily', value)}\n onBorderRadiusChange={(value) => handleColorChange('borderRadius', value)}\n />\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n {ThemePreviewCard}\n </>\n )}\n </div>\n\n {/* Action Buttons */}\n <Card className=\"border-2 shadow-sm bg-muted/30\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex flex-wrap gap-3\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" disabled={isSaving} className=\"shadow-sm\">\n <RotateCcw className=\"h-4 w-4 mr-2\" />\n Revert Theme\n <ChevronDown className=\"h-4 w-4 ml-2\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={revertToPreviousTheme} disabled={!previousTheme}>\n Revert to Previous Theme\n </DropdownMenuItem>\n <DropdownMenuItem onClick={revertToDefaultTheme}>\n Revert to Default Theme\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <Button\n onClick={handleSave}\n disabled={\n isSaving || (!hasChanges && (selectedPreset === 'custom' || !selectedPreset))\n }\n className=\"shadow-md\"\n size=\"lg\"\n >\n {isSaving ? <Loader2 className=\"size-4 animate-spin\" /> : 'Save Changes'}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )\n}\n\nfunction findMatchingPreset(themeToMatch: DashboardTheme): ThemePreset | 'custom' {\n const match = Object.entries(themePresets).find(([_, presetTheme]) =>\n Object.keys(presetTheme).every(\n (key) =>\n presetTheme[key as keyof DashboardTheme] === themeToMatch[key as keyof DashboardTheme]\n )\n )\n return match ? (match[0] as ThemePreset) : 'custom'\n}\n","import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport * as React from 'react'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border/70 bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border/70 bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)} {...props} />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => (\n <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n)\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut'\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import type { DashboardTheme, ThemePreset } from './types'\n\nexport const defaultTheme: DashboardTheme = {\n primary: '#1F4A05',\n secondary: '#5F7D52',\n interactive: '#CBD6BA',\n container: '#D9ECD9',\n module: '#E9F7DF',\n accent: '#8E8B78',\n outline: '#CADDC2',\n dialog: '#FFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#E9F7DF',\n dashboardBg: '#D9ECD9',\n cardIcons: '#1F4A05',\n cardText: '#1F4A05',\n cardTitle: '#1F4A05',\n buttonPrimary: '#1F4A05',\n buttonSecondary: '#5F7D52',\n buttonText: '#FFFFFF',\n}\n\nexport const themePresets: Record<ThemePreset, DashboardTheme> = {\n default: {\n primary: 'hsl(var(--primary))',\n secondary: 'hsl(var(--muted-foreground))',\n interactive: 'hsl(var(--border))',\n container: 'hsl(var(--background))',\n module: 'hsl(var(--card))',\n accent: 'hsl(var(--accent))',\n outline: 'hsl(var(--border))',\n dialog: 'hsl(var(--popover))',\n fontFamily: 'Nunito',\n borderRadius: 0.5,\n cardBg: 'hsl(var(--card))',\n dashboardBg: 'hsl(var(--background))',\n cardIcons: 'hsl(var(--foreground))',\n cardText: 'hsl(var(--card-foreground))',\n cardTitle: 'hsl(var(--foreground))',\n buttonPrimary: 'hsl(var(--primary))',\n buttonSecondary: 'hsl(var(--secondary))',\n buttonText: 'hsl(var(--primary-foreground))',\n },\n green: { ...defaultTheme },\n blue: {\n primary: '#1E40AF',\n secondary: '#3B82F6',\n interactive: '#93C5FD',\n container: '#DBEAFE',\n module: '#EFF6FF',\n accent: '#60A5FA',\n outline: '#BFDBFE',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#EFF6FF',\n dashboardBg: '#DBEAFE',\n cardIcons: '#1E40AF',\n cardText: '#1E40AF',\n cardTitle: '#1E40AF',\n buttonPrimary: '#1E40AF',\n buttonSecondary: '#3B82F6',\n buttonText: '#FFFFFF',\n },\n lime: {\n primary: '#065F46',\n secondary: '#10B981',\n interactive: '#6EE7B7',\n container: '#D1FAE5',\n module: '#ECFDF5',\n accent: '#34D399',\n outline: '#A7F3D0',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#ECFDF5',\n dashboardBg: '#D1FAE5',\n cardIcons: '#065F46',\n cardText: '#065F46',\n cardTitle: '#065F46',\n buttonPrimary: '#065F46',\n buttonSecondary: '#10B981',\n buttonText: '#FFFFFF',\n },\n purple: {\n primary: '#5B21B6',\n secondary: '#8B5CF6',\n interactive: '#C4B5FD',\n container: '#EDE9FE',\n module: '#F5F3FF',\n accent: '#A78BFA',\n outline: '#DDD6FE',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#F5F3FF',\n dashboardBg: '#EDE9FE',\n cardIcons: '#5B21B6',\n cardText: '#5B21B6',\n cardTitle: '#5B21B6',\n buttonPrimary: '#5B21B6',\n buttonSecondary: '#8B5CF6',\n buttonText: '#FFFFFF',\n },\n ocean: {\n primary: '#0E7490',\n secondary: '#06B6D4',\n interactive: '#67E8F9',\n container: '#CFFAFE',\n module: '#ECFEFF',\n accent: '#22D3EE',\n outline: '#A5F3FC',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#ECFEFF',\n dashboardBg: '#CFFAFE',\n cardIcons: '#0E7490',\n cardText: '#0E7490',\n cardTitle: '#0E7490',\n buttonPrimary: '#0E7490',\n buttonSecondary: '#06B6D4',\n buttonText: '#FFFFFF',\n },\n sunset: {\n primary: '#C2410C',\n secondary: '#F97316',\n interactive: '#FDBA74',\n container: '#FFEDD5',\n module: '#FFF7ED',\n accent: '#FB923C',\n outline: '#FED7AA',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#FFF7ED',\n dashboardBg: '#FFEDD5',\n cardIcons: '#C2410C',\n cardText: '#C2410C',\n cardTitle: '#C2410C',\n buttonPrimary: '#C2410C',\n buttonSecondary: '#F97316',\n buttonText: '#FFFFFF',\n },\n dark: {\n primary: '#F9FAFB',\n secondary: '#E5E7EB',\n interactive: '#9CA3AF',\n container: '#111827',\n module: '#1F2937',\n accent: '#D1D5DB',\n outline: '#374151',\n dialog: '#1F2937',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#1F2937',\n dashboardBg: '#111827',\n cardIcons: '#F9FAFB',\n cardText: '#F9FAFB',\n cardTitle: '#F9FAFB',\n buttonPrimary: '#F9FAFB',\n buttonSecondary: '#E5E7EB',\n buttonText: '#111827',\n },\n minimal: {\n primary: '#000000',\n secondary: '#4B5563',\n interactive: '#9CA3AF',\n container: '#F9FAFB',\n module: '#FFFFFF',\n accent: '#6B7280',\n outline: '#E5E7EB',\n dialog: '#FFFFFF',\n fontFamily: 'Source Sans Pro',\n borderRadius: 0.25,\n cardBg: '#FFFFFF',\n dashboardBg: '#F9FAFB',\n cardIcons: '#000000',\n cardText: '#000000',\n cardTitle: '#000000',\n buttonPrimary: '#000000',\n buttonSecondary: '#4B5563',\n buttonText: '#FFFFFF',\n },\n}\n\nexport const themePresetList: ThemePreset[] = [\n 'default',\n 'green',\n 'blue',\n 'lime',\n 'purple',\n 'ocean',\n 'sunset',\n 'dark',\n 'minimal',\n]\n\nexport const presetDisplayNames: Record<ThemePreset, string> = {\n default: 'Default',\n green: 'Forest',\n blue: 'Azure',\n lime: 'Mint',\n purple: 'Violet',\n ocean: 'Ocean',\n sunset: 'Blaze',\n dark: 'Midnight',\n minimal: 'Minimal',\n}\n","import React from 'react'\nimport { cn } from '../../utils/cn'\nimport { getContrastRatio, getContrastLevel } from './utils/colorUtils'\n\ninterface ContrastIndicatorProps {\n foreground: string\n background: string\n label: string\n}\n\nfunction ContrastIndicatorInner({ foreground, background, label }: ContrastIndicatorProps) {\n const ratio = getContrastRatio(foreground, background)\n if (ratio === null) return null\n\n const { level, passes } = getContrastLevel(ratio)\n const ratioText = ratio.toFixed(2)\n\n return (\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"text-muted-foreground\">Contrast:</span>\n <span\n className={cn(\n 'font-mono font-semibold',\n passes ? 'text-green-600 dark:text-green-400' : 'text-destructive'\n )}\n >\n {ratioText}:1\n </span>\n <span\n className={cn(\n 'px-1.5 py-0.5 rounded text-[10px] font-medium',\n level === 'AAA' && 'bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-300',\n level === 'AA' && 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300',\n level === 'AA-Large' &&\n 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900 dark:text-yellow-300',\n level === 'Fail' && 'bg-destructive/20 text-destructive'\n )}\n >\n {level}\n </span>\n </div>\n )\n}\n\nexport const ContrastIndicator = React.memo(ContrastIndicatorInner)\n","export function normalizeHex(hex: string): string {\n if (!hex) return '#000000'\n hex = hex.replace('#', '')\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((char) => char + char)\n .join('')\n }\n if (hex.length !== 6) return '#000000'\n return `#${hex}`\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const normalized = normalizeHex(hex)\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(normalized)\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null\n}\n\nexport function getRelativeLuminance(rgb: { r: number; g: number; b: number }): number {\n const [r, g, b] = [rgb.r, rgb.g, rgb.b].map((val) => {\n val = val / 255\n return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4)\n })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\nexport function getContrastRatio(color1: string, color2: string): number | null {\n const rgb1 = hexToRgb(color1)\n const rgb2 = hexToRgb(color2)\n if (!rgb1 || !rgb2) return null\n\n const lum1 = getRelativeLuminance(rgb1)\n const lum2 = getRelativeLuminance(rgb2)\n const lighter = Math.max(lum1, lum2)\n const darker = Math.min(lum1, lum2)\n return (lighter + 0.05) / (darker + 0.05)\n}\n\nexport function getContrastLevel(ratio: number): {\n level: 'AAA' | 'AA' | 'AA-Large' | 'Fail'\n passes: boolean\n} {\n if (ratio >= 7) return { level: 'AAA', passes: true }\n if (ratio >= 4.5) return { level: 'AA', passes: true }\n if (ratio >= 3) return { level: 'AA-Large', passes: true }\n return { level: 'Fail', passes: false }\n}\n\nexport function validateColorContrast(\n foreground: string,\n background: string,\n context: string\n): { valid: boolean; ratio: number; level: string; message: string } {\n const ratio = getContrastRatio(foreground, background)\n if (ratio === null) {\n return {\n valid: false,\n ratio: 0,\n level: 'Error',\n message: `Invalid color format for ${context}`,\n }\n }\n\n const { level, passes } = getContrastLevel(ratio)\n return {\n valid: passes,\n ratio: Math.round(ratio * 100) / 100,\n level,\n message: passes\n ? `${context}: Contrast ratio ${ratio.toFixed(2)}:1 meets ${level} standards`\n : `${context}: Contrast ratio ${ratio.toFixed(2)}:1 does NOT meet WCAG standards (minimum 4.5:1 for normal text, 3:1 for large text)`,\n }\n}\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../utils/cn'\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n)\n\nconst Label = React.forwardRef<\n HTMLLabelElement,\n React.LabelHTMLAttributes<HTMLLabelElement> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <label ref={ref} className={cn(labelVariants(), className)} {...props} />\n))\nLabel.displayName = 'Label'\n\nexport { Label }\n","import React from 'react'\nimport { Label } from '../ui/label'\nimport { Input } from '../ui/input'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { Info } from 'lucide-react'\nimport { normalizeHex } from './utils/colorUtils'\nimport { ContrastIndicator } from './ContrastIndicator'\nimport type { DashboardTheme } from './types'\n\ninterface ThemeColorInputProps {\n id: string\n label: string\n colorKey: keyof DashboardTheme\n value: string\n placeholder?: string\n onColorChange: (key: keyof DashboardTheme, value: string | number) => void\n theme: DashboardTheme\n showContrast?: boolean\n contrastForeground?: string\n contrastBackground?: string\n contrastLabel?: string\n description?: string\n}\n\nfunction ThemeColorInputInner({\n id,\n label,\n colorKey,\n value,\n placeholder,\n onColorChange,\n showContrast = false,\n contrastForeground,\n contrastBackground,\n contrastLabel,\n description,\n}: ThemeColorInputProps) {\n const onChange = (v: string) => onColorChange(colorKey, v)\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Label htmlFor={id}>{label}</Label>\n {description && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Info className=\"h-3.5 w-3.5 text-muted-foreground cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-xs\">\n <p className=\"text-sm\">{description}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <Input\n id={id}\n type=\"color\"\n value={normalizeHex(value)}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-10 w-16 cursor-pointer\"\n />\n <Input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder || value}\n className=\"flex-1 font-mono text-sm\"\n />\n </div>\n {showContrast && contrastForeground && contrastBackground && (\n <ContrastIndicator\n foreground={contrastForeground}\n background={contrastBackground}\n label={contrastLabel || 'contrast'}\n />\n )}\n </div>\n )\n}\n\nfunction propsAreEqual(prev: ThemeColorInputProps, next: ThemeColorInputProps): boolean {\n return (\n prev.id === next.id &&\n prev.label === next.label &&\n prev.colorKey === next.colorKey &&\n prev.value === next.value &&\n prev.placeholder === next.placeholder &&\n prev.showContrast === next.showContrast &&\n prev.contrastForeground === next.contrastForeground &&\n prev.contrastBackground === next.contrastBackground &&\n prev.contrastLabel === next.contrastLabel &&\n prev.description === next.description &&\n prev.onColorChange === next.onColorChange\n )\n}\n\nexport const ThemeColorInput = React.memo(ThemeColorInputInner, propsAreEqual)\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\n\nconst Input = React.forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement>>(\n ({ className, type, ...props }, ref) => (\n <input\n type={type}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import { ThemeColorInput } from './ThemeColorInput'\nimport type { DashboardTheme } from './types'\n\ninterface ThemeColorSectionProps {\n theme: DashboardTheme\n onColorChange: (key: keyof DashboardTheme, value: string | number) => void\n}\n\nexport function ThemeColorSection({ theme, onColorChange }: ThemeColorSectionProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4\">\n <ThemeColorInput\n id=\"primary-color\"\n label=\"Primary\"\n colorKey=\"primary\"\n value={theme.primary}\n placeholder=\"#1F4A05\"\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.primary}\n contrastBackground={theme.container || theme.dashboardBg || '#FFFFFF'}\n contrastLabel=\"on container\"\n description=\"Main brand color used for headings, primary buttons, and key UI elements\"\n />\n <ThemeColorInput\n id=\"secondary-color\"\n label=\"Secondary\"\n colorKey=\"secondary\"\n value={theme.secondary}\n placeholder=\"#5F7D52\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Secondary brand color used for secondary buttons and supporting elements\"\n />\n <ThemeColorInput\n id=\"interactive-color\"\n label=\"Interactive\"\n colorKey=\"interactive\"\n value={theme.interactive}\n placeholder=\"#CBD6BA\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Color for interactive elements like hover states and active links\"\n />\n <ThemeColorInput\n id=\"container-color\"\n label=\"Container\"\n colorKey=\"container\"\n value={theme.container}\n placeholder=\"#D9ECD9\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Background color for main containers and page sections\"\n />\n <ThemeColorInput\n id=\"module-color\"\n label=\"Module\"\n colorKey=\"module\"\n value={theme.module}\n placeholder=\"#E9F7DF\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Background color for navigation bars and elevated surfaces\"\n />\n <ThemeColorInput\n id=\"accent-color\"\n label=\"Accent\"\n colorKey=\"accent\"\n value={theme.accent}\n placeholder=\"#8E8B78\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Accent color for highlights, badges, and special emphasis\"\n />\n <ThemeColorInput\n id=\"outline-color\"\n label=\"Outline\"\n colorKey=\"outline\"\n value={theme.outline}\n placeholder=\"#CADDC2\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Color for borders, dividers, and outline elements\"\n />\n <ThemeColorInput\n id=\"dialog-color\"\n label=\"Dialog\"\n colorKey=\"dialog\"\n value={theme.dialog}\n placeholder=\"#FFF\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Background color for dialogs, modals, and popovers\"\n />\n <ThemeColorInput\n id=\"card-bg-color\"\n label=\"Card Background\"\n colorKey=\"cardBg\"\n value={theme.cardBg || theme.module}\n placeholder={theme.module}\n onColorChange={onColorChange}\n theme={theme}\n description=\"Background color specifically for chart cards and content cards\"\n />\n <ThemeColorInput\n id=\"dashboard-bg-color\"\n label=\"Dashboard Background\"\n colorKey=\"dashboardBg\"\n value={theme.dashboardBg || theme.container}\n placeholder={theme.container}\n onColorChange={onColorChange}\n theme={theme}\n description=\"Main background color for the entire dashboard view\"\n />\n <ThemeColorInput\n id=\"card-icons-color\"\n label=\"Card Icons\"\n colorKey=\"cardIcons\"\n value={theme.cardIcons || theme.primary}\n placeholder={theme.primary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.cardIcons || theme.primary}\n contrastBackground={theme.cardBg || theme.module || '#FFFFFF'}\n contrastLabel=\"on card\"\n description=\"Color for icons displayed on cards and chart cards\"\n />\n <ThemeColorInput\n id=\"card-title-color\"\n label=\"Card Title\"\n colorKey=\"cardTitle\"\n value={theme.cardTitle || theme.primary}\n placeholder={theme.primary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.cardTitle || theme.primary}\n contrastBackground={theme.cardBg || theme.module || '#FFFFFF'}\n contrastLabel=\"on card\"\n description=\"Text color for card titles and headings within cards\"\n />\n <ThemeColorInput\n id=\"card-text-color\"\n label=\"Card Text\"\n colorKey=\"cardText\"\n value={theme.cardText || theme.primary}\n placeholder={theme.primary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.cardText || theme.primary}\n contrastBackground={theme.cardBg || theme.module || '#FFFFFF'}\n contrastLabel=\"on card\"\n description=\"Text color for body text and content within cards\"\n />\n <ThemeColorInput\n id=\"button-primary-color\"\n label=\"Button Primary\"\n colorKey=\"buttonPrimary\"\n value={theme.buttonPrimary || theme.primary}\n placeholder={theme.primary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.buttonText || '#FFFFFF'}\n contrastBackground={theme.buttonPrimary || theme.primary}\n contrastLabel=\"button text\"\n description=\"Background color for primary action buttons\"\n />\n <ThemeColorInput\n id=\"button-secondary-color\"\n label=\"Button Secondary\"\n colorKey=\"buttonSecondary\"\n value={theme.buttonSecondary || theme.secondary}\n placeholder={theme.secondary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.buttonText || '#FFFFFF'}\n contrastBackground={theme.buttonSecondary || theme.secondary}\n contrastLabel=\"button text\"\n description=\"Background color for secondary action buttons\"\n />\n <ThemeColorInput\n id=\"button-text-color\"\n label=\"Button Text\"\n colorKey=\"buttonText\"\n value={theme.buttonText || '#FFFFFF'}\n placeholder=\"#FFFFFF\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Text color for text displayed on buttons\"\n />\n </div>\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\nimport { cn } from '../../utils/cn'\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn('relative flex w-full touch-none select-none items-center', className)}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20\">\n <SliderPrimitive.Range className=\"absolute h-full bg-primary\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n))\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n","import { Label } from '../ui/label'\nimport { Slider } from '../ui/slider'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { Info } from 'lucide-react'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'\nimport type { DashboardTheme } from './types'\n\nconst fontFamilies = [\n 'Nunito',\n 'Inter',\n 'Roboto',\n 'Open Sans',\n 'Lato',\n 'Montserrat',\n 'Poppins',\n 'Source Sans Pro',\n 'Raleway',\n 'Ubuntu',\n 'Playfair Display',\n 'Merriweather',\n]\n\ninterface ThemeTypographySectionProps {\n theme: DashboardTheme\n onFontFamilyChange: (value: string) => void\n onBorderRadiusChange: (value: number) => void\n}\n\nexport function ThemeTypographySection({\n theme,\n onFontFamilyChange,\n onBorderRadiusChange,\n}: ThemeTypographySectionProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Label htmlFor=\"font-family\">Font Family</Label>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Info className=\"h-3.5 w-3.5 text-muted-foreground cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-xs\">\n <p className=\"text-sm\">\n Choose the font family used throughout the dashboard. This affects all text\n elements including headings, body text, and UI labels.\n </p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n <Select value={theme.fontFamily} onValueChange={onFontFamilyChange}>\n <SelectTrigger id=\"font-family\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {fontFamilies.map((font) => (\n <SelectItem key={font} value={font}>\n {font}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Label htmlFor=\"border-radius\">Border Radius</Label>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Info className=\"h-3.5 w-3.5 text-muted-foreground cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-xs\">\n <p className=\"text-sm\">\n Adjust the roundness of corners for cards, buttons, and other UI elements.\n Higher values create more rounded corners.\n </p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n <span className=\"text-sm text-muted-foreground\">{theme.borderRadius}rem</span>\n </div>\n <Slider\n id=\"border-radius\"\n min={0}\n max={2}\n step={0.1}\n value={[theme.borderRadius]}\n onValueChange={([value]) => onBorderRadiusChange(value)}\n className=\"w-full\"\n />\n </div>\n </div>\n )\n}\n","import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'\nimport { Label } from '../ui/label'\nimport { Check } from 'lucide-react'\nimport { cn } from '../../utils/cn'\nimport type { ThemePreset, DashboardTheme } from './types'\nimport { presetDisplayNames } from './constants'\n\ninterface ThemePresetSelectorProps {\n value: ThemePreset | 'custom'\n onValueChange: (value: ThemePreset) => void\n presets: ThemePreset[]\n themePresets: Record<ThemePreset, DashboardTheme>\n onHover?: (preset: ThemePreset | null) => void\n}\n\nexport function ThemePresetSelector({\n value,\n onValueChange,\n presets,\n themePresets,\n onHover,\n}: ThemePresetSelectorProps) {\n const selectValue = value === 'custom' ? '' : value\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"theme-preset\" className=\"text-sm font-medium\">\n Quick Select\n </Label>\n <Select\n value={selectValue}\n onValueChange={(val) => {\n if (val) onValueChange(val as ThemePreset)\n }}\n >\n <SelectTrigger id=\"theme-preset\" className=\"h-9\">\n <SelectValue placeholder={value === 'custom' ? 'Custom' : 'Select a preset'} />\n </SelectTrigger>\n <SelectContent>\n {presets.map((preset) => (\n <SelectItem key={preset} value={preset}>\n {presetDisplayNames[preset]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n {presets.map((preset) => {\n const presetTheme = themePresets[preset]\n const isSelected = value === preset\n return (\n <button\n key={preset}\n type=\"button\"\n onClick={() => onValueChange(preset)}\n className={cn(\n 'relative group w-full flex items-center gap-3 p-3 rounded-lg border-2 transition-all duration-200 text-left',\n 'hover:shadow-md active:scale-[0.98]',\n 'bg-card backdrop-blur-sm',\n isSelected ? 'shadow-sm' : 'border-border/60 hover:bg-accent/50'\n )}\n style={\n {\n borderColor: isSelected ? presetTheme.outline : undefined,\n boxShadow: isSelected ? `0 0 0 2px ${presetTheme.primary}4D` : undefined,\n } as React.CSSProperties\n }\n onMouseEnter={(e) => {\n if (!isSelected) e.currentTarget.style.borderColor = presetTheme.primary\n onHover?.(preset)\n }}\n onMouseLeave={(e) => {\n if (!isSelected) e.currentTarget.style.borderColor = ''\n onHover?.(null)\n }}\n >\n <div\n className=\"h-12 w-12 rounded-lg border-2 border-background shadow-sm flex-shrink-0 relative overflow-hidden\"\n style={{\n background: `linear-gradient(135deg, ${presetTheme.primary} 0%, ${presetTheme.secondary} 50%, ${presetTheme.interactive} 100%)`,\n }}\n >\n <div className=\"absolute inset-0 bg-gradient-to-br from-white/10 to-transparent\" />\n {isSelected && (\n <div\n className=\"absolute inset-0 flex items-center justify-center drop-shadow-sm\"\n style={{ backgroundColor: `${presetTheme.primary}33` }}\n >\n <Check\n className=\"h-4 w-4 drop-shadow-sm stroke-[3px]\"\n style={{ color: presetTheme.container }}\n />\n </div>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"font-semibold text-sm tracking-tight truncate\">\n {presetDisplayNames[preset]}\n </span>\n </div>\n <div className=\"flex gap-1.5\">\n {[\n presetTheme.primary,\n presetTheme.secondary,\n presetTheme.interactive,\n presetTheme.accent,\n ].map((color, i) => (\n <div\n key={i}\n className=\"h-4 w-4 rounded border border-background/50 shadow-sm\"\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n </div>\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import { X } from 'lucide-react'\n\ninterface ContrastWarning {\n valid: boolean\n ratio: number\n level: string\n message: string\n}\n\ninterface ContrastWarningsProps {\n warnings: ContrastWarning[]\n}\n\nexport function ContrastWarnings({ warnings }: ContrastWarningsProps) {\n if (warnings.length === 0) return null\n\n return (\n <div className=\"space-y-4\">\n <div className=\"rounded-lg border-2 border-destructive/50 bg-destructive/10 p-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5\">\n <X className=\"h-5 w-5 text-destructive\" />\n </div>\n <div className=\"flex-1 space-y-2\">\n <h4 className=\"text-sm font-semibold text-destructive\">Contrast Ratio Warnings</h4>\n <p className=\"text-xs text-muted-foreground\">\n The following color combinations do not meet WCAG accessibility standards. Please\n adjust colors to ensure proper contrast for readability.\n </p>\n <ul className=\"space-y-1.5 text-xs\">\n {warnings.map((warning, index) => (\n <li key={index} className=\"flex items-start gap-2 text-destructive/90\">\n <span className=\"mt-0.5\">•</span>\n <span>\n <strong>{warning.message}</strong> (Ratio: {warning.ratio}:1)\n </span>\n </li>\n ))}\n </ul>\n <p className=\"text-xs text-muted-foreground mt-2\">\n <strong>WCAG Standards:</strong> Normal text requires 4.5:1 contrast, large text\n (18pt+) requires 3:1 contrast, enhanced (AAA) requires 7:1 contrast.\n </p>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import React, { useMemo, useState } from 'react'\nimport { Maximize2, Pencil, Trash2 } from 'lucide-react'\nimport { BarChart } from '../charts/BarChart'\nimport { PieChart } from '../charts/PieChart'\nimport type { DashboardTheme } from './types'\n\ninterface ThemePreviewProps {\n theme: DashboardTheme\n}\n\nfunction getThemeChartColors(theme: DashboardTheme): string[] {\n return [\n theme.primary,\n theme.accent,\n theme.secondary,\n theme.interactive,\n theme.buttonPrimary ?? theme.primary,\n ].filter(Boolean)\n}\n\nconst CHART_PREVIEW_CONFIG: {\n title: string\n subtitle: string\n type: 'bar' | 'pie'\n data: Record<string, string | number>[]\n x_key: string\n y_key: string\n showLegend: boolean\n}[] = [\n {\n title: 'Monthly Revenue',\n subtitle: 'Example bar chart visualization',\n type: 'bar',\n data: [\n { month: 'Jan', value: 450 },\n { month: 'Feb', value: 520 },\n { month: 'Mar', value: 480 },\n { month: 'Apr', value: 600 },\n { month: 'May', value: 550 },\n { month: 'Jun', value: 680 },\n ],\n x_key: 'month',\n y_key: 'value',\n showLegend: false,\n },\n {\n title: 'Data Distribution',\n subtitle: 'Example pie chart visualization',\n type: 'pie',\n data: [\n { name: 'Sales', value: 35 },\n { name: 'Marketing', value: 28 },\n { name: 'Support', value: 22 },\n { name: 'Other', value: 15 },\n ],\n x_key: 'name',\n y_key: 'value',\n showLegend: true,\n },\n]\n\nfunction ThemePreviewInner({ theme }: ThemePreviewProps) {\n const [hoveredId, setHoveredId] = useState<string | null>(null)\n\n const transitionStyle = {\n transition:\n 'color 0.5s ease-in-out, background-color 0.5s ease-in-out, border-color 0.5s ease-in-out, border-radius 0.5s ease-in-out',\n }\n\n const chartColors = useMemo(() => getThemeChartColors(theme), [theme])\n const cardStyle = useMemo(\n () => ({\n backgroundColor: theme.cardBg,\n borderColor: theme.outline,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }),\n [theme]\n )\n\n const fontStyle = {\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n }\n\n return (\n <div className=\"space-y-6\">\n <div\n className=\"mb-6 pb-4 border-b transition-colors duration-400 ease-in-out\"\n style={{\n borderColor: theme.outline,\n ...transitionStyle,\n }}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <h2\n className=\"text-2xl font-bold transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.primary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n Dashboard Preview\n </h2>\n <div className=\"flex items-center gap-2\">\n <div\n className=\"px-3 py-1.5 rounded-md text-xs font-medium transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: theme.secondary,\n color: theme.buttonText,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n Active\n </div>\n <button\n type=\"button\"\n className=\"px-4 py-2 rounded-md text-sm font-medium transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor:\n hoveredId === 'header-action' ? theme.interactive : theme.buttonPrimary,\n color: theme.buttonText,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n onMouseEnter={() => setHoveredId('header-action')}\n onMouseLeave={() => setHoveredId(null)}\n >\n Action\n </button>\n </div>\n </div>\n <p\n className=\"text-sm transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.secondary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n This preview demonstrates how your theme will appear across different components\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4 mb-6\">\n {[\n { title: 'Total Users', value: '12,345', change: '+12%' },\n { title: 'Revenue', value: '$45,678', change: '+8%' },\n { title: 'Growth', value: '23.4%', change: '+5%' },\n ].map((stat, idx) => (\n <div\n key={idx}\n className=\"p-5 rounded-lg border shadow-sm transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: theme.cardBg,\n borderColor: theme.outline,\n borderRadius: `${theme.borderRadius}rem`,\n ...fontStyle,\n ...transitionStyle,\n }}\n >\n <p\n className=\"text-sm mb-2 transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.cardTitle,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n {stat.title}\n </p>\n <div className=\"flex items-baseline justify-between\">\n <h3\n className=\"text-2xl font-bold transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.cardText,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n {stat.value}\n </h3>\n <span\n className=\"text-xs font-medium px-2 py-1 rounded transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: theme.interactive,\n color: theme.cardTitle,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n {stat.change}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"mb-6\">\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {CHART_PREVIEW_CONFIG.map((chart, idx) => (\n <div\n key={idx}\n className=\"group relative p-5 rounded-lg border transition-all duration-400 ease-in-out\"\n style={cardStyle}\n >\n <div\n className=\"absolute top-4 right-4 z-30 flex h-10 w-auto shrink-0 items-center justify-end gap-2 transition-colors duration-400 ease-in-out\"\n style={{ color: theme.cardIcons ?? theme.primary, ...transitionStyle }}\n aria-hidden\n >\n {(['maximize', 'edit', 'delete'] as const).map((action) => {\n const id = `card-${idx}-${action}`\n const isHovered = hoveredId === id\n const Icon =\n action === 'maximize' ? Maximize2 : action === 'edit' ? Pencil : Trash2\n return (\n <button\n key={action}\n type=\"button\"\n className=\"flex size-9 shrink-0 items-center justify-center rounded-md p-1.5 disabled:pointer-events-none\"\n style={{\n backgroundColor: isHovered ? theme.container : undefined,\n borderRadius: `${theme.borderRadius}rem`,\n ...transitionStyle,\n }}\n tabIndex={-1}\n aria-label={`${action} (preview)`}\n onMouseEnter={() => setHoveredId(id)}\n onMouseLeave={() => setHoveredId(null)}\n >\n <Icon className=\"size-4 shrink-0\" />\n </button>\n )\n })}\n </div>\n <div className=\"mb-4 min-w-0 pr-24\">\n <h3\n className=\"text-lg font-semibold mb-1 transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.cardTitle,\n fontFamily: cardStyle.fontFamily,\n ...transitionStyle,\n }}\n >\n {chart.title}\n </h3>\n <p\n className=\"text-sm transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.cardText ?? theme.cardTitle,\n fontFamily: cardStyle.fontFamily,\n ...transitionStyle,\n }}\n >\n {chart.subtitle}\n </p>\n </div>\n <div className=\"h-[250px] w-full min-h-0\">\n {chart.type === 'bar' ? (\n <BarChart\n data={chart.data}\n chartMeta={{ showLegend: chart.showLegend }}\n visualizationConfig={{\n x_key: chart.x_key,\n y_key: chart.y_key,\n colors: chartColors,\n }}\n />\n ) : (\n <PieChart\n data={chart.data}\n chartMeta={{ showLegend: chart.showLegend }}\n visualizationConfig={{\n x_key: chart.x_key,\n y_key: chart.y_key,\n colors: chartColors,\n }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <div\n className=\"p-6 rounded-lg border shadow-lg max-w-md mx-auto transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: theme.dialog,\n borderColor: theme.outline,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n <h4\n className=\"text-lg font-semibold mb-2 transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.primary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n Dialog Preview\n </h4>\n <p\n className=\"text-sm mb-4 transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.secondary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n This is how dialogs and modals will appear with your theme settings.\n </p>\n <div className=\"flex gap-2 justify-end\">\n <button\n type=\"button\"\n className=\"px-4 py-2 rounded-md text-sm font-medium border transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: hoveredId === 'dialog-cancel' ? theme.interactive : 'transparent',\n color: theme.secondary,\n borderColor: theme.outline,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n onMouseEnter={() => setHoveredId('dialog-cancel')}\n onMouseLeave={() => setHoveredId(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"px-4 py-2 rounded-md text-sm font-medium transition-all duration-300 ease-in-out\"\n style={{\n backgroundColor:\n hoveredId === 'dialog-confirm' ? theme.interactive : theme.buttonPrimary,\n color: theme.buttonText,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n onMouseEnter={() => setHoveredId('dialog-confirm')}\n onMouseLeave={() => setHoveredId(null)}\n >\n Confirm\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport const ThemePreview = React.memo(ThemePreviewInner)\n","import { useState, useCallback } from 'react'\nimport type { DashboardTheme } from '../types'\nimport { validateColorContrast } from '../utils/colorUtils'\n\nexport function useThemeValidation() {\n const [contrastWarnings, setContrastWarnings] = useState<\n Array<{ valid: boolean; ratio: number; level: string; message: string }>\n >([])\n\n const validateThemeContrast = useCallback((themeToValidate: DashboardTheme) => {\n const warnings: Array<{ valid: boolean; ratio: number; level: string; message: string }> = []\n\n const primaryOnContainer = validateColorContrast(\n themeToValidate.primary,\n themeToValidate.container || themeToValidate.dashboardBg || '#FFFFFF',\n 'Primary text on dashboard background'\n )\n if (!primaryOnContainer.valid) warnings.push(primaryOnContainer)\n\n const primaryOnModule = validateColorContrast(\n themeToValidate.primary,\n themeToValidate.module || themeToValidate.cardBg || '#FFFFFF',\n 'Primary text on card background'\n )\n if (!primaryOnModule.valid) warnings.push(primaryOnModule)\n\n const buttonTextOnPrimary = validateColorContrast(\n themeToValidate.buttonText || '#FFFFFF',\n themeToValidate.buttonPrimary || themeToValidate.primary,\n 'Button text on primary button'\n )\n if (!buttonTextOnPrimary.valid) warnings.push(buttonTextOnPrimary)\n\n const buttonTextOnSecondary = validateColorContrast(\n themeToValidate.buttonText || '#FFFFFF',\n themeToValidate.buttonSecondary || themeToValidate.secondary,\n 'Button text on secondary button'\n )\n if (!buttonTextOnSecondary.valid) warnings.push(buttonTextOnSecondary)\n\n const iconsOnCard = validateColorContrast(\n themeToValidate.cardIcons || themeToValidate.primary,\n themeToValidate.cardBg || themeToValidate.module || '#FFFFFF',\n 'Card icons on card background'\n )\n if (!iconsOnCard.valid) warnings.push(iconsOnCard)\n\n const cardTitleOnCard = validateColorContrast(\n themeToValidate.cardTitle || themeToValidate.primary,\n themeToValidate.cardBg || themeToValidate.module || '#FFFFFF',\n 'Card title on card background'\n )\n if (!cardTitleOnCard.valid) warnings.push(cardTitleOnCard)\n\n const cardTextOnCard = validateColorContrast(\n themeToValidate.cardText || themeToValidate.primary,\n themeToValidate.cardBg || themeToValidate.module || '#FFFFFF',\n 'Card text on card background'\n )\n if (!cardTextOnCard.valid) warnings.push(cardTextOnCard)\n\n const secondaryOnContainer = validateColorContrast(\n themeToValidate.secondary,\n themeToValidate.container || themeToValidate.dashboardBg || '#FFFFFF',\n 'Secondary text on dashboard background'\n )\n if (!secondaryOnContainer.valid) warnings.push(secondaryOnContainer)\n\n setContrastWarnings(warnings)\n return warnings\n }, [])\n\n return { contrastWarnings, validateThemeContrast }\n}\n","import type { DashboardTheme } from '../types/dashboard'\nimport type React from 'react'\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const r = parseInt(hex.slice(1, 3), 16)\n const g = parseInt(hex.slice(3, 5), 16)\n const b = parseInt(hex.slice(5, 7), 16)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\nexport function generateThemeStyles(\n theme: DashboardTheme | undefined\n): React.CSSProperties | undefined {\n if (!theme) return undefined\n return {\n '--theme-primary': theme.primary,\n '--theme-secondary': theme.secondary,\n '--theme-interactive': theme.interactive,\n '--theme-container': theme.container,\n '--theme-module': theme.module,\n '--theme-accent': theme.accent,\n '--theme-outline': theme.outline,\n '--theme-dialog': theme.dialog,\n '--theme-font-family': `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n '--theme-border-radius': `${theme.borderRadius}rem`,\n '--theme-card-bg': theme.cardBg || theme.module,\n '--theme-card-text': theme.cardText || theme.primary,\n '--theme-card-title': theme.cardTitle || theme.primary,\n '--theme-dashboard-bg': theme.dashboardBg || theme.container,\n '--theme-card-icons': theme.cardIcons || theme.primary,\n '--theme-button-primary': theme.buttonPrimary || theme.primary,\n '--theme-button-secondary': theme.buttonSecondary || theme.secondary,\n '--theme-button-text': theme.buttonText || theme.primary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n backgroundColor: theme.dashboardBg || theme.container,\n } as React.CSSProperties\n}\n\nexport function generateThemeCSS(theme: DashboardTheme | undefined): string {\n if (!theme) return ''\n const p10 = hexToRgba(theme.primary, 0.1)\n const p20 = hexToRgba(theme.primary, 0.2)\n const p30 = hexToRgba(theme.primary, 0.3)\n const p5 = hexToRgba(theme.primary, 0.05)\n const scope = '.dashboard-theme:not(.skip-dashboard-theme)'\n const scopes = `${scope}, ${scope}.dark, ${scope}.light, .dark ${scope}, .light ${scope}`\n return `\n ${scopes} {\n --theme-primary: ${theme.primary} !important;\n --theme-secondary: ${theme.secondary} !important;\n --theme-interactive: ${theme.interactive} !important;\n --theme-container: ${theme.container} !important;\n --theme-module: ${theme.module} !important;\n --theme-accent: ${theme.accent} !important;\n --theme-outline: ${theme.outline} !important;\n --theme-dialog: ${theme.dialog} !important;\n --theme-font-family: \"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n --theme-border-radius: ${theme.borderRadius}rem !important;\n --theme-card-bg: ${theme.cardBg || theme.module} !important;\n --theme-card-text: ${theme.cardText || theme.primary} !important;\n --theme-card-title: ${theme.cardTitle || theme.primary} !important;\n --theme-dashboard-bg: ${theme.dashboardBg || theme.container} !important;\n --theme-card-icons: ${theme.cardIcons || theme.primary} !important;\n --theme-button-primary: ${theme.buttonPrimary || theme.primary} !important;\n --theme-button-secondary: ${theme.buttonSecondary || theme.secondary} !important;\n --theme-button-text: ${theme.buttonText || theme.primary} !important;\n font-family: var(--theme-font-family) !important;\n }\n ${scope} .chart-card, .dark ${scope} .chart-card, .light ${scope} .chart-card {\n background-color: var(--theme-card-bg) !important;\n color: var(--theme-card-text) !important;\n border-color: var(--theme-outline) !important;\n border-radius: var(--theme-border-radius) !important;\n }\n ${scope} button, .dark ${scope} button, .light ${scope} button {\n border-radius: var(--theme-border-radius) !important;\n }\n ${scope} button[data-variant=\"default\"], ${scope} .bg-primary,\n .dark ${scope} button[data-variant=\"default\"],\n .light ${scope} button[data-variant=\"default\"] {\n background-color: var(--theme-button-primary) !important;\n color: var(--theme-container) !important;\n }\n ${scope} button[data-variant=\"outline\"], ${scope} .border-input, ${scope} .border-outline,\n .dark ${scope} button[data-variant=\"outline\"], .dark ${scope} .border-outline,\n .light ${scope} button[data-variant=\"outline\"], .light ${scope} .border-outline {\n border-color: var(--theme-outline) !important;\n color: var(--theme-button-text) !important;\n }\n ${scope} button[data-variant=\"secondary\"], ${scope} .bg-secondary,\n .dark ${scope} button[data-variant=\"secondary\"],\n .light ${scope} button[data-variant=\"secondary\"] {\n background-color: var(--theme-secondary) !important;\n color: var(--theme-button-text) !important;\n }\n ${scope} .card, .dark ${scope} .card, .light ${scope} .card {\n background-color: var(--theme-card-bg) !important;\n border-color: var(--theme-outline) !important;\n border-radius: var(--theme-border-radius) !important;\n }\n ${scope} .bg-card, .dark ${scope} .bg-card, .light ${scope} .bg-card {\n background-color: var(--theme-card-bg) !important;\n }\n ${scope} .bg-module, .dark ${scope} .bg-module, .light ${scope} .bg-module {\n background-color: var(--theme-module) !important;\n }\n ${scope} .text-primary, .dark ${scope} .text-primary, .light ${scope} .text-primary {\n color: var(--theme-primary) !important;\n }\n ${scope} .bg-accent, .dark ${scope} .bg-accent, .light ${scope} .bg-accent {\n background-color: var(--theme-accent) !important;\n }\n ${scope} .bg-dashboard-bg, .dark ${scope} .bg-dashboard-bg, .light ${scope} .bg-dashboard-bg {\n background-color: var(--theme-dashboard-bg) !important;\n }\n ${scope} .hover\\\\:bg-accent:hover, .dark ${scope} .hover\\\\:bg-accent:hover, .light ${scope} .hover\\\\:bg-accent:hover {\n background-color: var(--theme-interactive) !important;\n color: var(--theme-primary) !important;\n }\n ${scope} h2, .dark ${scope} h2, .light ${scope} h2 {\n color: var(--theme-primary) !important;\n font-family: var(--theme-font-family) !important;\n }\n ${scope} .generate-dashboard-btn, .dark ${scope} .generate-dashboard-btn, .light ${scope} .generate-dashboard-btn {\n background: linear-gradient(to right, ${p10}, ${p10}, ${p10}) !important;\n border-color: ${p20} !important;\n }\n ${scope} .generate-dashboard-btn:hover, .dark ${scope} .generate-dashboard-btn:hover, .light ${scope} .generate-dashboard-btn:hover {\n background: linear-gradient(to right, ${p20}, ${p20}, ${p20}) !important;\n border-color: ${p30} !important;\n }\n ${scope} .generate-dashboard-btn .absolute, .dark ${scope} .generate-dashboard-btn .absolute, .light ${scope} .generate-dashboard-btn .absolute {\n background: linear-gradient(to right, ${p5}, ${p5}, ${p5}) !important;\n }\n ${scope} .generate-dashboard-btn svg, ${scope} .generate-dashboard-btn span,\n .dark ${scope} .generate-dashboard-btn svg, .dark ${scope} .generate-dashboard-btn span,\n .light ${scope} .generate-dashboard-btn svg, .light ${scope} .generate-dashboard-btn span {\n color: var(--theme-primary) !important;\n }\n ${scope} .dashboard-toolbar-btn:hover, .dark ${scope} .dashboard-toolbar-btn:hover, .light ${scope} .dashboard-toolbar-btn:hover {\n background-color: ${p10} !important;\n }\n `\n}\n","import type { DashboardTheme } from '../types/dashboard'\n\n/**\n * Same resolution order as main-app `useDashboardTheme` (embedded + in-app dashboard):\n * 1. `meta.apply_theme_to_all_dashboards` + `meta.default_theme`\n * 2. `meta.theme[dashboardId]` (falls back to `default_dashboard` when `dashboardId` is empty)\n */\nexport function resolveDashboardThemeFromWorkspace(\n workspace: { meta?: Record<string, any>; default_dashboard?: string } | null | undefined,\n dashboardId: string\n): DashboardTheme | undefined {\n if (!workspace?.meta) return undefined\n const { meta } = workspace\n if (meta.apply_theme_to_all_dashboards && meta.default_theme) {\n return meta.default_theme as DashboardTheme\n }\n const id = dashboardId?.trim() || workspace.default_dashboard\n if (id && meta.theme?.[id]) {\n return meta.theme[id] as DashboardTheme\n }\n return undefined\n}\n","import type { DashboardTheme } from '../types/dashboard'\nimport type { ThemePreset } from '../components/theme/types'\n\n/**\n * Mirrors main-app ThemeCustomizationSettings: default preset removes this dashboard\n * from `meta.theme`; other presets persist `meta.theme[dashboardId]`.\n */\nexport function mergeWorkspaceMetaTheme(\n meta: Record<string, any> | undefined,\n dashboardId: string,\n theme: DashboardTheme,\n selectedPreset: ThemePreset | 'custom'\n): Record<string, any> {\n const nextMeta = { ...(meta || {}) }\n const currentThemePreferences = { ...(nextMeta.theme || {}) } as Record<string, DashboardTheme>\n const isDefaultTheme = selectedPreset === 'default'\n if (isDefaultTheme) {\n const { [dashboardId]: _removed, ...rest } = currentThemePreferences\n nextMeta.theme = rest\n } else {\n nextMeta.theme = { ...currentThemePreferences, [dashboardId]: theme }\n }\n return nextMeta\n}\n","import type { ResizeHandle } from './layout'\n\nexport const GRID_BREAKPOINTS = { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }\nexport const GRID_COLS = { lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }\n\nexport const LAYOUT_HANDLE: { RESIZE: ResizeHandle[]; MOVE: ResizeHandle[] } = {\n RESIZE: ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'],\n MOVE: ['nw', 'ne', 'se', 'sw'],\n}\n\nexport const EMPTY_HANDLES: ResizeHandle[] = []\n","import type { TChartResponse } from '../../types/chart'\nimport type { TLayout } from '../../types/dashboard'\n\nexport type ResizeHandle = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw'\n\nexport const getChartCardSize = ({\n chartType,\n chartData = [],\n variant,\n}: {\n chartType: string | undefined\n chartData?: any\n variant?: string | undefined\n}) => {\n if (chartType === 'tile') {\n if (variant === 'horizontal') {\n return { w: 4 * (chartData?.length || 1), h: 1 }\n }\n return { w: 4, h: chartData?.length || 1 }\n }\n return { w: 4, h: 3.2 }\n}\n\nexport const isFallbackLayout = (layout: TLayout[]): boolean => {\n if (!layout || layout.length === 0) return false\n return layout.every((item) => item.w === 1 && item.h === 1 && item.x === 0)\n}\n\nexport const getDefaultLayout = ({\n items,\n existingLayout = [],\n availableHandles = [],\n}: {\n items: TChartResponse[]\n existingLayout?: TLayout[]\n availableHandles?: ResizeHandle[]\n}) => {\n // Start with existing layout or empty array\n const layout = [...existingLayout]\n const existingItemIds = new Set(layout.map((item) => item.i))\n const missingItems = items.filter((item) => !existingItemIds.has(item.llm_data_chat_id))\n\n // If no missing items, return existing layout\n if (missingItems.length === 0) {\n return layout\n }\n\n let x_axis = 0\n let y_axis = 0\n\n if (layout.length > 0) {\n const maxY = Math.max(...layout.map((item) => item.y + item.h))\n y_axis = Math.ceil(maxY)\n }\n\n for (let i = 0; i < missingItems.length; i++) {\n const { w, h } = getChartCardSize({\n chartType: missingItems[i].chart_response?.chart_type,\n chartData: missingItems[i].chart_response?.data,\n })\n layout.push({\n i: missingItems[i].llm_data_chat_id,\n x: x_axis,\n y: y_axis,\n w,\n h,\n resizeHandles: availableHandles,\n })\n x_axis += 4\n if (x_axis >= 12) {\n y_axis++\n x_axis = 0\n }\n }\n\n return layout\n}\n","export const GRID_RESIZE_HANDLE_STYLES = `\n .papermap-grid-dashboard .react-grid-item.react-grid-placeholder {\n background-color: lightblue !important;\n opacity: 0.5 !important;\n border: 2px dashed #007bff !important;\n border-radius: 10px !important;\n box-sizing: border-box;\n transition: none;\n }\n\n .papermap-grid-dashboard .react-grid-item.react-grid-placeholder.placeholder-resizing {\n transition: none;\n }\n\n .papermap-grid-dashboard .react-resizable-handle {\n z-index: 100;\n }\n\n .papermap-grid-dashboard[data-edit-mode='false'] .react-grid-item > .react-resizable-handle {\n display: none !important;\n opacity: 0 !important;\n visibility: hidden !important;\n }\n\n .papermap-grid-dashboard[data-edit-mode='true'] .react-grid-item > .react-resizable-handle {\n display: block !important;\n opacity: 1 !important;\n visibility: visible !important;\n }\n\n .papermap-grid-dashboard[data-edit-mode='true'] .react-grid-item > .react-resizable-handle::after {\n border-right: 2px solid !important;\n border-bottom: 2px solid !important;\n }\n\n .dark .papermap-grid-dashboard .react-resizable-handle {\n filter: invert(1);\n }\n`\n"],"mappings":"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","names":["import_react","import_framer_motion","import_lucide_react","import_react","import_react","import_react_query","Axios","import_react","getToolIndex","props","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_framer_motion","import_lucide_react","React","import_class_variance_authority","import_jsx_runtime","React","import_class_variance_authority","import_lucide_react","import_jsx_runtime","CollapsibleTrigger","CollapsibleContent","import_react","import_prism","import_jsx_runtime","MarkdownRenderer","Markdown","remarkGfm","rehypeRaw","React","SyntaxHighlighter","import_jsx_runtime","import_react","React","import_lucide_react","import_jsx_runtime","import_lucide_react","import_react_syntax_highlighter","import_prism","React","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_framer_motion","import_lucide_react","import_jsx_runtime","import_react","import_framer_motion","import_lucide_react","import_react_syntax_highlighter","import_prism","import_jsx_runtime","SyntaxHighlighter","_SyntaxHighlighter","getResolvedTheme","React","import_jsx_runtime","import_jsx_runtime","SyntaxHighlighter","_SyntaxHighlighter","getResolvedTheme","React","import_lucide_react","import_framer_motion","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","Lottie","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_lucide_react","import_framer_motion","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react_query","import_jsx_runtime","import_react","import_lucide_react","React","import_jsx_runtime","import_react","import_lucide_react","import_lucide_react","import_react","import_lucide_react","React","import_lucide_react","import_jsx_runtime","import_react","React","import_jsx_runtime","config","import_jsx_runtime","RechartsAreaChart","import_recharts","import_jsx_runtime","RechartsBarChart","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_recharts","import_jsx_runtime","RechartsLineChart","import_lucide_react","import_jsx_runtime","import_recharts","import_react","import_jsx_runtime","innerRadius","RechartsPieChart","ChartTooltip","import_recharts","import_jsx_runtime","RechartsRadarChart","import_recharts","import_jsx_runtime","RechartsScatterChart","import_jsx_runtime","import_jsx_runtime","toast","takeScreenshot","import_jsx_runtime","toast","takeScreenshot","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_framer_motion","import_jsx_runtime","import_jsx_runtime","count","MessageItem","CollapsibleTrigger","CollapsibleContent","import_jsx_runtime","React","import_jsx_runtime","Separator","React","import_jsx_runtime","React","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","React","import_jsx_runtime","EASE","Separator","import_react","import_lucide_react","import_react_query","import_framer_motion","import_lucide_react","import_react","import_react_dom","import_react","import_framer_motion","import_lucide_react","import_jsx_runtime","APP_NAME","copyToClipboard","PanelMessageItem","CollapsibleTrigger","CollapsibleContent","import_jsx_runtime","EASE","toast","import_jsx_runtime","import_react","import_lucide_react","import_framer_motion","import_jsx_runtime","import_react","import_styles","import_lucide_react","import_react","React","import_lucide_react","React","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","React","React","import_class_variance_authority","import_jsx_runtime","Label","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Label","React","import_jsx_runtime","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Label","import_lucide_react","import_jsx_runtime","themePresets","Label","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","Icon","React","import_react","import_jsx_runtime","import_jsx_runtime","toast"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/PapermapChat.tsx","../src/utils/cn.ts","../src/hooks/useAutoFade.ts","../src/hooks/useKeyboardShortcuts.ts","../src/store/PapermapProvider.tsx","../src/store/papermap-store.ts","../src/api/endpoints.ts","../src/services/streaming.ts","../src/queryClient.ts","../src/api/client.ts","../src/services/chart.service.ts","../src/services/workspace.service.ts","../src/store/papermap-services.ts","../src/hooks/useAnalyticsStream.ts","../src/api/sse-client.ts","../src/api/analytics-sse.ts","../src/types/streaming.ts","../src/hooks/use-toast.ts","../src/components/ui/toast.tsx","../src/components/ui/toaster.tsx","../src/components/ThemeProvider.tsx","../src/components/ChatAssistant.tsx","../src/components/ui/alert.tsx","../src/components/ui/button.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/markdown.tsx","../src/components/ui/ThinkingMessage.tsx","../src/components/ui/chat-code-block.tsx","../src/components/ui/dialog.tsx","../src/components/ui/tooltip.tsx","../src/components/common/ButtonWithTooltip.tsx","../src/lib/analytics-stream-replay.ts","../src/components/dashboard/StreamingTimeline.tsx","../src/components/dashboard/AgentThoughtDisplay.tsx","../src/components/dashboard/ToolCallDisplay.tsx","../src/components/common/BookmarkButton.tsx","../src/components/common/ConfettiEffect.tsx","../src/components/common/BranchButton.tsx","../src/components/common/FeedbackButtons.tsx","../src/components/common/ThinkingLogo.tsx","../src/assets/loading.json","../src/components/LogoStandAlone.tsx","../src/components/MorphGradient.tsx","../src/components/dashboard/RecentConversations.tsx","../src/components/common/RecentConversationItem.tsx","../src/components/dashboard/DeleteConfirmationModal.tsx","../src/components/dashboard/ChartHistory.tsx","../src/components/ui/card.tsx","../src/components/dashboard/HistoryChartCard.tsx","../src/components/charts/ChartDialog.tsx","../src/components/charts/ChartView.tsx","../src/components/ui/select.tsx","../src/components/charts/AreaChart.tsx","../src/components/ui/chart.tsx","../src/lib/chart-utils.ts","../src/components/charts/BarChart.tsx","../src/components/charts/DataTable.tsx","../src/components/ui/table.tsx","../src/components/charts/LineChart.tsx","../src/components/charts/NoDataCard.tsx","../src/components/charts/PieChart.tsx","../src/components/charts/RadarChart.tsx","../src/components/charts/ScatterChart.tsx","../src/utils/screenshot.ts","../src/components/charts/Tile.tsx","../src/lib/screenshot.ts","../src/components/dashboard/SavedMemory.tsx","../src/components/ui/ShineBorder.tsx","../src/components/ui/separator.tsx","../src/components/ui/hover-card.tsx","../src/components/ui/switch.tsx","../src/components/common/ToolbarButtons.tsx","../src/components/common/ModelSelector.tsx","../src/components/PapermapChartCard.tsx","../src/components/charts/StreamingChartDialog.tsx","../src/components/StreamingChatPanel.tsx","../src/utils/chart-card-storage.ts","../src/components/dashboard/DashboardToolbar.tsx","../src/hooks/useAutoResize.ts","../src/features/GridDashboard/GridDashboard.tsx","../src/components/theme/ThemeCustomizationSettings.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/theme/constants.ts","../src/components/theme/ContrastIndicator.tsx","../src/components/theme/utils/colorUtils.ts","../src/components/ui/label.tsx","../src/components/theme/ThemeColorInput.tsx","../src/components/ui/input.tsx","../src/components/theme/ThemeColorSection.tsx","../src/components/ui/slider.tsx","../src/components/theme/ThemeTypographySection.tsx","../src/components/theme/ThemePresetSelector.tsx","../src/components/theme/ContrastWarnings.tsx","../src/components/theme/ThemePreview.tsx","../src/components/theme/hooks/useThemeValidation.ts","../src/utils/dashboard-theme.ts","../src/utils/resolve-dashboard-theme.ts","../src/utils/workspace-theme-persist.ts","../src/features/GridDashboard/constants.ts","../src/features/GridDashboard/layout.ts","../src/features/GridDashboard/styles.ts"],"sourcesContent":["// Main components\nexport { PapermapChat } from './components'\nexport type { PapermapChatProps } from './components/PapermapChat'\n\nexport { PapermapChartCard } from './components'\nexport type { PapermapChartCardProps } from './components/PapermapChartCard'\n\n// Sub-components (for advanced composition)\nexport {\n ChatAssistant,\n StreamingTimeline,\n AgentThoughtDisplay,\n ToolCallDisplay,\n RecentConversations,\n ChartHistory,\n SavedMemory,\n ChartView,\n ChartDialog,\n StreamingChartDialog,\n StreamingChatPanel,\n DataTable,\n ButtonWithTooltip,\n BookmarkButton,\n BranchButton,\n FeedbackButtons,\n ModelSelector,\n LogoStandAlone,\n MorphGradient,\n} from './components'\n\n// Store (for direct state access in custom layouts)\nexport {\n PapermapProvider,\n PapermapConfigProvider,\n usePapermapStore,\n usePapermapStoreApi,\n usePapermapStoreApiOptional,\n usePapermapConnection,\n usePapermapConnectionOptional,\n createPapermapStore,\n createPapermapServices,\n CHAT_MODAL_TAB,\n openPapermapChatAssistant,\n} from './store'\nexport type {\n PapermapStore,\n PapermapState,\n PapermapActions,\n PapermapStoreConfig,\n PapermapStoreApi,\n ChatModalTabType,\n OpenPapermapChatAssistantOptions,\n PapermapConnectionValue,\n PapermapHttpServices,\n} from './store'\n\n// Hooks\nexport { useAnalyticsStream, useKeyboardShortcuts, useAutoResize, useAutoFade } from './hooks'\n\n// API (for advanced usage)\nexport { createApiClient, decodeToken, buildAuthHeaders } from './api'\nexport type { DecodedToken } from './api'\n\n// Types\nexport type { Message } from './types'\nexport type {\n AgentThought,\n ToolCall,\n TimelineEvent,\n StreamState,\n FinalResponse,\n} from './types/streaming'\nexport type { TChartResponse, TChartMeta, ChartResponse, ConversationHistory } from './types/chart'\n\n// Grid dashboard\nexport { PapermapGridDashboard } from './features/GridDashboard'\nexport type {\n DashboardTheme,\n PapermapGridDashboardLayouts,\n TLayout as PapermapGridLayoutItem,\n} from './types/dashboard'\n\n// Theme customization\nexport { ThemeCustomizationSettings } from './components/theme/ThemeCustomizationSettings'\nexport type {\n ThemeCustomizationSettingsProps,\n ThemeSaveMeta,\n} from './components/theme/ThemeCustomizationSettings'\nexport { themePresets, themePresetList, defaultTheme, presetDisplayNames } from './components/theme'\nexport type { ThemePreset } from './components/theme'\nexport { resolveDashboardThemeFromWorkspace } from './utils/resolve-dashboard-theme'\n\n// Standalone chart card persistence (host `id` ↔ backend `chatId`)\nexport {\n CHART_CARD_CHAT_MAP_KEY,\n getChartCardIdLink,\n upsertChartCardIdLink,\n removeChartCardIdLink,\n resolveChartFetchChatId,\n} from './utils/chart-card-storage'\nexport type { ChartCardIdLink, ChartCardStorageNamespace } from './utils/chart-card-storage'\n","'use client'\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { ArrowUp, Clock, Eye, EyeOff, Square } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { useAutoFade } from '../hooks/useAutoFade'\nimport { useKeyboardShortcuts } from '../hooks/useKeyboardShortcuts'\nimport {\n PapermapProvider,\n usePapermapConnectionOptional,\n usePapermapStore,\n usePapermapStoreApi,\n usePapermapStoreApiOptional,\n CHAT_MODAL_TAB,\n} from '../store'\nimport { ChatAssistant } from './ChatAssistant'\nimport { ShineBorder } from './ui/ShineBorder'\nimport { Separator } from './ui/separator'\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from './ui/hover-card'\nimport { Switch } from './ui/switch'\nimport { AddNewChatBtn, SearchWebBtn, ChartHistoryBtn } from './common/ToolbarButtons'\nimport { ModelSelector } from './common/ModelSelector'\nimport { ButtonWithTooltip } from './common/ButtonWithTooltip'\n\nconst SPRING = { type: 'spring' as const, stiffness: 400, damping: 35, duration: 0.2 }\nconst EASE = [0.23, 1, 0.32, 1] as const\n\nexport interface PapermapChatProps {\n token?: string\n workspaceId?: string\n dashboardId?: string\n apiUrl?: string\n /**\n * Called whenever the toolbar height changes (including multiline expansion).\n * Host apps can use this to add bottom padding/margin to their chart area,\n * mirroring how the main app dashboard layout reacts to toolbar height.\n */\n onToolbarHeightChange?: (height: number) => void\n placeholder?: string\n shortcutKey?: string\n autoFade?: boolean\n fadeDelay?: number\n className?: string\n /**\n * Controls whether the fixed bottom chat toolbar (input + quick actions) is rendered.\n * Defaults to `true`.\n */\n showToolbar?: boolean\n}\n\nexport function PapermapChat({\n token,\n workspaceId,\n dashboardId,\n apiUrl,\n onToolbarHeightChange,\n showToolbar = true,\n ...uiProps\n}: PapermapChatProps) {\n const parentStore = usePapermapStoreApiOptional()\n const connection = usePapermapConnectionOptional()\n const resolvedToken = token ?? connection?.token\n const resolvedWorkspaceId = workspaceId ?? connection?.workspaceId\n const resolvedDashboardId = dashboardId ?? connection?.dashboardId\n const resolvedApiUrl = apiUrl ?? connection?.apiUrl\n\n if (parentStore) {\n if (!resolvedToken || !resolvedWorkspaceId || !resolvedDashboardId) {\n throw new Error(\n 'PapermapChat requires token, workspaceId, and dashboardId from props or PapermapProvider.'\n )\n }\n return (\n <PapermapChatInner\n onToolbarHeightChange={onToolbarHeightChange}\n showToolbar={showToolbar}\n {...uiProps}\n />\n )\n }\n\n if (!resolvedToken || !resolvedWorkspaceId || !resolvedDashboardId) {\n throw new Error(\n 'PapermapChat requires token, workspaceId, and dashboardId when used outside PapermapProvider.'\n )\n }\n\n return (\n <PapermapProvider\n token={resolvedToken}\n workspaceId={resolvedWorkspaceId}\n dashboardId={resolvedDashboardId}\n apiUrl={resolvedApiUrl}\n >\n <PapermapChatInner\n onToolbarHeightChange={onToolbarHeightChange}\n showToolbar={showToolbar}\n {...uiProps}\n />\n </PapermapProvider>\n )\n}\n\n// ── Inner component (reads from store) ──────────────────────────────\n\ninterface InnerProps {\n placeholder?: string\n shortcutKey?: string\n autoFade?: boolean\n fadeDelay?: number\n onToolbarHeightChange?: (height: number) => void\n className?: string\n showToolbar?: boolean\n}\n\nfunction PapermapChatInner({\n placeholder = 'Ask anything...',\n shortcutKey = 'k',\n autoFade = false,\n fadeDelay = 5000,\n onToolbarHeightChange,\n className,\n showToolbar = true,\n}: InnerProps) {\n const [isMounted, setIsMounted] = useState(false)\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n const isFocused = usePapermapStore((s) => s.isFocused)\n const isOpen = usePapermapStore((s) => s.isOpen)\n const inputValue = usePapermapStore((s) => s.inputValue)\n const isMultiline = usePapermapStore((s) => s.isMultiline)\n const isLoading = usePapermapStore((s) => s.isLoading)\n const messages = usePapermapStore((s) => s.messages)\n const chatId = usePapermapStore((s) => s.chatId)\n const useSSEStreaming = usePapermapStore((s) => s.useSSEStreaming)\n\n const setIsFocused = usePapermapStore((s) => s.setIsFocused)\n const setIsOpen = usePapermapStore((s) => s.setIsOpen)\n const setInputValue = usePapermapStore((s) => s.setInputValue)\n const setIsMultiline = usePapermapStore((s) => s.setIsMultiline)\n const handleSubmit = usePapermapStore((s) => s.handleSubmit)\n const handleCancel = usePapermapStore((s) => s.handleCancel)\n const handleNewChat = usePapermapStore((s) => s.handleNewChat)\n const setChatModalTab = usePapermapStore((s) => s.setChatModalTab)\n const setUseSSEStreaming = usePapermapStore((s) => s.setUseSSEStreaming)\n const editChatId = usePapermapStore((s) => s.editChatId)\n const setEditChatId = usePapermapStore((s) => s.setEditChatId)\n\n const storeApi = usePapermapStoreApi()\n const refs = storeApi.getState().getRefs()\n\n const { isFaded, resetFadeTimer } = useAutoFade(autoFade, fadeDelay, isOpen || isFocused)\n\n const toolbarRef = useRef<HTMLDivElement>(null)\n const [toolbarHeight, setToolbarHeight] = useState(0)\n\n useEffect(() => {\n if (!showToolbar) {\n setToolbarHeight(0)\n onToolbarHeightChange?.(0)\n }\n }, [showToolbar, onToolbarHeightChange])\n\n useEffect(() => {\n if (!showToolbar) return\n // If ResizeObserver is not available, fall back to polling.\n if (typeof ResizeObserver === 'undefined') {\n let lastHeight = 0\n const intervalId = window.setInterval(() => {\n if (!toolbarRef.current) return\n const height = toolbarRef.current.offsetHeight\n if (height !== lastHeight) {\n lastHeight = height\n\n setToolbarHeight(height)\n onToolbarHeightChange?.(height)\n }\n }, 250)\n\n return () => {\n window.clearInterval(intervalId)\n }\n }\n\n if (!toolbarRef.current) {\n return\n }\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height = entry.contentRect.height\n setToolbarHeight(height)\n onToolbarHeightChange?.(height)\n }\n })\n observer.observe(toolbarRef.current)\n return () => observer.disconnect()\n }, [onToolbarHeightChange, showToolbar])\n\n // Fallback: actively measure height when key UI state changes, mirroring main app behavior.\n useEffect(() => {\n if (!showToolbar) return\n if (!toolbarRef.current) return\n const height = toolbarRef.current.offsetHeight\n setToolbarHeight(height)\n onToolbarHeightChange?.(height)\n }, [isMultiline, inputValue, isFocused, isOpen, onToolbarHeightChange, showToolbar])\n\n useEffect(() => {\n if (!(isFocused || isOpen)) return\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = prev\n }\n }, [isFocused, isOpen])\n\n useEffect(() => {\n if (isOpen && refs.messagesEndRef.current) {\n refs.messagesEndRef.current.scrollIntoView({ behavior: 'smooth' })\n }\n }, [messages.length, isOpen, refs.messagesEndRef])\n\n const openChat = useCallback(() => {\n setIsFocused(true)\n setIsOpen(true)\n }, [setIsFocused, setIsOpen])\n\n const closeChat = useCallback(() => {\n setIsFocused(false)\n setIsMultiline(false)\n setIsOpen(false)\n if (editChatId) {\n setEditChatId(null)\n }\n refs.inputRef.current?.blur()\n refs.textareaRef.current?.blur()\n }, [setIsFocused, setIsMultiline, setIsOpen, editChatId, setEditChatId, refs])\n\n const handleFormSubmit = useCallback(() => {\n const msg = inputValue.trim()\n if (!msg || isLoading) return\n // Ensure we're on the main chat tab when sending a message\n setChatModalTab(CHAT_MODAL_TAB.CHAT)\n handleSubmit(msg)\n }, [inputValue, isLoading, handleSubmit, setChatModalTab])\n\n useKeyboardShortcuts({\n shortcutKey,\n onToggle: () => {\n if (isOpen || isFocused) closeChat()\n else {\n openChat()\n setTimeout(() => refs.inputRef.current?.focus(), 50)\n }\n },\n onEscape: closeChat,\n })\n\n const debouncedCheckOverflow = useMemo(() => {\n let tid: ReturnType<typeof setTimeout>\n return () => {\n clearTimeout(tid)\n tid = setTimeout(() => {\n if (\n refs.inputRef.current &&\n refs.inputRef.current.scrollWidth > refs.inputRef.current.clientWidth\n ) {\n setIsMultiline(true)\n }\n }, 100)\n }\n }, [refs.inputRef, setIsMultiline])\n\n useEffect(() => {\n if (isMultiline && refs.textareaRef.current && isFocused) {\n const ta = refs.textareaRef.current\n ta.focus()\n const len = ta.value.length\n ta.setSelectionRange(len, len)\n }\n }, [isMultiline, isFocused, refs.textareaRef])\n\n useEffect(() => {\n // Match main app behavior: collapse back to single-line whenever the toolbar\n // loses focus. The overflow check in handleFocus will immediately restore\n // multiline when appropriate (e.g. long existing text), so UX stays in sync.\n if (!isFocused && isMultiline) {\n setIsMultiline(false)\n }\n }, [isFocused, isMultiline, setIsMultiline])\n\n useEffect(() => {\n if (!inputValue.trim() && isMultiline) setIsMultiline(false)\n }, [inputValue, isMultiline, setIsMultiline])\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const value = e.target.value\n setInputValue(value)\n if (!isMultiline) debouncedCheckOverflow()\n else if (!value.trim()) setIsMultiline(false)\n if (isMultiline && refs.textareaRef.current) {\n const ta = refs.textareaRef.current\n ta.style.height = 'auto'\n ta.style.height = Math.min(Math.max(40, ta.scrollHeight), 120) + 'px'\n }\n },\n [setInputValue, isMultiline, setIsMultiline, debouncedCheckOverflow, refs.textareaRef]\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key !== 'Enter') return\n if (e.shiftKey) {\n e.preventDefault()\n if (!isMultiline) {\n setInputValue((prev: string) => prev + '\\n')\n setIsMultiline(true)\n }\n } else {\n e.preventDefault()\n if (inputValue.trim() && isFocused) handleFormSubmit()\n }\n },\n [isMultiline, setInputValue, setIsMultiline, inputValue, isFocused, handleFormSubmit]\n )\n\n const handleFocus = useCallback(() => {\n // Focusing the input should always return to the main chat view\n setChatModalTab(CHAT_MODAL_TAB.CHAT)\n setIsFocused(true)\n setIsOpen(true)\n // When refocusing, re-check for overflow so a long existing value\n // correctly switches back into multiline mode (mirrors main app behavior).\n if (!isMultiline) {\n debouncedCheckOverflow()\n }\n }, [setChatModalTab, setIsFocused, setIsOpen, isMultiline, debouncedCheckOverflow])\n const handleBlur = useCallback(() => {\n if (!isOpen) {\n setIsFocused(false)\n setIsMultiline(false)\n }\n }, [isOpen, setIsFocused, setIsMultiline])\n\n const onNewChat = useCallback(() => {\n handleNewChat()\n setIsOpen(true)\n setIsFocused(true)\n setTimeout(() => refs.inputRef.current?.focus(), 100)\n }, [handleNewChat, setIsOpen, setIsFocused, refs.inputRef])\n\n const handleOpenModalTab = useCallback(\n (tab: (typeof CHAT_MODAL_TAB)[keyof typeof CHAT_MODAL_TAB]) => {\n setChatModalTab(tab)\n setIsOpen(true)\n setIsFocused(true)\n },\n [setChatModalTab, setIsOpen, setIsFocused]\n )\n\n const showOnToolbar = !!chatId\n\n const submitButtonWithHoverCard = (\n <AnimatePresence>\n {(isFocused || inputValue.trim()) && (\n <HoverCard openDelay={200} closeDelay={100}>\n <HoverCardTrigger asChild>\n <motion.button\n type={isLoading ? 'button' : 'submit'}\n disabled={!isLoading && (!inputValue.trim() || !isFocused)}\n onClick={isLoading ? handleCancel : handleFormSubmit}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.15, ease: EASE }}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-full',\n 'transition-colors bg-primary text-primary-foreground hover:bg-primary/90 cursor-pointer',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n isMultiline ? 'absolute right-2 -bottom-10' : 'absolute right-1.5'\n )}\n >\n {isLoading ? (\n <Square className=\"h-4 w-4 fill-current\" />\n ) : (\n <ArrowUp className=\"h-4 w-4\" />\n )}\n </motion.button>\n </HoverCardTrigger>\n <HoverCardContent side=\"left\" align=\"end\" className=\"w-52 p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n {useSSEStreaming ? (\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <EyeOff className=\"h-4 w-4 text-muted-foreground\" />\n )}\n <span className=\"text-sm font-medium\">View Execution</span>\n </div>\n <Switch checked={useSSEStreaming} onCheckedChange={setUseSSEStreaming} />\n </div>\n <p className=\"text-xs text-muted-foreground mt-2\">\n {useSSEStreaming\n ? 'See real-time phases, thoughts & tool calls'\n : 'Show only final results'}\n </p>\n </HoverCardContent>\n </HoverCard>\n )}\n </AnimatePresence>\n )\n\n if (!isMounted) return null\n\n const shouldHideShineBorder = autoFade && isFaded && !(isOpen || isFocused)\n\n const content = (\n <>\n <AnimatePresence>\n {(isFocused || isOpen) && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.6, ease: EASE, exit: { duration: 0.8, ease: EASE } }}\n className=\"fixed inset-0 bg-neutral-800/80 backdrop-blur-md z-[45]\"\n onClick={closeChat}\n />\n )}\n </AnimatePresence>\n\n {isOpen && (\n <div\n className=\"fixed inset-0 flex items-end justify-center z-[47]\"\n style={{ bottom: `${Math.max(80, toolbarHeight + 20)}px` }}\n >\n <div className=\"absolute inset-0\" onClick={closeChat} />\n <div className=\"relative pb-3\">\n <AnimatePresence>\n <ChatAssistant />\n </AnimatePresence>\n </div>\n </div>\n )}\n\n {showToolbar && (\n <div\n ref={toolbarRef}\n className={cn(\n 'group fixed bottom-[16px] left-1/2 z-[48] -translate-x-1/2',\n 'backdrop-blur-sm shadow-all-around dark:bg-neutral-900/90',\n 'transition-all duration-500 ease-[0.23,1,0.32,1]',\n isMultiline\n ? 'w-[95vw] md:w-[75vw] lg:w-[65vw] xl:w-[55vw] 2xl:w-[45vw] max-w-[1100px] rounded-2xl'\n : isFocused\n ? 'w-[64vw] md:w-[52vw] lg:w-[44vw] xl:w-[36vw] 2xl:w-[32vw] max-w-[720px] rounded-full'\n : 'w-[65vw] md:w-[55vw] lg:w-[45vw] xl:w-[32vw] 2xl:w-[28vw] max-w-[850px] rounded-full',\n autoFade && isFaded && !(isOpen || isFocused)\n ? 'shadow-none bg-white dark:bg-neutral-900 hover:shadow-all-around hover:bg-white/65 hover:dark:bg-neutral-900/90'\n : '',\n className\n )}\n onMouseEnter={() => autoFade && resetFadeTimer()}\n onMouseLeave={() => autoFade && !isOpen && !isFocused && resetFadeTimer()}\n onClick={(e) => {\n if (autoFade) resetFadeTimer()\n if (e.target === e.currentTarget || e.target === toolbarRef.current) {\n if (isMultiline && refs.textareaRef.current) refs.textareaRef.current.focus()\n else if (refs.inputRef.current) refs.inputRef.current.focus()\n }\n }}\n >\n {!shouldHideShineBorder && <ShineBorder shineColor={['#A07CFE', '#FE8FB5', '#FFBE7B']} />}\n\n <motion.div\n layout\n transition={SPRING}\n className={cn(\n 'flex w-full text-muted-foreground/70 transition-opacity duration-500',\n isFocused && 'bg-background/95 backdrop-blur-lg opacity-85',\n autoFade &&\n isFaded &&\n !(isOpen || isFocused) &&\n '!opacity-20 group-hover:!opacity-100',\n isMultiline\n ? 'flex-col gap-1 py-3 px-4 rounded-2xl'\n : 'items-center gap-3 px-4 py-2 rounded-full'\n )}\n >\n <motion.div\n layout\n transition={SPRING}\n className={cn('flex w-full', isMultiline ? 'flex-col gap-1' : 'items-center gap-2')}\n >\n {!isMultiline && (\n <>\n <div className=\"flex items-center gap-1 sm:gap-2 flex-shrink-0\">\n <AddNewChatBtn onClick={onNewChat} />\n <ButtonWithTooltip\n onClick={() => handleOpenModalTab(CHAT_MODAL_TAB.RECENT_CONVERSATIONS)}\n tooltipText=\"Recent Conversations\"\n className=\"h-8 w-8 hidden sm:flex\"\n >\n <Clock className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n </div>\n <Separator\n orientation=\"vertical\"\n className=\"hidden md:block h-5 sm:h-6 flex-shrink-0\"\n />\n </>\n )}\n\n <form\n onSubmit={(e) => {\n e.preventDefault()\n handleFormSubmit()\n }}\n className=\"flex items-center flex-1 w-full min-w-0\"\n >\n <div\n className=\"relative flex items-center w-full flex-1 min-w-0 cursor-text max-w-none\"\n onClick={() => {\n if (!isMultiline && refs.inputRef.current) refs.inputRef.current.focus()\n else if (isMultiline && refs.textareaRef.current)\n refs.textareaRef.current.focus()\n }}\n >\n {!isMultiline ? (\n <>\n <input\n ref={refs.inputRef as React.RefObject<HTMLInputElement>}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onClick={(e) => e.stopPropagation()}\n placeholder={placeholder}\n className={cn(\n 'h-9 sm:h-10 text-sm rounded-full transition-all duration-300 border-none shadow-none',\n 'ring-0 focus-visible:ring-0 focus:ring-0 outline-none',\n 'placeholder:text-sm placeholder:text-muted-foreground/70',\n 'w-full pl-4 sm:pl-5 pr-12 bg-transparent flex-1 min-w-0 max-w-none text-foreground'\n )}\n />\n {submitButtonWithHoverCard}\n <AnimatePresence>\n {!isFocused && !inputValue.trim() && (\n <motion.kbd\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"pointer-events-none absolute right-4 top-1/2 -translate-y-1/2 hidden lg:inline-flex h-5 select-none items-center gap-1 rounded border border-border/70 bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground\"\n >\n <span className=\"text-xs\">⌘</span>\n {shortcutKey.toUpperCase()}\n </motion.kbd>\n )}\n </AnimatePresence>\n </>\n ) : (\n <div className=\"relative w-full flex-1 min-w-0\">\n <textarea\n ref={refs.textareaRef as React.RefObject<HTMLTextAreaElement>}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onInput={(e: React.FormEvent<HTMLTextAreaElement>) => {\n const ta = e.currentTarget\n ta.style.height = 'auto'\n ta.style.height = Math.min(Math.max(40, ta.scrollHeight), 80) + 'px'\n }}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onClick={(e) => e.stopPropagation()}\n placeholder={placeholder}\n rows={1}\n className={cn(\n 'w-full text-sm rounded-2xl p-3 pr-12 transition-all duration-200 border-none shadow-none',\n 'ring-0 focus-visible:ring-0 focus:ring-0 outline-none',\n 'placeholder:text-sm placeholder:text-muted-foreground/70',\n 'resize-none min-h-[40px] max-h-[80px] bg-transparent flex-1 min-w-0 text-foreground',\n 'scrollbar-hover-only'\n )}\n />\n {submitButtonWithHoverCard}\n </div>\n )}\n </div>\n </form>\n\n {!isMultiline && (\n <>\n <Separator\n orientation=\"vertical\"\n className=\"hidden lg:block h-5 sm:h-6 flex-shrink-0\"\n />\n <div className=\"hidden lg:flex items-center gap-1 sm:gap-2 flex-shrink-0\">\n <SearchWebBtn />\n <ModelSelector />\n {showOnToolbar && (\n <ChartHistoryBtn\n onClick={() => handleOpenModalTab(CHAT_MODAL_TAB.CHAT_HISTORY)}\n />\n )}\n </div>\n </>\n )}\n </motion.div>\n\n {isMultiline && (\n <motion.div\n layout\n transition={SPRING}\n className=\"flex items-center justify-between w-full mt-0\"\n >\n <div className=\"flex items-center gap-1 sm:gap-2 flex-wrap\">\n <AddNewChatBtn onClick={onNewChat} />\n <SearchWebBtn />\n <ButtonWithTooltip\n onClick={() => handleOpenModalTab(CHAT_MODAL_TAB.RECENT_CONVERSATIONS)}\n tooltipText=\"Recent Conversations\"\n className=\"h-8 w-8 hidden sm:flex\"\n >\n <Clock className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n <ModelSelector />\n {showOnToolbar && (\n <ChartHistoryBtn\n onClick={() => handleOpenModalTab(CHAT_MODAL_TAB.CHAT_HISTORY)}\n />\n )}\n </div>\n </motion.div>\n )}\n </motion.div>\n </div>\n )}\n\n {showToolbar && isMultiline && <div style={{ height: 48 }} />}\n </>\n )\n\n return createPortal(content, document.body)\n}\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\n\nexport function useAutoFade(enabled: boolean, delay: number = 5000, suppressWhen: boolean = false) {\n const [isFaded, setIsFaded] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const resetFadeTimer = useCallback(() => {\n if (!enabled) return\n setIsFaded(false)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => setIsFaded(true), delay)\n }, [enabled, delay])\n\n useEffect(() => {\n if (!enabled) return\n if (suppressWhen) {\n setIsFaded(false)\n if (timerRef.current) clearTimeout(timerRef.current)\n return\n }\n resetFadeTimer()\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [enabled, suppressWhen, resetFadeTimer])\n\n return { isFaded, resetFadeTimer }\n}\n","'use client'\n\nimport { useEffect } from 'react'\n\ninterface KeyboardShortcutHandlers {\n onToggle?: () => void\n onEscape?: () => void\n shortcutKey?: string\n}\n\nexport function useKeyboardShortcuts({\n onToggle,\n onEscape,\n shortcutKey = 'k',\n}: KeyboardShortcutHandlers) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === shortcutKey) {\n e.preventDefault()\n onToggle?.()\n }\n if (e.key === 'Escape') {\n onEscape?.()\n }\n }\n\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [onToggle, onEscape, shortcutKey])\n}\n","'use client'\n\nimport React, { createContext, useContext, useEffect, useMemo, useRef } from 'react'\nimport { useStore } from 'zustand'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport {\n createPapermapStore,\n type PapermapStore,\n type PapermapStoreApi,\n type PapermapStoreConfig,\n} from './papermap-store'\nimport { createPapermapServices, type PapermapHttpServices } from './papermap-services'\nimport { papermapQueryClient } from '../queryClient'\nimport { useAnalyticsStream } from '../hooks/useAnalyticsStream'\nimport { Toaster } from '../components/ui/toaster'\nimport { ThemeProvider } from '../components/ThemeProvider'\n\n// ── Context ─────────────────────────────────────────────────────────\n\nexport type PapermapConnectionValue = {\n token: string\n workspaceId: string\n dashboardId: string\n apiUrl?: string\n services: PapermapHttpServices\n}\n\nconst PapermapConnectionContext = createContext<PapermapConnectionValue | null>(null)\n\nconst PapermapStoreContext = createContext<PapermapStoreApi | null>(null)\n\n// ── Provider ────────────────────────────────────────────────────────\n\ninterface PapermapProviderProps extends PapermapStoreConfig {\n children: React.ReactNode\n}\n\nexport function PapermapProvider({\n children,\n token,\n workspaceId,\n dashboardId,\n apiUrl,\n initialModel,\n onModelChange,\n}: PapermapProviderProps) {\n const services = useMemo(() => createPapermapServices({ token, apiUrl }), [token, apiUrl])\n const connection = useMemo<PapermapConnectionValue>(\n () => ({ token, workspaceId, dashboardId, apiUrl, services }),\n [token, workspaceId, dashboardId, apiUrl, services]\n )\n\n const storeRef = useRef<PapermapStoreApi | null>(null)\n const queryClientRef = useRef<QueryClient | null>(null)\n\n if (!storeRef.current) {\n storeRef.current = createPapermapStore(\n { token, workspaceId, dashboardId, apiUrl, initialModel, onModelChange },\n services\n )\n }\n if (!queryClientRef.current) {\n queryClientRef.current = papermapQueryClient\n }\n\n return (\n <QueryClientProvider client={queryClientRef.current}>\n <ThemeProvider theme=\"light\">\n <PapermapConnectionContext.Provider value={connection}>\n <PapermapStoreContext.Provider value={storeRef.current}>\n <SSESync store={storeRef.current} />\n <ConversationLoader store={storeRef.current} />\n {children}\n <Toaster />\n </PapermapStoreContext.Provider>\n </PapermapConnectionContext.Provider>\n </ThemeProvider>\n </QueryClientProvider>\n )\n}\n\n// ── SSE sync (bridges useAnalyticsStream hook → store) ──────────────\n\nfunction SSESync({ store }: { store: PapermapStoreApi }) {\n const sseRequestId = useStore(store, (s) => s.sseRequestId)\n const services = store.getState().getServices()\n\n const {\n thoughts,\n toolCalls,\n timeline,\n currentPhase,\n isConnected,\n isStreaming,\n isComplete,\n error,\n markRequestAsCompleted: _mark,\n } = useAnalyticsStream(sseRequestId, services.authHeaders, services.baseUrl, {\n onComplete: () => store.getState().setSseRequestId(null),\n onError: () => store.getState().setSseRequestId(null),\n })\n\n useEffect(() => {\n store.getState().syncSseDisplay({\n thoughts,\n toolCalls,\n timeline,\n phase: currentPhase,\n isConnected,\n isStreaming,\n isComplete,\n error,\n })\n }, [\n thoughts,\n toolCalls,\n timeline,\n currentPhase,\n isConnected,\n isStreaming,\n isComplete,\n error,\n store,\n ])\n\n return null\n}\n\n// ── Conversation loader (replaces the useEffect in usePapermapChat) ──\n// When active chat id (editChatId || chatId) changes, clear persisted chart and messages\n// so the new conversation loads fresh (mirrors main app toolbar useEffect on activeChatId).\nfunction ConversationLoader({ store }: { store: PapermapStoreApi }) {\n const isOpen = useStore(store, (s) => s.isOpen)\n const chatId = useStore(store, (s) => s.chatId)\n const editChatId = useStore(store, (s) => s.editChatId)\n const activeChatId = useMemo(() => editChatId || chatId, [editChatId, chatId])\n const previousActiveChatIdRef = useRef<string | null>(null)\n\n useEffect(() => {\n const prev = previousActiveChatIdRef.current\n if (prev && activeChatId && prev !== activeChatId) {\n const state = store.getState()\n state.setMessages([])\n state.clearLatestChart()\n }\n previousActiveChatIdRef.current = activeChatId ?? null\n }, [activeChatId, store])\n\n useEffect(() => {\n store.getState().loadConversations()\n }, [isOpen, chatId, editChatId, store])\n\n return null\n}\n\n// ── Selector hook ───────────────────────────────────────────────────\n\nexport function usePapermapStore<T>(selector: (state: PapermapStore) => T): T {\n const store = useContext(PapermapStoreContext)\n if (!store) {\n throw new Error('usePapermapStore must be used within <PapermapProvider>')\n }\n return useStore(store, selector)\n}\n\n/**\n * Access the raw store API (for refs, services, imperative calls).\n * Does NOT subscribe to re-renders -- use usePapermapStore for reactive state.\n */\nexport function usePapermapStoreApi(): PapermapStoreApi {\n const store = useContext(PapermapStoreContext)\n if (!store) {\n throw new Error('usePapermapStoreApi must be used within <PapermapProvider>')\n }\n return store\n}\n\n/**\n * Like usePapermapStoreApi but returns null when outside a provider.\n * Use this to detect if a component is already inside a PapermapProvider\n * (e.g. to avoid nesting a second provider and share the same store).\n */\nexport function usePapermapStoreApiOptional(): PapermapStoreApi | null {\n return useContext(PapermapStoreContext)\n}\n\nexport function usePapermapConnection(): PapermapConnectionValue {\n const ctx = useContext(PapermapConnectionContext)\n if (!ctx) {\n throw new Error('usePapermapConnection must be used within <PapermapProvider>')\n }\n return ctx\n}\n\nexport function usePapermapConnectionOptional(): PapermapConnectionValue | null {\n return useContext(PapermapConnectionContext)\n}\n","import { createStore } from 'zustand/vanilla'\nimport { STREAM_STATUS } from '../api/endpoints'\nimport { generateChartRequestId } from '../services/streaming'\nimport { papermapQueryClient } from '../queryClient'\nimport { createPapermapServices, type PapermapHttpServices } from './papermap-services'\nimport type { Message } from '../types'\nimport type { AgentThought, ToolCall, TimelineEvent } from '../types/streaming'\nimport type { TChartMeta, TChartResponse } from '../types/chart'\n\n// ── Constants ─────────────────────────────────────────────────────────\n\nexport const CHAT_MODAL_TAB = {\n CHAT: 'CHAT',\n SAVED_MEMORY: 'SAVED_MEMORY',\n RECENT_CONVERSATIONS: 'RECENT_CONVERSATIONS',\n CHAT_HISTORY: 'CHAT_HISTORY',\n} as const\n\nexport type ChatModalTabType = (typeof CHAT_MODAL_TAB)[keyof typeof CHAT_MODAL_TAB]\n\n// ── Types ─────────────────────────────────────────────────────────────\n\nexport interface PapermapStoreConfig {\n token: string\n workspaceId: string\n dashboardId: string\n apiUrl?: string\n /**\n * Optional: use your own state (e.g. Redux) to control the selected model.\n * When provided, this value is used as the initial model instead of sessionStorage.\n */\n initialModel?: string | null\n /**\n * Optional: called whenever the selected model changes.\n * Ideal place to dispatch a Redux action in the host app.\n */\n onModelChange?: (model: string | null) => void\n}\n\ntype Services = PapermapHttpServices\n\ninterface Refs {\n inputRef: { current: HTMLInputElement | null }\n textareaRef: { current: HTMLTextAreaElement | null }\n scrollRef: { current: HTMLDivElement | null }\n messagesEndRef: { current: HTMLDivElement | null }\n activeChatIdRef: { current: string | null }\n loadedConversationChatIdRef: { current: string | null }\n}\n\nexport interface PapermapState {\n // Core\n messages: Message[]\n isLoading: boolean\n isBranching: boolean\n isFocused: boolean\n isOpen: boolean\n inputValue: string\n isMultiline: boolean\n\n // Chat tracking\n chatId: string | null\n editChatId: string | null\n currentRequestId: string | null\n\n // UI tabs & panels\n chatModalTab: ChatModalTabType\n browserUse: boolean\n selectedModel: string | null\n viewExecution: boolean\n\n // Chart state\n chartData: any[]\n allMeta: TChartMeta\n selectedChartType: string\n chartVisuals: Record<string, any>\n\n // Pagination\n totalPages: number\n currentPage: number\n isLoadingMore: boolean\n\n // SSE (controlled by store, synced from useAnalyticsStream via provider)\n useSSEStreaming: boolean\n sseRequestId: string | null\n sseChatId: string | null\n\n // SSE display state (written by the provider's sync effect)\n sseThoughts: AgentThought[]\n sseToolCalls: ToolCall[]\n sseTimeline: TimelineEvent[]\n ssePhase: string | undefined\n sseIsConnected: boolean\n sseIsStreaming: boolean\n sseIsComplete: boolean\n sseError: string | null\n}\n\nexport interface PapermapActions {\n // Setters\n setMessages: (messages: Message[] | ((prev: Message[]) => Message[])) => void\n setIsLoading: (v: boolean) => void\n setIsBranching: (v: boolean) => void\n setIsFocused: (v: boolean) => void\n setIsOpen: (v: boolean) => void\n setInputValue: (v: string | ((prev: string) => string)) => void\n setIsMultiline: (v: boolean) => void\n setIsLoadingMore: (v: boolean) => void\n setChatId: (v: string | null) => void\n setEditChatId: (v: string | null) => void\n\n // UI tab & panel setters\n setChatModalTab: (v: ChatModalTabType) => void\n setBrowserUse: (v: boolean) => void\n updateBrowserUse: (v: boolean) => void\n setSelectedModel: (v: string | null) => void\n setViewExecution: (v: boolean) => void\n\n // Chart state setters\n updateChartData: (data: any[]) => void\n updateAllMeta: (meta: TChartMeta) => void\n updateChartType: (v: string) => void\n updateChartVisuals: (v: Record<string, any>) => void\n updateLatestChart: (result: any) => void\n clearLatestChart: () => void\n\n // SSE control\n setUseSSEStreaming: (v: boolean) => void\n setSseRequestId: (v: string | null) => void\n setSseChatId: (v: string | null) => void\n clearStreamingState: () => void\n\n // SSE display sync (called by the provider)\n syncSseDisplay: (data: {\n thoughts: AgentThought[]\n toolCalls: ToolCall[]\n timeline: TimelineEvent[]\n phase: string | undefined\n isConnected: boolean\n isStreaming: boolean\n isComplete: boolean\n error: string | null\n }) => void\n\n // Computed\n shouldShowSSE: () => boolean\n\n // Core actions\n handleSubmit: (userMessage: string) => Promise<void>\n handleCancel: () => Promise<void>\n handleNewChat: () => void\n handleScroll: (event: React.UIEvent<HTMLDivElement>) => Promise<void>\n scrollToBottom: () => void\n loadConversations: () => Promise<void>\n\n // Access non-reactive internals\n getRefs: () => Refs\n getServices: () => Services\n getConfig: () => PapermapStoreConfig\n}\n\nexport type PapermapStore = PapermapState & PapermapActions\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\nconst MODEL_STORAGE_KEY = 'papermap_plugin_selected_model'\n\nfunction loadInitialModel(): string | null {\n if (typeof window === 'undefined') return null\n try {\n const stored = window.sessionStorage.getItem(MODEL_STORAGE_KEY)\n return stored || null\n } catch {\n return null\n }\n}\n\nfunction persistModel(model: string | null) {\n if (typeof window === 'undefined') return\n try {\n if (model) {\n window.sessionStorage.setItem(MODEL_STORAGE_KEY, model)\n } else {\n window.sessionStorage.removeItem(MODEL_STORAGE_KEY)\n }\n } catch {\n // Ignore storage errors (e.g. disabled cookies)\n }\n}\n\ninterface Conversation {\n text_response?: string\n user_query?: string\n code?: string\n thoughts?: string\n llm_data_id?: string\n bookmarked?: boolean\n bookmark_id?: string\n is_inherited?: boolean\n progress_events?: { event_type?: string; data?: Record<string, any> }[]\n}\n\nfunction formatConversations(conversations: Conversation[]): Message[] {\n const formatted: Message[] = conversations.flatMap((item) => {\n let thought = item.thoughts?.trim()\n if (!thought && item.progress_events) {\n thought =\n item.progress_events\n .filter((evt) => evt.event_type === 'agent_thought')\n .map((evt) => evt.data?.content || '')\n .join('')\n .trim() || undefined\n }\n return [\n {\n role: 'assistant' as const,\n content: (item.text_response || '') as string,\n code: item.code || undefined,\n thought,\n status: 'done' as const,\n id: item.llm_data_id,\n bookmarked: item.bookmarked ?? false,\n bookmark_id: item.bookmark_id,\n progress_events: item.progress_events,\n },\n {\n role: 'user' as const,\n content: (item.user_query || '') as string,\n id: item.llm_data_id,\n },\n ]\n })\n return formatted.reverse()\n}\n\n// ── Store factory ─────────────────────────────────────────────────────\n\nexport function createPapermapStore(config: PapermapStoreConfig, injectedServices?: PapermapHttpServices) {\n const services: Services = injectedServices ?? createPapermapServices(config)\n const { chartSvc, streamingSvc } = services\n\n const refs: Refs = {\n inputRef: { current: null },\n textareaRef: { current: null },\n scrollRef: { current: null },\n messagesEndRef: { current: null },\n activeChatIdRef: { current: null },\n loadedConversationChatIdRef: { current: null },\n }\n\n const GREETING: Message = {\n role: 'assistant',\n content: 'Hello! How can I help you analyze your data today?',\n status: 'done',\n noIcons: true,\n }\n\n const initialModel = config.initialModel ?? loadInitialModel()\n\n return createStore<PapermapStore>()((set, get) => ({\n // ── Initial state ───────────────────────────────────────────────\n messages: [GREETING],\n isLoading: false,\n isBranching: false,\n isFocused: false,\n isOpen: false,\n inputValue: '',\n isMultiline: false,\n chatId: null,\n editChatId: null,\n currentRequestId: null,\n chatModalTab: CHAT_MODAL_TAB.CHAT,\n browserUse:\n typeof window !== 'undefined' &&\n window.sessionStorage.getItem('papermap_plugin_browser_use') === 'true',\n selectedModel: initialModel,\n viewExecution: true,\n chartData: [],\n allMeta: {},\n selectedChartType: '',\n chartVisuals: {},\n totalPages: 0,\n currentPage: 1,\n isLoadingMore: false,\n useSSEStreaming: true,\n sseRequestId: null,\n sseChatId: null,\n sseThoughts: [],\n sseToolCalls: [],\n sseTimeline: [],\n ssePhase: undefined,\n sseIsConnected: false,\n sseIsStreaming: false,\n sseIsComplete: false,\n sseError: null,\n\n // ── Setters ─────────────────────────────────────────────────────\n setMessages: (v) =>\n set((s) => ({\n messages: typeof v === 'function' ? v(s.messages) : v,\n })),\n setIsLoading: (v) => set({ isLoading: v }),\n setIsBranching: (v) => set({ isBranching: v }),\n setIsFocused: (v) => set({ isFocused: v }),\n setIsOpen: (v) => set({ isOpen: v }),\n setInputValue: (v) =>\n set((s) => ({\n inputValue: typeof v === 'function' ? v(s.inputValue) : v,\n })),\n setIsMultiline: (v) => set({ isMultiline: v }),\n setIsLoadingMore: (v) => set({ isLoadingMore: v }),\n setChatId: (v) => set({ chatId: v }),\n setEditChatId: (v) => set({ editChatId: v }),\n\n // ── UI tab & panel setters ───────────────────────────────────────\n setChatModalTab: (v) => set({ chatModalTab: v }),\n setBrowserUse: (v) => {\n set({ browserUse: v })\n if (typeof window !== 'undefined') {\n try {\n window.sessionStorage.setItem('papermap_plugin_browser_use', v ? 'true' : 'false')\n } catch {\n // ignore storage errors\n }\n }\n },\n updateBrowserUse: (v) => {\n set({ browserUse: v })\n if (typeof window !== 'undefined') {\n try {\n window.sessionStorage.setItem('papermap_plugin_browser_use', v ? 'true' : 'false')\n } catch {\n // ignore storage errors\n }\n }\n },\n setSelectedModel: (v) => {\n set({ selectedModel: v })\n persistModel(v)\n if (typeof config.onModelChange === 'function') {\n config.onModelChange(v)\n }\n },\n setViewExecution: (v) => set({ viewExecution: v }),\n\n // ── Chart state setters ──────────────────────────────────────────\n updateChartData: (data) => set({ chartData: data }),\n updateAllMeta: (meta) => set({ allMeta: meta }),\n updateChartType: (v) => set({ selectedChartType: v }),\n updateChartVisuals: (v) => set({ chartVisuals: v }),\n updateLatestChart: (result) => {\n if (result?.chart_type && result?.data?.length) {\n set({ chartData: result.data, selectedChartType: `${result.chart_type}` })\n }\n if (result?.visualization_config) {\n set({ chartVisuals: result.visualization_config })\n }\n console.log('meta: ', result?.meta)\n // Persist meta (including variant) so ChartView shows the correct variation (mirrors main app)\n if (result?.meta && typeof result.meta === 'object') {\n set({ allMeta: result.meta })\n } else if (result?.visualization_config?.variant !== undefined) {\n get().updateAllMeta({ ...get().allMeta, variant: result.visualization_config.variant })\n }\n },\n clearLatestChart: () =>\n set({ chartData: [], selectedChartType: '', chartVisuals: {}, allMeta: {} }),\n\n // ── SSE control ─────────────────────────────────────────────────\n setUseSSEStreaming: (v) => set({ useSSEStreaming: v }),\n setSseRequestId: (v) => set({ sseRequestId: v }),\n setSseChatId: (v) => set({ sseChatId: v }),\n clearStreamingState: () => set({ sseRequestId: null, sseChatId: null }),\n\n syncSseDisplay: (data) => {\n const s = get()\n const show = !!s.sseRequestId && !!s.chatId && s.sseChatId === s.chatId\n set({\n sseThoughts: show ? data.thoughts : [],\n sseToolCalls: show ? data.toolCalls : [],\n sseTimeline: show ? data.timeline : [],\n ssePhase: show ? data.phase : undefined,\n sseIsConnected: show ? data.isConnected : false,\n sseIsStreaming: show ? data.isStreaming : false,\n sseIsComplete: show ? data.isComplete : false,\n sseError: show ? data.error : null,\n })\n },\n\n shouldShowSSE: () => {\n const s = get()\n return !!s.sseRequestId && !!s.chatId && s.sseChatId === s.chatId\n },\n\n // ── Non-reactive access ─────────────────────────────────────────\n getRefs: () => refs,\n getServices: () => services,\n getConfig: () => config,\n\n // ── Scroll ──────────────────────────────────────────────────────\n scrollToBottom: () => {\n refs.messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n },\n\n // ── Load conversations ──────────────────────────────────────────\n // Use editChatId || chatId (like main app) so we get conversation by that id when editing.\n loadConversations: async () => {\n const { isOpen, chatId, editChatId } = get()\n const chatIdToUse = editChatId || chatId\n if ((!isOpen && !editChatId) || !chatIdToUse) {\n refs.loadedConversationChatIdRef.current = null\n set({ isLoadingMore: false })\n if (!chatIdToUse) get().clearLatestChart()\n return\n }\n if (refs.loadedConversationChatIdRef.current === chatIdToUse) return\n\n set({ isLoadingMore: true })\n const chatIdToLoad = chatIdToUse\n\n // Fetch chart in parallel with conversations (like main app toolbar)\n chartSvc\n .getLatestChart(chatIdToLoad)\n .then((result) => {\n const current = get()\n if ((current.editChatId || current.chatId) !== chatIdToLoad) return\n if (result?.success === false && (result?.data as any)?.is_multi_source) {\n return\n }\n const chartPayload = result?.data\n if (chartPayload?.chart_type && chartPayload?.data?.length) {\n get().updateLatestChart(chartPayload)\n } else {\n get().clearLatestChart()\n }\n })\n .catch(() => {\n // Silently ignore chart fetch errors; keep previous chart\n })\n\n try {\n const result = await chartSvc.getConversations({\n chat_id: chatIdToUse,\n per_page: 4,\n page: 1,\n })\n const formatted = formatConversations(result.data.conversations)\n set({\n totalPages: result.data.total_pages,\n currentPage: 1,\n messages: formatted,\n isLoadingMore: false,\n })\n refs.loadedConversationChatIdRef.current = chatIdToUse\n } catch {\n set({ isLoadingMore: false })\n }\n },\n\n // ── Submit ──────────────────────────────────────────────────────\n handleSubmit: async (userMessage: string) => {\n const s = get()\n if (!userMessage.trim() || s.isLoading) return\n\n const requestId = generateChartRequestId()\n set({ inputValue: '' })\n get().clearStreamingState()\n\n const currentMessages: Message[] = [...s.messages, { role: 'user', content: userMessage }]\n\n const tempMessages: Message[] = [\n ...currentMessages,\n { role: 'assistant', content: '', status: 'thinking', thought: 'Thinking...' },\n ]\n set({ isLoading: true, messages: tempMessages })\n get().scrollToBottom()\n\n let chatIdToUse = s.editChatId || s.chatId\n\n if (!chatIdToUse) {\n try {\n const data = await chartSvc.createChat({\n name: '',\n dashboard_id: config.dashboardId,\n })\n chatIdToUse = data.data.llm_data_chat_id\n set({ chatId: chatIdToUse })\n refs.loadedConversationChatIdRef.current = chatIdToUse\n // Invalidate conversation history so new chat appears in RecentConversations\n papermapQueryClient.invalidateQueries({\n queryKey: ['conversationHistory', config.dashboardId],\n })\n } catch (err) {\n console.error('Failed to create chat:', err)\n set({\n messages: [\n ...currentMessages,\n { role: 'error', content: 'Failed to start a new chat. Please try again.' },\n ],\n isLoading: false,\n })\n return\n }\n }\n\n if (!chatIdToUse) return\n refs.activeChatIdRef.current = chatIdToUse\n\n try {\n set({ currentRequestId: requestId })\n\n const responsePromise = streamingSvc.streamChartWithSSE({\n prompt: userMessage,\n workspace_id: config.workspaceId,\n chat_id: chatIdToUse,\n request_id: requestId,\n llm_model: s.selectedModel || undefined,\n stream_execution: true,\n use_search: s.browserUse,\n })\n\n await new Promise((resolve) => setTimeout(resolve, 150))\n\n set({ sseChatId: chatIdToUse, sseRequestId: requestId })\n\n const response = await responsePromise\n const chartData = response.data.data\n\n const lastIdx = tempMessages.length - 1\n const updatedMessages = [...tempMessages]\n if (updatedMessages[lastIdx - 1]) {\n updatedMessages[lastIdx - 1] = {\n ...updatedMessages[lastIdx - 1],\n id: chartData.llm_data_id || chatIdToUse,\n }\n }\n updatedMessages[lastIdx] = {\n role: 'assistant',\n content: chartData.text_response || '',\n thought: chartData.thoughts,\n progress_events: chartData.progress_events,\n openThought: false,\n status: 'done',\n code: chartData.code || '',\n id: chartData.llm_data_id || '',\n bookmarked: chartData.bookmarked ?? false,\n bookmark_id: chartData.bookmark_id,\n }\n\n if (\n chartData.status !== STREAM_STATUS.CANCELLED &&\n refs.activeChatIdRef.current === chatIdToUse\n ) {\n set({ messages: updatedMessages })\n get().updateLatestChart(chartData)\n }\n\n set({ isLoading: false, currentRequestId: null })\n } catch (error: any) {\n console.error('Error streaming chart:', error)\n const errorMsg =\n error?.response?.data?.message ||\n error?.message ||\n 'Oops! Something went wrong. Please try again.'\n set({\n messages: [...currentMessages, { role: 'error', content: errorMsg }],\n isLoading: false,\n currentRequestId: null,\n })\n get().scrollToBottom()\n get().clearStreamingState()\n }\n },\n\n // ── Cancel ──────────────────────────────────────────────────────\n handleCancel: async () => {\n const s = get()\n if (!s.currentRequestId) return\n try {\n await streamingSvc.cancelChartRequest(s.currentRequestId)\n set({\n messages: s.messages.filter((msg) => msg.status !== 'thinking'),\n })\n } catch (err) {\n console.error('Cancel failed:', err)\n }\n set({ isLoading: false, currentRequestId: null })\n get().clearStreamingState()\n },\n\n // ── New chat ────────────────────────────────────────────────────\n handleNewChat: () => {\n get().clearStreamingState()\n get().clearLatestChart()\n set({\n isLoading: false,\n isLoadingMore: false,\n chatId: null,\n editChatId: null,\n messages: [GREETING],\n inputValue: '',\n allMeta: {},\n chatModalTab: CHAT_MODAL_TAB.CHAT,\n })\n refs.loadedConversationChatIdRef.current = null\n },\n\n // ── Scroll handler (pagination) ─────────────────────────────────\n handleScroll: async (event: React.UIEvent<HTMLDivElement>) => {\n const target = event.target as HTMLDivElement\n const isNearTop = target.scrollTop <= 100\n const s = get()\n\n const chatIdToUse = s.editChatId || s.chatId\n if (\n isNearTop &&\n s.currentPage < s.totalPages &&\n !s.isLoading &&\n !s.isLoadingMore &&\n chatIdToUse\n ) {\n set({ isLoadingMore: true })\n const previousScrollHeight = target.scrollHeight\n\n try {\n const nextPage = s.currentPage + 1\n const result = await chartSvc.getConversations({\n chat_id: chatIdToUse,\n per_page: 4,\n page: nextPage,\n })\n const formatted = formatConversations(result.data.conversations)\n const MAX_MESSAGES = 200\n const combined = [...formatted, ...s.messages]\n set({\n messages: combined.length > MAX_MESSAGES ? combined.slice(0, MAX_MESSAGES) : combined,\n currentPage: nextPage,\n })\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const newScrollHeight = target.scrollHeight\n target.scrollTop = newScrollHeight - previousScrollHeight\n })\n })\n } catch (err) {\n console.error('Error loading more messages:', err)\n } finally {\n set({ isLoadingMore: false })\n }\n }\n },\n }))\n}\n\nexport type PapermapStoreApi = ReturnType<typeof createPapermapStore>\n\n// ── Imperative open/close chat assistant (e.g. from Edit Chart button) ───────\n\nexport interface OpenPapermapChatAssistantOptions {\n /** When provided, opens the assistant in edit mode for this chart/chat. */\n editChartId?: string | null\n /**\n * Full chart to prime the store with (like main app openEditChartModal).\n * When provided, sets meta, chart data, type, and visuals immediately so\n * variant and chart display correctly before loadConversations/getLatestChart run.\n */\n chart?: TChartResponse | null\n /**\n * When true, do not open/focus the floating PapermapChat assistant.\n * This is useful for streaming variants that render their own embedded\n * chart+conversation panel instead of the global UI.\n */\n suppressOpen?: boolean\n}\n\n/**\n * Opens the chart assistant (chat modal) from outside React, e.g. when the user\n * clicks the Edit Chart icon. Call with the store API from a component that has\n * access to it (e.g. via usePapermapStoreApi). Optionally pass editChartId to\n * open in edit mode for that chart.\n *\n * When chart is provided (e.g. from ChartCard), primes the store like the main\n * app openEditChartModal: setMessages([]), updateAllMeta(chart.meta),\n * updateChartData/Type/Visuals(chart.chart_response), then set editChatId and open.\n * ConversationLoader still runs loadConversations() for messages; variant shows\n * immediately from chart.meta.\n */\nexport function openPapermapChatAssistant(\n storeApi: PapermapStoreApi,\n options?: OpenPapermapChatAssistantOptions\n): void {\n const state = storeApi.getState()\n state.setChatModalTab(CHAT_MODAL_TAB.CHAT)\n\n const chart = options?.chart\n const id = options?.editChartId ?? chart?.llm_data_chat_id ?? null\n\n if (chart) {\n state.setMessages([])\n if (chart.meta && typeof chart.meta === 'object') {\n state.updateAllMeta(chart.meta)\n }\n if (chart.chart_response) {\n const cr = chart.chart_response\n state.updateChartData(cr.data || [])\n state.updateChartType(cr.chart_type || '')\n if (cr.visualization_config) {\n state.updateChartVisuals(cr.visualization_config)\n if (cr.visualization_config.variant !== undefined && !(chart.meta?.variant !== undefined)) {\n const currentMeta = (state as PapermapStore).allMeta ?? {}\n state.updateAllMeta({ ...currentMeta, variant: cr.visualization_config.variant })\n }\n }\n }\n }\n\n if (id !== undefined && id !== null) {\n state.setEditChatId(id)\n const refs = state.getRefs()\n refs.loadedConversationChatIdRef.current = null\n }\n\n // For streaming variants, callers can pass suppressOpen to avoid opening\n // the floating PapermapChat assistant and only prime the store.\n if (!options?.suppressOpen) {\n state.setIsFocused(true)\n state.setIsOpen(true)\n const refs = state.getRefs()\n setTimeout(() => {\n refs.inputRef.current?.focus()\n }, 50)\n }\n}\n\nexport function closePapermapChatAssistant(storeApi: PapermapStoreApi): void {\n const state = storeApi.getState()\n state.setEditChatId(null)\n state.setIsOpen(false)\n state.setIsFocused(false)\n}\n","const API_V1 = '/api/v1'\n\nexport const DEFAULT_API_URL = 'https://dataapi.papermap.ai'\n\nexport const ENDPOINTS = {\n dashboards: `${API_V1}/analytics/dashboards`,\n dashboardLayout: (dashboardId: string) => `${API_V1}/analytics/dashboards/${dashboardId}/layout`,\n charts: `${API_V1}/analytics/chats`,\n streamChat: `${API_V1}/analytics/chats/stream`,\n chartsPaginated: `${API_V1}/analytics/chats/paginate`,\n streamChart: `${API_V1}/analytics/charts/stream`,\n cancelChartRequest: `${API_V1}/analytics/charts/cancel`,\n editChatMessage: (llmDataId: string) => `${API_V1}/analytics/conversations/${llmDataId}/edit`,\n streamRequest: `${API_V1}/analytics/requests/stream`,\n conversationHistory: `${API_V1}/analytics/chats-history`,\n chartHistory: (chatId: string) => `${API_V1}/analytics/chats/${chatId}/get-all-charts`,\n chartById: (chartId: string) => `${API_V1}/analytics/chats/${chartId}`,\n bookmarkConversation: `${API_V1}/analytics/chart-bookmarks`,\n getBookmarkedCharts: `${API_V1}/analytics/chart-bookmarks/paginate`,\n deleteBookmark: `${API_V1}/analytics/chart-bookmarks`,\n getChatDataWithBookmark: `${API_V1}/analytics/charts`,\n updateResponseLabel: `${API_V1}/analytics/charts/update-label`,\n\n // Branch Conversation\n branchConversation: (llm_data_id: string) =>\n `${API_V1}/analytics/conversations/${llm_data_id}/branch`,\n\n models: `${API_V1}/options/models`,\n generateProactiveDashboard: `${API_V1}/analytics/proactive-dashboard/generate`,\n\n /** Workspace CRUD (theme lives on `meta.theme` keyed by dashboard id) */\n workspace: (workspaceId: string) => `${API_V1}/analytics/workspaces/${workspaceId}`,\n} as const\n\nexport const STREAM_STATUS = {\n PENDING: 'pending',\n PROCESSING: 'processing',\n COMPLETED: 'completed',\n FAILED: 'failed',\n CANCELLED: 'cancelled',\n} as const\n","import type { AxiosInstance } from 'axios'\nimport { ENDPOINTS } from '../api/endpoints'\n\ntype StreamChartWithSSEData = {\n prompt: string\n workspace_id: string\n chat_id: string\n request_id: string\n llm_model?: string\n use_search?: boolean\n stream_execution?: boolean\n}\n\ntype EditMessageWithSSEData = StreamChartWithSSEData & {\n llm_data_id: string\n}\n\nexport function createStreamingService(client: AxiosInstance) {\n const streamChartWithSSE = async (data: StreamChartWithSSEData) => {\n const res = await client.post(ENDPOINTS.streamChart, {\n ...data,\n use_search: data.use_search ?? false,\n stream_execution: data.stream_execution ?? true,\n })\n return res\n }\n\n const editMessageWithSSE = async (data: EditMessageWithSSEData) => {\n const res = await client.post(ENDPOINTS.editChatMessage(data.llm_data_id), {\n prompt: data.prompt,\n workspace_id: data.workspace_id,\n chat_id: data.chat_id,\n request_id: data.request_id,\n use_search: data.use_search,\n llm_model: data.llm_model,\n stream_execution: data.stream_execution ?? true,\n })\n return res\n }\n\n const cancelChartRequest = async (request_id: string, reason = 'user_cancelled') => {\n const res = await client.post(ENDPOINTS.cancelChartRequest, { request_id, reason })\n return res.data\n }\n\n return { streamChartWithSSE, editMessageWithSSE, cancelChartRequest }\n}\n\nexport const generateChartRequestId = () => `chat_${Date.now()}_${crypto.randomUUID().slice(0, 8)}`\n","import { QueryClient } from '@tanstack/react-query'\n\nexport const papermapQueryClient = new QueryClient({\n defaultOptions: {\n queries: { staleTime: 5 * 60 * 1000 }, // 5 min\n },\n})\n","import Axios from 'axios'\nimport { DEFAULT_API_URL } from './endpoints'\n\nexport interface DecodedToken {\n api_key_id: string\n workspace_id: string\n valid_until: number\n signature: string\n dashboard_id?: string\n tenant_id?: string\n}\n\nexport function decodeToken(token: string): DecodedToken {\n try {\n return JSON.parse(atob(token))\n } catch {\n throw new Error('Invalid Papermap token: could not decode base64 JSON')\n }\n}\n\nexport function buildAuthHeaders(decoded: DecodedToken): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-API-Key-ID': decoded.api_key_id,\n 'X-Workspace-ID': decoded.workspace_id,\n 'X-Valid-Until': decoded.valid_until.toString(),\n 'X-Signature': decoded.signature,\n 'X-Tenant-ID': decoded.tenant_id || 'da-app',\n }\n return headers\n}\n\nexport function createApiClient(token: string, apiUrl?: string) {\n const decoded = decodeToken(token)\n const authHeaders = buildAuthHeaders(decoded)\n\n const client = Axios.create({\n baseURL: apiUrl || DEFAULT_API_URL,\n responseType: 'json',\n timeout: 200_000,\n })\n\n client.interceptors.request.use((config) => {\n Object.entries(authHeaders).forEach(([key, value]) => {\n config.headers[key] = value\n })\n return config\n })\n\n return { client, decoded, authHeaders }\n}\n","import type { AxiosInstance } from 'axios'\nimport type { TLayout } from '../types/dashboard'\nimport { ENDPOINTS } from '../api/endpoints'\n\nexport function createChartService(client: AxiosInstance) {\n const getDashboards = async (params: { workspace_id: string }) => {\n const res = await client.get(ENDPOINTS.dashboards, {\n params: { workspace_id: params.workspace_id },\n })\n return res.data\n }\n\n const updateDashboardLayout = async (dashboardId: string, layout: TLayout[]) => {\n const res = await client.post(ENDPOINTS.dashboardLayout(dashboardId), { meta: layout })\n return res.data\n }\n\n const createChat = async (data: { name: string; dashboard_id: string }) => {\n const res = await client.post(ENDPOINTS.charts, data)\n return res.data\n }\n\n const getCharts = async (params: {\n dashboard_id: string\n page?: number\n per_page?: number\n pin?: boolean\n }) => {\n const res = await client.get(ENDPOINTS.chartsPaginated, {\n params: {\n dashboard_id: params.dashboard_id,\n page: params.page ?? 1,\n per_page: params.per_page ?? 20,\n pin: params.pin ?? false,\n },\n })\n return res.data\n }\n\n const getConversations = async (params: {\n chat_id: string\n per_page?: number\n page?: number\n }) => {\n const res = await client.get(`${ENDPOINTS.charts}/${params.chat_id}/conversations`, {\n params: {\n chat_id: params.chat_id,\n per_page: params.per_page ?? 4,\n page: params.page ?? 1,\n },\n })\n return res.data\n }\n\n const getLatestChart = async (chat_id: string) => {\n const res = await client.get(`${ENDPOINTS.charts}/${chat_id}/latest-chart`)\n return res.data\n }\n\n const getConversationHistory = async (params: {\n dashboard_id?: string\n per_page?: number\n page?: number\n }) => {\n const res = await client.get(ENDPOINTS.conversationHistory, { params })\n return res.data\n }\n\n const deleteChart = async (chatId: string) => {\n const res = await client.delete(`${ENDPOINTS.charts}/${chatId}`)\n return res.data\n }\n\n const getChartHistory = async (params: { chat_id: string; per_page?: number; page?: number }) => {\n const res = await client.get(ENDPOINTS.chartHistory(params.chat_id), {\n params: { per_page: params.per_page ?? 4, page: params.page ?? 1 },\n })\n return res.data\n }\n\n const getChartById = async (chartId: string) => {\n const res = await client.get(ENDPOINTS.chartById(chartId))\n return res.data\n }\n\n const updateChartMeta = async (chatId: string, meta: Record<string, any>) => {\n const res = await client.patch(`${ENDPOINTS.charts}/${chatId}`, { meta })\n return res.data\n }\n\n const updateChartPin = async (chatId: string, pin: boolean) => {\n const res = await client.patch(`${ENDPOINTS.charts}/${chatId}`, { pin })\n return res.data\n }\n\n const bookmarkConversation = async (data: { llm_data_id: string; dashboard_id: string }) => {\n const res = await client.post(ENDPOINTS.bookmarkConversation, data)\n return res.data\n }\n\n const removeBookmark = async (bookmarkId: string) => {\n const res = await client.delete(`${ENDPOINTS.bookmarkConversation}/${bookmarkId}`)\n return res.data\n }\n\n const updateResponseLabel = async (llm_data_id: string, label: 'positive' | 'negative') => {\n const res = await client.post(ENDPOINTS.updateResponseLabel, { label, llm_data_id })\n return res.data\n }\n\n const branchConversation = async (dashboard_id: string, llm_data_id: string) => {\n const res = await client.post(ENDPOINTS.branchConversation(llm_data_id), {\n dashboard_id,\n llm_data_id,\n })\n return res.data\n }\n\n const getModels = async () => {\n const res = await client.get(ENDPOINTS.models)\n return res.data\n }\n\n const generateProactiveDashboard = async (payload: {\n workspace_id: string\n dashboard_id?: string\n color_scheme?: string\n }) => {\n const res = await client.post(ENDPOINTS.generateProactiveDashboard, payload)\n return res.data\n }\n\n return {\n getDashboards,\n updateDashboardLayout,\n createChat,\n getCharts,\n getConversations,\n getLatestChart,\n getConversationHistory,\n deleteChart,\n getChartHistory,\n getChartById,\n updateChartMeta,\n updateChartPin,\n bookmarkConversation,\n removeBookmark,\n updateResponseLabel,\n branchConversation,\n getModels,\n generateProactiveDashboard,\n }\n}\n","import type { AxiosInstance } from 'axios'\nimport { ENDPOINTS } from '../api/endpoints'\n\n/** API may return `{ data: workspace }` or the workspace object directly */\nexport function unwrapWorkspacePayload(res: unknown): Record<string, any> {\n if (res && typeof res === 'object' && 'data' in res && (res as any).data != null) {\n return (res as { data: Record<string, any> }).data\n }\n return res as Record<string, any>\n}\n\nexport function createWorkspaceService(client: AxiosInstance) {\n const getWorkspace = async (workspaceId: string) => {\n const res = await client.get(ENDPOINTS.workspace(workspaceId))\n return res.data\n }\n\n const updateWorkspace = async (workspaceId: string, workspace: Record<string, any>) => {\n const res = await client.put(ENDPOINTS.workspace(workspaceId), workspace)\n return res.data\n }\n\n return { getWorkspace, updateWorkspace }\n}\n","import { createApiClient, buildAuthHeaders, decodeToken } from '../api/client'\nimport { DEFAULT_API_URL } from '../api/endpoints'\nimport { createStreamingService } from '../services/streaming'\nimport { createChartService } from '../services/chart.service'\nimport { createWorkspaceService } from '../services/workspace.service'\n\nexport type PapermapHttpServices = {\n authHeaders: Record<string, string>\n streamingSvc: ReturnType<typeof createStreamingService>\n chartSvc: ReturnType<typeof createChartService>\n workspaceSvc: ReturnType<typeof createWorkspaceService>\n baseUrl: string\n}\n\nexport function createPapermapServices(config: { token: string; apiUrl?: string }): PapermapHttpServices {\n const baseUrl = config.apiUrl || DEFAULT_API_URL\n const authHeaders = buildAuthHeaders(decodeToken(config.token))\n const { client } = createApiClient(config.token, baseUrl)\n return {\n authHeaders,\n streamingSvc: createStreamingService(client),\n chartSvc: createChartService(client),\n workspaceSvc: createWorkspaceService(client),\n baseUrl,\n }\n}\n","'use client'\n\nimport { useEffect, useState, useCallback, useRef } from 'react'\nimport { AnalyticsSSEClient } from '../api/analytics-sse'\nimport { EVENT_NAME } from '../types/streaming'\nimport type {\n AgentThought,\n ToolCall,\n ToolOutput,\n ToolCallComplete,\n ToolCallAnnounced,\n ToolCallArgsDelta,\n ToolCallArgsComplete,\n FinalResponse,\n StreamState,\n TimelineEvent,\n} from '../types/streaming'\n\ninterface UseAnalyticsStreamOptions {\n onComplete?: (data: any) => void\n onError?: (error: string) => void\n onThought?: (thought: AgentThought) => void\n onToolCall?: (toolCall: ToolCall) => void\n}\n\n/**\n * Adapted from papermap's useAnalyticsStream.\n * Instead of Redux for auth, receives `authHeaders` and `apiUrl` directly.\n */\nexport function useAnalyticsStream(\n requestId: string | null,\n authHeaders: Record<string, string>,\n apiUrl: string,\n options: UseAnalyticsStreamOptions = {}\n) {\n const [state, setState] = useState<StreamState>({\n thoughts: [],\n toolCalls: [],\n timeline: [],\n currentPhase: 'Analyzing your request...',\n error: null,\n finalResponse: null,\n isComplete: false,\n isConnected: false,\n isStreaming: false,\n })\n\n const clientRef = useRef<AnalyticsSSEClient | null>(null)\n const currentToolCallIndexRef = useRef<Map<string, number>>(new Map())\n const completedRequestIdsRef = useRef<Set<string>>(new Set())\n const MAX_COMPLETED_IDS = 50\n const previousRequestIdRef = useRef<string | null>(null)\n\n const onCompleteRef = useRef(options.onComplete)\n const onErrorRef = useRef(options.onError)\n const onThoughtRef = useRef(options.onThought)\n const onToolCallRef = useRef(options.onToolCall)\n\n useEffect(() => {\n onCompleteRef.current = options.onComplete\n onErrorRef.current = options.onError\n onThoughtRef.current = options.onThought\n onToolCallRef.current = options.onToolCall\n }, [options.onComplete, options.onError, options.onThought, options.onToolCall])\n\n const addCompletedId = useCallback((id: string) => {\n const set = completedRequestIdsRef.current\n if (set.size >= MAX_COMPLETED_IDS) {\n const oldest = set.values().next().value\n if (oldest !== undefined) set.delete(oldest)\n }\n set.add(id)\n }, [])\n\n type StateUpdater = (prev: StreamState) => StreamState\n const pendingUpdatesRef = useRef<StateUpdater[]>([])\n const rafIdRef = useRef<number | null>(null)\n\n const scheduleFlush = useCallback(() => {\n if (rafIdRef.current !== null) return\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null\n const updates = pendingUpdatesRef.current\n if (updates.length === 0) return\n pendingUpdatesRef.current = []\n setState((prev) => updates.reduce((s, fn) => fn(s), prev))\n })\n }, [])\n\n const enqueueUpdate = useCallback((updater: StateUpdater) => {\n pendingUpdatesRef.current.push(updater)\n scheduleFlush()\n }, [scheduleFlush])\n\n const flushAndApply = useCallback((updater: StateUpdater) => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n const pending = pendingUpdatesRef.current\n pendingUpdatesRef.current = []\n setState((prev) => {\n const intermediate = pending.reduce((s, fn) => fn(s), prev)\n return updater(intermediate)\n })\n }, [])\n\n const cleanup = useCallback(() => {\n if (clientRef.current) {\n clientRef.current.abort()\n clientRef.current = null\n }\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n pendingUpdatesRef.current = []\n setState((prev) => ({ ...prev, isConnected: false, isStreaming: false }))\n currentToolCallIndexRef.current.clear()\n }, [])\n\n useEffect(() => {\n const isExplicitClear = !requestId && previousRequestIdRef.current !== null\n\n if (!requestId) {\n if (isExplicitClear) {\n setState({\n thoughts: [],\n toolCalls: [],\n timeline: [],\n currentPhase: 'Analyzing your request...',\n error: null,\n finalResponse: null,\n isComplete: false,\n isConnected: false,\n isStreaming: false,\n })\n }\n return\n }\n\n previousRequestIdRef.current = requestId\n\n if (completedRequestIdsRef.current.has(requestId)) return\n\n setState({\n thoughts: [],\n toolCalls: [],\n timeline: [],\n currentPhase: 'Analyzing your request...',\n error: null,\n finalResponse: null,\n isComplete: false,\n isConnected: false,\n isStreaming: false,\n })\n currentToolCallIndexRef.current.clear()\n\n const client = new AnalyticsSSEClient()\n clientRef.current = client\n\n client.onOpen(() => {\n if (completedRequestIdsRef.current.has(requestId)) {\n client.abort()\n return\n }\n setState((prev) => ({ ...prev, isConnected: true, isStreaming: true, error: null }))\n })\n\n client.on(EVENT_NAME.AGENT_THOUGHT, (data) => {\n try {\n const parsed: AgentThought = JSON.parse(data)\n enqueueUpdate((prev) => ({\n ...prev,\n thoughts: [...prev.thoughts, parsed],\n timeline: [...prev.timeline, {\n type: 'thought' as const,\n timestamp: parsed.timestamp,\n iteration: parsed.iteration,\n thoughtData: parsed,\n }],\n }))\n onThoughtRef.current?.(parsed)\n } catch { /* ignore parse errors */ }\n })\n\n client.on(EVENT_NAME.TOOL_CALL_ANNOUNCED, (data) => {\n try {\n const parsed: ToolCallAnnounced = JSON.parse(data)\n const toolCall: ToolCall = {\n tool_name: parsed.tool_name,\n tool_display_name: parsed.tool_display_name,\n args_preview: '',\n status: 'announced',\n code: '',\n isStreamingArgs: false,\n timestamp: parsed.timestamp,\n ...(parsed.tool_call_id != null && { tool_call_id: parsed.tool_call_id }),\n }\n enqueueUpdate((prev) => {\n const newToolCalls = [...prev.toolCalls, toolCall]\n const newIndex = newToolCalls.length - 1\n const uniqueKey = `${parsed.tool_name}-${parsed.timestamp}-${newIndex}`\n currentToolCallIndexRef.current.set(uniqueKey, newIndex)\n currentToolCallIndexRef.current.set(parsed.tool_name, newIndex)\n return {\n ...prev,\n toolCalls: newToolCalls,\n timeline: [...prev.timeline, {\n type: 'tool' as const,\n timestamp: parsed.timestamp,\n iteration: parsed.iteration,\n toolData: toolCall,\n }],\n }\n })\n onToolCallRef.current?.(toolCall)\n } catch { /* ignore */ }\n })\n\n const getToolIndex = (toolCalls: ToolCall[], tool_name: string, tool_call_id?: string): number => {\n if (tool_call_id) {\n const idx = toolCalls.findIndex(t => t.tool_call_id === tool_call_id)\n if (idx >= 0) return idx\n }\n const incomplete = toolCalls.findIndex(\n t => t.tool_name === tool_name && t.status !== 'success' && t.status !== 'error'\n )\n if (incomplete >= 0) return incomplete\n const fallback = currentToolCallIndexRef.current.get(tool_name)\n return fallback !== undefined && fallback >= 0 && fallback < toolCalls.length ? fallback : -1\n }\n\n const findTimelineIndex = (timeline: TimelineEvent[], tool: ToolCall): number => {\n return timeline.findIndex(\n e => e.type === 'tool' && e.toolData && (\n (tool.tool_call_id && e.toolData.tool_call_id === tool.tool_call_id) ||\n (e.toolData.tool_name === tool.tool_name && e.toolData.timestamp === tool.timestamp)\n )\n )\n }\n\n client.on(EVENT_NAME.TOOL_CALL_ARGS_DELTA, (data) => {\n try {\n const parsed: ToolCallArgsDelta = JSON.parse(data)\n enqueueUpdate((prev) => {\n const toolCalls = [...prev.toolCalls]\n const timeline = [...prev.timeline]\n const toolIndex = getToolIndex(toolCalls, parsed.tool_name, parsed.tool_call_id)\n if (toolIndex >= 0) {\n toolCalls[toolIndex] = {\n ...toolCalls[toolIndex],\n code: (toolCalls[toolIndex].code || '') + parsed.args_delta,\n args_preview: parsed.args_preview || toolCalls[toolIndex].args_preview,\n status: 'streaming',\n isStreamingArgs: true,\n hasPrivateArgs: parsed.private_args ?? toolCalls[toolIndex].hasPrivateArgs,\n ...(parsed.tool_call_id != null && { tool_call_id: parsed.tool_call_id }),\n }\n const ti = findTimelineIndex(timeline, toolCalls[toolIndex])\n if (ti !== -1 && timeline[ti].toolData) {\n timeline[ti] = { ...timeline[ti], toolData: toolCalls[toolIndex] }\n }\n }\n return { ...prev, toolCalls, timeline }\n })\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.TOOL_CALL_ARGS_COMPLETE, (data) => {\n try {\n const parsed: ToolCallArgsComplete = JSON.parse(data)\n enqueueUpdate((prev) => {\n const toolCalls = [...prev.toolCalls]\n const timeline = [...prev.timeline]\n const toolIndex = getToolIndex(toolCalls, parsed.tool_name, parsed.tool_call_id)\n if (toolIndex >= 0) {\n let fullCode = parsed.full_args.code_str || parsed.full_args.query || parsed.full_args.user_query || ''\n if (!fullCode && Object.keys(parsed.full_args).length > 0) {\n fullCode = JSON.stringify(parsed.full_args, null, 2)\n }\n toolCalls[toolIndex] = {\n ...toolCalls[toolIndex],\n code: fullCode,\n args_preview: parsed.args_preview || toolCalls[toolIndex].args_preview,\n status: 'ready',\n isStreamingArgs: false,\n hasPrivateArgs: parsed.private_args || false,\n ...(parsed.tool_call_id != null && { tool_call_id: parsed.tool_call_id }),\n }\n const ti = findTimelineIndex(timeline, toolCalls[toolIndex])\n if (ti !== -1 && timeline[ti].toolData) {\n timeline[ti] = { ...timeline[ti], toolData: toolCalls[toolIndex] }\n }\n }\n return { ...prev, toolCalls, timeline }\n })\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.TOOL_OUTPUT, (data) => {\n try {\n const parsed: ToolOutput = JSON.parse(data)\n enqueueUpdate((prev) => {\n const toolCalls = [...prev.toolCalls]\n const timeline = [...prev.timeline]\n const toolIndex = getToolIndex(toolCalls, parsed.tool_name, parsed.tool_call_id)\n if (toolIndex >= 0) {\n toolCalls[toolIndex] = {\n ...toolCalls[toolIndex],\n output: parsed.content,\n status: 'executing',\n hasPrivateOutput: parsed.private_output || false,\n }\n const ti = findTimelineIndex(timeline, toolCalls[toolIndex])\n if (ti !== -1 && timeline[ti].toolData) {\n timeline[ti] = { ...timeline[ti], toolData: toolCalls[toolIndex] }\n }\n }\n return { ...prev, toolCalls, timeline }\n })\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.TOOL_CALL_COMPLETE, (data) => {\n try {\n const parsed: ToolCallComplete = JSON.parse(data)\n enqueueUpdate((prev) => {\n const toolCalls = [...prev.toolCalls]\n const timeline = [...prev.timeline]\n const toolIndex = getToolIndex(toolCalls, parsed.tool_name, parsed.tool_call_id)\n if (toolIndex >= 0) {\n toolCalls[toolIndex] = {\n ...toolCalls[toolIndex],\n status: parsed.status,\n duration_ms: parsed.duration_ms,\n ...(parsed.error_message != null && { error_message: parsed.error_message }),\n }\n const ti = findTimelineIndex(timeline, toolCalls[toolIndex])\n if (ti !== -1 && timeline[ti].toolData) {\n timeline[ti] = { ...timeline[ti], toolData: toolCalls[toolIndex] }\n }\n }\n return { ...prev, toolCalls, timeline }\n })\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.PHASE_UPDATE, (data) => {\n try {\n const parsed = JSON.parse(data)\n setState((prev) => ({ ...prev, currentPhase: parsed.message || parsed.phase }))\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.FINAL_RESPONSE, (data) => {\n try {\n const parsed: FinalResponse = JSON.parse(data)\n flushAndApply((prev) => ({ ...prev, finalResponse: parsed.response_data }))\n onCompleteRef.current?.(parsed.response_data)\n } catch { /* ignore */ }\n })\n\n client.on(EVENT_NAME.COMPLETE, (data) => {\n try {\n JSON.parse(data)\n flushAndApply((prev) => ({ ...prev, isComplete: true, isStreaming: false }))\n } catch { /* ignore */ }\n })\n\n client.onError((error) => {\n if (requestId) addCompletedId(requestId)\n const errorMsg = 'Unable to establish connection - using HTTP fallback response'\n setState((prev) => ({ ...prev, error: errorMsg, isConnected: false, isStreaming: false }))\n onErrorRef.current?.(errorMsg)\n cleanup()\n })\n\n client.onComplete(() => {\n if (requestId) addCompletedId(requestId)\n setTimeout(() => cleanup(), 100)\n })\n\n client.connect({\n url: `${apiUrl}/api/v1/analytics/requests/stream`,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders,\n },\n body: JSON.stringify({ request_id: requestId }),\n })\n\n return () => { cleanup() }\n }, [requestId, authHeaders, apiUrl, cleanup, enqueueUpdate, flushAndApply, addCompletedId])\n\n const markRequestAsCompleted = useCallback((reqId: string) => {\n addCompletedId(reqId)\n }, [addCompletedId])\n\n return {\n ...state,\n disconnect: cleanup,\n markRequestAsCompleted,\n }\n}\n","type SSEEvent = {\n type?: string\n data?: string\n id?: string\n retry?: number\n}\n\ntype EventHandler = (data: string, event: SSEEvent) => void\ntype ErrorHandler = (error: Error) => void\ntype CompleteHandler = () => void\n\ninterface SSEStreamOptions {\n url: string\n headers?: Record<string, string>\n signal?: AbortSignal\n method?: string\n body?: string\n}\n\nexport class SSEStreamClient {\n private eventHandlers = new Map<string, EventHandler>()\n private errorHandler?: ErrorHandler\n private completeHandler?: CompleteHandler\n private abortController?: AbortController\n private isStreaming = false\n\n on(eventType: string, handler: EventHandler): this {\n this.eventHandlers.set(eventType, handler)\n return this\n }\n\n onError(handler: ErrorHandler): this {\n this.errorHandler = handler\n return this\n }\n\n onComplete(handler: CompleteHandler): this {\n this.completeHandler = handler\n return this\n }\n\n off(eventType: string): this {\n this.eventHandlers.delete(eventType)\n return this\n }\n\n private parseSSEEvents(buffer: string): { events: SSEEvent[]; remainingBuffer: string } {\n const events: SSEEvent[] = []\n let remainingBuffer = ''\n\n const eventBlocks = buffer.split('\\n\\n')\n\n for (let i = 0; i < eventBlocks.length; i++) {\n const block = eventBlocks[i]\n\n if (i === eventBlocks.length - 1 && !buffer.endsWith('\\n\\n')) {\n remainingBuffer = block\n break\n }\n\n if (!block.trim()) continue\n\n const event: SSEEvent = {}\n const lines = block.split('\\n')\n const dataLines: string[] = []\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n event.type = line.slice(7)\n } else if (line.startsWith('data: ')) {\n dataLines.push(line.slice(6))\n } else if (line.startsWith('id: ')) {\n event.id = line.slice(4)\n } else if (line.startsWith('retry: ')) {\n event.retry = parseInt(line.slice(7))\n }\n }\n\n if (dataLines.length > 0) {\n event.data = dataLines.join('\\n')\n events.push(event)\n }\n }\n\n return { events, remainingBuffer }\n }\n\n async stream(options: SSEStreamOptions, retryCount = 0): Promise<void> {\n if (this.isStreaming && retryCount === 0) {\n throw new Error('Stream is already active. Call abort() first.')\n }\n\n this.isStreaming = true\n\n let signal: AbortSignal\n if (options.signal) {\n signal = options.signal\n signal.addEventListener('abort', () => { this.isStreaming = false }, { once: true })\n } else {\n this.abortController = new AbortController()\n signal = this.abortController.signal\n }\n\n const defaultHeaders = {\n Accept: 'text/event-stream',\n 'Cache-Control': 'no-cache',\n }\n\n try {\n const response = await fetch(options.url, {\n method: options.method || 'POST',\n headers: { ...defaultHeaders, ...options.headers },\n signal,\n ...(options.body && { body: options.body }),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`)\n }\n\n const reader = response.body?.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n if (!reader) {\n throw new Error('Failed to get response reader')\n }\n\n while (this.isStreaming) {\n if (signal.aborted) break\n\n const { done, value } = await reader.read()\n if (done) break\n if (signal.aborted) break\n\n buffer += decoder.decode(value, { stream: true })\n\n const { events, remainingBuffer } = this.parseSSEEvents(buffer)\n buffer = remainingBuffer\n\n for (const event of events) {\n if (event.data !== undefined) {\n const eventType = event.type || 'message'\n const handler = this.eventHandlers.get(eventType)\n if (handler) {\n try {\n handler(event.data, event)\n } catch (handlerError) {\n console.error(`Error in event handler for ${eventType}:`, handlerError)\n }\n }\n }\n }\n }\n\n this.completeHandler?.()\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Stream was intentionally aborted\n } else if (this.errorHandler && error instanceof Error) {\n this.errorHandler(error)\n } else {\n console.error('Stream error:', error)\n }\n } finally {\n this.isStreaming = false\n this.abortController = undefined\n }\n }\n\n abort(): void {\n this.abortController?.abort()\n this.isStreaming = false\n }\n\n get streaming(): boolean {\n return this.isStreaming\n }\n\n clearHandlers(): this {\n this.eventHandlers.clear()\n this.errorHandler = undefined\n this.completeHandler = undefined\n return this\n }\n\n getRegisteredEvents(): string[] {\n return Array.from(this.eventHandlers.keys())\n }\n}\n","import { SSEStreamClient } from './sse-client'\n\ntype EventHandler = (data: string, event: { type?: string; data?: string; id?: string; retry?: number }) => void\ntype ErrorHandler = (error: Error) => void\ntype CompleteHandler = () => void\ntype OpenHandler = () => void\n\ninterface ConnectionOptions {\n url: string\n method: string\n headers: Record<string, string>\n body: string\n}\n\nexport class AnalyticsSSEClient {\n private client: SSEStreamClient | null = null\n private retryCount = 0\n private maxRetries = 5\n private didConnect = false\n private retryTimeout?: ReturnType<typeof setTimeout>\n private isRetrying = false\n private eventHandlers = new Map<string, EventHandler>()\n private errorHandler?: ErrorHandler\n private completeHandler?: CompleteHandler\n private openHandler?: OpenHandler\n private connectionOptions?: ConnectionOptions\n private isAborted = false\n\n on(eventType: string, handler: EventHandler): this {\n this.eventHandlers.set(eventType, handler)\n return this\n }\n\n onOpen(handler: OpenHandler): this {\n this.openHandler = handler\n return this\n }\n\n onError(handler: ErrorHandler): this {\n this.errorHandler = handler\n return this\n }\n\n onComplete(handler: CompleteHandler): this {\n this.completeHandler = handler\n return this\n }\n\n async connect(options: ConnectionOptions): Promise<void> {\n this.connectionOptions = options\n this.isAborted = false\n this.retryCount = 0\n this.didConnect = false\n this.isRetrying = false\n return this.attemptConnection()\n }\n\n private async attemptConnection(): Promise<void> {\n if (this.isAborted) return\n\n this.client = new SSEStreamClient()\n\n this.eventHandlers.forEach((handler, eventType) => {\n this.client!.on(eventType, (data, event) => {\n if (!this.didConnect && eventType !== 'error') {\n this.didConnect = true\n this.isRetrying = false\n this.openHandler?.()\n }\n handler(data, event)\n })\n })\n\n this.client.on('error', (data) => {\n try {\n const parsed = JSON.parse(data)\n if (parsed.message?.includes('Request not found') && this.retryCount < this.maxRetries) {\n this.isRetrying = true\n this.handleRetry('Request not ready')\n return\n }\n } catch {\n // Not JSON, ignore\n }\n })\n\n this.client.onError((error) => {\n if (!this.didConnect && this.retryCount < this.maxRetries) {\n this.isRetrying = true\n this.handleRetry('Connection failed')\n } else if (this.errorHandler) {\n this.errorHandler(error)\n }\n })\n\n if (this.completeHandler) {\n this.client.onComplete(() => {\n if (this.isRetrying) return\n this.completeHandler!()\n })\n }\n\n try {\n await this.client.stream({\n url: this.connectionOptions!.url,\n method: this.connectionOptions!.method,\n headers: this.connectionOptions!.headers,\n body: this.connectionOptions!.body,\n })\n\n if (!this.didConnect) {\n this.didConnect = true\n this.openHandler?.()\n }\n } catch (error) {\n if (!this.didConnect && this.retryCount < this.maxRetries && !this.isAborted) {\n this.isRetrying = true\n this.handleRetry('Connection error during stream')\n } else if (this.errorHandler && !this.isAborted) {\n this.errorHandler(error instanceof Error ? error : new Error(String(error)))\n }\n }\n }\n\n private handleRetry(reason: string): void {\n this.client?.abort()\n this.retryCount++\n const retryDelay = 200\n\n console.log(`⏳ ${reason}, retrying in ${retryDelay}ms (attempt ${this.retryCount}/${this.maxRetries})...`)\n\n this.retryTimeout = setTimeout(() => {\n if (!this.isAborted) {\n this.attemptConnection()\n }\n }, retryDelay)\n }\n\n abort(): void {\n this.isAborted = true\n if (this.retryTimeout) {\n clearTimeout(this.retryTimeout)\n this.retryTimeout = undefined\n }\n if (this.client) {\n this.client.abort()\n this.client = null\n }\n }\n\n get streaming(): boolean {\n return this.client?.streaming || false\n }\n\n get currentRetryCount(): number {\n return this.retryCount\n }\n\n get isConnected(): boolean {\n return this.didConnect\n }\n}\n","export const EVENT_NAME = {\n CHART: 'chart_ready',\n STREAM: 'stream',\n COMPLETE: 'complete',\n FINAL: 'final',\n ERROR: 'error',\n OPEN: 'open',\n MESSAGE: 'message',\n AGENT_THOUGHT: 'agent_thought',\n TOOL_CALL_ANNOUNCED: 'tool_call_announced',\n TOOL_CALL_ARGS_DELTA: 'tool_call_args_delta',\n TOOL_CALL_ARGS_COMPLETE: 'tool_call_args_complete',\n TOOL_OUTPUT: 'tool_output',\n TOOL_CALL_COMPLETE: 'tool_call_complete',\n PHASE_UPDATE: 'phase_update',\n FINAL_RESPONSE: 'final_response',\n} as const\n\nexport interface AgentThought {\n type: 'agent_thought'\n content: string\n is_complete: boolean\n iteration: number\n timestamp: string\n}\n\nexport interface ToolCallAnnounced {\n type: 'tool_call_announced'\n tool_name: string\n tool_display_name: string\n iteration: number\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface ToolCallArgsDelta {\n type: 'tool_call_args_delta'\n tool_name: string\n args_delta: string\n args_preview?: string\n private_args?: boolean\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface ToolCallArgsComplete {\n type: 'tool_call_args_complete'\n tool_name: string\n full_args: Record<string, any>\n args_preview?: string\n private_args?: boolean\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface ToolOutput {\n type: 'tool_output'\n tool_name: string\n content: string\n content_type: 'code' | 'sql' | 'json' | 'text'\n is_complete: boolean\n private_output?: boolean\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface ToolCallComplete {\n type: 'tool_call_complete'\n tool_name: string\n status: 'success' | 'error'\n duration_ms: number\n result_preview?: string\n error_message?: string\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface FinalResponse {\n type: 'final_response'\n response_data: {\n response_type: string\n generated_text: string\n chart_type?: string\n data?: any[]\n pandas_code?: string\n thoughts?: string\n [key: string]: any\n }\n llm_data_id: string\n total_iterations: number\n total_duration_ms: number\n token_usage?: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n timestamp: string\n}\n\nexport interface ToolCall {\n tool_name: string\n tool_display_name: string\n args_preview: string\n status: 'announced' | 'streaming' | 'ready' | 'executing' | 'success' | 'error'\n output?: string\n code?: string\n isStreamingArgs?: boolean\n hasPrivateArgs?: boolean\n hasPrivateOutput?: boolean\n duration_ms?: number\n error_message?: string\n tool_call_id?: string\n timestamp: string\n}\n\nexport interface TimelineEvent {\n type: 'thought' | 'tool'\n timestamp: string\n iteration?: number\n thoughtData?: AgentThought\n toolData?: ToolCall\n}\n\nexport interface PhaseUpdate {\n type: 'phase_update'\n phase: string\n message: string\n iteration?: number\n max_iterations?: number\n timestamp: string\n}\n\nexport interface StreamError {\n type: 'error'\n error_type: string\n message: string\n action: 'retrying' | 'failed'\n iteration?: number\n timestamp: string\n}\n\nexport interface CompleteEvent {\n type: 'complete'\n status: 'success' | 'cancelled' | 'error'\n message: string\n timestamp: string\n}\n\nexport type StreamEvent =\n | AgentThought\n | ToolCallAnnounced\n | ToolCallArgsDelta\n | ToolCallArgsComplete\n | ToolOutput\n | ToolCallComplete\n | PhaseUpdate\n | StreamError\n | FinalResponse\n | CompleteEvent\n\nexport const TOOL_DISPLAY_NAMES: Record<string, string> = {\n execute_python_code: 'Python Analysis',\n generate_sql_tool: 'SQL Query Generation',\n web_search: 'Web Search',\n explore_data_tool: 'Database Exploration',\n workspace_tool: 'Workspace Selection',\n slack_tool: 'Slack Integration',\n internal_information_lookup: 'Knowledge Base Lookup',\n}\n\nexport const EXECUTION_PHASES = {\n INITIALIZING: 'initializing',\n PROMPT_PREP: 'prompt_prep',\n AGENT_EXEC: 'agent_exec',\n TOOL_CALL: 'tool_call',\n RESPONSE_PROC: 'response_proc',\n COMPLETE: 'complete',\n} as const\n\nexport type ExecutionPhase = (typeof EXECUTION_PHASES)[keyof typeof EXECUTION_PHASES]\n\nexport type TimelineRenderItem =\n | { kind: 'thought'; events: TimelineEvent[]; key: string }\n | { kind: 'collapsed-tools'; toolCalls: ToolCall[]; key: string }\n | { kind: 'tool'; event: TimelineEvent; isLatest: boolean; key: string }\n\nexport interface StreamState {\n thoughts: AgentThought[]\n toolCalls: ToolCall[]\n timeline: TimelineEvent[]\n currentPhase: string\n error: string | null\n finalResponse: any | null\n isComplete: boolean\n isConnected: boolean\n isStreaming: boolean\n}\n","import * as React from 'react'\n\nimport type { ToastActionElement, ToastProps } from '../components/ui/toast'\n\nconst TOAST_LIMIT = 1\nconst TOAST_REMOVE_DELAY = 1000000\n\ntype ToasterToast = ToastProps & {\n id: string\n title?: React.ReactNode\n description?: React.ReactNode\n action?: ToastActionElement\n}\n\nlet count = 0\n\nfunction genId() {\n count = (count + 1) % Number.MAX_SAFE_INTEGER\n return count.toString()\n}\n\ntype Action =\n | { type: 'ADD_TOAST'; toast: ToasterToast }\n | { type: 'UPDATE_TOAST'; toast: Partial<ToasterToast> }\n | { type: 'DISMISS_TOAST'; toastId?: string }\n | { type: 'REMOVE_TOAST'; toastId: string }\n\ninterface State {\n toasts: ToasterToast[]\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) return\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId)\n dispatch({ type: 'REMOVE_TOAST', toastId })\n }, TOAST_REMOVE_DELAY)\n toastTimeouts.set(toastId, timeout)\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case 'ADD_TOAST':\n return { ...state, toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT) }\n case 'UPDATE_TOAST':\n return { ...state, toasts: state.toasts.map((t) => (t.id === action.toast.id ? { ...t, ...action.toast } : t)) }\n case 'DISMISS_TOAST': {\n const { toastId } = action\n if (toastId) {\n addToRemoveQueue(toastId)\n } else {\n state.toasts.forEach((t) => addToRemoveQueue(t.id))\n }\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined ? { ...t, open: false } : t\n ),\n }\n }\n case 'REMOVE_TOAST':\n if (action.toastId === undefined) return { ...state, toasts: [] }\n return { ...state, toasts: state.toasts.filter((t) => t.id !== action.toastId) }\n }\n}\n\nconst listeners: Array<(state: State) => void> = []\nlet memoryState: State = { toasts: [] }\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action)\n listeners.forEach((listener) => listener(memoryState))\n}\n\ntype Toast = Omit<ToasterToast, 'id'>\n\nfunction toast({ ...props }: Toast) {\n const id = genId()\n const update = (props: ToasterToast) => dispatch({ type: 'UPDATE_TOAST', toast: { ...props, id } })\n const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id })\n\n dispatch({\n type: 'ADD_TOAST',\n toast: { ...props, id, open: true, onOpenChange: (open) => { if (!open) dismiss() } },\n })\n\n return { id, dismiss, update }\n}\n\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState)\n\n React.useEffect(() => {\n listeners.push(setState)\n return () => {\n const index = listeners.indexOf(setState)\n if (index > -1) listeners.splice(index, 1)\n }\n }, [state])\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }),\n }\n}\n\nexport { useToast, toast }\n","import * as React from 'react'\nimport * as ToastPrimitives from '@radix-ui/react-toast'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { X } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\nconst ToastProvider = ToastPrimitives.Provider\n\nconst ToastViewport = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Viewport>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Viewport\n ref={ref}\n className={cn(\n 'fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]',\n className\n )}\n {...props}\n />\n))\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\n\nconst toastVariants = cva(\n 'group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',\n {\n variants: {\n variant: {\n default: 'border-white/20 bg-background text-foreground',\n destructive: 'destructive group border-destructive bg-destructive text-destructive-foreground',\n },\n },\n defaultVariants: { variant: 'default' },\n }\n)\n\nconst Toast = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => (\n <ToastPrimitives.Root ref={ref} className={cn(toastVariants({ variant }), className)} {...props} />\n))\nToast.displayName = ToastPrimitives.Root.displayName\n\nconst ToastAction = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Action>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Action\n ref={ref}\n className={cn(\n 'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive',\n className\n )}\n {...props}\n />\n))\nToastAction.displayName = ToastPrimitives.Action.displayName\n\nconst ToastClose = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Close>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Close\n ref={ref}\n className={cn(\n 'absolute right-1 top-1 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600',\n className\n )}\n toast-close=\"\"\n {...props}\n >\n <X className=\"h-4 w-4\" />\n </ToastPrimitives.Close>\n))\nToastClose.displayName = ToastPrimitives.Close.displayName\n\nconst ToastTitle = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Title>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Title ref={ref} className={cn('text-sm font-semibold [&+div]:text-xs', className)} {...props} />\n))\nToastTitle.displayName = ToastPrimitives.Title.displayName\n\nconst ToastDescription = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Description>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Description ref={ref} className={cn('text-sm opacity-90', className)} {...props} />\n))\nToastDescription.displayName = ToastPrimitives.Description.displayName\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\n\nexport {\n type ToastProps,\n type ToastActionElement,\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n}\n","import { useToast } from '../../hooks/use-toast'\nimport {\n Toast,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastTitle,\n ToastViewport,\n} from './toast'\n\nexport function Toaster() {\n const { toasts } = useToast()\n\n return (\n <ToastProvider>\n {toasts.map(({ id, title, description, action, ...props }) => (\n <Toast key={id} {...props}>\n <div className=\"grid gap-1\">\n {title && <ToastTitle>{title}</ToastTitle>}\n {description && <ToastDescription>{description}</ToastDescription>}\n </div>\n {action}\n <ToastClose />\n </Toast>\n ))}\n <ToastViewport />\n </ToastProvider>\n )\n}\n","'use client'\n\nimport * as React from 'react'\n\nexport interface ThemeProviderProps {\n children: React.ReactNode\n theme: 'light' | 'dark'\n}\n\n/**\n * Minimal theme provider for the plugin.\n *\n * This does not enforce any specific theming library. Host apps can\n * wrap PapermapChat with their own providers (e.g. next-themes,\n * custom context, CSS variables). This exists mainly for API parity\n * with the main app and as a convenient wrapper.\n */\nexport function ThemeProvider({ children, theme }: ThemeProviderProps) {\n return <div className={theme}>{children}</div>\n}\n","'use client'\n\nimport React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport {\n ArrowDown,\n Brain,\n Copy,\n Edit2,\n Eye,\n FullscreenIcon,\n Loader2,\n Split,\n Terminal,\n User,\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { usePapermapStore, usePapermapStoreApi, CHAT_MODAL_TAB } from '../store'\nimport type { Message } from '../types'\n\nimport { Alert, AlertDescription, AlertTitle } from './ui/alert'\nimport { Button } from './ui/button'\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'\nimport { MarkdownRenderer } from './ui/markdown'\nimport { ThinkingMessage } from './ui/ThinkingMessage'\nimport { ChatCodeBlock } from './ui/chat-code-block'\nimport { ButtonWithTooltip } from './common/ButtonWithTooltip'\nimport { BookmarkButton } from './common/BookmarkButton'\nimport { BranchButton } from './common/BranchButton'\nimport { FeedbackButtons } from './common/FeedbackButtons'\nimport { ThinkingLogo } from './common/ThinkingLogo'\nimport LogoStandAlone from './LogoStandAlone'\nimport MorphGradient from './MorphGradient'\nimport { StreamingTimeline } from './dashboard/StreamingTimeline'\nimport { RecentConversations } from './dashboard/RecentConversations'\nimport { ChartHistory } from './dashboard/ChartHistory'\nimport { SavedMemory } from './dashboard/SavedMemory'\nimport { ChartView } from './charts/ChartView'\nimport { ChartDialog } from './charts/ChartDialog'\nimport { DataTable } from './charts/DataTable'\nimport { toast } from '../hooks/use-toast'\n\nconst EASE = [0.23, 1, 0.32, 1] as const\nconst APP_NAME = 'Papermap'\n\nasync function copyToClipboard({\n value,\n successMessage = 'Copied to clipboard successfully',\n}: {\n value: string\n successMessage?: string\n}) {\n try {\n await navigator.clipboard.writeText(value)\n toast({ title: 'Success', description: successMessage })\n return true\n } catch (error) {\n console.error('Failed to copy to clipboard:', error)\n toast({ title: 'Error', description: 'Failed to copy to clipboard', variant: 'destructive' })\n return false\n }\n}\n\nfunction detectLanguage(code: string): string {\n if (/^\\s*(import |from |def |class |if __name__)/.test(code)) return 'python'\n if (/^\\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|ALTER|DROP)\\b/i.test(code)) return 'sql'\n try {\n JSON.parse(code)\n return 'json'\n } catch {\n /* noop */\n }\n return 'text'\n}\n\nconst SUGGESTIONS = [\n 'Show me revenue trends for the last quarter',\n 'What are my top performing products?',\n 'Compare sales month over month',\n 'Summarize the key metrics',\n]\n\nfunction getRandomSuggestions(count = 3) {\n return [...SUGGESTIONS].sort(() => Math.random() - 0.5).slice(0, count)\n}\n\nfunction getAssistantDimensions(\n selectedType: 'chart' | null,\n options?: { expanded?: boolean; toolbarHeight?: number }\n) {\n const expanded = options?.expanded === true\n const toolbarHeight = options?.toolbarHeight || 0\n const topEdgeGapPx = 48\n const bottomExtraGapPx = 16\n const fallbackBottomGapPx = 80\n const bottomGap = toolbarHeight > 0 ? toolbarHeight + bottomExtraGapPx : fallbackBottomGapPx\n const defaultHeightExpanded = expanded\n ? `calc(100vh - ${topEdgeGapPx + bottomGap}px)`\n : 'calc(100vh - 110px)'\n\n const isMobile = typeof window !== 'undefined' && window.innerWidth < 768\n if (isMobile) {\n return { width: expanded ? '95vw' : '90vw', height: expanded ? defaultHeightExpanded : '60vh' }\n }\n\n const screenWidth = typeof window !== 'undefined' ? window.innerWidth : 1024\n let width: string | number\n if (screenWidth >= 1536) width = expanded ? '96vw' : '45vw'\n else if (screenWidth >= 1280) width = expanded ? '97vw' : '55vw'\n else if (screenWidth >= 1024) width = expanded ? '98vw' : '65vw'\n else if (screenWidth >= 768) width = expanded ? '98vw' : '75vw'\n else width = expanded ? '95vw' : '90vw'\n\n const maxWidth = expanded ? 1920 : 1100\n if (typeof width === 'string' && width.includes('vw')) {\n const vwValue = parseInt(width)\n if ((screenWidth * vwValue) / 100 > maxWidth) width = maxWidth\n }\n\n if (selectedType === 'chart') {\n const chartMaxWidth = expanded ? 1920 : 1400\n let chartWidth: string | number\n if (screenWidth >= 1736) chartWidth = expanded ? '98vw' : '1400px'\n else if (screenWidth >= 1280) chartWidth = expanded ? '97vw' : '68vw'\n else if (screenWidth >= 1024) chartWidth = expanded ? '98vw' : '90vw'\n else if (screenWidth >= 768) chartWidth = expanded ? '98vw' : '92vw'\n else chartWidth = expanded ? '95vw' : '95vw'\n if (typeof chartWidth === 'string' && chartWidth.includes('vw')) {\n const vwValue = parseInt(chartWidth)\n if ((screenWidth * vwValue) / 100 > chartMaxWidth) chartWidth = chartMaxWidth\n }\n return { width: chartWidth, height: expanded ? defaultHeightExpanded : '65vh' }\n }\n\n return { width, height: expanded ? defaultHeightExpanded : '60vh' }\n}\n\n// ── RundownBubble ────────────────────────────────────────────────────\n\nfunction RundownBubble({\n message,\n isExpanded,\n isChartVisible,\n initialMessage,\n children,\n}: {\n message: Message\n isExpanded?: boolean\n isChartVisible?: boolean\n initialMessage?: Message\n children: React.ReactNode\n}) {\n return (\n <div\n className={cn(\n 'rounded-2xl text-sm break-words',\n message.role === 'user'\n ? 'bg-primary ml-auto text-primary-foreground rounded-tr-sm max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px] px-4 py-2.5'\n : isExpanded && !isChartVisible\n ? 'bg-muted/50 rounded-tl-sm max-w-full w-full px-4 py-2.5'\n : initialMessage && message.content === initialMessage.content\n ? 'bg-muted/50 rounded-tl-sm max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px] px-6 py-4 [&_h1]:text-xl [&_h1]:font-semibold [&_h1]:mb-3 [&_h2]:text-lg [&_h2]:font-semibold [&_h2]:mt-4 [&_h2]:mb-2 [&_p]:mb-2 [&_ul]:list-disc [&_ul]:ml-4 [&_ul]:mb-2 [&_li]:mb-1 [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_pre]:bg-muted [&_pre]:p-3 [&_pre]:rounded-lg [&_pre]:overflow-x-auto [&_pre]:my-2'\n : 'bg-muted/50 rounded-tl-sm max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px] px-4 py-2.5'\n )}\n >\n {children}\n </div>\n )\n}\n\n// ── MessageItem ──────────────────────────────────────────────────────\n\nconst MessageItem = memo(function MessageItem({\n message,\n index,\n isThinking,\n isLastMessage,\n onBookmarkMessage,\n onCollapseThought,\n bookmarkLoading,\n feedbackLoading,\n feedbackLoadingType,\n tempChartData,\n onFeedback,\n onBranch,\n onEditSave,\n initialMessage,\n hideAvatar = false,\n hideThinkingProcess = false,\n isExpanded = false,\n isChartVisible = false,\n isViewer = false,\n}: {\n message: Message\n index: number\n isThinking: boolean\n isLastMessage: boolean\n onBookmarkMessage: (index: number) => void\n onCollapseThought: (index: number) => void\n bookmarkLoading: number | null\n feedbackLoading: number | null\n feedbackLoadingType: 'positive' | 'negative' | null\n tempChartData: any[]\n onFeedback: (index: number, type: 'positive' | 'negative') => void\n onBranch: (index: number) => void\n onEditSave: (message: Message) => void\n initialMessage?: Message\n hideAvatar?: boolean\n hideThinkingProcess?: boolean\n isExpanded?: boolean\n isChartVisible?: boolean\n isViewer?: boolean\n}) {\n const [isEditing, setIsEditing] = useState(false)\n const [editedContent, setEditedContent] = useState(message.content)\n const [originalContent] = useState(message.content)\n\n const handleEditClick = () => {\n setIsEditing(true)\n setEditedContent(message.content)\n }\n const handleCancel = () => {\n setIsEditing(false)\n setEditedContent(message.content)\n }\n const handleSave = () => {\n if (editedContent.trim()) {\n onEditSave({ ...message, content: editedContent, originalContent } as any)\n setIsEditing(false)\n }\n }\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className={cn(\n 'flex gap-3 group/message',\n message.role === 'user' ? 'flex-row-reverse items-start' : 'items-start',\n hideAvatar && 'gap-0'\n )}\n >\n {!hideAvatar && (\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n 'bg-primary',\n isLastMessage && isThinking && 'bg-transparent'\n )}\n >\n {message.role === 'user' ? (\n <User className=\"h-4 w-4 text-primary-foreground\" />\n ) : isLastMessage && isThinking ? (\n <ThinkingLogo size=\"md\" />\n ) : (\n <LogoStandAlone className=\"h-4 w-4\" />\n )}\n </div>\n )}\n <div\n className={cn(\n 'flex flex-col min-w-0',\n message.role === 'user' ? 'items-end gap-0' : 'gap-1',\n message.role === 'assistant' && isExpanded && !isChartVisible\n ? 'max-w-full w-full flex-1'\n : 'max-w-[90%]',\n message.role === 'user' && 'max-w-[90%]',\n hideAvatar && 'max-w-full'\n )}\n >\n {message.role === 'error' ? (\n <Alert variant=\"destructive\">\n <Terminal className=\"h-3.5 w-3.5\" />\n <AlertTitle />\n <AlertDescription>{message?.content}</AlertDescription>\n </Alert>\n ) : (\n <div className={cn('flex flex-col', message.role === 'user' ? 'gap-0' : 'gap-2')}>\n {message.thought && message.role === 'assistant' && !hideThinkingProcess && (\n <Collapsible open={message.openThought} onOpenChange={() => onCollapseThought(index)}>\n <CollapsibleTrigger className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <Brain className=\"h-3.5 w-3.5\" />\n View thinking process\n </CollapsibleTrigger>\n <CollapsibleContent className=\"text-xs bg-muted/30 p-2\">\n <div className=\"pl-3 border-l-2 border-gray-500 text-gray-700 dark:text-white/80\">\n <MarkdownRenderer>{message.thought}</MarkdownRenderer>\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n <div className={cn('relative', message.role === 'user' && 'group')}>\n {isEditing && message.role === 'user' ? (\n <div className=\"flex flex-col gap-2 w-full max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]\">\n <textarea\n value={editedContent}\n onChange={(e) => setEditedContent(e.target.value)}\n className=\"w-full rounded-xl border border-border/50 bg-background px-4 py-3 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary/50 resize-none min-h-[80px]\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSave()\n }\n if (e.key === 'Escape') handleCancel()\n }}\n />\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleCancel} className=\"h-8 px-3\">\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={handleSave}\n className=\"h-8 px-3\"\n disabled={!editedContent.trim()}\n >\n Send\n </Button>\n </div>\n </div>\n ) : (\n <>\n <RundownBubble\n message={message}\n isExpanded={isExpanded}\n isChartVisible={isChartVisible}\n initialMessage={initialMessage}\n >\n <MarkdownRenderer>{message.content}</MarkdownRenderer>\n {isThinking ? null : (\n <div className=\"flex justify-between items-center gap-2 mt-2\">\n <div className=\"flex items-center gap-1\">\n {message.role === 'assistant' &&\n message.bookmarked !== undefined &&\n !isViewer &&\n !message?.noIcons ? (\n <BookmarkButton\n onToggle={() => onBookmarkMessage(index)}\n isLoading={Boolean(bookmarkLoading === index)}\n isBookmarked={message.bookmarked || false}\n />\n ) : null}\n\n {message.role === 'assistant' && !message?.noIcons && (\n <ButtonWithTooltip\n onClick={() =>\n copyToClipboard({\n value: message.content,\n successMessage: 'Message copied to clipboard',\n })\n }\n tooltipText=\"Copy message\"\n className=\"h-6 w-6 hover:bg-muted/80 transition-colors\"\n >\n <Copy className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </ButtonWithTooltip>\n )}\n\n {message.role === 'assistant' && !message?.noIcons && (\n <BranchButton onBranch={() => onBranch(index)} />\n )}\n\n {message.role === 'assistant' && !message?.noIcons && (\n <ChatCodeBlock\n code={message.code}\n language={detectLanguage(message.code || 'text')}\n progressEvents={message.progress_events}\n >\n {tempChartData?.length ? (\n <div className=\"h-[400px]\">\n <DataTable data={tempChartData} />\n </div>\n ) : null}\n </ChatCodeBlock>\n )}\n </div>\n\n {message.role === 'assistant' && !message?.noIcons ? (\n <FeedbackButtons\n onFeedback={(type) => onFeedback(index, type)}\n isLoading={Boolean(feedbackLoading === index)}\n selectedFeedback={message.feedback || null}\n loadingType={feedbackLoading === index ? feedbackLoadingType : null}\n />\n ) : null}\n </div>\n )}\n </RundownBubble>\n {message.role === 'user' && !isEditing && (\n <div className=\"max-h-0 overflow-hidden group-hover/message:max-h-10 transition-all duration-200 ease-out\">\n <div className=\"flex items-center gap-1 mt-1 justify-end opacity-0 group-hover/message:opacity-100 transition-opacity duration-200\">\n {!message?.is_inherited && !message?.is_rundown ? (\n <ButtonWithTooltip\n onClick={handleEditClick}\n tooltipText=\"Edit message\"\n className=\"h-6 w-6 hover:bg-muted/80 transition-colors\"\n >\n <Edit2 className=\"h-3.5 w-3.5\" />\n </ButtonWithTooltip>\n ) : null}\n\n <ButtonWithTooltip\n onClick={() =>\n copyToClipboard({\n value: message.content,\n successMessage: 'Message copied to clipboard',\n })\n }\n tooltipText=\"Copy message\"\n className=\"h-6 w-6 hover:bg-muted/80 transition-colors\"\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </ButtonWithTooltip>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n )}\n {message.status === 'done' && (\n <span className=\"text-[10px] text-muted-foreground px-2\">\n {message.role === 'user' ? 'You' : `${APP_NAME} AI`}\n </span>\n )}\n </div>\n </motion.div>\n )\n})\n\nMessageItem.displayName = 'MessageItem'\n\n// ── ChatAssistant (zero props - reads from store) ────────────────────\n\nexport function ChatAssistant() {\n const messages = usePapermapStore((s) => s.messages)\n const isThinking = usePapermapStore((s) => s.isLoading)\n const isLoadingMore = usePapermapStore((s) => s.isLoadingMore)\n const inputValue = usePapermapStore((s) => s.inputValue)\n const handleScroll = usePapermapStore((s) => s.handleScroll)\n const setInputValue = usePapermapStore((s) => s.setInputValue)\n const handleSubmit = usePapermapStore((s) => s.handleSubmit)\n const setIsFocused = usePapermapStore((s) => s.setIsFocused)\n const setIsOpen = usePapermapStore((s) => s.setIsOpen)\n const chatModalTab = usePapermapStore((s) => s.chatModalTab)\n const chatId = usePapermapStore((s) => s.chatId)\n const editChatId = usePapermapStore((s) => s.editChatId)\n const chartData = usePapermapStore((s) => s.chartData)\n const allMeta = usePapermapStore((s) => s.allMeta)\n const selectedChartType = usePapermapStore((s) => s.selectedChartType)\n const chartVisuals = usePapermapStore((s) => s.chartVisuals)\n\n const sseTimeline = usePapermapStore((s) => s.sseTimeline)\n const ssePhase = usePapermapStore((s) => s.ssePhase)\n const sseIsStreaming = usePapermapStore((s) => s.sseIsStreaming)\n const sseIsComplete = usePapermapStore((s) => s.sseIsComplete)\n const sseToolCalls = usePapermapStore((s) => s.sseToolCalls)\n const sseThoughts = usePapermapStore((s) => s.sseThoughts)\n\n const storeApi = usePapermapStoreApi()\n const refs = storeApi.getState().getRefs()\n const { chartSvc } = storeApi.getState().getServices()\n const config = storeApi.getState().getConfig()\n\n const scrollViewportRef = useRef<HTMLDivElement>(null)\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const userIsScrolledUp = useRef(false)\n const previousMessagesLength = useRef(0)\n const hasScrolledToBottomForInitial = useRef(false)\n const previousChatIdRef = useRef<string>('')\n\n const [showScrollButton, setShowScrollButton] = useState(false)\n const [isMaximized, setIsMaximized] = useState(false)\n const [isExpanded, setIsExpanded] = useState(false)\n const [tempChartData, setTempChartData] = useState(chartData)\n const [isChartVisible, setIsChartVisible] = useState(true)\n const [bookmarkLoading, setBookmarkLoading] = useState<number | null>(null)\n const [feedbackLoading, setFeedbackLoading] = useState<number | null>(null)\n const [feedbackLoadingType, setFeedbackLoadingType] = useState<'positive' | 'negative' | null>(\n null\n )\n const [isBranching, setIsBranching] = useState(false)\n\n const chatIdToUse = editChatId || chatId\n\n const suggestedPrompts = useMemo(() => getRandomSuggestions(3), [])\n const hasActiveSSE = sseIsStreaming || sseTimeline.length > 0\n\n const dimensions = getAssistantDimensions(chartData?.length && isChartVisible ? 'chart' : null, {\n expanded: isExpanded,\n })\n\n const floatingActionButtonClasses =\n 'h-8 px-3 backdrop-blur-md border border-border/50 shadow-lg hover:shadow-xl transition-all duration-200 flex items-center justify-center gap-2 text-sm font-medium'\n\n const scrollToBottom = useCallback(() => {\n if (refs.scrollRef?.current) {\n refs.scrollRef.current.scrollTo({\n top: refs.scrollRef.current.scrollHeight,\n behavior: 'smooth',\n })\n } else {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }\n }, [refs.scrollRef])\n\n const toggleExpanded = useCallback(() => setIsExpanded((p) => !p), [])\n\n useEffect(() => {\n const currentId = chatIdToUse\n if (currentId !== previousChatIdRef.current) {\n hasScrolledToBottomForInitial.current = false\n previousMessagesLength.current = 0\n userIsScrolledUp.current = false\n previousChatIdRef.current = currentId || ''\n }\n }, [chatIdToUse])\n\n useEffect(() => {\n if (chatIdToUse && messages.length > 0 && !hasScrolledToBottomForInitial.current) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (refs.scrollRef?.current) {\n refs.scrollRef.current.scrollTop = refs.scrollRef.current.scrollHeight\n hasScrolledToBottomForInitial.current = true\n }\n })\n })\n }\n }, [chatIdToUse, messages.length, refs.scrollRef])\n\n useEffect(() => {\n if (messages.length === 0) {\n hasScrolledToBottomForInitial.current = false\n previousMessagesLength.current = 0\n userIsScrolledUp.current = false\n }\n }, [messages.length])\n\n useEffect(() => {\n if (chartData?.length) setTempChartData(chartData)\n else {\n setTempChartData([])\n setIsChartVisible(true)\n }\n }, [chartData])\n\n useEffect(() => {\n if (isLoadingMore) return\n const isInitialLoad = previousMessagesLength.current === 0 && messages.length > 0\n if (isInitialLoad && !hasScrolledToBottomForInitial.current) {\n hasScrolledToBottomForInitial.current = true\n requestAnimationFrame(() => scrollToBottom())\n previousMessagesLength.current = messages.length\n return\n }\n previousMessagesLength.current = messages.length\n if (refs.scrollRef?.current) {\n const { scrollTop, scrollHeight, clientHeight } = refs.scrollRef.current\n if (scrollHeight - scrollTop - clientHeight < 200) scrollToBottom()\n } else {\n scrollToBottom()\n }\n }, [messages, scrollToBottom, isLoadingMore, refs.scrollRef])\n\n useEffect(() => {\n if (userIsScrolledUp.current) return\n if (sseIsStreaming || sseToolCalls.length > 0 || sseThoughts.length > 0) {\n const timer = setTimeout(() => {\n if (!userIsScrolledUp.current && refs.scrollRef?.current) {\n const { scrollTop, scrollHeight, clientHeight } = refs.scrollRef.current\n if (scrollHeight - scrollTop - clientHeight <= 200) scrollToBottom()\n }\n }, 100)\n return () => clearTimeout(timer)\n }\n }, [sseIsStreaming, sseToolCalls, sseThoughts, sseTimeline, scrollToBottom])\n\n const handleChartToggle = (open: boolean) => {\n setIsChartVisible(open)\n if (open) {\n storeApi.getState().updateChartData(tempChartData)\n }\n }\n\n const collapseThought = useCallback(\n (index: number) => {\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((msg, i) => (i === index ? { ...msg, openThought: !msg.openThought } : msg))\n )\n },\n [storeApi]\n )\n\n const handleBookmarkMessage = useCallback(\n async (messageIndex: number) => {\n const msg = messages[messageIndex]\n if (!msg) return\n setBookmarkLoading(messageIndex)\n try {\n if (msg.bookmarked) {\n await chartSvc.removeBookmark(msg.bookmark_id || '')\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) => (i === messageIndex ? { ...m, bookmarked: false } : m))\n )\n } else {\n const result = await chartSvc.bookmarkConversation({\n llm_data_id: msg.id || msg.llm_data_id || '',\n dashboard_id: config.dashboardId,\n })\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) =>\n i === messageIndex\n ? { ...m, bookmarked: true, bookmark_id: result.data?.bookmark_id }\n : m\n )\n )\n }\n } catch (error) {\n console.error('Bookmark error:', error)\n toast({ title: 'Error', description: 'Failed to bookmark', variant: 'destructive' })\n } finally {\n setBookmarkLoading(null)\n }\n },\n [messages, chartSvc, storeApi, config.dashboardId]\n )\n\n const handleFeedback = useCallback(\n async (messageIndex: number, feedbackType: 'positive' | 'negative') => {\n const msg = messages[messageIndex]\n if (!msg || !msg.id) return\n setFeedbackLoading(messageIndex)\n setFeedbackLoadingType(feedbackType)\n try {\n await chartSvc.updateResponseLabel(msg.id, feedbackType)\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) => (i === messageIndex ? { ...m, feedback: feedbackType } : m))\n )\n toast({ title: 'Success', description: 'Feedback recorded successfully!' })\n } catch (error) {\n console.error('Feedback error:', error)\n toast({ title: 'Error', description: 'Failed to record feedback', variant: 'destructive' })\n } finally {\n setFeedbackLoading(null)\n setFeedbackLoadingType(null)\n }\n },\n [messages, chartSvc, storeApi]\n )\n\n const handleBranch = useCallback(\n async (messageIndex: number) => {\n const msg = messages[messageIndex]\n const llmDataId = msg?.llm_data_id || msg?.id\n if (!msg || !llmDataId || !chatIdToUse) return\n setIsBranching(true)\n try {\n const response = await chartSvc.branchConversation(config.dashboardId, llmDataId)\n const newChatId = response?.data?.new_chat_id || ''\n storeApi.getState().clearStreamingState()\n storeApi.getState().setChatId(newChatId)\n storeApi.getState().setEditChatId(null)\n // Mark as loaded so ConversationLoader doesn't overwrite our messages when chatId changes\n refs.loadedConversationChatIdRef.current = newChatId\n const branchMsg: Message = {\n role: 'branch' as any,\n content: 'Branched from Conversation',\n status: 'done',\n }\n const inherited = messages.map((m) => ({ ...m, is_inherited: true, noIcons: true }))\n storeApi.getState().setMessages([...inherited.slice(0, messageIndex + 1), branchMsg])\n toast({\n title: 'Success',\n description: `Branch created successfully! ${response?.data?.inherited_message_count || 0} messages inherited.`,\n })\n } catch (error) {\n console.error('Branch error:', error)\n toast({ title: 'Error', description: 'Failed to create branch', variant: 'destructive' })\n } finally {\n setIsBranching(false)\n }\n },\n [messages, chatIdToUse, chartSvc, storeApi, refs, config.dashboardId]\n )\n\n const handleEditSave = useCallback(\n (editedMessage: Message) => {\n // For now, a simplified edit handler\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m) => (m.id === editedMessage.id ? editedMessage : m))\n )\n },\n [storeApi]\n )\n\n const onScrollInternal = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (refs.scrollRef?.current) {\n const { scrollTop, scrollHeight, clientHeight } = refs.scrollRef.current\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight\n userIsScrolledUp.current = distanceFromBottom > 200\n setShowScrollButton(distanceFromBottom > 200)\n }\n handleScroll(e)\n },\n [handleScroll, refs.scrollRef]\n )\n\n const visibleMessages = useMemo(() => {\n if (messages.length <= 50) return messages\n return messages.slice(-50)\n }, [messages])\n\n const onSuggestionClick = useCallback(\n async (suggestion: string) => {\n setInputValue(suggestion)\n await handleSubmit(suggestion)\n },\n [setInputValue, handleSubmit]\n )\n\n const renderChart = () => {\n if (!tempChartData?.length) return null\n return (\n <div className=\"w-full h-full\">\n <ChartView\n data={tempChartData}\n chartId={chatIdToUse || undefined}\n chartMeta={allMeta}\n chartType={selectedChartType || ''}\n visualizationConfig={chartVisuals}\n variant=\"\"\n onClose={() => handleChartToggle(false)}\n onMaximize={() => setIsMaximized(true)}\n showIcons={true}\n />\n </div>\n )\n }\n\n return (\n <motion.div\n initial={{ opacity: 0, scale: 0.98, width: 400, height: 0 }}\n animate={{\n opacity: 1,\n scale: 1,\n width: typeof dimensions.width === 'string' ? dimensions.width : `${dimensions.width}px`,\n height:\n typeof dimensions.height === 'string' ? dimensions.height : `${dimensions.height}px`,\n transition: {\n duration: 0.3,\n ease: EASE,\n opacity: { duration: 0.2 },\n scale: { duration: 0.3, ease: EASE },\n width: { duration: 0.3, ease: EASE },\n height: { duration: 0.3, ease: EASE },\n },\n }}\n exit={{\n opacity: 0,\n scale: 0.98,\n width: 400,\n height: 0,\n transition: { duration: 0.2, ease: EASE },\n }}\n className={cn(\n 'rounded-3xl bg-background/85 border border-border/50 backdrop-blur-lg overflow-hidden flex flex-col w-[95vw] md:w-[75vw] lg:w-[65vw] xl:w-[55vw]',\n isExpanded ? 'max-w-none' : 'max-w-[1300px]',\n chartData?.length && isChartVisible\n ? isExpanded\n ? 'h-[65vh] md:h-[70vh] lg:h-[calc(100vh-90px)] xl:h-[calc(100vh-90px)]'\n : 'h-[55vh] md:h-[60vh] lg:h-[62vh] xl:h-[65vh] max-h-[650px] md:max-h-[700px] lg:max-h-[720px] xl:max-h-[750px]'\n : isExpanded\n ? 'h-[calc(100vh-90px)]'\n : 'h-[70vh] max-h-[600px]'\n )}\n style={{ transformOrigin: 'bottom center' }}\n onClick={(e) => {\n if (!(e.target instanceof HTMLAnchorElement)) {\n e.stopPropagation()\n e.preventDefault()\n }\n }}\n >\n <div className=\"absolute inset-0 bg-gradient-to-b from-background/10 via-background/50 to-background/10 opacity-50\" />\n <MorphGradient />\n\n <div className={cn('absolute bottom-4 right-4 z-20 flex items-center gap-2')}>\n <Button\n variant=\"outline\"\n onClick={toggleExpanded}\n className={cn(floatingActionButtonClasses, 'w-full')}\n >\n <FullscreenIcon className=\"h-4 w-4\" />\n {isExpanded ? 'Exit Full Screen' : 'Full Screen'}\n </Button>\n </div>\n\n <motion.div\n className=\"relative flex w-full h-full z-10\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1, transition: { delay: 0.1, duration: 0.2 } }}\n >\n {chatModalTab === CHAT_MODAL_TAB.RECENT_CONVERSATIONS && <RecentConversations />}\n {chatModalTab === CHAT_MODAL_TAB.SAVED_MEMORY && <SavedMemory />}\n {chatModalTab === CHAT_MODAL_TAB.CHAT_HISTORY && <ChartHistory />}\n {chatModalTab === CHAT_MODAL_TAB.CHAT && (\n <>\n {chartData?.length && isChartVisible ? (\n <motion.div className=\"flex-1 py-7 px-6 flex items-center justify-center border-b md:border-b-0 md:border-r border-border/50\">\n <div className=\"w-full h-full overflow-auto scrollbar-hide\">{renderChart()}</div>\n </motion.div>\n ) : null}\n\n <ChartDialog\n isOpen={isMaximized}\n onOpenChange={setIsMaximized}\n title={allMeta?.title}\n data={tempChartData}\n chartId={chatIdToUse || ''}\n chartMeta={allMeta}\n chartType={selectedChartType || ''}\n visualizationConfig={chartVisuals}\n onMetaChange={() => {}}\n variant=\"\"\n onClose={() => setIsMaximized(false)}\n />\n\n <motion.div\n className={cn(\n 'flex flex-col relative h-full',\n isChartVisible && chartData?.length ? 'md:w-[35%] w-full' : 'w-full'\n )}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1, transition: { delay: 0.15, duration: 0.3, ease: EASE } }}\n >\n <div className=\"flex-1 overflow-hidden\">\n <div\n ref={refs.scrollRef as React.RefObject<HTMLDivElement>}\n onScroll={onScrollInternal}\n className=\"h-full overflow-y-auto scrollbar-hide [mask-image:linear-gradient(to_bottom,transparent_0,black_8%,black_92%,transparent_100%)] min-h-0\"\n >\n <div\n className={cn(\n 'space-y-2 py-2 pt-4',\n tempChartData?.length\n ? isExpanded && !(isChartVisible && chartData?.length)\n ? 'px-32 md:px-48 lg:px-[320px] xl:px-[448px]'\n : 'px-4'\n : isExpanded && !(isChartVisible && chartData?.length)\n ? 'mx-auto px-32 md:px-48 lg:px-[320px] xl:px-[448px]'\n : 'mx-auto px-4'\n )}\n >\n {isLoadingMore && (\n <div className=\"flex justify-center py-2\">\n <div className=\"size-4 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n )}\n\n {visibleMessages.map((message, index) => {\n const actualIndex = messages.length - visibleMessages.length + index\n const isLastAssistantMessage =\n message.role === 'assistant' && actualIndex === messages.length - 1\n const showStreamingBlock =\n hasActiveSSE ||\n (isLastAssistantMessage && (sseTimeline.length > 0 || isThinking))\n\n if (message.role === ('branch' as any)) {\n return (\n <motion.div\n key={`branch-${actualIndex}`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex justify-center my-4\"\n >\n <div className=\"flex items-center gap-2 px-4 py-2 rounded-full bg-white dark:bg-muted border border-primary/20 dark:border-border\">\n <Split className=\"h-4 w-4 text-primary rotate-90\" />\n <span className=\"text-sm font-medium text-foreground\">\n {message.content}\n </span>\n </div>\n </motion.div>\n )\n }\n\n if (\n (isLastAssistantMessage && hasActiveSSE) ||\n (message.status === 'thinking' && hasActiveSSE)\n )\n return null\n\n return (\n <MessageItem\n key={`${message.id || actualIndex}-${(message.content || '').slice(0, 50)}`}\n message={message}\n index={actualIndex}\n isThinking={isThinking}\n isLastMessage={actualIndex === messages.length - 1}\n onBookmarkMessage={handleBookmarkMessage}\n onCollapseThought={collapseThought}\n bookmarkLoading={bookmarkLoading}\n feedbackLoading={feedbackLoading}\n feedbackLoadingType={feedbackLoadingType}\n tempChartData={tempChartData}\n onFeedback={handleFeedback}\n onBranch={handleBranch}\n onEditSave={handleEditSave}\n initialMessage={messages.find((m) => m.role === 'assistant')}\n isExpanded={isExpanded}\n isChartVisible={isChartVisible && !!chartData?.length}\n />\n )\n })}\n\n {(() => {\n const lastMessage = messages[messages.length - 1]\n const hasAssistantMessage = lastMessage && lastMessage.role === 'assistant'\n if (hasActiveSSE || (hasAssistantMessage && sseTimeline.length > 0)) {\n const actualIndex = hasAssistantMessage ? messages.length - 1 : -1\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex gap-3 items-start\"\n key={`sse-combined-${actualIndex}`}\n >\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n sseIsStreaming ? 'bg-transparent' : 'bg-primary'\n )}\n >\n {sseIsStreaming ? (\n <ThinkingLogo size=\"md\" />\n ) : (\n <LogoStandAlone className=\"h-4 w-4\" />\n )}\n </div>\n <div\n className={cn(\n 'flex flex-col gap-3 w-full min-w-0',\n isExpanded\n ? 'max-w-full'\n : 'max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]'\n )}\n >\n {(isThinking || sseIsStreaming || (ssePhase && !sseIsComplete)) && (\n <div className=\"flex flex-col gap-1 w-fit\">\n <div className=\"rounded-2xl rounded-tl-sm bg-muted/50 px-4 py-3 text-sm break-words max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]\">\n <ThinkingMessage\n isThinking={isThinking || sseIsStreaming || !!ssePhase}\n currentPhase={ssePhase || 'Analyzing your request...'}\n />\n </div>\n <span className=\"text-[10px] text-muted-foreground pl-2\">\n {APP_NAME} AI\n </span>\n </div>\n )}\n <StreamingTimeline\n timeline={sseTimeline}\n collapseThreshold={3}\n recentFullCount={1}\n />\n {hasAssistantMessage && lastMessage && (\n <MessageItem\n key={`${lastMessage.id || actualIndex}-final`}\n message={lastMessage}\n index={actualIndex}\n isThinking={isThinking}\n isLastMessage={true}\n onBookmarkMessage={handleBookmarkMessage}\n onCollapseThought={collapseThought}\n bookmarkLoading={bookmarkLoading}\n feedbackLoading={feedbackLoading}\n feedbackLoadingType={feedbackLoadingType}\n tempChartData={tempChartData}\n onFeedback={handleFeedback}\n onBranch={handleBranch}\n onEditSave={handleEditSave}\n initialMessage={messages.find((m) => m.role === 'assistant')}\n hideAvatar\n hideThinkingProcess={hasActiveSSE}\n isExpanded={isExpanded}\n isChartVisible={isChartVisible && !!chartData?.length}\n />\n )}\n </div>\n </motion.div>\n )\n }\n return null\n })()}\n\n <div ref={messagesEndRef} className=\"h-8\" />\n </div>\n </div>\n </div>\n\n <AnimatePresence>\n {showScrollButton && (\n <div className=\"absolute inset-x-0 bottom-4 flex justify-center\">\n <motion.button\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 20 }}\n transition={{ duration: 0.2 }}\n onClick={scrollToBottom}\n className=\"px-3 py-1.5 rounded-full bg-background/70 hover:bg-background/90 text-foreground/70 hover:text-foreground border border-border/50 hover:border-border/70 backdrop-blur-md shadow-sm hover:shadow-md transition-all duration-200 flex gap-1.5 justify-center items-center text-xs font-medium group z-50\"\n >\n <ArrowDown className=\"h-3.5 w-3.5 transition-transform duration-200 group-hover:translate-y-0.5\" />\n Scroll to bottom\n </motion.button>\n </div>\n )}\n </AnimatePresence>\n\n <AnimatePresence>\n {!isChartVisible && tempChartData?.length && chartData?.length ? (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.3, ease: EASE }}\n className={cn('absolute bottom-4 z-50', isChartVisible ? 'right-4' : 'left-4')}\n >\n <Button\n variant=\"outline\"\n onClick={() => handleChartToggle(true)}\n className={floatingActionButtonClasses}\n >\n <Eye className=\"h-4 w-4\" />\n Show Chart\n </Button>\n </motion.div>\n ) : null}\n </AnimatePresence>\n\n {!isLoadingMore && !inputValue && messages.length <= 1 && (\n <AnimatePresence>\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.3, ease: EASE }}\n className=\"p-4\"\n >\n <div className=\"flex gap-2 justify-center flex-wrap\">\n {suggestedPrompts.map((suggestion, index) => (\n <motion.button\n key={index}\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, delay: index * 0.05, ease: EASE }}\n onClick={() => onSuggestionClick(suggestion)}\n className={cn(\n 'relative px-4 py-2.5 rounded-xl transition-all duration-200 text-xs font-medium',\n 'bg-muted/50 hover:bg-muted dark:hover:bg-muted/80',\n 'border border-border/[0.15] hover:border-border/30',\n 'text-foreground/70 hover:text-foreground',\n 'max-w-[320px] text-center leading-relaxed truncate'\n )}\n >\n {suggestion}\n </motion.button>\n ))}\n </div>\n </motion.div>\n </AnimatePresence>\n )}\n </motion.div>\n </>\n )}\n </motion.div>\n\n <AnimatePresence>\n {isBranching && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0 bg-background/60 backdrop-blur-md z-50 flex items-center justify-center rounded-3xl\"\n >\n <motion.div\n initial={{ scale: 0.9, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.9, opacity: 0 }}\n transition={{ duration: 0.3, ease: EASE }}\n className=\"flex flex-col items-center gap-4\"\n >\n <div className=\"size-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-lg font-medium text-foreground\">\n Branching into a new conversation\n </p>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )\n}\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../../utils/cn'\n\nconst alertVariants = cva(\n 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7',\n {\n variants: {\n variant: {\n default: 'bg-background text-foreground',\n destructive: 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div ref={ref} role=\"alert\" className={cn(alertVariants({ variant }), className)} {...props} />\n))\nAlert.displayName = 'Alert'\n\nconst AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h5 ref={ref} className={cn('mb-1 font-medium leading-none tracking-tight', className)} {...props} />\n )\n)\nAlertTitle.displayName = 'AlertTitle'\n\nconst AlertDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('text-sm [&_p]:leading-relaxed', className)} {...props} />\n )\n)\nAlertDescription.displayName = 'AlertDescription'\n\nexport { Alert, AlertTitle, AlertDescription }\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Loader2 } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n outline: 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, loading = false, children, disabled, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n disabled={disabled || loading}\n {...props}\n >\n {loading ? (\n <>\n <Loader2 className=\"size-4 animate-spin\" />\n {children}\n </>\n ) : (\n children\n )}\n </Comp>\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","import React, { memo } from 'react'\nimport Markdown from 'react-markdown'\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { atomDark } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport rehypeRaw from 'rehype-raw'\nimport remarkGfm from 'remark-gfm'\n\ntype MarkdownRendererProps = {\n children: string\n theme?: 'light' | 'dark'\n}\n\nfunction getResolvedTheme(preference?: 'light' | 'dark'): 'light' | 'dark' {\n if (preference) return preference\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches)\n return 'dark'\n return 'light'\n}\n\nexport const MarkdownRenderer = memo(function MarkdownRenderer({\n children: markdown,\n theme,\n}: MarkdownRendererProps) {\n const resolvedTheme = getResolvedTheme(theme)\n\n return (\n <div className=\"prose prose-base prose-gray dark:prose-invert max-w-none\">\n <Markdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={{\n h1: ({ children }) => (\n <h1 className=\"mt-6 first:mt-0 mb-3 text-2xl font-bold text-gray-900 dark:text-white\">\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"mt-6 first:mt-0 mb-3 text-xl font-semibold text-gray-800 dark:text-gray-300\">\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"mt-5 first:mt-0 mb-2 text-lg font-medium text-gray-700 dark:text-gray-400\">\n {children}\n </h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"mt-4 first:mt-0 mb-2 text-base font-medium text-gray-600 dark:text-gray-500\">\n {children}\n </h4>\n ),\n p: ({ children }) => {\n const hasContent = React.Children.toArray(children).some((child) => {\n if (typeof child === 'string') {\n const trimmed = child.trim()\n if (\n trimmed.length === 0 ||\n trimmed === '\\u00A0' ||\n trimmed === \"'\" ||\n trimmed === '\"'\n )\n return false\n return trimmed.length > 0\n }\n return true\n })\n if (!hasContent) return null\n return <p className=\"mt-3 text-sm leading-relaxed\">{children}</p>\n },\n ul: ({ children }) => (\n <ul className=\"mt-3 list-disc pl-5 text-sm space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"mt-3 list-decimal pl-5 text-sm space-y-1\">{children}</ol>\n ),\n hr: () => (\n <hr className=\"my-4 border-t border-border/60 dark:border-white/30 transition-colors\" />\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-4 border-gray-500 pl-3 italic text-gray-600 dark:text-gray-400 text-sm\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <table className=\"w-full border-collapse border border-gray-300 dark:border-gray-600 text-sm\">\n {children}\n </table>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-gray-100 dark:bg-gray-700\">{children}</thead>\n ),\n tbody: ({ children }) => (\n <tbody className=\"divide-y divide-gray-300 dark:divide-gray-600\">{children}</tbody>\n ),\n th: ({ children }) => (\n <th className=\"p-2 border border-gray-300 dark:border-gray-600 text-left font-semibold text-sm\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"p-2 border border-gray-300 dark:border-gray-600 text-sm\">{children}</td>\n ),\n a: ({ href = '', children }) => (\n <a\n href={href}\n className=\"text-blue-600 dark:text-blue-400 underline hover:opacity-80\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ),\n code({ inline, className, children, ...props }: any) {\n const match = /language-(\\w+)/.exec(className || '')\n return !inline && match ? (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n <SyntaxHighlighter\n style={resolvedTheme === 'dark' ? atomDark : oneLight}\n PreTag=\"div\"\n wrapLongLines\n language={match[1]}\n {...props}\n >\n {children}\n </SyntaxHighlighter>\n ) : (\n <code className={className} {...props}>\n {children}\n </code>\n )\n },\n }}\n >\n {markdown}\n </Markdown>\n </div>\n )\n})\n","import { motion } from 'framer-motion'\n\ninterface ThinkingMessageProps {\n isThinking: boolean\n currentPhase?: string\n className?: string\n}\n\nexport function ThinkingMessage({ isThinking, currentPhase, className = '' }: ThinkingMessageProps) {\n if (!isThinking) return null\n\n const displayText = currentPhase || 'Analyzing your request...'\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 5 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -5 }}\n transition={{ duration: 0.2 }}\n className={`text-sm leading-relaxed ${className}`}\n >\n <motion.span\n key={displayText}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.15 }}\n className=\"inline-block bg-gradient-to-r from-foreground/50 via-primary to-foreground/50 text-transparent bg-clip-text\"\n style={{\n backgroundSize: '200% 100%',\n animation: 'shimmer 2s linear infinite',\n }}\n >\n {displayText}\n </motion.span>\n </motion.div>\n )\n}\n","import React from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from './dialog'\nimport { CopyIcon, FileSearch } from 'lucide-react'\nimport { Prism as _SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { atomDark } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'\nconst SyntaxHighlighter = _SyntaxHighlighter as any\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\nimport { toast } from '../../hooks/use-toast'\nimport { buildTimelineFromProgressEvents } from '../../lib/analytics-stream-replay'\nimport { StreamingTimeline } from '../dashboard/StreamingTimeline'\n\nfunction getResolvedTheme(): 'light' | 'dark' {\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches)\n return 'dark'\n return 'light'\n}\n\nexport function ChatCodeBlock({\n children,\n language,\n code,\n progressEvents,\n}: {\n children: React.ReactNode\n language: string\n code?: string\n progressEvents?: {\n event_type?: string\n data?: Record<string, any>\n timestamp?: string\n }[]\n}) {\n const resolvedTheme = getResolvedTheme()\n const safeCode = code || ''\n const onCopy = () => {\n if (!safeCode.trim()) return\n navigator.clipboard.writeText(safeCode)\n toast({ title: 'Code Copied' })\n }\n const replayTimeline = React.useMemo(\n () => buildTimelineFromProgressEvents(progressEvents),\n [progressEvents]\n )\n const replayHasCode = React.useMemo(\n () =>\n replayTimeline.some(\n (event) =>\n event.type === 'tool' && !!event.toolData?.code && event.toolData.code.trim().length > 0\n ),\n [replayTimeline]\n )\n\n return (\n <Dialog>\n <DialogTrigger asChild>\n <ButtonWithTooltip className=\"h-6 w-6\" tooltipText=\"Audit Log\" onClick={() => {}}>\n <FileSearch className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </ButtonWithTooltip>\n </DialogTrigger>\n <DialogContent className=\"sm:max-w-[760px] p-0 max-h-[85vh] overflow-hidden flex flex-col\">\n <DialogHeader className=\"px-5 pt-4 pb-3 border-b border-border/60 space-y-0\">\n <DialogTitle className=\"text-base font-semibold leading-normal\">Audit Log</DialogTitle>\n </DialogHeader>\n <div className=\"flex-1 overflow-y-auto scrollbar-hide px-3 py-3 space-y-3\">\n <div className=\"space-y-2 border border-border/60 rounded-lg p-3 bg-muted/20\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n Execution Replay\n </p>\n {replayTimeline.length > 0 ? (\n <StreamingTimeline\n timeline={replayTimeline}\n collapseThreshold={3}\n recentFullCount={1}\n />\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n No execution replay is available for this historical run.\n </p>\n )}\n </div>\n {!replayHasCode ? (\n <>\n {safeCode.trim() ? (\n <SyntaxHighlighter\n wrapLines\n showLineNumbers\n language={language}\n style={resolvedTheme === 'dark' ? atomDark : oneLight}\n >\n {safeCode}\n </SyntaxHighlighter>\n ) : (\n <div className=\"rounded-md border border-border/60 bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n No executable code was produced for this response.\n </div>\n )}\n <div className=\"flex justify-end\">\n {safeCode.trim() ? (\n <ButtonWithTooltip tooltipText=\"Copy\" onClick={onCopy}>\n <CopyIcon className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n ) : null}\n </div>\n </>\n ) : null}\n {React.Children.count(children) > 0 ? (\n <div className=\"space-y-2 pt-2\">\n <p className=\"pl-3 text-xs uppercase tracking-wide text-muted-foreground\">\n Result Data\n </p>\n {children}\n </div>\n ) : null}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\nconst Dialog = ({\n open,\n onOpenChange,\n children,\n ...props\n}: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>) => {\n React.useEffect(() => {\n if (!open) {\n document.body.style.pointerEvents = ''\n document.body.style.overflow = ''\n }\n }, [open])\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange} {...props}>\n {children}\n </DialogPrimitive.Root>\n )\n}\nDialog.displayName = DialogPrimitive.Root.displayName\n\nconst DialogTrigger = DialogPrimitive.Trigger\nconst DialogPortal = DialogPrimitive.Portal\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/30 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border/70 bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n className\n )}\n onCloseAutoFocus={() => {\n document.body.style.pointerEvents = ''\n document.body.style.overflow = ''\n }}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)} {...props} />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props} />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","import * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\nimport { cn } from '../../utils/cn'\n\nconst TooltipProvider = TooltipPrimitive.Provider\nconst Tooltip = TooltipPrimitive.Root\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React from 'react'\nimport { Button, type ButtonProps } from '../ui/button'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { cn } from '../../utils/cn'\n\ntype ButtonWithTooltipProps = {\n onClick: () => void\n children: React.ReactNode\n tooltipText: string\n className?: string\n} & ButtonProps\n\nexport function ButtonWithTooltip({\n onClick,\n children,\n tooltipText,\n className,\n ...props\n}: ButtonWithTooltipProps) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n 'flex items-center justify-center hover:bg-accent/50 transition-colors duration-200',\n className\n )}\n onClick={onClick}\n {...props}\n >\n {children}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltipText}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n}\n","import { TimelineEvent, ToolCall, TOOL_DISPLAY_NAMES } from '../types/streaming'\n\ntype ProgressEvent = {\n event_type?: string\n data?: Record<string, any>\n timestamp?: string\n}\n\nconst ACTIVE_TOOL_STATES = new Set(['announced', 'streaming', 'ready', 'executing'])\n\nconst getToolDisplayName = (toolName: string) => {\n return TOOL_DISPLAY_NAMES[toolName] || toolName.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nconst getToolIndex = (toolCalls: ToolCall[], toolName: string, toolCallId?: string): number => {\n if (toolCallId) {\n const idx = toolCalls.findIndex((t) => t.tool_call_id === toolCallId)\n if (idx >= 0) return idx\n }\n const activeIdx = toolCalls.findIndex((t) => t.tool_name === toolName && ACTIVE_TOOL_STATES.has(t.status))\n if (activeIdx >= 0) return activeIdx\n for (let i = toolCalls.length - 1; i >= 0; i--) {\n if (toolCalls[i].tool_name === toolName) return i\n }\n return -1\n}\n\nconst findTimelineToolIndex = (timeline: TimelineEvent[], tool: ToolCall): number => {\n return timeline.findIndex(\n (entry) =>\n entry.type === 'tool' &&\n entry.toolData &&\n ((tool.tool_call_id && entry.toolData.tool_call_id === tool.tool_call_id) ||\n (entry.toolData.tool_name === tool.tool_name && entry.toolData.timestamp === tool.timestamp))\n )\n}\n\nconst parseToolCodeFromArgs = (fullArgs: Record<string, any>): string => {\n const explicit = fullArgs?.code_str || fullArgs?.query || fullArgs?.user_query || ''\n if (explicit) return String(explicit)\n if (fullArgs && Object.keys(fullArgs).length) return JSON.stringify(fullArgs, null, 2)\n return ''\n}\n\nexport const buildTimelineFromProgressEvents = (progressEvents?: ProgressEvent[]): TimelineEvent[] => {\n if (!Array.isArray(progressEvents) || !progressEvents.length) return []\n\n const toolCalls: ToolCall[] = []\n const timeline: TimelineEvent[] = []\n\n for (const event of progressEvents) {\n const type = event?.event_type || event?.data?.type\n const timestamp = event?.timestamp || event?.data?.timestamp || new Date().toISOString()\n const data = event?.data || {}\n\n if (type === 'agent_thought') {\n timeline.push({\n type: 'thought',\n timestamp,\n iteration: data?.iteration,\n thoughtData: {\n type: 'agent_thought',\n content: data?.content || '',\n is_complete: Boolean(data?.is_complete),\n iteration: data?.iteration || 1,\n timestamp,\n },\n })\n continue\n }\n\n if (type === 'tool_call_announced') {\n const tool: ToolCall = {\n tool_name: String(data?.tool_name || ''),\n tool_display_name: String(data?.tool_display_name || getToolDisplayName(String(data?.tool_name || 'tool'))),\n args_preview: '',\n status: 'announced',\n code: '',\n isStreamingArgs: false,\n ...(data?.tool_call_id != null && { tool_call_id: String(data.tool_call_id) }),\n timestamp,\n }\n toolCalls.push(tool)\n timeline.push({ type: 'tool', timestamp, iteration: data?.iteration, toolData: tool })\n continue\n }\n\n if (type === 'tool_call_args_delta') {\n const idx = getToolIndex(toolCalls, String(data?.tool_name || ''), data?.tool_call_id)\n if (idx >= 0) {\n toolCalls[idx] = {\n ...toolCalls[idx],\n code: (toolCalls[idx].code || '') + String(data?.args_delta || ''),\n args_preview: String(data?.args_preview || toolCalls[idx].args_preview || ''),\n status: 'streaming',\n isStreamingArgs: true,\n hasPrivateArgs: data?.private_args ?? toolCalls[idx].hasPrivateArgs,\n ...(data?.tool_call_id != null && { tool_call_id: String(data.tool_call_id) }),\n }\n const timelineIdx = findTimelineToolIndex(timeline, toolCalls[idx])\n if (timelineIdx >= 0) timeline[timelineIdx] = { ...timeline[timelineIdx], toolData: toolCalls[idx] }\n }\n continue\n }\n\n if (type === 'tool_call_args_complete') {\n const idx = getToolIndex(toolCalls, String(data?.tool_name || ''), data?.tool_call_id)\n if (idx >= 0) {\n const fullArgs = (data?.full_args || {}) as Record<string, any>\n toolCalls[idx] = {\n ...toolCalls[idx],\n code: parseToolCodeFromArgs(fullArgs),\n args_preview: String(data?.args_preview || toolCalls[idx].args_preview || ''),\n status: 'ready',\n isStreamingArgs: false,\n hasPrivateArgs: Boolean(data?.private_args) || toolCalls[idx].hasPrivateArgs,\n ...(data?.tool_call_id != null && { tool_call_id: String(data.tool_call_id) }),\n }\n const timelineIdx = findTimelineToolIndex(timeline, toolCalls[idx])\n if (timelineIdx >= 0) timeline[timelineIdx] = { ...timeline[timelineIdx], toolData: toolCalls[idx] }\n }\n continue\n }\n\n if (type === 'tool_output') {\n const idx = getToolIndex(toolCalls, String(data?.tool_name || ''), data?.tool_call_id)\n if (idx >= 0) {\n toolCalls[idx] = {\n ...toolCalls[idx],\n output: String(data?.content || ''),\n status: 'executing',\n hasPrivateOutput: Boolean(data?.private_output) || toolCalls[idx].hasPrivateOutput,\n }\n const timelineIdx = findTimelineToolIndex(timeline, toolCalls[idx])\n if (timelineIdx >= 0) timeline[timelineIdx] = { ...timeline[timelineIdx], toolData: toolCalls[idx] }\n }\n continue\n }\n\n if (type === 'tool_call_complete') {\n const idx = getToolIndex(toolCalls, String(data?.tool_name || ''), data?.tool_call_id)\n if (idx >= 0) {\n const status = data?.status === 'error' ? 'error' : 'success'\n toolCalls[idx] = {\n ...toolCalls[idx],\n status,\n duration_ms: Number(data?.duration_ms || 0),\n ...(data?.error_message ? { error_message: String(data.error_message) } : {}),\n }\n const timelineIdx = findTimelineToolIndex(timeline, toolCalls[idx])\n if (timelineIdx >= 0) timeline[timelineIdx] = { ...timeline[timelineIdx], toolData: toolCalls[idx] }\n }\n }\n }\n\n return timeline\n}\n","import { useMemo } from 'react'\nimport { AgentThoughtDisplay } from './AgentThoughtDisplay'\nimport { CollapsedToolCalls, ToolCallDisplay } from './ToolCallDisplay'\nimport type { TimelineRenderItem, TimelineEvent, ToolCall } from '../../types/streaming'\n\nexport function StreamingTimeline({\n timeline,\n collapseThreshold = 3,\n recentFullCount = 1,\n}: {\n timeline: TimelineEvent[]\n collapseThreshold?: number\n recentFullCount?: number\n}) {\n const renderPlan = useMemo<TimelineRenderItem[]>(() => {\n if (!timeline?.length) return []\n\n const toolEvents = timeline.filter((e) => e.type === 'tool' && e.toolData)\n const shouldCollapse = toolEvents.length > collapseThreshold\n const recentToolTimestamps = new Set(toolEvents.slice(-recentFullCount).map((e) => e.timestamp))\n\n const plan: TimelineRenderItem[] = []\n let pendingCollapsed: ToolCall[] = []\n\n const flushCollapsed = () => {\n if (!pendingCollapsed.length) return\n plan.push({\n kind: 'collapsed-tools',\n toolCalls: [...pendingCollapsed],\n key: `collapsed-${pendingCollapsed[0].timestamp}`,\n })\n pendingCollapsed = []\n }\n\n for (let i = 0; i < timeline.length; i++) {\n const event = timeline[i]\n\n if (event.type === 'thought' && event.thoughtData) {\n flushCollapsed()\n const isFirstOfIteration =\n i === 0 || timeline[i - 1].type !== 'thought' || timeline[i - 1].iteration !== event.iteration\n\n if (isFirstOfIteration) {\n const iterationThoughts = timeline\n .slice(i)\n .filter((e) => e.type === 'thought' && e.iteration === event.iteration)\n\n plan.push({\n kind: 'thought',\n events: iterationThoughts,\n key: `thought-${event.iteration}-${i}`,\n })\n }\n continue\n }\n\n if (event.type === 'tool' && event.toolData) {\n const isRecent = recentToolTimestamps.has(event.timestamp)\n const isCollapsible = shouldCollapse && !isRecent\n\n if (isCollapsible) {\n pendingCollapsed.push(event.toolData)\n } else {\n flushCollapsed()\n const hasNextExecutionElement = timeline\n .slice(i + 1)\n .some(\n (e) =>\n (e.type === 'tool' && e.toolData?.status !== 'announced') ||\n (e.type === 'thought' && e.thoughtData)\n )\n\n plan.push({\n kind: 'tool',\n event,\n isLatest: !hasNextExecutionElement,\n key: `tool-${event.toolData.tool_name}-${event.timestamp}`,\n })\n }\n }\n }\n\n flushCollapsed()\n return plan\n }, [timeline, collapseThreshold, recentFullCount])\n\n if (!renderPlan.length) return null\n\n return (\n <>\n {renderPlan.map((item) => {\n if (item.kind === 'thought') {\n const thoughtData = item.events.map((e) => e.thoughtData!)\n return (\n <AgentThoughtDisplay\n key={item.key}\n thoughts={thoughtData}\n maxThoughts={1}\n showOnlyLast={false}\n />\n )\n }\n\n if (item.kind === 'collapsed-tools') {\n return <CollapsedToolCalls key={item.key} toolCalls={item.toolCalls} />\n }\n\n return (\n <ToolCallDisplay\n key={item.key}\n toolCalls={[item.event.toolData!]}\n showAll={true}\n isLatest={item.isLatest}\n />\n )\n })}\n </>\n )\n}\n","import React, { useEffect, useState, useRef } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Brain, Loader2, ChevronDown, ChevronRight } from 'lucide-react'\nimport { AgentThought } from '../../types/streaming'\nimport { cn } from '../../utils/cn'\n\ninterface AgentThoughtDisplayProps {\n thoughts: AgentThought[]\n className?: string\n showOnlyLast?: boolean\n maxThoughts?: number\n}\n\nexport function AgentThoughtDisplay({ thoughts, className, showOnlyLast = false, maxThoughts = 5 }: AgentThoughtDisplayProps) {\n const [accumulatedThoughts, setAccumulatedThoughts] = useState<Map<number, { content: string; isComplete: boolean; lastUpdate: string }>>(new Map())\n const processedIndices = useRef(new Set<string>())\n\n useEffect(() => {\n if (!thoughts.length) {\n processedIndices.current.clear()\n setAccumulatedThoughts(new Map())\n return\n }\n const newThoughts = thoughts.filter((thought, idx) => !processedIndices.current.has(`${thought.timestamp}-${idx}`))\n if (newThoughts.length === 0) return\n\n setAccumulatedThoughts((prevMap) => {\n const newMap = new Map(prevMap)\n newThoughts.forEach((thought) => {\n const thoughtIndex = thoughts.indexOf(thought)\n processedIndices.current.add(`${thought.timestamp}-${thoughtIndex}`)\n const iteration = thought.iteration || 0\n const existing = newMap.get(iteration)\n if (!existing) {\n newMap.set(iteration, { content: thought.content, isComplete: thought.is_complete, lastUpdate: thought.timestamp })\n } else {\n newMap.set(iteration, { content: existing.content + thought.content, isComplete: thought.is_complete, lastUpdate: thought.timestamp })\n }\n })\n return newMap\n })\n }, [thoughts])\n\n const thoughtsArray = Array.from(accumulatedThoughts.entries())\n .map(([iteration, data]) => ({ iteration, ...data }))\n .sort((a, b) => a.iteration - b.iteration)\n\n const displayThoughts = showOnlyLast ? thoughtsArray.slice(-1) : thoughtsArray.slice(-maxThoughts)\n\n if (!displayThoughts.length) return null\n\n return (\n <div className={cn('space-y-2', className)}>\n <AnimatePresence mode=\"popLayout\">\n {displayThoughts.map((thought, index) => {\n const isLatest = index === displayThoughts.length - 1\n const isActivelyStreaming = isLatest && !thought.isComplete\n return <ThoughtItem key={`iteration-${thought.iteration}`} thought={thought} isActivelyStreaming={isActivelyStreaming} />\n })}\n </AnimatePresence>\n {!showOnlyLast && thoughtsArray.length > maxThoughts && (\n <div className=\"text-xs text-center text-muted-foreground py-1\">\n Showing last {maxThoughts} of {thoughtsArray.length} iterations\n </div>\n )}\n </div>\n )\n}\n\nfunction ThoughtItem({ thought, isActivelyStreaming }: { thought: { iteration: number; content: string; isComplete: boolean }; isActivelyStreaming: boolean }) {\n const [isExpanded, setIsExpanded] = useState(true)\n return (\n <motion.div initial={{ opacity: 0, y: -10 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -10 }} transition={{ duration: 0.2 }}\n className={cn('rounded-lg border overflow-hidden bg-muted/30 dark:bg-muted/10 border-border dark:border-white/10', isActivelyStreaming && 'ring-1 ring-blue-500/20')}>\n <div className=\"flex items-center gap-2 p-3 cursor-pointer hover:bg-muted/50 transition-colors\" onClick={() => setIsExpanded(!isExpanded)}>\n <div className=\"flex-shrink-0\">\n {isActivelyStreaming ? <Loader2 className=\"h-4 w-4 text-muted-foreground animate-spin\" /> : <Brain className=\"h-4 w-4 text-muted-foreground\" />}\n </div>\n <span className=\"text-xs font-medium text-muted-foreground flex-1\">Agent Thinking</span>\n {isExpanded ? <ChevronDown className=\"h-4 w-4 text-muted-foreground\" /> : <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />}\n </div>\n <AnimatePresence>\n {isExpanded && (\n <motion.div initial={{ height: 0, opacity: 0 }} animate={{ height: 'auto', opacity: 1 }} exit={{ height: 0, opacity: 0 }} transition={{ duration: 0.2 }} className=\"overflow-hidden\">\n <div className=\"px-3 pb-3 pt-0\">\n <p className=\"text-sm text-foreground leading-relaxed whitespace-pre-wrap\">\n {thought.content}\n {isActivelyStreaming && <span className=\"inline-block w-1 h-4 ml-0.5 bg-blue-500 animate-pulse\" />}\n </p>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )\n}\n\nexport function AgentThoughtCompact({ thoughts }: { thoughts: AgentThought[] }) {\n const latestThought = thoughts[thoughts.length - 1]\n if (!latestThought) return null\n return (\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-xs text-muted-foreground bg-muted/30 rounded\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n <span className=\"truncate max-w-[300px]\">{latestThought.content}</span>\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n Code2,\n Database,\n Search,\n Wrench,\n CheckCircle2,\n RotateCcw,\n Loader2,\n ChevronDown,\n Clock,\n Copy,\n} from 'lucide-react'\nimport { ToolCall } from '../../types/streaming'\nimport { cn } from '../../utils/cn'\nimport { Prism as _SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { atomDark } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'\nconst SyntaxHighlighter = _SyntaxHighlighter as any\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\nimport { toast } from '../../hooks/use-toast'\n\nfunction getResolvedTheme(): 'light' | 'dark' {\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches)\n return 'dark'\n return 'light'\n}\n\nconst getToolIcon = (toolName: string) => {\n if (toolName.includes('python')) return Code2\n if (toolName.includes('sql')) return Database\n if (toolName.includes('search')) return Search\n return Wrench\n}\n\nconst getStatusIcon = (status: ToolCall['status']) => {\n switch (status) {\n case 'announced':\n return Wrench\n case 'streaming':\n case 'ready':\n case 'executing':\n return Loader2\n case 'success':\n return CheckCircle2\n case 'error':\n return RotateCcw\n default:\n return Clock\n }\n}\n\nconst getStatusColor = (status: ToolCall['status']) => {\n switch (status) {\n case 'announced':\n return 'text-gray-400'\n case 'streaming':\n return 'text-blue-400'\n case 'ready':\n case 'executing':\n return 'text-blue-500'\n case 'success':\n return 'text-green-500'\n case 'error':\n return 'text-muted-foreground'\n default:\n return 'text-gray-500'\n }\n}\n\nfunction ToolCallItem({ toolCall, isLatest = false }: { toolCall: ToolCall; isLatest?: boolean }) {\n const [isExpanded, setIsExpanded] = useState(false)\n const resolvedTheme = getResolvedTheme()\n const ToolIcon = getToolIcon(toolCall.tool_name)\n const StatusIcon = getStatusIcon(toolCall.status)\n const statusColor = getStatusColor(toolCall.status)\n const prevIsLatestRef = React.useRef(isLatest)\n const codeContainerRef = React.useRef<HTMLDivElement>(null)\n\n const hasCode = toolCall.code && toolCall.code.trim().length > 0 && !toolCall.hasPrivateArgs\n const hasOutput =\n toolCall.output && toolCall.output.trim().length > 0 && !toolCall.hasPrivateOutput\n const hasExpandableContent = hasCode || hasOutput\n\n React.useEffect(() => {\n if (toolCall.isStreamingArgs && hasCode) setIsExpanded(true)\n }, [toolCall.isStreamingArgs, hasCode])\n\n const prevStatusRef = React.useRef(toolCall.status)\n React.useEffect(() => {\n if (\n prevIsLatestRef.current &&\n !isLatest &&\n (toolCall.status === 'success' || toolCall.status === 'error')\n )\n setIsExpanded(false)\n prevIsLatestRef.current = isLatest\n }, [isLatest, toolCall.status])\n\n React.useEffect(() => {\n const wasRunning = ['streaming', 'ready', 'executing'].includes(prevStatusRef.current)\n const nowDone = toolCall.status === 'success' || toolCall.status === 'error'\n if (wasRunning && nowDone && !isLatest) {\n const timer = setTimeout(() => setIsExpanded(false), 300)\n prevStatusRef.current = toolCall.status\n return () => clearTimeout(timer)\n }\n prevStatusRef.current = toolCall.status\n }, [toolCall.status, isLatest])\n\n React.useEffect(() => {\n if (codeContainerRef.current && toolCall.isStreamingArgs) {\n codeContainerRef.current.scrollLeft = 0\n codeContainerRef.current.scrollTop = codeContainerRef.current.scrollHeight\n }\n }, [toolCall.code, toolCall.isStreamingArgs])\n\n const getLanguage = () => {\n if (toolCall.tool_name.includes('python')) return 'python'\n if (toolCall.tool_name.includes('sql')) {\n const sqlKeywords = /\\b(SELECT|INSERT|UPDATE|DELETE|CREATE|ALTER|DROP|FROM|WHERE|JOIN)\\b/i\n if (toolCall.code && sqlKeywords.test(toolCall.code)) return 'sql'\n return 'text'\n }\n if (\n toolCall.code &&\n (toolCall.code.trim().startsWith('{') || toolCall.code.trim().startsWith('['))\n ) {\n try {\n JSON.parse(toolCall.code)\n return 'json'\n } catch {\n return 'text'\n }\n }\n return 'javascript'\n }\n\n const handleCopyCode = () => {\n if (toolCall.code) {\n navigator.clipboard.writeText(toolCall.code)\n toast({ title: 'Code Copied' })\n }\n }\n\n const isActive =\n toolCall.status === 'streaming' ||\n toolCall.status === 'ready' ||\n toolCall.status === 'executing'\n\n return (\n <motion.div\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n transition={{ duration: 0.2 }}\n className={cn(\n 'border rounded-lg overflow-hidden bg-card dark:bg-card/50 border-border dark:border-white/10',\n isActive && 'ring-1 ring-blue-500/20'\n )}\n >\n <div\n className={cn(\n 'flex items-center gap-3 p-3',\n hasExpandableContent && 'cursor-pointer hover:bg-muted/50 transition-colors'\n )}\n onClick={() => hasExpandableContent && setIsExpanded(!isExpanded)}\n >\n <div className=\"flex-shrink-0\">\n <div className=\"p-1.5 rounded-lg bg-muted/50\">\n <ToolIcon className=\"h-4 w-4 text-foreground\" />\n </div>\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {toolCall.tool_display_name}\n </span>\n {toolCall.duration_ms != null &&\n toolCall.duration_ms >= 1 &&\n toolCall.status === 'success' && (\n <span className=\"text-xs text-muted-foreground\">\n {toolCall.duration_ms.toFixed(0)}ms\n </span>\n )}\n </div>\n {toolCall.status === 'error' && toolCall.error_message && (\n <p className=\"text-xs text-muted-foreground mt-0.5\">{toolCall.error_message}</p>\n )}\n {toolCall.args_preview && (\n <p className=\"text-xs text-muted-foreground truncate\">{toolCall.args_preview}</p>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={cn('h-4 w-4', statusColor, isActive && 'animate-spin')} />\n {hasExpandableContent && (\n <ChevronDown\n className={cn(\n 'h-4 w-4 text-muted-foreground transition-transform',\n isExpanded && 'rotate-180'\n )}\n />\n )}\n </div>\n </div>\n <AnimatePresence>\n {isExpanded && hasExpandableContent && (\n <motion.div\n initial={{ height: 0 }}\n animate={{ height: 'auto' }}\n exit={{ height: 0 }}\n transition={{ duration: 0.2 }}\n className=\"overflow-hidden\"\n >\n <div className=\"border-t border-border dark:border-white/10 bg-muted/30 p-3 space-y-3\">\n {hasCode && (\n <div className=\"relative group\">\n <ButtonWithTooltip\n tooltipText=\"Copy code\"\n onClick={handleCopyCode}\n variant=\"ghost\"\n className=\"h-7 w-7 p-1 absolute top-2 right-2 z-10 bg-background/80 hover:bg-background opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </ButtonWithTooltip>\n <div\n ref={codeContainerRef}\n className=\"rounded relative overflow-auto scrollbar-hide max-w-full\"\n >\n <SyntaxHighlighter\n language={getLanguage()}\n style={resolvedTheme === 'dark' ? atomDark : oneLight}\n showLineNumbers={!toolCall.isStreamingArgs}\n wrapLines\n wrapLongLines\n className=\"scrollbar-hide\"\n customStyle={{\n margin: 0,\n borderRadius: '0.375rem',\n fontSize: '0.75rem',\n maxHeight: '400px',\n minWidth: '600px',\n }}\n >\n {toolCall.code!}\n </SyntaxHighlighter>\n {toolCall.isStreamingArgs && (\n <span\n className=\"absolute bottom-4 right-4 text-blue-400 font-bold animate-pulse\"\n style={{ fontSize: '1rem', zIndex: 10 }}\n >\n |\n </span>\n )}\n </div>\n </div>\n )}\n {toolCall.status === 'ready' && !hasOutput && (\n <div className=\"flex items-center gap-2 p-3 bg-blue-500/10 rounded border border-blue-500/20\">\n <Loader2 className=\"h-4 w-4 text-blue-500 animate-spin\" />\n <span className=\"text-sm text-blue-500 font-medium\">Executing...</span>\n </div>\n )}\n {hasOutput && (\n <div>\n <pre className=\"text-xs bg-background rounded p-2 overflow-x-auto overflow-y-auto max-h-[200px] scrollbar-hide\">\n <code className=\"text-foreground\">{toolCall.output}</code>\n </pre>\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )\n}\n\ninterface ToolCallDisplayProps {\n toolCalls: ToolCall[]\n className?: string\n showAll?: boolean\n isLatest?: boolean\n}\n\nexport function ToolCallDisplay({\n toolCalls,\n className,\n showAll = false,\n isLatest = false,\n}: ToolCallDisplayProps) {\n const displayedToolCalls = showAll ? toolCalls : toolCalls.slice(-3)\n if (!toolCalls.length) return null\n return (\n <div className={cn('space-y-2', className)}>\n <div className=\"space-y-2\">\n <AnimatePresence mode=\"popLayout\">\n {displayedToolCalls.map((toolCall, index) => (\n <ToolCallItem\n key={`${toolCall.timestamp}-${index}`}\n toolCall={toolCall}\n isLatest={isLatest}\n />\n ))}\n </AnimatePresence>\n </div>\n {!showAll && toolCalls.length > 3 && (\n <div className=\"text-xs text-center text-muted-foreground py-1\">\n Showing last 3 of {toolCalls.length} tool calls\n </div>\n )}\n </div>\n )\n}\n\nexport function ToolCallPill({ toolCall }: { toolCall: ToolCall }) {\n const ToolIcon = getToolIcon(toolCall.tool_name)\n const StatusIcon = getStatusIcon(toolCall.status)\n const statusColor = getStatusColor(toolCall.status)\n const isActive =\n toolCall.status === 'streaming' ||\n toolCall.status === 'ready' ||\n toolCall.status === 'executing'\n return (\n <div\n className={cn(\n 'inline-flex items-center gap-1.5 px-2.5 py-1.5 h-auto rounded-md text-xs border bg-card dark:bg-card/50 border-border dark:border-white/10 whitespace-nowrap',\n isActive && 'ring-1 ring-blue-500/20'\n )}\n >\n <ToolIcon className=\"h-3 w-3 text-muted-foreground flex-shrink-0\" />\n <span className=\"font-medium text-foreground truncate max-w-[140px]\">\n {toolCall.tool_display_name}\n </span>\n {toolCall.duration_ms != null &&\n toolCall.duration_ms >= 1 &&\n toolCall.status === 'success' && (\n <span className=\"text-muted-foreground\">{toolCall.duration_ms.toFixed(0)}ms</span>\n )}\n <StatusIcon\n className={cn('h-3 w-3 flex-shrink-0', statusColor, isActive && 'animate-spin')}\n />\n </div>\n )\n}\n\nexport function CollapsedToolCalls({\n toolCalls,\n className,\n}: {\n toolCalls: ToolCall[]\n className?: string\n}) {\n const [expanded, setExpanded] = useState(false)\n if (!toolCalls.length) return null\n const successCount = toolCalls.filter((t) => t.status === 'success').length\n const errorCount = toolCalls.filter((t) => t.status === 'error').length\n const activeCount = toolCalls.filter((t) =>\n ['streaming', 'ready', 'executing'].includes(t.status)\n ).length\n const allDone = activeCount === 0\n return (\n <div className={cn('space-y-1.5', className)}>\n <button\n onClick={() => setExpanded((v) => !v)}\n className=\"flex items-center gap-2 text-xs text-muted-foreground hover:text-foreground transition-colors py-0.5\"\n >\n <ChevronDown className={cn('h-3.5 w-3.5 transition-transform', expanded && 'rotate-180')} />\n <span>\n {toolCalls.length} tool call{toolCalls.length > 1 ? 's' : ''}\n {allDone ? ' completed' : activeCount > 0 ? ` (${activeCount} running)` : ''}\n {errorCount > 0 && ` · ${errorCount} self-healed`}\n </span>\n {!expanded && allDone && successCount > 0 && (\n <CheckCircle2 className=\"h-3 w-3 text-green-500\" />\n )}\n {!expanded && activeCount > 0 && <Loader2 className=\"h-3 w-3 text-blue-500 animate-spin\" />}\n </button>\n {expanded ? (\n <div className=\"space-y-2\">\n {toolCalls.map((tc, i) => (\n <ToolCallItem key={`${tc.timestamp}-${i}`} toolCall={tc} />\n ))}\n </div>\n ) : (\n <div className=\"flex flex-wrap items-start gap-1.5\">\n {toolCalls.map((tc, i) => (\n <ToolCallPill key={`pill-${tc.timestamp}-${i}`} toolCall={tc} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport function ToolCallCompact({ toolCalls }: { toolCalls: ToolCall[] }) {\n const activeTool = toolCalls.find((t) => ['streaming', 'ready', 'executing'].includes(t.status))\n const toolToShow = activeTool || toolCalls[toolCalls.length - 1]\n if (!toolToShow) return null\n const ToolIcon = getToolIcon(toolToShow.tool_name)\n const StatusIcon = getStatusIcon(toolToShow.status)\n const statusColor = getStatusColor(toolToShow.status)\n const isActive = ['streaming', 'ready', 'executing'].includes(toolToShow.status)\n return (\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-xs bg-muted/30 rounded\">\n <ToolIcon className=\"h-3 w-3 text-muted-foreground\" />\n <span className=\"font-medium\">{toolToShow.tool_display_name}</span>\n <StatusIcon className={cn('h-3 w-3', statusColor, isActive && 'animate-spin')} />\n </div>\n )\n}\n","import React from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { BookmarkFilledIcon, BookmarkIcon } from '@radix-ui/react-icons'\nimport { ButtonWithTooltip } from './ButtonWithTooltip'\nimport ConfettiEffect from './ConfettiEffect'\n\ninterface BookmarkButtonProps {\n isBookmarked: boolean\n onToggle: () => void\n isLoading?: boolean\n}\n\nexport function BookmarkButton({ isBookmarked, onToggle, isLoading }: BookmarkButtonProps) {\n return (\n <div className=\"relative\">\n <ButtonWithTooltip\n tooltipText={isBookmarked ? 'Remove bookmark' : 'Bookmark'}\n onClick={onToggle}\n disabled={isLoading}\n variant=\"ghost\"\n className=\"h-6 w-6\"\n >\n {isLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : isBookmarked ? (\n <BookmarkFilledIcon className=\"h-3.5 w-3.5 text-primary\" />\n ) : (\n <BookmarkIcon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </ButtonWithTooltip>\n <ConfettiEffect showGlobeConfetti={isBookmarked} />\n </div>\n )\n}\n","import React from 'react'\nimport { AnimatePresence, motion } from 'framer-motion'\n\nconst rainbowColors = [\n 'bg-red-400', 'bg-orange-400', 'bg-yellow-400', 'bg-green-400',\n 'bg-blue-400', 'bg-indigo-400', 'bg-purple-400', 'bg-pink-400',\n 'bg-red-500', 'bg-orange-500', 'bg-yellow-500', 'bg-green-500',\n 'bg-blue-500', 'bg-indigo-500', 'bg-purple-500', 'bg-pink-500',\n]\n\nexport default function ConfettiEffect({ showGlobeConfetti }: { showGlobeConfetti: boolean }) {\n return (\n <AnimatePresence>\n {showGlobeConfetti && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"absolute inset-0 pointer-events-none\"\n >\n {Array.from({ length: 25 }).map((_, i) => (\n <motion.div\n key={i}\n className={`absolute w-1.5 h-1.5 ${rainbowColors[Math.floor(Math.random() * rainbowColors.length)]} rounded-full`}\n style={{ top: '50%', left: '50%' }}\n animate={{\n x: [0, (Math.random() - 0.5) * 100],\n y: [0, -Math.random() * 100],\n opacity: [1, 0],\n scale: [0, 1],\n }}\n transition={{ duration: 1 + Math.random(), ease: 'easeOut' }}\n />\n ))}\n </motion.div>\n )}\n </AnimatePresence>\n )\n}\n","import React from 'react'\nimport { ButtonWithTooltip } from './ButtonWithTooltip'\nimport { Loader2, Split } from 'lucide-react'\n\ninterface BranchButtonProps {\n onBranch: () => void\n isLoading?: boolean\n tooltipText?: string\n}\n\nexport function BranchButton({ onBranch, isLoading, tooltipText = 'Branch conversation' }: BranchButtonProps) {\n return (\n <ButtonWithTooltip\n tooltipText={tooltipText}\n onClick={onBranch}\n disabled={isLoading}\n variant=\"ghost\"\n className=\"h-6 w-6\"\n >\n {isLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : (\n <Split className=\"h-3.5 w-3.5 rotate-90 text-muted-foreground\" />\n )}\n </ButtonWithTooltip>\n )\n}\n","import React, { useState } from 'react'\nimport { Loader2, ThumbsDown, ThumbsUp } from 'lucide-react'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { Button } from '../ui/button'\nimport ConfettiEffect from './ConfettiEffect'\nimport { cn } from '../../utils/cn'\n\ninterface FeedbackButtonsProps {\n onFeedback: (type: 'positive' | 'negative') => void\n className?: string\n isLoading?: boolean\n selectedFeedback?: 'positive' | 'negative' | null\n loadingType?: 'positive' | 'negative' | null\n}\n\nexport function FeedbackButtons({\n onFeedback,\n className,\n isLoading = false,\n selectedFeedback = null,\n loadingType = null,\n}: FeedbackButtonsProps) {\n const [showConfetti, setShowConfetti] = useState(false)\n\n const handlePositiveFeedback = () => {\n setShowConfetti(true)\n onFeedback('positive')\n setTimeout(() => setShowConfetti(false), 2000)\n }\n\n if (selectedFeedback) {\n return (\n <TooltipProvider>\n <div className={cn('flex items-center gap-1', className)}>\n {selectedFeedback === 'positive' ? (\n <div className=\"relative\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0 cursor-default\" disabled>\n <ThumbsUp className=\"h-3.5 w-3.5 fill-current\" />\n </Button>\n </div>\n </TooltipTrigger>\n <TooltipContent><p>Good response</p></TooltipContent>\n </Tooltip>\n <ConfettiEffect showGlobeConfetti={false} />\n </div>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <div>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-6 w-6 p-0 cursor-default\" disabled>\n <ThumbsDown className=\"h-3.5 w-3.5 fill-current\" />\n </Button>\n </div>\n </TooltipTrigger>\n <TooltipContent><p>Bad response</p></TooltipContent>\n </Tooltip>\n )}\n </div>\n </TooltipProvider>\n )\n }\n\n return (\n <TooltipProvider>\n <div className={cn('flex items-center gap-1', className)}>\n <div className=\"relative\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn('h-6 w-6 p-0 hover:bg-muted/50', isLoading && 'opacity-50 cursor-not-allowed')}\n onClick={handlePositiveFeedback}\n disabled={isLoading}\n >\n {isLoading && loadingType === 'positive' ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : (\n <ThumbsUp className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent><p>Good response</p></TooltipContent>\n </Tooltip>\n <ConfettiEffect showGlobeConfetti={showConfetti} />\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn('h-6 w-6 p-0 hover:bg-muted/50', isLoading && 'opacity-50 cursor-not-allowed')}\n onClick={() => onFeedback('negative')}\n disabled={isLoading}\n >\n {isLoading && loadingType === 'negative' ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n ) : (\n <ThumbsDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent><p>Bad response</p></TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n )\n}\n","import Lottie from 'lottie-react'\nimport { cn } from '../../utils/cn'\nimport loadingAnimation from '../../assets/loading.json'\n\ninterface ThinkingLogoProps {\n className?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst sizeClasses = {\n sm: { container: 'h-7 w-7', logo: 'h-3 w-3' },\n md: { container: 'h-8 w-8', logo: 'h-4 w-4' },\n lg: { container: 'h-10 w-10', logo: 'h-5 w-5' },\n}\n\nexport function ThinkingLogo({ className, size = 'md' }: ThinkingLogoProps) {\n return (\n <div\n className={cn(\n 'relative flex items-center justify-center',\n sizeClasses[size].container,\n className\n )}\n >\n {/* Circular spinner */}\n <div className=\"absolute inset-0 rounded-full border-2 border-y-primary/80 border-x-transparent animate-spin\" />\n\n {/* Lottie animation - position relative to container */}\n <div className=\"absolute inset-0 flex items-center justify-center border-none\">\n <Lottie\n animationData={loadingAnimation}\n loop={true}\n renderer=\"svg\"\n style={{\n width: '70%',\n height: '70%',\n background: 'transparent',\n border: 'none !important',\n outline: 'none',\n }}\n />\n </div>\n </div>\n )\n}\n","{\"assets\":[{\"id\":\"7\",\"layers\":[{\"ind\":6,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[44,43]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[88,86]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-12.07,0.13],[0.8,-17.21],[16.87,0.13],[0.04,0],[-0.04,0],[0.4,16.91]],\"o\":[[0.93,23.47],[-19.83,1.5],[-0.73,-18.8],[-0.04,0],[0.04,0],[17.47,0.07],[0,0]],\"v\":[[33.27,0.16],[65.78,32.11],[33.14,64.19],[0.75,32.24],[0.64,32.24],[0.75,32.24],[33.27,0.16]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"12\",\"layers\":[{\"ind\":11,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[26,25.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[52,51]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-7.06,0.08],[0.46,-10.07],[9.88,0.07],[0.23,9.9]],\"o\":[[0.54,13.73],[-11.61,0.88],[-0.43,-11],[10.22,0.04],[0,0]],\"v\":[[19.55,0.71],[38.57,19.41],[19.47,38.18],[0.52,19.49],[19.55,0.71]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"16\",\"layers\":[{\"ind\":15,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[49.5,49]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[99,98]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-13.7,0.15],[0.91,-19.54],[19.14,0.14],[0.04,0],[-0.04,0],[0.45,19.2]],\"o\":[[1.05,26.64],[-22.51,1.7],[-0.82,-21.34],[-0.04,0],[0.04,0],[19.82,0.07],[0,0]],\"v\":[[37.11,0.41],[73.99,36.66],[36.95,73.07],[0.2,36.81],[0.07,36.81],[0.2,36.81],[37.11,0.41]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"19\",\"layers\":[{\"ind\":18,\"ty\":0,\"ks\":{},\"w\":99,\"h\":98,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"16\"}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[152.5,166]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[305,332]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[-2.54,0],[-2.21,-1.23],[0,0],[-1.23,-2.15],[0.02,-2.46],[1.27,-2.13],[2.18,-1.24],[0,0],[1.27,-2.18],[-0.02,-2.51],[0,0],[1.27,-2.13],[2.18,-1.24],[2.52,-0.02],[2.2,1.21],[0,0],[1.27,2.15],[0.01,2.48],[0,0],[0,0],[5.61,0],[0.11,-5.42],[0,0],[0,0],[-1.69,-2.9],[-2.93,-1.71],[0,0],[-3.5,0.02],[-3,1.77],[0,0],[-1.7,2.9],[0,3.34],[0,0],[1.71,2.92],[2.96,1.7],[0,0],[3.47,0],[2.99,-1.71],[0,0],[0,0],[0,0],[-2.69,-5.17],[-5.49,3.19],[0,0]],\"o\":[[0,0],[2.21,-1.23],[2.54,0],[0,0],[2.16,1.27],[1.23,2.15],[-0.02,2.46],[-1.26,2.13],[0,0],[-2.22,1.25],[-1.28,2.18],[0,0],[-0.02,2.47],[-1.27,2.13],[-2.18,1.23],[-2.52,0.02],[0,0],[-2.2,-1.24],[-1.27,-2.15],[0,0],[0,0],[0,-5.51],[-5.54,0],[0,0],[0,0],[0.01,3.34],[1.69,2.9],[0,0],[3.02,1.73],[3.5,-0.02],[0,0],[2.94,-1.7],[1.69,-2.9],[0,0],[0.01,-3.36],[-1.71,-2.92],[0,0],[-2.99,-1.71],[-3.47,0],[0,0],[0,0],[0,0],[-5.12,2.89],[2.9,5.59],[0,0],[0,0]],\"v\":[[94.61,34.31],[98.2,32.29],[105.44,30.41],[112.68,32.29],[142.51,49.54],[147.68,54.75],[149.53,61.8],[147.57,68.81],[142.32,73.95],[86.59,104.67],[81.25,109.9],[79.32,117.05],[79.32,179.32],[77.36,186.33],[72.1,191.47],[64.94,193.38],[57.75,191.56],[27.89,174.9],[22.6,169.73],[20.65,162.66],[20.65,152.33],[20.7,152.33],[10.55,142.35],[0.4,152.13],[0.4,152.13],[0.4,175.18],[3,184.7],[10.05,191.73],[104.84,245.68],[114.8,248.29],[124.73,245.55],[218.86,190.92],[225.93,183.91],[228.51,174.38],[228.51,73.62],[225.92,64.03],[218.79,56.98],[124.65,3.34],[114.78,0.71],[104.91,3.34],[89.52,12.1],[89.52,12.07],[82.46,16.05],[78.11,30.43],[93.6,34.85],[94.59,34.27]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[0,0],[-1.21,2.01],[-2.09,1.11],[0,0],[-1.17,1.95],[-0.02,2.26],[1.14,1.97],[1.99,1.15],[0,0],[2.32,0],[2.02,-1.13],[0,0],[1.16,-1.96],[0,-2.27],[0,0],[-1.17,-1.97],[-2.02,-1.12],[0,0],[-2.31,0.01],[-1.99,1.14],[-1.15,1.96],[0.01,2.26]],\"o\":[[0,0],[0,0],[-0.02,-2.33],[1.21,-2.01],[0,0],[2.01,-1.11],[1.17,-1.95],[0.02,-2.26],[-1.14,-1.97],[0,0],[-2.02,-1.13],[-2.32,0],[0,0],[-2.01,1.14],[-1.16,1.96],[0,0],[-0.01,2.28],[1.17,1.97],[0,0],[2.01,1.12],[2.31,-0.01],[2,-1.14],[1.15,-1.96],[0,0]],\"v\":[[144.49,189.36],[144.49,147.77],[144.45,147.91],[146.26,141.27],[151.3,136.5],[188.54,115.96],[193.4,111.29],[195.21,104.86],[193.51,98.41],[188.73,93.66],[170.85,83.3],[164.24,81.58],[157.62,83.3],[106.94,111.85],[102.11,116.59],[100.35,123.05],[100.35,179.41],[102.11,185.9],[106.98,190.61],[124.8,200.61],[131.39,202.3],[137.95,200.54],[142.75,195.81],[144.49,189.36]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,2.27],[0,0],[1.12,1.93],[1.95,1.14],[2.26,0.05],[2,-1.04],[0,0],[1.22,-1.99],[0,-2.32],[0,0],[-1.14,-1.95],[-1.98,-1.13],[-2.29,-0.02],[-2,1.1],[0,0],[-1.17,1.95]],\"o\":[[1.17,-1.96],[0,0],[0,-2.22],[-1.12,-1.93],[-1.94,-1.14],[-2.27,-0.05],[0,0],[-2.09,1.1],[-1.22,2],[0,0],[0,2.24],[1.14,1.94],[1.98,1.13],[2.29,0.02],[0,0],[2.02,-1.11],[0,0]],\"v\":[[206.57,173.62],[208.36,167.17],[208.38,147.91],[206.67,141.59],[202,136.91],[195.58,135.09],[189.07,136.59],[171.12,146.05],[166.06,150.77],[164.19,157.36],[164.19,177.12],[165.94,183.51],[170.7,188.2],[177.22,189.95],[183.76,188.3],[201.7,178.3],[206.57,173.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"r\":2,\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":660,\"ip\":0,\"layers\":[{\"ind\":9,\"ty\":0,\"parent\":5,\"ks\":{},\"w\":88,\"h\":86,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"7\"},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[44,43]},\"p\":{\"a\":0,\"k\":[50.398,115.453]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":28.2,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":58.2,\"s\":[150,150],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":106.2,\"s\":[117,117],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":117,\"s\":[117,117],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":165,\"s\":[85,85],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":192.6,\"s\":[30,30],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":225,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":240,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":14,\"ty\":0,\"parent\":10,\"ks\":{},\"w\":52,\"h\":51,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"12\"},{\"ind\":10,\"ty\":3,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[26,25.5]},\"p\":{\"a\":0,\"k\":[25.398,31.953]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":48,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":96,\"s\":[150,150],\"i\":{\"x\":[0.013,0.013],\"y\":[0.975,0.975]},\"o\":{\"x\":[0.513,0.513],\"y\":[0,0]}},{\"t\":142.2,\"s\":[40.05,40.05],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":190.2,\"s\":[150,150],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":238.2,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":240,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":21,\"ty\":0,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[49.5,49]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100],\"h\":1},{\"t\":157.2,\"s\":[100],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":205.2,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":217.8,\"s\":[100],\"h\":1},{\"t\":240,\"s\":[100],\"h\":1}]},\"p\":{\"a\":0,\"k\":[102.898,48.453]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[0.013,0.013],\"y\":[0.975,0.975]},\"o\":{\"x\":[0.513,0.513],\"y\":[0,0]}},{\"t\":46.2,\"s\":[149.98,149.98],\"h\":1},{\"t\":46.2,\"s\":[150,150],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":94.2,\"s\":[50,50],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":142.2,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":190.2,\"s\":[25,25],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":205.2,\"s\":[25,25],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":217.8,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":240,\"s\":[100,100],\"h\":1}]}},\"w\":99,\"h\":98,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"19\"},{\"ind\":4,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[-0.088,21.594]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":26,\"ty\":0,\"parent\":22,\"ks\":{},\"w\":305,\"h\":332,\"ip\":0,\"op\":241,\"st\":0,\"refId\":\"24\"},{\"ind\":22,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[35.313,-0.953]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[149.691,164.954]}},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":27,\"ty\":4,\"parent\":2,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[330,330]},\"r\":{\"a\":0,\"k\":206229.375},\"s\":{\"a\":0,\"k\":[660,660]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.243,0.698,0.459]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":2,\"ty\":3,\"parent\":1,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":1,\"ty\":3,\"parent\":0,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0},{\"ind\":0,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":241,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":240,\"v\":\"5.7.4\",\"w\":660}","import React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface LogoStandAloneProps {\n className?: string\n}\n\nconst LogoStandAlone = ({ className }: LogoStandAloneProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"45\"\n height=\"51\"\n viewBox=\"0 0 45 51\"\n fill=\"none\"\n className={cn(className)}\n >\n <path\n d=\"M43.0811 11.7987L24.5117 0.964833C23.921 0.617926 23.2488 0.435059 22.5643 0.435059C21.8797 0.435059 21.2075 0.617926 20.6169 0.964833L1.90456 11.875C1.32501 12.2182 0.844612 12.7067 0.510658 13.2925C0.176703 13.8783 0.000708569 14.5412 0 15.2158V35.6712C0.00211576 36.3456 0.178704 37.008 0.512521 37.5935C0.846338 38.1791 1.32597 38.6678 1.90456 39.0121L20.6026 49.9079C21.1985 50.2571 21.8772 50.4392 22.5675 50.435C23.2578 50.4308 23.9343 50.2405 24.526 49.8841L43.0954 38.8498C43.6759 38.5077 44.1571 38.0195 44.4912 37.4334C44.8253 36.8474 45.0007 36.1839 45 35.509V15.1586C45.0016 14.4792 44.8252 13.8112 44.4885 13.2216C44.1518 12.632 43.6665 12.1413 43.0811 11.7987ZM15.5698 23.9306V36.5064C15.5656 37.0043 15.4321 37.4924 15.1822 37.9227C14.9324 38.353 14.575 38.7106 14.1453 38.9602C13.7155 39.2098 13.2283 39.3427 12.7316 39.346C12.235 39.3492 11.746 39.2226 11.3131 38.9787L5.42323 35.614C4.99007 35.3633 4.63015 35.003 4.37948 34.5692C4.1288 34.1353 3.99616 33.6431 3.99481 33.1418V17.3015C3.99616 16.8001 4.1288 16.3079 4.37948 15.8741C4.63015 15.4402 4.99007 15.0799 5.42323 14.8293L19.2932 6.81128C19.7286 6.56317 20.2208 6.43273 20.7216 6.43273C21.2224 6.43273 21.7147 6.56317 22.15 6.81128L28.0351 10.2953C28.4606 10.5518 28.812 10.9151 29.0547 11.3493C29.2974 11.7835 29.423 12.2736 29.4192 12.7712C29.4153 13.2689 29.2822 13.757 29.0328 14.1873C28.7834 14.6177 28.4264 14.9755 27.997 15.2254L17.003 21.4298C16.5647 21.6823 16.2011 22.0468 15.9493 22.4861C15.6975 22.9255 15.5666 23.424 15.5698 23.9306ZM28.4256 30.135V38.5348C28.4268 38.9914 28.3082 39.4403 28.0819 39.8365C27.8555 40.2328 27.5292 40.5624 27.1358 40.7925C26.7423 41.0226 26.2954 41.145 25.8399 41.1474C25.3844 41.1499 24.9362 41.0324 24.5403 40.8066L21.0263 38.7878C20.6269 38.5617 20.2949 38.2328 20.0647 37.8351C19.8346 37.4374 19.7145 36.9853 19.717 36.5255V25.1429C19.716 24.6845 19.8357 24.234 20.0639 23.8368C20.2921 23.4396 20.6208 23.1098 21.0168 22.8807L31.0158 17.1153C31.4127 16.8867 31.8626 16.7664 32.3204 16.7664C32.7782 16.7664 33.228 16.8867 33.625 17.1153L37.1532 19.2057C37.5458 19.4374 37.8707 19.7685 38.0951 20.1659C38.3196 20.5632 38.4357 21.0128 38.4319 21.4694C38.428 21.9261 38.3043 22.3736 38.0731 22.7671C37.842 23.1606 37.5116 23.4862 37.1151 23.7111L29.7683 27.8585C29.3554 28.0836 29.0115 28.4171 28.7733 28.8231C28.5351 29.2292 28.4116 29.6926 28.416 30.1637L28.4256 30.135ZM41.0242 34.0533C41.0237 34.5112 40.9017 34.9606 40.6708 35.3556C40.4398 35.7506 40.1083 36.077 39.7101 36.3012L36.1724 38.32C35.7786 38.5424 35.3336 38.6576 34.8817 38.6542C34.4297 38.6508 33.9865 38.5289 33.5961 38.3007C33.2057 38.0725 32.8816 37.7458 32.6562 37.3532C32.4307 36.9606 32.3117 36.5156 32.3109 36.0626V32.0727C32.3118 31.6035 32.4393 31.1434 32.6798 30.7409C32.9204 30.3384 33.2651 30.0087 33.6774 29.7866L37.2199 27.8776C37.6142 27.6668 38.0562 27.5618 38.5029 27.5729C38.9497 27.584 39.386 27.7108 39.7694 27.9409C40.1528 28.171 40.4703 28.4966 40.691 28.8861C40.9117 29.2756 41.0282 29.7157 41.029 30.1637L41.0242 34.0533Z\"\n fill=\"url(#paint0_angular_258_754)\"\n />\n <defs>\n <radialGradient\n id=\"paint0_angular_258_754\"\n cx=\"0\"\n cy=\"0\"\n r=\"1\"\n gradientUnits=\"userSpaceOnUse\"\n gradientTransform=\"translate(-6.41239e-07 13.5597) rotate(27.8141) scale(51.1419 51.2099)\"\n >\n <stop stopColor=\"#3ECF8E\" />\n <stop offset=\"0.5\" stopColor=\"#218759\" />\n <stop offset=\"1\" stopColor=\"#43E09A\" />\n </radialGradient>\n </defs>\n </svg>\n )\n}\n\nexport default LogoStandAlone\n","import { useEffect, useState } from 'react'\nimport { cn } from '../utils/cn'\n\ninterface MorphGradientProps {\n className?: string\n}\n\nexport default function MorphGradient({ className }: MorphGradientProps) {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) return null\n\n return (\n <div className={cn('absolute inset-0 rounded-lg overflow-hidden', className)}>\n <div className=\"absolute inset-0 bg-background/80\" />\n <div className=\"absolute inset-0\">\n <div className=\"absolute h-[40%] aspect-square top-[20%] left-[30%] animate-morph-slow border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(139,92,246,0.3)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[45%] aspect-square bottom-[25%] right-[20%] animate-morph-medium border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(16,185,129,0.25)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[35%] aspect-square top-[30%] right-[35%] animate-morph-fast border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(248,113,113,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[50%] aspect-square bottom-[15%] left-[25%] animate-morph-slower border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(79,70,229,0.25)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[30%] aspect-square top-[40%] left-[45%] animate-morph-fast border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(236,72,153,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[25%] aspect-square top-[15%] right-[40%] animate-morph-medium border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(234,179,8,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[20%] aspect-square bottom-[40%] left-[15%] animate-bounce-slow border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(139,92,246,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[15%] aspect-square top-[45%] right-[15%] animate-bounce-slow border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(16,185,129,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[35%] aspect-square -left-[10%] top-[30%] animate-edge-float border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(99,102,241,0.25)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[40%] aspect-square -right-[15%] bottom-[40%] animate-edge-float-reverse border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(244,114,182,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[30%] aspect-square -top-[10%] -left-[10%] animate-corner-float border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(34,197,94,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[25%] aspect-square -bottom-[5%] -right-[5%] animate-corner-float border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(249,115,22,0.2)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[20%] aspect-square -top-[5%] right-[20%] animate-edge-float border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(168,85,247,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n <div className=\"absolute h-[15%] aspect-square -bottom-[8%] left-[30%] animate-edge-float-reverse border-none\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(59,130,246,0.15)_0%,transparent_70%)] border-none\" />\n </div>\n </div>\n <div className=\"absolute inset-0 backdrop-blur-[40px]\" />\n </div>\n )\n}\n","import React, { useCallback, useRef, useState } from 'react'\nimport { Clock, Loader2, MessageSquare } from 'lucide-react'\nimport { usePapermapStoreApi, CHAT_MODAL_TAB } from '../../store'\nimport { RecentConversationItem } from '../common/RecentConversationItem'\nimport { DeleteConfirmationModal } from './DeleteConfirmationModal'\nimport { toast } from '../../hooks/use-toast'\nimport type { ConversationHistory } from '../../types/chart'\nimport { useInfiniteQuery, useQueryClient } from '@tanstack/react-query'\n\nexport function RecentConversations() {\n const storeApi = usePapermapStoreApi()\n const config = storeApi.getState().getConfig()\n const { chartSvc } = storeApi.getState().getServices()\n\n const [chatToDelete, setChatToDelete] = useState<ConversationHistory | null>(null)\n const [isDeleting, setIsDeleting] = useState(false)\n const scrollRef = useRef<HTMLDivElement>(null)\n const queryClient = useQueryClient()\n\n const dashboardId = config.dashboardId\n\n const fetchPage = useCallback(\n async ({ pageParam = 1 }: { pageParam?: number }) => {\n const result = await chartSvc.getConversationHistory({\n dashboard_id: dashboardId,\n per_page: 10,\n page: pageParam,\n })\n const chats = result?.data?.chats || []\n const pages = result?.data?.total_pages || 0\n return {\n chats,\n nextPage: pageParam + 1,\n totalPages: pages,\n }\n },\n [chartSvc, dashboardId]\n )\n\n const { data, isLoading, isRefetching, isFetchingNextPage, fetchNextPage, hasNextPage } =\n useInfiniteQuery({\n queryKey: ['conversationHistory', dashboardId],\n queryFn: fetchPage,\n getNextPageParam: (lastPage) => {\n if (lastPage.nextPage <= lastPage.totalPages) {\n return lastPage.nextPage\n }\n return undefined\n },\n initialPageParam: 1,\n enabled: !!dashboardId,\n // Avoid infinite retries on persistent failures; user can manually retry.\n retry: 1,\n retryDelay: 1000,\n })\n\n const cachedConversations = data?.pages.flatMap((page) => page.chats) || []\n\n const handleScroll = useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollHeight, clientHeight } = event.currentTarget\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100\n if (isNearBottom && hasNextPage && !isFetchingNextPage) {\n fetchNextPage()\n }\n },\n [fetchNextPage, hasNextPage, isFetchingNextPage]\n )\n\n const handleConversationClick = (conversation: ConversationHistory) => {\n const state = storeApi.getState()\n state.setEditChatId(null)\n state.setChatId(conversation.llm_data_chat_id)\n state.setChatModalTab(CHAT_MODAL_TAB.CHAT)\n state.updateAllMeta(conversation.meta || {})\n state.updateChartData([])\n state.setMessages([])\n }\n\n const handleDeleteChart = async (id: string) => {\n try {\n setIsDeleting(true)\n await chartSvc.deleteChart(id)\n await queryClient.invalidateQueries({ queryKey: ['conversationHistory', dashboardId] })\n toast({ title: 'Success', description: 'Conversation deleted successfully' })\n setChatToDelete(null)\n } catch (error) {\n console.error('error', error)\n toast({\n title: 'Error',\n description: 'Failed to delete conversation',\n variant: 'destructive',\n })\n } finally {\n setIsDeleting(false)\n }\n }\n\n const handleDeleteClick = (\n e: React.MouseEvent<HTMLButtonElement>,\n conversation: ConversationHistory\n ) => {\n e.stopPropagation()\n setChatToDelete(conversation)\n }\n\n return (\n <div className=\"flex flex-col w-full h-full\">\n <div className=\"flex items-center justify-between p-4 border-b border-border/50\">\n <div className=\"flex items-center gap-2 text-foreground\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-sm font-medium\">Recent Conversations</span>\n </div>\n <div className=\"flex gap-2\">\n {isRefetching && (\n <div className=\"flex items-center mx-auto gap-2 text-xs text-muted-foreground\">\n <Loader2 className=\"size-3 animate-spin\" />\n <p>Refreshing</p>\n </div>\n )}\n <span className=\"text-xs text-muted-foreground\">\n {cachedConversations.length} conversations\n </span>\n </div>\n </div>\n\n {isLoading && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <Loader2 className=\"h-6 w-6 text-muted-foreground animate-spin\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">Loading chats...</h3>\n <p className=\"text-xs text-muted-foreground\">\n Please wait while we fetch your conversation history\n </p>\n </div>\n )}\n\n {!isLoading && (\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"flex-1 overflow-auto scrollbar-hide\"\n >\n <div className=\"flex flex-col gap-1 p-2\">\n {cachedConversations.map((conversation, index) => (\n <RecentConversationItem\n key={conversation.llm_data_chat_id}\n conversation={conversation}\n index={index}\n handleConversationClick={handleConversationClick}\n handleDeleteClick={handleDeleteClick}\n />\n ))}\n </div>\n {isFetchingNextPage && (\n <div className=\"flex justify-center py-4\">\n <div className=\"size-4 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n )}\n </div>\n )}\n\n {!isLoading && cachedConversations.length === 0 && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <MessageSquare className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">No Recent Conversations yet</h3>\n <p className=\"text-xs text-muted-foreground\">\n Start a new chat to see your recent conversations here\n </p>\n </div>\n )}\n\n <DeleteConfirmationModal\n isOpen={!!chatToDelete}\n onClose={() => setChatToDelete(null)}\n isDeleting={isDeleting}\n onConfirm={() => chatToDelete && handleDeleteChart(chatToDelete.llm_data_chat_id)}\n title=\"Delete Conversation\"\n description=\"Are you sure you want to delete this conversation? This action cannot be undone.\"\n />\n </div>\n )\n}\n","import React from 'react'\nimport { MessageSquare, Trash2 } from 'lucide-react'\nimport { motion } from 'framer-motion'\nimport { cn } from '../../utils/cn'\nimport type { ConversationHistory } from '../../types/chart'\n\ntype RecentConversationItemProps = {\n conversation: ConversationHistory\n index: number\n handleConversationClick: (conversation: ConversationHistory) => void\n handleDeleteClick: (e: React.MouseEvent<HTMLButtonElement>, conversation: ConversationHistory) => void\n}\n\nexport function RecentConversationItem({\n conversation,\n index,\n handleConversationClick,\n handleDeleteClick,\n}: RecentConversationItemProps) {\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={cn(\n 'flex items-start gap-3 p-3 rounded-xl transition-all duration-200',\n 'hover:bg-muted/50 group cursor-pointer',\n 'border border-transparent hover:border-border/50',\n 'relative overflow-hidden'\n )}\n onClick={() => handleConversationClick(conversation)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleConversationClick(conversation)\n }}\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 ring-1 ring-inset ring-primary/5\">\n <MessageSquare className=\"size-4 text-primary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">\n {conversation?.name || `Untitled ${index + 1}`}\n </span>\n </div>\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground/80 leading-relaxed\">\n {conversation?.meta?.subtitle || 'No description'}\n </p>\n {conversation?.latest_user_name ? (\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n Last from {conversation.latest_user_name}\n </p>\n ) : null}\n </div>\n <span className=\"text-[10px] text-muted-foreground shrink-0 tabular-nums\">\n {conversation?.created_at\n ? new Date(conversation.created_at).toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n : ''}\n </span>\n </div>\n </div>\n <div\n className={cn(\n 'absolute right-2 top-1 opacity-0 group-hover:opacity-100',\n 'transition-all duration-200 ease-in-out transform translate-x-4 group-hover:translate-x-0'\n )}\n >\n <motion.button\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.95 }}\n onClick={(e) => handleDeleteClick(e as any, conversation)}\n className=\"p-2 rounded-full hover:bg-muted flex items-center justify-center group/delete\"\n >\n <Trash2 className=\"h-4 w-4 text-muted-foreground group-hover/delete:text-destructive transition-colors\" />\n </motion.button>\n </div>\n </motion.div>\n )\n}\n","import React from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { Dialog, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription } from '../ui/dialog'\nimport { Button } from '../ui/button'\n\ninterface DeleteConfirmationModalProps {\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title?: string\n description?: string\n isDeleting?: boolean\n}\n\nexport function DeleteConfirmationModal({\n isOpen,\n onClose,\n onConfirm,\n title = 'Are you sure?',\n description = 'This action cannot be undone.',\n isDeleting,\n}: DeleteConfirmationModalProps) {\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={isDeleting}>Cancel</Button>\n <Button variant=\"destructive\" onClick={onConfirm} disabled={isDeleting}>\n {isDeleting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Deleting...\n </>\n ) : (\n 'Delete'\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { Clock, Loader2, MessageSquare } from 'lucide-react'\nimport { Card, CardContent, CardHeader } from '../ui/card'\nimport { HistoryChartCard } from './HistoryChartCard'\nimport { usePapermapStore, usePapermapStoreApi, openPapermapChatAssistant } from '../../store'\nimport { toast } from '../../hooks/use-toast'\nimport type { ChartResponse, TChartResponse } from '../../types/chart'\n\nexport function ChartHistory() {\n const chatId = usePapermapStore((s) => s.chatId)\n const storeApi = usePapermapStoreApi()\n const { chartSvc } = storeApi.getState().getServices()\n\n const [charts, setCharts] = useState<ChartResponse[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isLoadingMore, setIsLoadingMore] = useState(false)\n const [totalPages, setTotalPages] = useState(0)\n const [currentPage, setCurrentPage] = useState(1)\n const scrollRef = useRef<HTMLDivElement>(null)\n\n const chatIdToUse = chatId\n\n const fetchCharts = async (page: number) => {\n try {\n const result = await chartSvc.getChartHistory({\n chat_id: chatIdToUse ?? '',\n per_page: 4,\n page,\n })\n\n if (page === 1) {\n setCharts(result?.data?.charts || [])\n } else {\n setCharts((prev) => [...prev, ...(result?.data?.charts || [])])\n }\n setTotalPages(result?.data?.total_pages || 0)\n setCurrentPage(page)\n } catch (error) {\n console.error('Error fetching charts:', error)\n } finally {\n setIsLoading(false)\n setIsLoadingMore(false)\n }\n }\n\n useEffect(() => {\n if (chatIdToUse) {\n setIsLoading(true)\n setIsLoadingMore(true)\n fetchCharts(1)\n }\n }, [chatIdToUse])\n\n const handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollHeight, clientHeight } = event.currentTarget\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 50\n if (isNearBottom && !isLoadingMore && currentPage < totalPages) {\n setIsLoadingMore(true)\n fetchCharts(currentPage + 1)\n }\n }\n\n const handleEditChart = (chartId: string, chart?: TChartResponse) => {\n openPapermapChatAssistant(storeApi, { editChartId: chartId, chart: chart ?? undefined })\n }\n\n const handleDeleteChart = (chart: TChartResponse) => {\n toast({\n title: 'Delete Chart',\n description: `Deleting chart with ID: ${chart.llm_data_chat_id}`,\n })\n }\n\n const handleRefetch = () => {\n fetchCharts(1)\n }\n\n return (\n <div className=\"flex flex-col w-full h-full p-6\">\n <div className=\"flex items-center justify-between p-3 border-b border-border/50\">\n <div className=\"flex items-center gap-2 text-foreground\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-sm font-medium\">Charts History</span>\n </div>\n </div>\n\n {isLoading && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <Loader2 className=\"h-6 w-6 text-muted-foreground animate-spin\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">Loading charts...</h3>\n <p className=\"text-xs text-muted-foreground\">\n Please wait while we fetch your chart history\n </p>\n </div>\n )}\n\n {!isLoading && (\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"flex-1 overflow-auto scrollbar-hide [mask-image:linear-gradient(to_bottom,transparent_0,black_8%,black_92%,transparent_100%)]\"\n >\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4 p-4\">\n {charts.map((chart, index) => (\n <Card\n key={index}\n className=\"overflow-hidden hover:shadow-md transition-shadow group border-0\"\n >\n <CardHeader className=\"p-4 pb-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex h-6 w-6 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <span className=\"text-xs font-medium\">{index + 1}</span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium\">\n {chart.visualization_config?.title || 'Untitled Chart'}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {new Date().toLocaleDateString()}\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"rounded-full bg-muted px-2 py-1 text-xs font-medium text-muted-foreground\">\n {chart.chart_type?.toUpperCase()}\n </span>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"p-4 pt-0\">\n <div className=\"w-full h-[300px]\">\n <HistoryChartCard\n chart={{\n chart_response: chart as any,\n llm_data_chat_id: chatIdToUse ?? '',\n name: `Chart ${index + 1}`,\n meta: {\n title: `Chart ${index + 1}`,\n description: chart.text_response,\n footer: '',\n showLegend: true,\n },\n pin: false,\n }}\n onDeleteClick={handleDeleteChart}\n onEditClick={handleEditChart}\n triggerRefetch={handleRefetch}\n />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n {isLoadingMore && (\n <div className=\"flex justify-center py-4\">\n <div className=\"size-4 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n )}\n </div>\n )}\n\n {!isLoading && charts.length === 0 && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <MessageSquare className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">No Charts History yet</h3>\n <p className=\"text-xs text-muted-foreground\">\n Start a new chat to see your charts history here\n </p>\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('rounded-xl border bg-card text-card-foreground shadow', className)} {...props} />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn('font-semibold leading-none tracking-tight', className)} {...props} />\n))\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(({ className, ...props }, ref) => (\n <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...props} />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import React, { useState } from 'react'\nimport { Loader2, Maximize2, Pencil, Trash2 } from 'lucide-react'\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\nimport { ChartDialog } from '../charts/ChartDialog'\nimport { ChartView } from '../charts/ChartView'\nimport { DeleteConfirmationModal } from './DeleteConfirmationModal'\nimport { cn } from '../../utils/cn'\nimport { toast } from '../../hooks/use-toast'\nimport type { TChartResponse } from '../../types/chart'\n\ninterface HistoryChartCardProps {\n chart: TChartResponse\n onDeleteClick: (chart: TChartResponse) => void\n /** Called with chart id; can optionally pass full chart for variant/metadata (plugin passes chart). */\n onEditClick: (chartId: string, chart?: TChartResponse) => void\n onToggleActive?: (id: string) => void\n triggerRefetch?: () => void\n isActive?: boolean\n}\n\nexport function HistoryChartCard({\n chart,\n onDeleteClick,\n onEditClick,\n isActive = false,\n}: HistoryChartCardProps) {\n const [showDeleteDialog, setShowDeleteDialog] = useState(false)\n const [showMaximized, setShowMaximized] = useState(false)\n const [isDeleting, setIsDeleting] = useState(false)\n\n const handleDelete = async () => {\n setIsDeleting(true)\n try {\n await onDeleteClick(chart)\n setShowDeleteDialog(false)\n toast({ title: 'Success', description: 'Chart deleted successfully' })\n } catch (error) {\n console.error('Error deleting chart:', error)\n toast({ title: 'Error', description: 'Failed to delete chart', variant: 'destructive' })\n } finally {\n setIsDeleting(false)\n }\n }\n\n return (\n <>\n <div\n className={cn(\n 'group relative flex h-full flex-col overflow-hidden transition-all duration-200 resize-handle',\n isActive && 'opacity-75 grayscale hover:opacity-100 hover:grayscale-0'\n )}\n >\n <div className=\"flex-1 min-h-0 mt-4 px-0 w-[120%] translate-x-[-10%] pb-0\">\n <ChartView\n data={chart?.chart_response?.data || []}\n chartMeta={chart?.meta}\n visualizationConfig={chart?.chart_response?.visualization_config || {}}\n chartType={chart?.chart_response?.chart_type || ''}\n variant=\"default\"\n className=\"h-full w-full\"\n chartId={chart.llm_data_chat_id}\n hideTitleAndSubtitle={true}\n error={chart?.chart_response?.error}\n />\n </div>\n\n <div className=\"absolute top-1 right-1 z-30 flex h-8 w-auto items-center justify-center bg-gradient-to-t from-background via-background to-transparent px-1\">\n <div className=\"flex items-center gap-3\">\n <ButtonWithTooltip onClick={() => setShowMaximized(true)} tooltipText=\"Maximize Chart\">\n <Maximize2 className=\"size-3\" />\n </ButtonWithTooltip>\n <ButtonWithTooltip\n onClick={() => onEditClick(chart.llm_data_chat_id, chart)}\n tooltipText=\"Edit Chart\"\n >\n <Pencil className=\"size-3\" />\n </ButtonWithTooltip>\n <ButtonWithTooltip\n onClick={() => setShowDeleteDialog(true)}\n tooltipText=\"Delete Chart\"\n disabled={isDeleting}\n >\n {isDeleting ? (\n <Loader2 className=\"size-3 animate-spin\" />\n ) : (\n <Trash2 className=\"size-3\" />\n )}\n </ButtonWithTooltip>\n </div>\n </div>\n </div>\n\n <DeleteConfirmationModal\n isOpen={showDeleteDialog}\n onClose={() => setShowDeleteDialog(false)}\n onConfirm={handleDelete}\n isDeleting={isDeleting}\n title=\"Are you sure you want to delete this chart?\"\n description=\"This action cannot be undone. This will permanently delete the chart.\"\n />\n\n <ChartDialog\n isOpen={showMaximized}\n onOpenChange={setShowMaximized}\n title={chart?.meta?.title}\n data={chart?.chart_response?.data || []}\n chartId={chart.llm_data_chat_id}\n chartMeta={chart?.meta}\n chartType={chart?.chart_response?.chart_type || ''}\n visualizationConfig={chart?.chart_response?.visualization_config || {}}\n onMetaChange={() => {}}\n variant=\"default\"\n onClose={() => setShowMaximized(false)}\n />\n </>\n )\n}\n","import { Dialog, DialogContent, DialogTitle } from '../ui/dialog'\nimport { Camera, Loader2, Minimize2 } from 'lucide-react'\nimport { useState } from 'react'\n\nimport { Button } from '../ui/button'\nimport { ChartView, type TChartMeta } from './ChartView'\nimport { takeScreenshot } from '../../lib/screenshot'\nimport { useToast } from '../../hooks/use-toast'\nimport { cn } from '../../utils/cn'\nimport {\n PapermapProvider,\n usePapermapConnectionOptional,\n usePapermapStoreApiOptional,\n} from '../../store'\n\nexport interface ChartDialogProps {\n token?: string\n workspaceId?: string\n dashboardId?: string\n apiUrl?: string\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n title?: string\n data: any[]\n chartId: string\n chartMeta: TChartMeta\n chartType: string\n visualizationConfig: Record<string, any>\n onMetaChange: (key: 'title' | 'description' | 'footer' | 'subtitle', value: string) => void\n variant?: string\n onClose?: () => void\n}\n\nexport function ChartDialog(props: ChartDialogProps) {\n const parentStore = usePapermapStoreApiOptional()\n const connection = usePapermapConnectionOptional()\n const resolvedToken = props.token ?? connection?.token\n const resolvedWorkspaceId = props.workspaceId ?? connection?.workspaceId\n const resolvedDashboardId = props.dashboardId ?? connection?.dashboardId\n const resolvedApiUrl = props.apiUrl ?? connection?.apiUrl\n\n if (!resolvedToken || !resolvedWorkspaceId || !resolvedDashboardId) {\n throw new Error(\n 'ChartDialog requires token, workspaceId, and dashboardId from props or PapermapProvider.'\n )\n }\n if (parentStore) {\n return <ChartDialogInner {...props} />\n }\n\n return (\n <PapermapProvider\n token={resolvedToken}\n workspaceId={resolvedWorkspaceId}\n dashboardId={resolvedDashboardId}\n apiUrl={resolvedApiUrl}\n >\n <ChartDialogInner {...props} />\n </PapermapProvider>\n )\n}\n\nfunction ChartDialogInner({ isOpen, onOpenChange, title, onClose, ...rest }: ChartDialogProps) {\n const [isTakingScreenshot, setIsTakingScreenshot] = useState(false)\n const { toast } = useToast()\n\n const takeScreenshotAsync = async () => {\n try {\n setIsTakingScreenshot(true)\n await takeScreenshot({\n selector: '.chart',\n additionalWidth: 30,\n fileName: title || 'View chart',\n additionalHeight: 50,\n })\n toast({\n title: 'Success',\n description: 'Screenshot taken successfully',\n })\n } catch (error) {\n console.error(error)\n toast({\n title: 'Error',\n description: 'Failed to take screenshot.',\n variant: 'destructive',\n })\n } finally {\n setIsTakingScreenshot(false)\n }\n }\n\n return (\n <Dialog open={isOpen} onOpenChange={onOpenChange}>\n <DialogContent\n className={cn(\n 'max-w-[75vw] h-[92vh] flex flex-col justify-center items-center p-0 [&>button]:hidden chart'\n )}\n >\n <div className=\"flex justify-between items-center w-full relative\">\n <div className=\"sr-only\">\n <DialogTitle>{title || 'Chart View'}</DialogTitle>\n </div>\n <Button\n onClick={takeScreenshotAsync}\n variant=\"ghost\"\n size=\"icon\"\n className={cn('fixed top-5 right-14 h-8 w-8')}\n disabled={isTakingScreenshot}\n >\n {isTakingScreenshot ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Camera className=\"size-4\" />\n )}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n onClose?.()\n onOpenChange(false)\n }}\n className={cn('h-8 w-8 absolute top-5 right-5')}\n >\n <Minimize2 className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div className=\"flex-1 w-[70vw] p-10 overflow-hidden\">\n <ChartView isDialog className=\"h-full\" {...rest} />\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","import { Maximize2, Pencil, Save, X, AlertTriangle } from 'lucide-react'\nimport { usePapermapStoreApi } from '../../store'\nimport { useToast } from '../../hooks/use-toast'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'\nimport { Button } from '../ui/button'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nimport { AreaChart } from './AreaChart'\nimport { BarChart } from './BarChart'\nimport { DataTable } from './DataTable'\nimport { LineChart } from './LineChart'\nimport { NoDataCard } from './NoDataCard'\nimport { PieChart } from './PieChart'\nimport { RadarChart } from './RadarChart'\nimport { ScatterChart } from './ScatterChart'\nimport { Tile } from './Tile'\nimport { cn } from '../../utils/cn'\nimport { getXYKeys, unwrapNestedChartData } from '../../lib/chart-utils'\n\nexport interface TChartMeta {\n title?: string\n subtitle?: string\n footer?: string\n variant?: string\n showLegend?: boolean\n}\n\nconst CHART_VARIATIONS: Record<string, string[]> = {\n bar: [\n 'default',\n 'horizontal',\n 'stacked',\n 'multiple',\n 'negative',\n 'triangular',\n 'value-on-top',\n 'triangular-with-value',\n 'brush',\n ],\n line: ['default', 'linear', 'step', 'multiple', 'dots', 'dashed', 'curved'],\n area: ['default', 'linear', 'step', 'stacked', 'gradient'],\n pie: ['default', 'donut', 'stacked', 'percentage', 'percentage-with-label'],\n radar: ['default', 'dots', 'multiple', 'lines', 'filled'],\n scatter: ['default'],\n table: ['default'],\n tile: ['default', 'horizontal', 'vertical', 'colored', 'centered'],\n}\n\nexport interface ChartViewProps {\n data: any[]\n chartMeta: TChartMeta\n error?: boolean\n chartType: string\n variant?: string\n className?: string\n containerClassName?: string\n visualizationConfig?: Record<string, any>\n previewMode?: boolean\n onMetaChange?: (key: 'title' | 'description' | 'footer' | 'subtitle', value: string) => void\n chartId?: string\n onClose?: () => void\n isDialog?: boolean\n onMaximize?: () => void\n showIcons?: boolean\n hideTitleAndSubtitle?: boolean\n hideVariants?: boolean\n pin?: boolean\n /** Called when the user clicks the edit action on the chart header. */\n onEditClick?: () => void\n /**\n * Override the built-in save-to-dashboard handler. When provided, this\n * callback is invoked instead of the internal pin+meta-update logic.\n */\n onSaveToDashboard?: () => void\n /**\n * Render the save button as a compact pill in the chart header instead\n * of the default bottom-left outline button. Used in streaming layouts.\n */\n compactSave?: boolean\n}\n\nexport function ChartView(props: ChartViewProps) {\n const {\n data: rawData,\n chartMeta,\n chartType = 'bar',\n className,\n visualizationConfig = {},\n chartId,\n onClose,\n isDialog = false,\n onMaximize,\n hideTitleAndSubtitle = false,\n hideVariants = false,\n showIcons = false,\n pin = false,\n onEditClick,\n onSaveToDashboard,\n compactSave = false,\n } = props\n\n const storeApi = usePapermapStoreApi()\n const { chartSvc } = storeApi.getState().getServices()\n const dashboardId = storeApi.getState().getConfig().dashboardId\n const { toast } = useToast()\n const [isSaving, setIsSaving] = useState(false)\n\n const data = useMemo(() => unwrapNestedChartData(rawData || []), [rawData])\n const isAxisChart = ['bar', 'line', 'area', 'scatter', 'radar'].includes(chartType)\n const hasNoPlottableData = useMemo(() => {\n if (!isAxisChart || !Array.isArray(data) || !data.length) return false\n const { y_keys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n return y_keys.length === 0\n }, [data, isAxisChart, visualizationConfig?.x_key, visualizationConfig?.y_key])\n\n const normalizedProps = useMemo(() => ({ ...props, data }), [props, data])\n const isMultiTile = chartType === 'tile' && (data?.length || 0) > 1\n\n const getDefaultVariant = (type: string, metaVariant?: string) => {\n if (metaVariant) return metaVariant\n if (type === 'pie') return 'percentage-with-label'\n return ''\n }\n\n const [selectedVariation, setSelectedVariation] = useState(\n getDefaultVariant(chartType, chartMeta?.variant)\n )\n const [headerHeight, setHeaderHeight] = useState(70)\n const headerRef = useRef<HTMLDivElement>(null)\n const scrollContainerRef = useRef<HTMLDivElement>(null)\n const [isScrolling, setIsScrolling] = useState(false)\n\n const chartVariations = (() => {\n const variations = CHART_VARIATIONS[chartType] || ['default']\n if (chartType === 'tile' && !isMultiTile)\n return variations.filter((v) => !['horizontal', 'vertical'].includes(v))\n return variations\n })()\n\n useEffect(() => {\n if (chartMeta?.variant) setSelectedVariation(chartMeta.variant)\n else setSelectedVariation(getDefaultVariant(chartType, undefined))\n }, [chartMeta, chartType])\n\n useEffect(() => {\n const updateHeaderHeight = () => {\n if (headerRef.current) setHeaderHeight(headerRef.current.offsetHeight + 16)\n }\n updateHeaderHeight()\n const resizeObserver = new ResizeObserver(updateHeaderHeight)\n if (headerRef.current) resizeObserver.observe(headerRef.current)\n return () => resizeObserver.disconnect()\n }, [chartMeta?.title, chartMeta?.subtitle, hideTitleAndSubtitle])\n\n // Enable scroll behavior for multi-tile layouts, similar to main app\n useEffect(() => {\n const scrollContainer = scrollContainerRef.current\n if (!scrollContainer || !isMultiTile) return\n\n let scrollTimeout: ReturnType<typeof setTimeout>\n\n const handleScroll = () => {\n setIsScrolling(true)\n clearTimeout(scrollTimeout)\n scrollTimeout = setTimeout(() => {\n setIsScrolling(false)\n }, 1000)\n }\n\n scrollContainer.addEventListener('scroll', handleScroll, { passive: true })\n\n return () => {\n scrollContainer.removeEventListener('scroll', handleScroll)\n clearTimeout(scrollTimeout)\n }\n }, [isMultiTile])\n\n const handleSaveToDashboard = async () => {\n if (onSaveToDashboard) {\n onSaveToDashboard()\n return\n }\n if (!chartId || !dashboardId) return\n try {\n setIsSaving(true)\n const title = chartMeta?.title || visualizationConfig?.title || 'Chart'\n if (chartMeta?.variant !== selectedVariation) {\n await chartSvc.updateChartMeta(chartId, {\n ...chartMeta,\n variant: selectedVariation,\n })\n }\n await chartSvc.updateChartPin(chartId, true)\n toast({\n title: `Chart ${title} saved to dashboard`,\n description: '',\n })\n } catch (error) {\n console.error('Failed to save chart:', error)\n toast({\n title: 'Failed to save chart',\n description: '',\n variant: 'destructive',\n })\n } finally {\n setIsSaving(false)\n }\n }\n\n const renderChart = () => (\n <>\n {!Array.isArray(data) || !data.length ? (\n <div className=\"absolute inset-0 bottom-12 flex items-center justify-center\">\n <NoDataCard\n message={\n chartId\n ? 'No data available for this chart'\n : 'Tell me what kind of chart you want to create...'\n }\n />\n </div>\n ) : hasNoPlottableData ? (\n <div className=\"absolute inset-0 bottom-12 flex items-center justify-center\">\n <div className=\"flex flex-col items-center justify-center gap-4 p-8 text-muted-foreground/70 max-w-sm text-center\">\n <div className=\"relative\">\n <div className=\"absolute -inset-4 bg-foreground/5 blur-xl rounded-full\" />\n <AlertTriangle className=\"size-12 relative opacity-60\" />\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium text-foreground/80\">\n This data doesn't contain numeric values to chart\n </p>\n <p className=\"text-xs text-muted-foreground/60\">\n Try asking the AI to calculate or aggregate the data into numbers, or request a\n table view instead.\n </p>\n </div>\n </div>\n </div>\n ) : (\n <>\n {chartType === 'bar' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <BarChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'pie' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <PieChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'line' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <LineChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'area' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <AreaChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'radar' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <RadarChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'scatter' && (\n <div className={cn('h-full w-full', !isDialog && 'pt-6 px-4')}>\n <ScatterChart\n {...normalizedProps}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n />\n </div>\n )}\n {chartType === 'table' && (\n <div className=\"absolute inset-0 flex flex-col\">\n <DataTable data={data} />\n </div>\n )}\n </>\n )}\n </>\n )\n\n const headerContent = !hideTitleAndSubtitle && (\n <div ref={headerRef} className=\"flex-none space-y-2 px-4 pt-3 pb-2\">\n <div className=\"flex justify-between items-start\">\n <div className=\"flex flex-col w-[70%] min-w-0\">\n {visualizationConfig?.title && (\n <h1 className=\"text-lg font-medium px-2 -mx-2 py-0.5\">{visualizationConfig.title}</h1>\n )}\n {visualizationConfig?.subtitle && (\n <p className=\"text-[13px] px-2 -mx-2 py-0.5 opacity-80\">\n {visualizationConfig.subtitle}\n </p>\n )}\n </div>\n <div className=\"flex-shrink-0 relative z-10\">\n <div className=\"flex items-center gap-2\">\n {!isDialog && !hideVariants && chartVariations.length > 1 && (\n <Select value={selectedVariation || ''} onValueChange={setSelectedVariation}>\n <SelectTrigger className=\"w-[160px] h-8 border-white/20\">\n <SelectValue placeholder=\"Chart Variations\" />\n </SelectTrigger>\n <SelectContent className=\"border-white/20\">\n {chartVariations.map((variation, index) => (\n <SelectItem key={index} value={variation}>\n {variation.charAt(0).toUpperCase() + variation.slice(1)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {compactSave && !pin && showIcons && chartId && dashboardId && !hasNoPlottableData && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleSaveToDashboard}\n disabled={isSaving}\n className=\"h-7 px-3 rounded-full text-xs font-medium gap-1.5\"\n >\n <Save className=\"h-3 w-3\" />\n {isSaving ? 'Saving...' : 'Save'}\n </Button>\n )}\n {!isDialog && onEditClick && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onEditClick} className=\"h-8 w-8\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n )}\n {!isDialog && onMaximize && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onMaximize} className=\"h-8 w-8\">\n <Maximize2 className=\"h-4 w-4\" />\n </Button>\n )}\n {onClose && !isDialog && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose} className=\"h-8 w-8\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n\n const saveButton =\n !isDialog &&\n !pin &&\n showIcons &&\n chartId &&\n dashboardId &&\n !hasNoPlottableData &&\n !compactSave ? (\n <div className=\"absolute bottom-0 left-2\">\n <div className=\"flex justify-start\">\n <Button\n variant=\"outline\"\n onClick={handleSaveToDashboard}\n className=\"gap-2 bg-inherit\"\n disabled={isSaving}\n loading={isSaving}\n >\n <Save className=\"h-4 w-4\" />\n Save to Dashboard\n </Button>\n </div>\n </div>\n ) : null\n\n if (chartType === 'tile') {\n return (\n <div className=\"h-full overflow-hidden relative\">\n <div className=\"relative h-full w-full\">\n {headerContent}\n <div\n ref={scrollContainerRef}\n className={cn(\n 'absolute inset-x-0 bottom-4 m-0 px-0',\n isMultiTile && 'overflow-y-auto scrollbar-auto-hide',\n isMultiTile && isScrolling && 'scrolling'\n )}\n style={{ top: hideTitleAndSubtitle ? 0 : `${headerHeight}px` }}\n >\n <div className={cn('w-full', isMultiTile && 'pb-4')}>\n <Tile\n data={data}\n visualizationConfig={{ ...visualizationConfig, variant: selectedVariation }}\n isMultiTile={isMultiTile}\n />\n </div>\n </div>\n {saveButton}\n </div>\n </div>\n )\n }\n\n return (\n <div className={cn('h-full overflow-hidden relative', isDialog && 'overflow-hidden')}>\n <div className={cn('flex flex-col h-full', className)}>\n {headerContent}\n <div\n className=\"absolute inset-x-0 bottom-4 m-0 px-0\"\n style={{ top: hideTitleAndSubtitle ? 0 : `${headerHeight}px` }}\n >\n {renderChart()}\n </div>\n {saveButton}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\nconst Select = SelectPrimitive.Root\nconst SelectGroup = SelectPrimitive.Group\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton ref={ref} className={cn('flex cursor-default items-center justify-center py-1', className)} {...props}>\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton ref={ref} className={cn('flex cursor-default items-center justify-center py-1', className)} {...props}>\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn('p-1', position === 'popper' && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]')}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', className)} {...props} />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import {\n Area,\n CartesianGrid,\n Legend,\n AreaChart as RechartsAreaChart,\n ResponsiveContainer,\n XAxis,\n YAxis,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nexport function AreaChart({\n data,\n chartMeta,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const { x_key, y_keys, primaryYKey, contextKeys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const parsedData = normalizeNumericStrings(data)\n const getAreaType = () => {\n if (visualizationConfig?.variant === 'step') return 'step'\n if (visualizationConfig?.variant === 'linear') return 'linear'\n return 'monotone'\n }\n const isStacked = visualizationConfig?.variant === 'stacked'\n const useGradient = visualizationConfig?.variant === 'gradient'\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsAreaChart data={parsedData} margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <defs>\n {useGradient &&\n y_keys.map((key, index) => (\n <linearGradient key={key} id={`gradient-${key}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop\n offset=\"0%\"\n stopColor={\n visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n }\n stopOpacity={0.8}\n />\n <stop\n offset=\"100%\"\n stopColor={\n visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n }\n stopOpacity={0.1}\n />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis\n dataKey={visualizationConfig?.x_key || x_key}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n dataKey={y_keys.length <= 1 ? primaryYKey : undefined}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent contextKeys={contextKeys} />}\n />\n {chartMeta?.showLegend !== false && <Legend />}\n {y_keys.map((key, index) => {\n const color = visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n return (\n <Area\n key={key}\n type={getAreaType()}\n dataKey={key}\n stroke={color}\n fill={useGradient ? `url(#gradient-${key})` : color}\n fillOpacity={useGradient ? 1 : 0.4}\n stackId={isStacked ? '1' : undefined}\n />\n )\n })}\n </RechartsAreaChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as RechartsPrimitive from 'recharts'\nimport { cn } from '../../utils/cn'\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n}\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />')\n }\n\n return context\n}\n\nconst ChartContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> & {\n config: ChartConfig\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children']\n }\n>(({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId()\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>{children}</RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n})\nChartContainer.displayName = 'Chart'\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(([_, config]) => config.theme || config.color)\n\n if (!colorConfig.length) {\n return null\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] || itemConfig.color\n return color ? ` --color-${key}: ${color};` : null\n })\n .join('\\n')}\n}\n`\n )\n .join('\\n'),\n }}\n />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nconst ChartTooltipContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<'div'> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: 'line' | 'dot' | 'dashed'\n nameKey?: string\n labelKey?: string\n contextKeys?: string[]\n }\n>(\n (\n {\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n contextKeys,\n },\n ref\n ) => {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey || item.dataKey || item.name || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === 'string'\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn('font-medium text-foreground', labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n if (!value) return null\n return <div className={cn('font-medium text-foreground', labelClassName)}>{value}</div>\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot'\n\n return (\n <div\n ref={ref}\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background text-foreground px-2.5 py-1.5 text-xs shadow-xl',\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color || item.payload.fill || item.color\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n indicator === 'dot' && 'items-center'\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent':\n indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n }\n )}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between gap-4 leading-none',\n nestLabel ? 'items-end' : 'items-center'\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-foreground\">{itemConfig?.label || item.name}</span>\n </div>\n {item.value && (\n <span className=\"font-mono font-medium tabular-nums text-foreground\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n {contextKeys && contextKeys.length > 0 && payload?.[0]?.payload && (\n <div className=\"border-t border-border/30 mt-1.5 pt-1.5 grid gap-1\">\n {contextKeys.map((key) => {\n const value = payload[0].payload[key]\n if (value == null) return null\n return (\n <div key={key} className=\"flex justify-between gap-4 text-[11px]\">\n <span className=\"text-muted-foreground capitalize\">{key.replace(/_/g, ' ')}</span>\n <span className=\"font-mono text-foreground/80 truncate max-w-[160px]\">\n {String(value)}\n </span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n }\n)\nChartTooltipContent.displayName = 'ChartTooltip'\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nconst ChartLegendContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> &\n Pick<RechartsPrimitive.LegendProps, 'payload' | 'verticalAlign'> & {\n hideIcon?: boolean\n nameKey?: string\n }\n>(({ className, hideIcon = false, payload, verticalAlign = 'bottom', nameKey }, ref) => {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center justify-center gap-4',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n className\n )}\n >\n {payload.map((item) => {\n const key = `${nameKey || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n return (\n <div\n key={item.value}\n className={cn(\n 'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground'\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n )\n })}\n </div>\n )\n})\nChartLegendContent.displayName = 'ChartLegend'\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n 'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (key in payload && typeof payload[key as keyof typeof payload] === 'string') {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config]\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n}\n","export function normalizeNumericStrings<T extends Record<string, any>>(data: T[]): T[] {\n return data.map((item) => {\n const normalizedItem: Record<string, any> = { ...item }\n for (const key in normalizedItem) {\n const value = normalizedItem[key]\n if (typeof value === 'string' && !isNaN(Number(value))) {\n normalizedItem[key] = Number(value)\n }\n }\n return normalizedItem as T\n })\n}\n\nexport function unwrapNestedChartData(data: any[]): any[] {\n if (\n Array.isArray(data) &&\n data.length === 1 &&\n data[0] != null &&\n typeof data[0] === 'object' &&\n Array.isArray(data[0].chart_data)\n ) {\n return data[0].chart_data\n }\n return data\n}\n\nexport const getXYKeys = ({ data, x, y }: { data: any[]; x?: string; y?: string | string[] }) => {\n if (!Array.isArray(data) || !data.length)\n return {\n x_key: '',\n y_keys: [] as string[],\n primaryYKey: undefined as string | undefined,\n contextKeys: [] as string[],\n }\n const keys = Object.keys(data[0] || {})\n const x_key = x || keys[0]\n const allNonXKeys = keys.filter((key) => key !== x_key)\n const y_keys = allNonXKeys.filter((key) => {\n const sample = data.find((row) => row[key] != null)?.[key]\n return (\n typeof sample === 'number' ||\n (typeof sample === 'string' && !isNaN(Number(sample)) && sample.trim() !== '')\n )\n })\n const contextKeys = allNonXKeys.filter((key) => !y_keys.includes(key))\n let primaryYKey: string | undefined\n if (Array.isArray(y)) {\n primaryYKey = undefined\n } else {\n primaryYKey = y && y_keys.includes(y) ? y : undefined\n }\n return { x_key, y_keys, primaryYKey, contextKeys }\n}\n\nexport const formatePieChartData = ({\n data,\n visualizationConfig,\n}: {\n data: any[]\n visualizationConfig: any\n}) => {\n if (!Array.isArray(data) || !data.length) return []\n const { x_key, primaryYKey } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const numericKeys = Object.keys(data[0]).filter((key) => typeof data[0][key] === 'number')\n if (!x_key || !numericKeys.length) return []\n return numericKeys.map((valueKey) => ({\n label: valueKey,\n x_key,\n y_key: primaryYKey || '',\n data: data.map((item) => ({\n [x_key]: item[x_key],\n [String(primaryYKey)]: item[valueKey],\n })),\n }))\n}\n\nexport const formatChartData = (data: any[]) => {\n if (!Array.isArray(data) || !data.length) return []\n const numericKeys = Object.keys(data[0]).filter((key) => typeof data[0][key] === 'number')\n const nameKey = Object.keys(data[0]).find((key) => key.toLowerCase())\n if (!nameKey || !numericKeys.length) return []\n return numericKeys.map((valueKey) => ({\n label: valueKey,\n data: data.map((item) => ({ name: item[nameKey], value: item[valueKey] })),\n }))\n}\n\nexport function formatNumericValue(value: any): string {\n if (value == null) return ''\n const num = Number(value)\n if (isNaN(num)) return String(value)\n if (Math.abs(num) >= 1_000_000_000) return `${(num / 1_000_000_000).toFixed(1)}B`\n if (Math.abs(num) >= 1_000_000) return `${(num / 1_000_000).toFixed(1)}M`\n if (Math.abs(num) >= 1_000) return `${(num / 1_000).toFixed(1)}K`\n if (Number.isInteger(num)) return num.toLocaleString()\n return num.toFixed(2)\n}\n\nexport function downloadCSV(data: any[], filename = 'data.csv') {\n if (!data.length) return\n const headers = Object.keys(data[0])\n const rows = data.map((row) => headers.map((h) => JSON.stringify(row[h] ?? '')).join(','))\n const csv = [headers.join(','), ...rows].join('\\n')\n const blob = new Blob([csv], { type: 'text/csv' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\nexport function generateChartConfig(keys: string[]) {\n const chartConfig: Record<string, { label: string; color: string }> = {}\n keys.forEach((key, index) => {\n chartConfig[key] = {\n label: key.charAt(0).toUpperCase() + key.slice(1),\n color: `hsl(var(--chart-${(index % 5) + 1}))`,\n }\n })\n return chartConfig\n}\n","import {\n Bar,\n CartesianGrid,\n Legend,\n BarChart as RechartsBarChart,\n XAxis,\n YAxis,\n BarProps,\n LabelList,\n Brush,\n ReferenceLine,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nconst getPath = (x: number, y: number, width: number, height: number) =>\n `M${x},${y + height}C${x + width / 3},${y + height} ${x + width / 2},${y + height / 3} ${x + width / 2}, ${y} C${x + width / 2},${y + height / 3} ${x + (2 * width) / 3},${y + height} ${x + width}, ${y + height} Z`\n\nconst TriangleBar = (props: BarProps) => {\n const { fill, x, y, width, height } = props\n return (\n <path\n d={getPath(Number(x), Number(y), Number(width), Number(height))}\n stroke=\"none\"\n fill={fill}\n />\n )\n}\n\nconst ValueLabel = (props: { x: number; y: number; value: number; width: number }) => {\n const { x, y, value, width } = props\n const centerX = x + width / 2\n const radius = 16\n const padding = 4\n return (\n <g>\n <circle\n cx={centerX}\n cy={y - radius - padding}\n r={radius}\n fill=\"hsl(var(--background))\"\n stroke=\"hsl(var(--border))\"\n strokeWidth={1}\n />\n <text\n x={centerX}\n y={y - radius - padding}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n style={{ fill: 'hsl(var(--foreground))', fontSize: '12px', fontWeight: 500 }}\n >\n {value.toLocaleString()}\n </text>\n </g>\n )\n}\n\nexport function BarChart({\n data,\n chartMeta,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const { x_key, y_keys, primaryYKey, contextKeys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const parsedData = normalizeNumericStrings(data)\n const isHorizontal = visualizationConfig?.variant === 'horizontal'\n const isStacked = visualizationConfig?.variant === 'stacked'\n const isTriangular =\n visualizationConfig?.variant === 'triangular' ||\n visualizationConfig?.variant === 'triangular-with-value'\n const showValueOnTop =\n visualizationConfig?.variant === 'value-on-top' ||\n visualizationConfig?.variant === 'triangular-with-value'\n const isBrush = visualizationConfig?.variant === 'brush'\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <RechartsBarChart\n data={parsedData}\n margin={{ top: 20, right: 30, left: 20, bottom: isBrush ? 50 : 20 }}\n layout={isHorizontal ? 'vertical' : 'horizontal'}\n >\n <CartesianGrid vertical={false} strokeDasharray=\"4\" stroke=\"hsl(var(--border))\" />\n <XAxis\n dataKey={isHorizontal ? (y_keys.length <= 1 ? primaryYKey : undefined) : x_key}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n type={isHorizontal ? 'number' : 'category'}\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n dataKey={isHorizontal ? x_key : y_keys.length <= 1 ? primaryYKey : undefined}\n stroke=\"hsl(var(--muted-foreground))\"\n type={isHorizontal ? 'category' : 'number'}\n />\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent contextKeys={contextKeys} />}\n />\n {chartMeta?.showLegend !== false && <Legend />}\n {isBrush && <ReferenceLine y={0} stroke=\"hsl(var(--border))\" />}\n {y_keys.map((key, index) => (\n <Bar\n key={key}\n dataKey={key}\n name={key}\n fill={visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`}\n radius={4}\n stackId={isStacked ? '1' : undefined}\n shape={isTriangular ? (TriangleBar as any) : undefined}\n >\n {showValueOnTop && (\n <LabelList\n dataKey={key}\n position=\"top\"\n content={({ x, y, value, width }) => (\n <ValueLabel\n x={Number(x)}\n y={Number(y)}\n value={Number(value)}\n width={Number(width)}\n />\n )}\n />\n )}\n </Bar>\n ))}\n {isBrush && (\n <Brush\n dataKey={x_key}\n height={30}\n stroke=\"hsl(var(--chart-1))\"\n fill=\"hsl(var(--background))\"\n />\n )}\n </RechartsBarChart>\n </ChartContainer>\n )\n}\n","import { useState, useMemo } from 'react'\nimport {\n useReactTable,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n type VisibilityState,\n} from '@tanstack/react-table'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'\nimport { Button } from '../ui/button'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'\nimport { ArrowUpDown, ChevronLeft, ChevronRight, Download, Search } from 'lucide-react'\nimport { downloadCSV } from '../../lib/chart-utils'\n\ninterface DataTableProps {\n data: any[]\n dashboardTheme?: any\n}\n\nexport function DataTable({ data, dashboardTheme }: DataTableProps) {\n const [sorting, setSorting] = useState<SortingState>([])\n const [globalFilter, setGlobalFilter] = useState('')\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n\n const columns = useMemo<ColumnDef<any>[]>(() => {\n if (!data.length) return []\n return Object.keys(data[0]).map((key) => ({\n accessorKey: key,\n header: ({ column }) => (\n <Button\n variant=\"ghost\"\n onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}\n className=\"px-0 hover:bg-transparent\"\n >\n {key} <ArrowUpDown className=\"ml-2 h-3 w-3\" />\n </Button>\n ),\n cell: ({ row }) => {\n const value = row.getValue(key)\n return <div className=\"truncate max-w-[200px]\">{value == null ? '' : String(value)}</div>\n },\n }))\n }, [data])\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n onSortingChange: setSorting,\n onColumnVisibilityChange: setColumnVisibility,\n onGlobalFilterChange: setGlobalFilter,\n state: { sorting, columnVisibility, globalFilter },\n initialState: { pagination: { pageSize: 10 } },\n })\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-border/40\">\n <div className=\"flex items-center gap-2 flex-1\">\n <Search className=\"h-4 w-4 text-muted-foreground\" />\n <input\n placeholder=\"Search...\"\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n className=\"flex-1 bg-transparent border-none outline-none text-sm placeholder:text-muted-foreground\"\n />\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => downloadCSV(data)} className=\"gap-1\">\n <Download className=\"h-3.5 w-3.5\" /> CSV\n </Button>\n </div>\n <div className=\"flex-1 overflow-auto scrollbar-hide\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id}>\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow key={row.id}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n <div className=\"flex items-center justify-between px-4 py-2 border-t border-border/40\">\n <div className=\"text-xs text-muted-foreground\">\n {table.getFilteredRowModel().rows.length} row(s)\n </div>\n <div className=\"flex items-center gap-2\">\n <Select\n value={String(table.getState().pagination.pageSize)}\n onValueChange={(v) => table.setPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-7 w-[70px] text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {[10, 20, 30, 40, 50].map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n className=\"h-7 w-7 p-0\"\n >\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </Button>\n <span className=\"text-xs\">\n {table.getState().pagination.pageIndex + 1} / {table.getPageCount()}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n className=\"h-7 w-7 p-0\"\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\n\nconst Table = React.forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto scrollbar-hide\">\n <table ref={ref} className={cn('w-full caption-bottom text-sm', className)} {...props} />\n </div>\n )\n)\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n))\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className\n )}\n {...props}\n />\n )\n)\nTableRow.displayName = 'TableRow'\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = 'TableHead'\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption ref={ref} className={cn('mt-4 text-sm text-muted-foreground', className)} {...props} />\n))\nTableCaption.displayName = 'TableCaption'\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }\n","import {\n CartesianGrid,\n Legend,\n Line,\n LineChart as RechartsLineChart,\n ResponsiveContainer,\n XAxis,\n YAxis,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nexport function LineChart({\n data,\n chartMeta,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const { x_key, y_keys, primaryYKey, contextKeys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const parsedData = normalizeNumericStrings(data)\n const getLineType = () => {\n if (visualizationConfig?.variant === 'step') return 'step'\n if (visualizationConfig?.variant === 'linear') return 'linear'\n if (visualizationConfig?.variant === 'curved') return 'basis'\n return 'monotone'\n }\n const showDots = visualizationConfig?.variant === 'dots'\n const isDashed = visualizationConfig?.variant === 'dashed'\n const useGradient = visualizationConfig?.variant === 'gradient'\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsLineChart data={parsedData} margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <defs>\n {useGradient &&\n y_keys.map((key, index) => (\n <linearGradient key={key} id={`gradient-${key}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop\n offset=\"0%\"\n stopColor={\n visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n }\n stopOpacity={0.8}\n />\n <stop\n offset=\"100%\"\n stopColor={\n visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n }\n stopOpacity={0.2}\n />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid vertical={false} strokeDasharray=\"4\" stroke=\"hsl(var(--border))\" />\n <XAxis\n dataKey={x_key}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n dataKey={y_keys.length <= 1 ? primaryYKey : undefined}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent contextKeys={contextKeys} />}\n />\n {chartMeta?.showLegend !== false && <Legend />}\n {y_keys.map((key, index) => {\n const color = visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n return (\n <Line\n key={key}\n type={getLineType()}\n dataKey={key}\n name={key}\n stroke={useGradient ? `url(#gradient-${key})` : color}\n strokeWidth={2}\n strokeDasharray={isDashed ? '5 5' : '0'}\n dot={showDots ? { r: 3, fill: color, strokeWidth: 0 } : false}\n />\n )\n })}\n </RechartsLineChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","import { BarChart2 } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\ninterface NoDataCardProps {\n message?: string\n className?: string\n}\n\nexport function NoDataCard({ message = 'Tell me what kind of chart you want to create...', className }: NoDataCardProps) {\n const isCreationMessage = message.toLowerCase().includes('create')\n return (\n <div className={cn('flex flex-col items-center justify-center gap-6 p-12 text-muted-foreground/60 bg-muted/5 transition-all hover:border-muted-foreground/30 hover:bg-muted/10 rounded-lg', className)}>\n <div className=\"relative\">\n <div className=\"absolute -inset-4 bg-foreground/5 blur-xl rounded-full\" />\n <BarChart2 className={cn('size-16 relative', isCreationMessage ? 'animate-pulse' : 'opacity-80')} />\n </div>\n <p className=\"text-lg font-medium tracking-tight text-center\">{message}</p>\n </div>\n )\n}\n","import {\n Cell,\n Tooltip as ChartTooltip,\n Legend,\n Pie,\n PieChart as RechartsPieChart,\n ResponsiveContainer,\n Sector,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent } from '../ui/chart'\nimport { formatePieChartData, normalizeNumericStrings } from '../../lib/chart-utils'\nimport { useState } from 'react'\n\nexport function PieChart({\n data,\n chartMeta,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const [activeIndex, setActiveIndex] = useState<number | undefined>(undefined)\n const formattedData = normalizeNumericStrings(formatePieChartData({ data, visualizationConfig }))\n const x_key = formattedData.length ? formattedData[0]?.x_key : 'name'\n\n const variant =\n !visualizationConfig?.variant || visualizationConfig.variant === 'default'\n ? 'percentage-with-label'\n : visualizationConfig.variant\n const isDonut = variant === 'donut'\n const isStacked = variant === 'stacked' || formattedData.length > 1\n const showPercentage = variant === 'percentage' || variant === 'percentage-with-label'\n const showLabel = variant === 'percentage-with-label'\n const colors = visualizationConfig?.colors || []\n\n const maxRadius = 120\n const minRadius = 30\n const totalSpace = maxRadius - minRadius\n const numRings = formattedData.length\n const ringThickness = Math.max(15, Math.min(40, Math.floor(totalSpace / (numRings || 1))))\n const ringGap = Math.max(3, Math.min(8, Math.floor(ringThickness / 5)))\n const innerRadius = isDonut ? 60 : undefined\n\n const renderActiveShape = (props: any) => {\n const RADIAN = Math.PI / 180\n const {\n cx,\n cy,\n midAngle,\n innerRadius,\n outerRadius,\n startAngle,\n endAngle,\n fill,\n payload,\n percent,\n } = props\n const sin = Math.sin(-RADIAN * midAngle)\n const cos = Math.cos(-RADIAN * midAngle)\n const sx = cx + (outerRadius + 10) * cos\n const sy = cy + (outerRadius + 10) * sin\n const mx = cx + (outerRadius + 30) * cos\n const my = cy + (outerRadius + 30) * sin\n const ex = mx + (cos >= 0 ? 1 : -1) * 22\n const ey = my\n const textAnchor = cos >= 0 ? 'start' : 'end'\n return (\n <g>\n <Sector\n cx={cx}\n cy={cy}\n innerRadius={innerRadius}\n outerRadius={outerRadius}\n startAngle={startAngle}\n endAngle={endAngle}\n fill={fill}\n />\n <Sector\n cx={cx}\n cy={cy}\n startAngle={startAngle}\n endAngle={endAngle}\n innerRadius={outerRadius + 6}\n outerRadius={outerRadius + 10}\n fill={fill}\n />\n <path d={`M${sx},${sy}L${mx},${ey}L${ex},${ey}`} stroke={fill} fill=\"none\" />\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\n <text\n x={ex + (cos >= 0 ? 1 : -1) * 12}\n y={ey}\n textAnchor={textAnchor}\n fill=\"hsl(var(--foreground))\"\n >\n {payload[x_key]}\n </text>\n <text\n x={ex + (cos >= 0 ? 1 : -1) * 12}\n y={ey}\n dy={18}\n textAnchor={textAnchor}\n fill=\"hsl(var(--muted-foreground))\"\n >{`${(percent * 100).toFixed(0)}%`}</text>\n </g>\n )\n }\n\n const renderCustomizedLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent }: any) => {\n const RADIAN = Math.PI / 180\n const radius = innerRadius + (outerRadius - innerRadius) * 0.5\n const x = cx + radius * Math.cos(-midAngle * RADIAN)\n const y = cy + radius * Math.sin(-midAngle * RADIAN)\n if (!showLabel)\n return (\n <text\n x={x}\n y={y}\n fill=\"white\"\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n style={{ fontSize: '12px', fontWeight: 'bold' }}\n >{`${(percent * 100).toFixed(0)}%`}</text>\n )\n return null\n }\n\n const getActiveIndex = () => {\n if (showLabel) return Array.from({ length: formattedData[0]?.data?.length || 0 }, (_, i) => i)\n return activeIndex\n }\n\n return (\n <ChartContainer config={{}} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsPieChart margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent />}\n />\n {formattedData.map(({ x_key: xk, y_key, data: pieData }, index) => (\n <Pie\n key={`pie-${index}`}\n data={pieData}\n dataKey={y_key}\n nameKey={xk}\n cx=\"50%\"\n cy=\"50%\"\n labelLine={false}\n outerRadius={isStacked ? maxRadius - index * (ringThickness + ringGap) : undefined}\n innerRadius={\n isStacked\n ? maxRadius - ((index + 1) * ringThickness + index * ringGap)\n : innerRadius\n }\n label={showPercentage ? renderCustomizedLabel : false}\n activeShape={renderActiveShape as any}\n {...({ activeIndex: getActiveIndex() } as any)}\n onMouseEnter={(_, i: number) => {\n if (!showLabel) setActiveIndex(i)\n }}\n onMouseLeave={() => {\n if (!showLabel) setActiveIndex(undefined)\n }}\n >\n {pieData.map((_: any, i: number) => (\n <Cell\n key={`cell-${i}`}\n fill={colors[i] ? colors[i] : `hsl(var(--chart-${(i % 5) + 1}))`}\n />\n ))}\n </Pie>\n ))}\n <Legend verticalAlign=\"bottom\" align=\"center\" layout=\"horizontal\" />\n </RechartsPieChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","import { Legend, PolarAngleAxis, PolarGrid, PolarRadiusAxis, Radar, RadarChart as RechartsRadarChart, ResponsiveContainer } from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nexport function RadarChart({ data, chartMeta, visualizationConfig }: { data: any[]; chartMeta: { showLegend?: boolean }; visualizationConfig: Record<string, any> }) {\n const { x_key, y_keys, contextKeys } = getXYKeys({ data, x: visualizationConfig?.x_key })\n const parsedData = normalizeNumericStrings(data)\n const showDots = visualizationConfig?.variant === 'dots'\n const showLines = visualizationConfig?.variant === 'lines' || visualizationConfig?.variant === 'default'\n const isFilled = visualizationConfig?.variant === 'filled'\n const useGradient = visualizationConfig?.variant === 'gradient'\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsRadarChart cx=\"50%\" cy=\"50%\" outerRadius=\"80%\" data={parsedData} margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <defs>\n {useGradient && y_keys.map((key, index) => (\n <linearGradient key={key} id={`gradient-${key}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`} stopOpacity={0.8} />\n <stop offset=\"100%\" stopColor={visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`} stopOpacity={0.2} />\n </linearGradient>\n ))}\n </defs>\n <PolarGrid stroke=\"hsl(var(--border))\" />\n <PolarAngleAxis dataKey={x_key} tick={{ fill: 'hsl(var(--muted-foreground))' }} />\n <PolarRadiusAxis angle={30} domain={[0, 'auto']} tick={{ fill: 'hsl(var(--muted-foreground))' }} />\n <ChartTooltip content={<ChartTooltipContent contextKeys={contextKeys} />} />\n {chartMeta?.showLegend !== false && <Legend />}\n {y_keys.map((key, index) => {\n const color = visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`\n return <Radar key={key} name={key} dataKey={key} stroke={color} fill={useGradient ? `url(#gradient-${key})` : color} fillOpacity={isFilled ? 0.6 : useGradient ? 1 : 0.1} dot={showDots ? { r: 3 } : false} strokeWidth={showLines ? 2 : 0} />\n })}\n </RechartsRadarChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","import {\n CartesianGrid,\n Legend,\n ScatterChart as RechartsScatterChart,\n ResponsiveContainer,\n Scatter,\n XAxis,\n YAxis,\n} from 'recharts'\nimport { ChartContainer, ChartTooltipContent, ChartTooltip } from '../ui/chart'\nimport { getXYKeys, normalizeNumericStrings, generateChartConfig } from '../../lib/chart-utils'\n\nexport function ScatterChart({\n data,\n visualizationConfig,\n}: {\n data: any[]\n chartMeta: { showLegend?: boolean }\n visualizationConfig: Record<string, any>\n}) {\n const { x_key, y_keys, primaryYKey, contextKeys } = getXYKeys({\n data,\n x: visualizationConfig?.x_key,\n y: visualizationConfig?.y_key,\n })\n const parsedData = normalizeNumericStrings(data)\n\n return (\n <ChartContainer config={generateChartConfig(y_keys)} className=\"w-full h-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\" debounce={1}>\n <RechartsScatterChart margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <CartesianGrid vertical={false} strokeDasharray=\"4\" stroke=\"hsl(var(--border))\" />\n <XAxis\n dataKey={x_key}\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tickMargin={8}\n dataKey={y_keys?.length <= 1 ? primaryYKey : undefined}\n fontSize={12}\n stroke=\"hsl(var(--muted-foreground))\"\n />\n <ChartTooltip\n cursor={{ fill: 'hsl(var(--muted))', opacity: 0.1 }}\n content={<ChartTooltipContent contextKeys={contextKeys} />}\n />\n <Legend />\n {y_keys?.map((key, index) => (\n <Scatter\n key={key}\n dataKey={key}\n name={key}\n data={parsedData}\n fill={visualizationConfig?.colors?.[index] || `hsl(var(--chart-${index + 1}))`}\n strokeWidth={2}\n />\n ))}\n </RechartsScatterChart>\n </ResponsiveContainer>\n </ChartContainer>\n )\n}\n","export const waitForChartsToLoad = async (maxWaitTime = 5000) => {\n const startTime = Date.now()\n\n while (Date.now() - startTime < maxWaitTime) {\n const loadingElements = document.querySelectorAll(\n '[data-loading=\"true\"], .animate-spin, .loading'\n )\n const emptyCharts = document.querySelectorAll('.chart-container:empty, .recharts-wrapper:empty')\n\n const canvasElements = document.querySelectorAll('canvas')\n let allCanvasReady = true\n canvasElements.forEach((canvas) => {\n const ctx = canvas.getContext('2d')\n if (ctx && canvas.width === 0 && canvas.height === 0) {\n allCanvasReady = false\n }\n })\n\n if (loadingElements.length === 0 && emptyCharts.length === 0 && allCanvasReady) {\n await new Promise((resolve) => setTimeout(resolve, 500))\n return true\n }\n\n await new Promise((resolve) => setTimeout(resolve, 200))\n }\n}\n\nexport const takeScreenshot = async ({\n selector,\n fileName = 'dashboard',\n additionalWidth = 30,\n additionalHeight = 0,\n}: {\n selector: string\n fileName?: string\n additionalWidth?: number\n additionalHeight?: number\n}) => {\n const layoutElement = document.querySelector(selector) as HTMLElement\n if (!layoutElement) {\n console.error('No element with class layout found!')\n return\n }\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const toolIcons = layoutElement.querySelectorAll('.tool-icons')\n const originalStyles = new Map<HTMLElement, string>()\n\n toolIcons.forEach((el) => {\n const htmlEl = el as HTMLElement\n originalStyles.set(htmlEl, htmlEl.style.display)\n htmlEl.style.display = 'none'\n })\n\n const html2canvas = (await import('html2canvas')).default\n const canvas = await html2canvas(layoutElement, {\n useCORS: true,\n scrollY: -window.scrollY,\n width: layoutElement.scrollWidth + additionalWidth,\n height: layoutElement.scrollHeight + additionalHeight,\n scale: 2,\n logging: false,\n allowTaint: true,\n })\n\n toolIcons.forEach((el) => {\n const htmlEl = el as HTMLElement\n htmlEl.style.display = originalStyles.get(htmlEl) || ''\n })\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const padding = 50\n const newCanvas = document.createElement('canvas')\n newCanvas.width = canvas.width + padding * 2\n newCanvas.height = canvas.height + padding * 2\n\n const ctx = newCanvas.getContext('2d')!\n ctx.fillStyle = '#ffffff'\n ctx.fillRect(0, 0, newCanvas.width, newCanvas.height)\n ctx.drawImage(canvas, padding, padding)\n\n layoutElement.scrollIntoView({ behavior: 'auto' })\n const imageData = newCanvas.toDataURL('image/png')\n const link = document.createElement('a')\n link.href = imageData\n link.download = `${fileName}.png`\n link.click()\n}\n","import React from 'react'\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from '../ui/card'\nimport { cn } from '../../utils'\nimport { formatNumericValue } from '../../lib/chart-utils'\n\nexport function Tile({\n data,\n visualizationConfig,\n isMultiTile,\n}: {\n data: any[]\n visualizationConfig: any\n isMultiTile: boolean\n}) {\n const parsedData = data.flatMap((obj) =>\n Object.entries(obj).map(([key, value]) => ({\n label:\n typeof key === 'string'\n ? key.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())\n : null,\n value: typeof value === 'string' || typeof value === 'number' ? value : null,\n }))\n )\n\n const variant = visualizationConfig?.variant || 'vertical'\n const colors = visualizationConfig?.colors\n\n return (\n <div\n className={cn(\n 'flex gap-4',\n isMultiTile ? 'flex-col' : 'flex-wrap',\n variant === 'horizontal' ? 'flex-row' : 'flex-col'\n )}\n >\n {parsedData.map((item, index) => {\n const color = colors[index % colors.length]\n const cardStyle: React.CSSProperties | undefined =\n variant === 'colored'\n ? {\n backgroundColor: color,\n }\n : undefined\n\n return (\n <Card\n key={index}\n className={cn(\n // In grid dashboards, tiles can be resized smaller than the original design size.\n // Allow them to shrink instead of forcing a fixed min-width.\n 'border-0 shadow-none min-w-0',\n 'border border-border/70 dark:border-0',\n isMultiTile && 'border w-full',\n variant === 'horizontal' ? 'flex-1' : '',\n variant === 'colored' && 'rounded-lg',\n variant === 'centered' && 'flex flex-col items-center justify-center text-center'\n )}\n style={cardStyle}\n >\n {visualizationConfig.title ? (\n <CardHeader\n className={cn(\n 'flex flex-row items-center justify-between space-y-0 pb-1',\n variant === 'centered' && 'w-full justify-center pb-1'\n )}\n >\n <CardTitle\n className={cn('text-sm font-medium', variant === 'centered' && 'text-center')}\n style={variant === 'colored' ? { color: 'white' } : undefined}\n >\n {parsedData.length === 1 ? visualizationConfig?.title || item.label : item.label}\n </CardTitle>\n </CardHeader>\n ) : null}\n <CardContent\n className={cn(\n variant === 'centered' && 'flex flex-col items-center justify-center flex-1 py-1'\n )}\n >\n <div\n className={cn(\n 'text-2xl font-bold',\n variant === 'centered' && 'text-center text-4xl'\n )}\n style={variant === 'colored' ? { color: 'white' } : undefined}\n >\n {typeof item.value === 'number' ||\n (typeof item.value === 'string' && !isNaN(Number(item.value)))\n ? formatNumericValue(item.value)\n : item.value}\n </div>\n </CardContent>\n <CardFooter className={cn(variant === 'centered' && 'w-full justify-center pb-3')}>\n {visualizationConfig.subtitle ? (\n <div\n className={cn('text-sm', variant === 'centered' && 'text-center')}\n style={\n variant === 'colored'\n ? {\n color: 'rgba(255, 255, 255, 0.8)',\n }\n : undefined\n }\n >\n {visualizationConfig?.subtitle}\n </div>\n ) : null}\n </CardFooter>\n </Card>\n )\n })}\n </div>\n )\n}\n","/**\n * Captures an element as PNG and triggers a download.\n * Mirrors main app takeScreenshot (utils.ts) for chart dialog.\n */\nexport async function takeScreenshot({\n selector,\n fileName = 'chart',\n additionalWidth = 0,\n additionalHeight = 0,\n hideSelectors = ['.tool-icons'],\n}: {\n selector: string\n fileName?: string\n additionalWidth?: number\n additionalHeight?: number\n /** Selectors to hide during capture (e.g. buttons); restored after. */\n hideSelectors?: string[]\n}): Promise<void> {\n const element = document.querySelector(selector) as HTMLElement\n\n if (!element) {\n console.error('Screenshot target not found:', selector)\n throw new Error('Screenshot target not found')\n }\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const originalStyles = new Map<HTMLElement, string>()\n hideSelectors.forEach((sel) => {\n element.querySelectorAll(sel).forEach((el) => {\n const htmlEl = el as HTMLElement\n originalStyles.set(htmlEl, htmlEl.style.display)\n htmlEl.style.display = 'none'\n })\n })\n\n const html2canvas = (await import('html2canvas')).default\n const canvas = await html2canvas(element, {\n useCORS: true,\n scrollY: -window.scrollY,\n width: element.scrollWidth + additionalWidth,\n height: element.scrollHeight + additionalHeight,\n scale: 2,\n logging: false,\n allowTaint: true,\n backgroundColor: '#ffffff',\n })\n\n hideSelectors.forEach((sel) => {\n element.querySelectorAll(sel).forEach((el) => {\n const htmlEl = el as HTMLElement\n htmlEl.style.display = originalStyles.get(htmlEl) ?? ''\n })\n })\n\n await new Promise((resolve) => requestAnimationFrame(resolve))\n\n const padding = 50\n const newCanvas = document.createElement('canvas')\n newCanvas.width = canvas.width + padding * 2\n newCanvas.height = canvas.height + padding * 2\n\n const ctx = newCanvas.getContext('2d')\n if (!ctx) throw new Error('Could not get canvas context')\n\n ctx.fillStyle = '#ffffff'\n ctx.fillRect(0, 0, newCanvas.width, newCanvas.height)\n ctx.drawImage(canvas, padding, padding)\n\n element.scrollIntoView({ behavior: 'auto' })\n const imageData = newCanvas.toDataURL('image/png')\n const link = document.createElement('a')\n link.href = imageData\n link.download = `${fileName}.png`\n link.click()\n}\n","import React from 'react'\nimport { BrainCircuit, Clock, MessageSquare, Trash2 } from 'lucide-react'\nimport { cn } from '../../utils/cn'\nimport { motion } from 'framer-motion'\n\ninterface SavedMemoryItem {\n id: string\n title: string\n preview: string\n type: string\n timestamp: string\n}\n\nconst MOCK_MEMORIES: SavedMemoryItem[] = [\n {\n id: '1',\n title: 'User Engagement Analytics Report',\n preview:\n 'Detailed analysis of user behavior patterns, session duration metrics, and conversion rates across different platforms...',\n type: 'analytics',\n timestamp: '2 hours ago',\n },\n {\n id: '2',\n title: 'Revenue Growth Trends Q2 2024',\n preview:\n 'Comprehensive breakdown of revenue metrics, MRR growth, customer acquisition costs, and churn rate analysis...',\n type: 'analytics',\n timestamp: '1 day ago',\n },\n {\n id: '3',\n title: 'Marketing Campaign Performance',\n preview:\n 'ROI analysis of multi-channel campaigns, click-through rates, and customer segment performance metrics...',\n type: 'analytics',\n timestamp: '2 days ago',\n },\n]\n\nexport function SavedMemory() {\n const handleConversationClick = (item: SavedMemoryItem) => {\n console.log('Clicked memory:', item.id)\n }\n\n const handleDeleteClick = (e: React.MouseEvent, item: SavedMemoryItem) => {\n e.stopPropagation()\n console.log('Delete memory:', item.id)\n }\n\n return (\n <div className=\"flex flex-col w-full h-full\">\n <div className=\"flex items-center justify-between p-4 border-b border-border/50\">\n <div className=\"flex items-center gap-2 text-foreground\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-sm font-medium\">Saved Memory</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">{MOCK_MEMORIES.length} items</span>\n </div>\n\n <div className=\"flex-1 overflow-auto scrollbar-hide\">\n <div className=\"flex flex-col gap-1 p-2\">\n {MOCK_MEMORIES.map((item, index) => (\n <motion.div\n key={item.id}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, delay: index * 0.05, ease: [0.23, 1, 0.32, 1] }}\n className={cn(\n 'flex items-start gap-3 p-3 rounded-xl transition-all duration-200',\n 'hover:bg-muted/50 group cursor-pointer',\n 'border border-transparent hover:border-border/50',\n 'relative overflow-hidden'\n )}\n onClick={() => handleConversationClick(item)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleConversationClick(item)\n }}\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 ring-1 ring-inset ring-primary/5\">\n <BrainCircuit className=\"size-4 text-primary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">{item.title}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <p className=\"text-xs text-muted-foreground/80 truncate leading-relaxed flex-1\">\n {item.preview}\n </p>\n <span className=\"text-[10px] text-muted-foreground shrink-0 tabular-nums ml-2\">\n {item.timestamp}\n </span>\n </div>\n </div>\n <div\n className={cn(\n 'absolute right-2 top-1 opacity-0 group-hover:opacity-100',\n 'transition-all duration-200 ease-in-out transform translate-x-4 group-hover:translate-x-0'\n )}\n >\n <motion.button\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.95 }}\n onClick={(e) => handleDeleteClick(e, item)}\n className=\"p-2 rounded-full hover:bg-muted flex items-center justify-center group/delete\"\n >\n <Trash2 className=\"h-4 w-4 text-muted-foreground group-hover/delete:text-destructive transition-colors\" />\n </motion.button>\n </div>\n </motion.div>\n ))}\n </div>\n </div>\n\n {MOCK_MEMORIES.length === 0 && (\n <div className=\"flex flex-col items-center justify-center flex-1 p-8 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <MessageSquare className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <h3 className=\"text-sm font-medium mb-1\">No saved memories yet</h3>\n <p className=\"text-xs text-muted-foreground\">\n Start a new chat to see your saved memories here\n </p>\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport React from 'react'\nimport { cn } from '../../utils/cn'\n\ninterface ShineBorderProps extends React.HTMLAttributes<HTMLDivElement> {\n borderWidth?: number\n duration?: number\n shineColor?: string | string[]\n}\n\nexport function ShineBorder({\n borderWidth = 1,\n duration = 14,\n shineColor = '#000000',\n className,\n style,\n ...props\n}: ShineBorderProps) {\n return (\n <div\n style={\n {\n '--border-width': `${borderWidth}px`,\n '--duration': `${duration}s`,\n '--mask-linear-gradient': `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,\n '--background-radial-gradient': `radial-gradient(transparent,transparent, ${Array.isArray(shineColor) ? shineColor.join(',') : shineColor},transparent,transparent)`,\n backgroundImage: 'var(--background-radial-gradient)',\n backgroundSize: '300% 300%',\n mask: 'var(--mask-linear-gradient)',\n WebkitMaskComposite: 'xor',\n maskComposite: 'exclude',\n animation: `shine var(--duration) infinite linear`,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'pointer-events-none absolute inset-0 size-full rounded-[inherit] p-[--border-width] will-change-[background-position]',\n className\n )}\n {...props}\n />\n )\n}\n","import * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\nimport { cn } from '../../utils/cn'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n))\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","import * as React from 'react'\nimport * as HoverCardPrimitive from '@radix-ui/react-hover-card'\nimport { cn } from '../../utils/cn'\n\nconst HoverCard = HoverCardPrimitive.Root\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\nconst HoverCardContent = React.forwardRef<\n React.ElementRef<typeof HoverCardPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <HoverCardPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","import * as React from 'react'\nimport * as SwitchPrimitives from '@radix-ui/react-switch'\nimport { cn } from '../../utils/cn'\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0'\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","import React, { useState } from 'react'\nimport { PlusCircle, Globe, ChartArea } from 'lucide-react'\nimport { ButtonWithTooltip } from './ButtonWithTooltip'\nimport ConfettiEffect from './ConfettiEffect'\nimport { cn } from '../../utils/cn'\nimport { toast } from '../../hooks/use-toast'\nimport { usePapermapStore } from '../../store'\n\ninterface SimpleButtonProps {\n onClick: () => void\n}\n\nexport function AddNewChatBtn({ onClick }: SimpleButtonProps) {\n return (\n <ButtonWithTooltip onClick={onClick} tooltipText=\"New Chat\" className=\"h-8 w-8\">\n <PlusCircle className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n )\n}\n\nexport function ChartHistoryBtn({ onClick }: SimpleButtonProps) {\n return (\n <ButtonWithTooltip onClick={onClick} tooltipText=\"Charts History\" className=\"h-8 w-8\">\n <ChartArea className=\"h-4 w-4 text-muted-foreground\" />\n </ButtonWithTooltip>\n )\n}\n\nexport function SearchWebBtn() {\n const browserUse = usePapermapStore((s) => s.browserUse)\n const updateBrowserUse = usePapermapStore((s) => s.updateBrowserUse)\n const [showGlobeConfetti, setShowGlobeConfetti] = useState(false)\n\n const handleBrowserUse = () => {\n const newBrowserUse = !browserUse\n toast({\n title: 'Search the web',\n description: browserUse ? 'Web search feature disabled' : 'Web search feature activated',\n })\n updateBrowserUse(newBrowserUse)\n\n // Trigger confetti animation when activating browser use\n if (newBrowserUse) {\n setShowGlobeConfetti(true)\n // Hide confetti after animation\n setTimeout(() => {\n setShowGlobeConfetti(false)\n }, 2000)\n }\n }\n\n return (\n <div className=\"relative\">\n <ButtonWithTooltip\n onClick={handleBrowserUse}\n tooltipText={browserUse ? 'Disable Web search' : 'Enable Web search'}\n className=\"h-8 w-8\"\n >\n <Globe\n className={cn(\n 'h-4 w-4 transition-all duration-500 ease-in-out',\n browserUse ? 'text-teal-600 dark:text-teal-400 animate-fade' : 'text-muted-foreground'\n )}\n />\n </ButtonWithTooltip>\n <ConfettiEffect showGlobeConfetti={showGlobeConfetti} />\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { Sparkles, ChevronDown } from 'lucide-react'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectGroup } from '../ui/select'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { cn } from '../../utils/cn'\nimport { usePapermapStore, usePapermapStoreApi } from '../../store'\n\nconst RECOMMENDED_LABELS: Record<string, string> = {\n Default: 'Default (Great for most tasks)',\n Max: 'Max (Most capable model)',\n}\n\nexport function ModelSelector() {\n const selectedModel = usePapermapStore((s) => s.selectedModel)\n const setSelectedModel = usePapermapStore((s) => s.setSelectedModel)\n const storeApi = usePapermapStoreApi()\n\n const [modelGroups, setModelGroups] = useState<Record<string, string[]>>({})\n const [recommendedModels, setRecommendedModels] = useState<Record<string, string>>({})\n const [showAllModels, setShowAllModels] = useState(false)\n const [isDropdownOpen, setIsDropdownOpen] = useState(false)\n const [allowTooltip, setAllowTooltip] = useState(true)\n\n useEffect(() => {\n const services = storeApi.getState().getServices()\n services.chartSvc.getModels().then((data: any) => {\n if (data) {\n setModelGroups(data.all_models || {})\n setRecommendedModels(data.recommended_models || {})\n if (!selectedModel && data.recommended_models?.Default) {\n setSelectedModel(data.recommended_models.Default)\n }\n }\n }).catch(() => {})\n }, [storeApi, selectedModel, setSelectedModel])\n\n return (\n <TooltipProvider>\n <Tooltip open={isDropdownOpen || !allowTooltip ? false : undefined}>\n <div className=\"relative\">\n <Select\n value={selectedModel || ''}\n onValueChange={(value: string) => setSelectedModel(value)}\n onOpenChange={(open) => {\n setIsDropdownOpen(open)\n if (!open) {\n setShowAllModels(false)\n setAllowTooltip(false)\n setTimeout(() => setAllowTooltip(true), 300)\n }\n }}\n >\n <TooltipTrigger asChild>\n <SelectTrigger\n className={cn(\n 'h-8 w-8 p-0 border-none shadow-none ring-0 focus-visible:ring-0 focus:ring-0 focus-within:ring-0',\n 'hover:bg-accent/50 transition-colors duration-200',\n 'rounded-sm flex items-center justify-center'\n )}\n >\n <Sparkles className=\"h-4 w-4 text-muted-foreground\" />\n </SelectTrigger>\n </TooltipTrigger>\n <SelectContent className=\"w-[280px] p-2\" position=\"popper\">\n <SelectGroup>\n {Object.entries(recommendedModels).map(([key, modelValue]) => (\n <SelectItem key={key} value={modelValue} className=\"text-sm cursor-pointer pl-8 pr-3 py-2\">\n {RECOMMENDED_LABELS[key] || key}\n </SelectItem>\n ))}\n </SelectGroup>\n <div\n onClick={() => setShowAllModels(!showAllModels)}\n className=\"flex items-center justify-between pl-8 pr-3 py-2 text-xs text-muted-foreground hover:text-foreground hover:bg-accent/50 cursor-pointer rounded-sm mt-1 transition-colors\"\n >\n <span>{showAllModels ? 'Show less' : 'Show more'}</span>\n <ChevronDown className={cn('h-3 w-3 transition-transform duration-200', showAllModels && 'rotate-180')} />\n </div>\n {showAllModels && (\n <>\n <div className=\"border-t border-border/50 my-2\" />\n {Object.entries(modelGroups).map(([provider, models], index, array) => (\n <React.Fragment key={provider}>\n <SelectGroup>\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground capitalize\">{provider}</div>\n {models.map((model) => (\n <SelectItem key={model} value={model} className=\"text-sm cursor-pointer pl-8 pr-3 py-2\">\n {model}\n </SelectItem>\n ))}\n </SelectGroup>\n {index < array.length - 1 ? <div className=\"border-t border-border/50 my-1\" /> : null}\n </React.Fragment>\n ))}\n </>\n )}\n </SelectContent>\n </Select>\n <TooltipContent>\n <p>{selectedModel ? `Model: ${selectedModel}` : 'Select Model'}</p>\n </TooltipContent>\n </div>\n </Tooltip>\n </TooltipProvider>\n )\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n BarChart3,\n Loader2,\n Maximize2,\n MessageSquare,\n MoveDiagonal2,\n Pencil,\n Trash2,\n} from 'lucide-react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { cn } from '../utils/cn'\nimport {\n PapermapProvider,\n usePapermapConnection,\n usePapermapConnectionOptional,\n usePapermapStoreApiOptional,\n openPapermapChatAssistant,\n closePapermapChatAssistant,\n} from '../store'\nimport { ChartView } from './charts/ChartView'\nimport { ChartDialog } from './charts/ChartDialog'\nimport { StreamingChartDialog } from './charts/StreamingChartDialog'\nimport { DeleteConfirmationModal } from './dashboard/DeleteConfirmationModal'\nimport { ButtonWithTooltip } from './common/ButtonWithTooltip'\nimport { Card } from './ui/card'\nimport { toast } from '../hooks/use-toast'\nimport type { TChartResponse } from '../types/chart'\nimport {\n resolveChartFetchChatId,\n upsertChartCardIdLink,\n removeChartCardIdLink,\n removeChartCardLinksByChatId,\n} from '../utils/chart-card-storage'\nimport type { PapermapHttpServices } from '../store'\n\nfunction normalizeLatestChartPayload(result: any, fallbackChatId: string): TChartResponse | null {\n const chartData = result?.data ?? result\n if (!chartData) return null\n const hasChartShape =\n chartData.chart_response ||\n chartData.chart_type ||\n chartData.response_type === 'chart' ||\n (Array.isArray(chartData.data) && chartData.schema_hints)\n if (!hasChartShape) return null\n if (chartData.chart_response) {\n return {\n llm_data_chat_id: chartData.llm_data_chat_id ?? fallbackChatId,\n name: chartData.name || '',\n meta: chartData.meta || {},\n pin: chartData.pin ?? false,\n chart_response: chartData.chart_response,\n }\n }\n return {\n llm_data_chat_id: chartData.llm_data_chat_id ?? fallbackChatId,\n name: chartData.name || '',\n meta: chartData.meta || {},\n pin: chartData.pin ?? false,\n chart_response: {\n chart_type: chartData.chart_type || '',\n data: chartData.data || [],\n response_type: chartData.response_type || 'chart',\n schema_hints: chartData.schema_hints || { x_key: '', y_key: '', label_key: '' },\n visualization_config: chartData.visualization_config || {\n colors: [],\n width: 0,\n height: 0,\n },\n },\n }\n}\n\n/** Loads chart data for a **backend chat id** only (never a host `cardId`). */\nasync function fetchChartForChatId(\n chartSvc: PapermapHttpServices['chartSvc'],\n chatId: string\n): Promise<TChartResponse | null> {\n try {\n const byId = await chartSvc.getChartById(chatId)\n const fromById = normalizeLatestChartPayload(byId, chatId)\n if (fromById) return fromById\n } catch {\n // fall through to latest-chart\n }\n const latest = await chartSvc.getLatestChart(chatId)\n return normalizeLatestChartPayload(latest, chatId)\n}\n\nfunction persistChartLoaded(\n chart: TChartResponse,\n cardId: string | undefined,\n workspaceId: string,\n dashboardId: string,\n onSave?: (chart: TChartResponse) => void\n): void {\n if (cardId?.trim() && chart.llm_data_chat_id) {\n upsertChartCardIdLink(\n {\n id: cardId.trim(),\n chatId: chart.llm_data_chat_id.trim(),\n },\n { workspaceId, dashboardId }\n )\n }\n if (onSave) {\n try {\n onSave(chart)\n } catch (e) {\n console.error('PapermapChartCard onSave:', e)\n }\n }\n}\n\nexport interface PapermapChartCardProps {\n /**\n * Connection details for API calls. Optional when the card is rendered inside\n * `PapermapProvider` with the same values (or use props to override provider defaults).\n */\n token?: string\n workspaceId?: string\n dashboardId?: string\n apiUrl?: string\n /**\n * Stable id owned by the host (layout slot, widget key, etc.). It is **not** a backend chat id.\n * On successful load, the card persists `{ id, chatId }` to localStorage; on later mounts, that\n * `chatId` is used for API fetches (see `resolveChartFetchChatId` in `chart-card-storage`).\n */\n id?: string\n /**\n * Called after chart state is successfully loaded or when a preloaded `chart` prop\n * is applied with a valid `llm_data_chat_id`. Errors from the host callback are caught\n * and logged only.\n */\n onSave?: (chart: TChartResponse) => void\n /**\n * The chat ID to load a chart for. When provided, the component will\n * fetch the latest chart for this chat on mount (overrides `id` → localStorage map).\n */\n chartId?: string\n /**\n * Pre-loaded chart data. When provided, the component will render this\n * chart instead of fetching from the API.\n */\n chart?: TChartResponse\n /**\n * Visual theme for the chart card. When set, renders in the specified\n * mode independent of the host app. Omit to inherit the host page's theme.\n */\n theme?: 'light' | 'dark'\n /**\n * Called when the user clicks the edit button on the chart card.\n * In streaming variant, if not provided, the built-in StreamingChartDialog opens.\n */\n onEditClick?: (chartId: string) => void\n /**\n * Called when the user confirms chart deletion.\n */\n onDelete?: (chartId: string) => void\n /**\n * Called when the pin state of the chart changes.\n */\n onPinChange?: (chartId: string, pinned: boolean) => void\n /**\n * When true, suppress destructive actions like delete.\n * (Used by viewer mode dashboards.)\n */\n isViewer?: boolean\n /**\n * When true, the chart card will be rendered in wide mode suitable for\n * table-type charts that need more horizontal space.\n */\n wide?: boolean\n /** Hide the chart variation selector. Defaults to true. */\n hideVariants?: boolean\n /** Show the toolbar with edit/delete/maximize buttons. Defaults to true. */\n showToolbar?: boolean\n /** When true, chart toolbar actions are visually disabled during layout editing. */\n isEditMode?: boolean\n /** When true, show resize affordance and disable toolbar actions. */\n // isResizable?: boolean\n /** Optional stable identifier for standalone resize handle instrumentation. */\n // resizeKey?: string\n className?: string\n /**\n * Card variant. When `\"streaming\"`, clicking the edit icon opens an\n * expanded chart+conversation view (StreamingChartDialog) instead of\n * just calling onEditClick or opening the toolbar chat.\n */\n variant?: 'default' | 'streaming'\n}\n\nexport function PapermapChartCard({\n token: tokenProp,\n workspaceId: workspaceIdProp,\n dashboardId: dashboardIdProp,\n apiUrl: apiUrlProp,\n id,\n onSave,\n chartId,\n chart: chartProp,\n theme,\n onEditClick,\n onDelete,\n isViewer = false,\n wide = false,\n hideVariants = true,\n showToolbar = true,\n isEditMode = false,\n // isResizable,\n // resizeKey,\n className,\n variant = 'default',\n}: PapermapChartCardProps) {\n const conn = usePapermapConnectionOptional()\n const token = tokenProp ?? conn?.token\n const workspaceId = workspaceIdProp ?? conn?.workspaceId\n const dashboardId = dashboardIdProp ?? conn?.dashboardId\n const apiUrl = apiUrlProp ?? conn?.apiUrl\n\n if (!token?.trim() || !workspaceId?.trim() || !dashboardId?.trim()) {\n throw new Error(\n 'PapermapChartCard requires token, workspaceId, and dashboardId from props or PapermapProvider.'\n )\n }\n\n const resolvedFetchChatId = useMemo(\n () =>\n resolveChartFetchChatId({\n chartIdProp: chartId,\n cardId: id,\n workspaceId,\n dashboardId,\n }),\n [chartId, id, workspaceId, dashboardId]\n )\n /** Bridges dialog save → local `id`↔`chatId` map + host `onSave` (see `persistChartLoaded`). */\n const saveChart = useCallback(\n (chart: TChartResponse) => {\n persistChartLoaded(chart, id, workspaceId, dashboardId, onSave)\n },\n [onSave, id, workspaceId, dashboardId]\n )\n\n const card = (\n <div\n className={cn(\n 'h-full min-h-0',\n theme === 'dark' ? 'dark' : theme === 'light' ? 'light' : undefined\n )}\n >\n <ChartCardInner\n workspaceId={workspaceId}\n dashboardId={dashboardId}\n cardId={id}\n onSave={saveChart}\n resolvedFetchChatId={resolvedFetchChatId}\n chart={chartProp}\n onEditClick={onEditClick}\n onDelete={onDelete}\n isViewer={isViewer}\n wide={wide}\n hideVariants={hideVariants}\n showToolbar={showToolbar}\n isEditMode={isEditMode}\n // isResizable={isResizable}\n // resizeKey={resizeKey}\n className={className}\n variant={variant}\n />\n </div>\n )\n\n if (conn) {\n return card\n }\n\n return (\n <PapermapProvider\n token={token}\n workspaceId={workspaceId}\n dashboardId={dashboardId}\n apiUrl={apiUrl}\n >\n {card}\n </PapermapProvider>\n )\n}\n\ninterface InnerProps {\n workspaceId: string\n dashboardId: string\n /** Host stable id; paired with backend chat id in local storage when set. */\n cardId?: string\n onSave?: (chart: TChartResponse) => void\n /** Backend chat id from prop or persisted link — always the id passed to chart HTTP APIs. */\n resolvedFetchChatId?: string\n chart?: TChartResponse\n onDelete?: (chartId: string) => void\n isViewer?: boolean\n wide?: boolean\n hideVariants?: boolean\n showToolbar?: boolean\n isEditMode?: boolean\n // isResizable?: boolean\n // resizeKey?: string\n className?: string\n onEditClick?: (chartId: string) => void\n variant?: 'default' | 'streaming'\n}\n\n// const STANDALONE_RESIZE_DIRECTIONS = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'] as const\n\n// const STANDALONE_RESIZE_HANDLE_POSITION: Record<\n// (typeof STANDALONE_RESIZE_DIRECTIONS)[number],\n// string\n// > = {\n// n: 'left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 cursor-n-resize',\n// s: 'left-1/2 bottom-0 -translate-x-1/2 translate-y-1/2 cursor-s-resize',\n// e: 'right-0 top-1/2 -translate-y-1/2 translate-x-1/2 cursor-e-resize',\n// w: 'left-0 top-1/2 -translate-y-1/2 -translate-x-1/2 cursor-w-resize',\n// ne: 'right-0 top-0 translate-x-1/2 -translate-y-1/2 cursor-ne-resize',\n// nw: 'left-0 top-0 -translate-x-1/2 -translate-y-1/2 cursor-nw-resize',\n// se: 'right-0 bottom-0 translate-x-1/2 translate-y-1/2 cursor-se-resize',\n// sw: 'left-0 bottom-0 -translate-x-1/2 translate-y-1/2 cursor-sw-resize',\n// }\n\nfunction ChartCardInner({\n workspaceId,\n dashboardId,\n cardId,\n onSave,\n resolvedFetchChatId,\n chart: chartProp,\n onDelete,\n isViewer = false,\n wide = false,\n hideVariants = true,\n showToolbar = true,\n isEditMode = false,\n // isResizable,\n // resizeKey,\n className,\n onEditClick,\n variant = 'default',\n}: InnerProps) {\n const { services } = usePapermapConnection()\n const { chartSvc } = services\n const storeApi = usePapermapStoreApiOptional()\n const queryClient = useQueryClient()\n\n const [chart, setChart] = useState<TChartResponse | null>(chartProp ?? null)\n const [isLoading, setIsLoading] = useState(!chartProp && !!resolvedFetchChatId)\n const [error, setError] = useState<string | null>(null)\n\n const [isDeleting, setIsDeleting] = useState(false)\n const [showDeleteDialog, setShowDeleteDialog] = useState(false)\n const [showMaximized, setShowMaximized] = useState(false)\n const [showStreamingDialog, setShowStreamingDialog] = useState(false)\n const [cardInstanceKey, setCardInstanceKey] = useState(0)\n\n const chatId = chart?.llm_data_chat_id ?? resolvedFetchChatId ?? null\n // const isResizing = Boolean(isResizable ?? isEditMode)\n // const resizeInstanceKey = useMemo(\n // () => resizeKey?.trim() || cardId?.trim() || chatId?.trim() || 'standalone-chart-card',\n // [resizeKey, cardId, chatId]\n // )\n\n useEffect(() => {\n if (!chartProp) return\n setChart(chartProp)\n setIsLoading(false)\n setError(null)\n if (chartProp.llm_data_chat_id) {\n persistChartLoaded(chartProp, cardId, workspaceId, dashboardId, onSave)\n }\n }, [chartProp, cardId, workspaceId, dashboardId, onSave])\n\n useEffect(() => {\n if (chartProp) return\n if (!resolvedFetchChatId) {\n setIsLoading(false)\n return\n }\n\n let stale = false\n setIsLoading(true)\n setError(null)\n\n fetchChartForChatId(chartSvc, resolvedFetchChatId)\n .then((loaded) => {\n if (stale) return\n if (loaded) {\n setChart(loaded)\n persistChartLoaded(loaded, cardId, workspaceId, dashboardId, onSave)\n } else {\n setError('No chart data found')\n }\n })\n .catch((err: unknown) => {\n if (stale) return\n console.error('Failed to load chart:', err)\n setError(err instanceof Error ? err.message : 'Failed to load chart')\n })\n .finally(() => {\n if (!stale) setIsLoading(false)\n })\n\n return () => {\n stale = true\n }\n }, [chartProp, resolvedFetchChatId, chartSvc, cardId, workspaceId, dashboardId, onSave])\n\n const isPinned = Boolean(chart?.pin)\n const isTile = chart?.chart_response?.chart_type === 'tile'\n const isMultiTile = isTile && (chart?.chart_response?.data?.length ?? 0) > 1\n\n const invalidateChartCards = useCallback(async () => {\n await queryClient.invalidateQueries({ queryKey: ['chartCards', dashboardId] })\n }, [queryClient, dashboardId])\n\n const remountChartCard = useCallback(() => {\n setChart(null)\n setError(null)\n setIsLoading(false)\n setShowDeleteDialog(false)\n setShowMaximized(false)\n setShowStreamingDialog(false)\n setCardInstanceKey((prev) => prev + 1)\n }, [])\n\n const handleDelete = useCallback(async () => {\n if (!chatId) return\n setShowDeleteDialog(false)\n setIsDeleting(true)\n\n try {\n await chartSvc.deleteChart(chatId)\n await queryClient.invalidateQueries({ queryKey: ['conversationHistory', dashboardId] })\n await invalidateChartCards()\n onDelete?.(chatId)\n removeChartCardLinksByChatId(chatId, { workspaceId, dashboardId })\n if (cardId?.trim()) {\n removeChartCardIdLink(cardId.trim(), chatId, { workspaceId, dashboardId })\n }\n try {\n const maybeChart = await fetchChartForChatId(chartSvc, chatId)\n if (!maybeChart) remountChartCard()\n } catch {\n remountChartCard()\n }\n toast({\n title: 'Chart Deleted',\n description: 'The chart has been removed successfully',\n })\n } catch {\n toast({\n title: 'Error',\n description: 'Failed to delete the chart',\n variant: 'destructive',\n })\n } finally {\n setIsDeleting(false)\n }\n }, [\n chatId,\n chartSvc,\n onDelete,\n queryClient,\n dashboardId,\n cardId,\n workspaceId,\n invalidateChartCards,\n remountChartCard,\n ])\n\n const handleOpenStreamingDialog = useCallback(() => {\n if (!storeApi) {\n toast({\n title: 'Chat unavailable',\n description: 'Mount PapermapProvider to use the streaming chart assistant.',\n variant: 'destructive',\n })\n return\n }\n if (chatId) {\n openPapermapChatAssistant(storeApi, {\n editChartId: chatId,\n chart: chart ?? undefined,\n suppressOpen: true,\n })\n }\n setShowStreamingDialog(true)\n }, [chatId, chart, storeApi])\n\n const streamingDialog =\n storeApi && variant === 'streaming' ? (\n <StreamingChartDialog\n isOpen={showStreamingDialog}\n onOpenChange={(open) => {\n setShowStreamingDialog(open)\n if (!open) closePapermapChatAssistant(storeApi)\n }}\n chartId={chatId ?? ''}\n onSave={onSave}\n onClose={() => {\n setShowStreamingDialog(false)\n closePapermapChatAssistant(storeApi)\n }}\n />\n ) : null\n\n if (isLoading) {\n return (\n <Card\n className={cn(\n 'relative flex h-full flex-col items-center justify-center min-h-[200px]',\n className\n )}\n >\n <Loader2 className=\"size-8 animate-spin mb-3\" />\n <p className=\"text-sm text-muted-foreground font-medium\">Fetching data...</p>\n </Card>\n )\n }\n\n if (error) {\n return (\n <Card\n className={cn(\n 'relative flex h-full flex-col items-center justify-center min-h-[200px]',\n className\n )}\n >\n <p className=\"text-sm text-destructive font-medium\">{error}</p>\n </Card>\n )\n }\n\n if (!chart) {\n if (variant !== 'streaming') return null\n\n return (\n <>\n <Card\n className={cn(\n 'group relative flex h-full flex-col items-center justify-center min-h-[300px] cursor-pointer transition-all duration-200 w-[400px]',\n !storeApi && 'cursor-not-allowed opacity-80',\n className\n )}\n onClick={() => {\n if (!storeApi) {\n toast({\n title: 'Chat unavailable',\n description: 'Mount PapermapProvider to use the streaming chart assistant.',\n variant: 'destructive',\n })\n return\n }\n handleOpenStreamingDialog()\n }}\n >\n <div className=\"flex flex-col items-center gap-3 px-6 text-center\">\n <div className=\"flex items-center justify-center size-12 rounded-full bg-muted/60\">\n <BarChart3 className=\"size-5 text-muted-foreground\" />\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">Create a chart</p>\n <p className=\"text-xs text-muted-foreground max-w-[200px]\">\n Click to start a conversation and generate a chart from your data\n </p>\n </div>\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground/70 mt-1\">\n <MessageSquare className=\"size-3\" />\n <span>Ask anything about your data</span>\n </div>\n </div>\n </Card>\n\n {streamingDialog}\n </>\n )\n }\n\n return (\n <>\n <Card\n key={cardInstanceKey}\n data-wide={wide ? 'true' : undefined}\n className={cn(\n 'group relative flex h-full flex-col overflow-hidden transition-all duration-200 pb-0 m-0 shadow-none',\n isTile && '!border-none',\n isMultiTile && 'shadow-none bg-transparent border-none',\n className\n )}\n >\n {chart.isLoading && (\n <div className=\"absolute inset-0 z-50 flex flex-col items-center justify-center bg-background/80 backdrop-blur-sm\">\n <Loader2 className=\"size-8 animate-spin mb-3\" />\n <p className=\"text-sm text-muted-foreground font-medium\">Fetching data...</p>\n </div>\n )}\n {/* \n {isResizing && (\n <div\n className=\"pointer-events-none absolute inset-0 z-20\"\n data-resize-key={resizeInstanceKey}\n data-resizing=\"true\"\n >\n {STANDALONE_RESIZE_DIRECTIONS.map((direction) => (\n <span\n key={`${resizeInstanceKey}:${direction}`}\n className={cn(\n 'pointer-events-auto absolute size-3 rounded-sm border border-primary/80 bg-background/95 shadow-sm',\n STANDALONE_RESIZE_HANDLE_POSITION[direction]\n )}\n data-resize-key={resizeInstanceKey}\n data-resize-direction={direction}\n aria-label={`Resize handle ${direction}`}\n title={`Resize (${direction.toUpperCase()})`}\n />\n ))}\n </div>\n )} */}\n\n {showToolbar && (\n <div\n className={cn(\n 'absolute top-4 right-0 z-30 flex h-10 w-auto items-center justify-end px-4',\n isTile && 'opacity-0 group-hover:opacity-100 transition-opacity'\n )}\n >\n {chart.isFetching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <div className=\"flex items-center gap-2\">\n {/* {isResizing && (\n <div\n className=\"flex size-8 items-center justify-center rounded-md border border-border/60 bg-background/90 text-muted-foreground\"\n aria-label=\"Resize card\"\n title=\"Resize Card\"\n >\n <MoveDiagonal2 className=\"size-4\" />\n </div>\n )} */}\n <div\n className={cn(\n 'flex items-center gap-2'\n // isResizing && 'opacity-30 pointer-events-none'\n )}\n >\n <ButtonWithTooltip\n onClick={() => setShowMaximized(true)}\n tooltipText=\"Maximize Chart\"\n >\n <Maximize2 className=\"size-4\" />\n </ButtonWithTooltip>\n {chatId && (\n <ButtonWithTooltip\n onClick={() => {\n void invalidateChartCards()\n if (variant === 'streaming') {\n if (onEditClick) {\n onEditClick(chatId)\n } else {\n handleOpenStreamingDialog()\n }\n } else if (onEditClick) {\n onEditClick(chatId)\n } else if (storeApi) {\n openPapermapChatAssistant(storeApi, {\n editChartId: chatId,\n chart: chart ?? undefined,\n })\n } else {\n toast({\n title: 'Chat unavailable',\n description: 'Mount PapermapProvider to open the chart assistant.',\n variant: 'destructive',\n })\n }\n }}\n tooltipText=\"Edit Chart\"\n >\n <Pencil className=\"size-4\" />\n </ButtonWithTooltip>\n )}\n {!isViewer && chatId && !isDeleting && (\n <ButtonWithTooltip\n onClick={() => setShowDeleteDialog(true)}\n tooltipText=\"Delete Chart\"\n >\n {isDeleting ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Trash2 className=\"size-4\" />\n )}\n </ButtonWithTooltip>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n\n <div className=\"flex-1 min-h-0 px-1\">\n <ChartView\n data={chart.chart_response?.data || []}\n chartMeta={chart.meta}\n visualizationConfig={chart.chart_response?.visualization_config || {}}\n chartType={chart.chart_response?.chart_type || ''}\n variant=\"default\"\n className=\"h-full w-full\"\n chartId={chatId || undefined}\n hideVariants={hideVariants}\n hideTitleAndSubtitle={isTile}\n pin={isPinned}\n />\n </div>\n </Card>\n\n <DeleteConfirmationModal\n isOpen={showDeleteDialog}\n onClose={() => setShowDeleteDialog(false)}\n onConfirm={handleDelete}\n isDeleting={isDeleting}\n title=\"Are you sure you want to delete this chart?\"\n description=\"This action cannot be undone. This will permanently delete the chart and remove it from the dashboard.\"\n />\n\n {chatId && (\n <ChartDialog\n isOpen={showMaximized}\n onOpenChange={setShowMaximized}\n title={chart.meta?.title}\n data={chart.chart_response?.data || []}\n chartId={chatId}\n chartMeta={chart.meta}\n chartType={chart.chart_response?.chart_type || ''}\n visualizationConfig={chart.chart_response?.visualization_config || {}}\n onMetaChange={() => {}}\n variant=\"default\"\n onClose={() => setShowMaximized(false)}\n />\n )}\n\n {chatId && streamingDialog}\n </>\n )\n}\n","'use client'\n\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { Eye, FullscreenIcon, Loader2, Maximize2, MessageSquare, Save, X } from 'lucide-react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { Button } from '../ui/button'\nimport { ChartView } from './ChartView'\nimport { ChartDialog } from './ChartDialog'\nimport { StreamingChatPanel } from '../StreamingChatPanel'\nimport MorphGradient from '../MorphGradient'\nimport { useToast } from '../../hooks/use-toast'\nimport { usePapermapStore, usePapermapStoreApi } from '../../store'\nimport type { TChartResponse } from '../../types/chart'\nimport { cn } from '../../utils/cn'\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\n\nconst EASE = [0.23, 1, 0.32, 1] as const\n\n/** Snapshot after “Save to dashboard” in the streaming dialog (pinned, store-backed chart state). */\nfunction buildTChartResponseFromStreamingState(args: {\n chartId: string\n chartData: any[]\n allMeta: Record<string, any>\n selectedChartType: string\n chartVisuals: Record<string, any>\n}): TChartResponse {\n const { chartId, chartData, allMeta, selectedChartType, chartVisuals } = args\n const variant =\n (typeof allMeta?.variant === 'string' && allMeta.variant) ||\n (typeof chartVisuals?.variant === 'string' && chartVisuals.variant) ||\n ''\n const title = allMeta?.title || chartVisuals?.title || ''\n return {\n llm_data_chat_id: chartId,\n name: typeof title === 'string' ? title : '',\n meta: { ...allMeta, variant },\n pin: true,\n chart_response: {\n chart_type: selectedChartType,\n data: Array.isArray(chartData) ? chartData : [],\n response_type: 'chart',\n schema_hints: {\n x_key: chartVisuals?.x_key ?? '',\n y_key: chartVisuals?.y_key ?? '',\n label_key: chartVisuals?.label_key ?? '',\n },\n visualization_config: {\n colors: Array.isArray(chartVisuals?.colors) ? chartVisuals.colors : [],\n width: typeof chartVisuals?.width === 'number' ? chartVisuals.width : 0,\n height: typeof chartVisuals?.height === 'number' ? chartVisuals.height : 0,\n ...chartVisuals,\n variant,\n },\n },\n }\n}\n\nfunction getDialogDimensions(hasChart: boolean, options?: { expanded?: boolean }) {\n const expanded = options?.expanded === true\n\n const isMobile = typeof window !== 'undefined' && window.innerWidth < 768\n if (isMobile) {\n return {\n width: expanded ? '95vw' : '90vw',\n height: expanded ? 'calc(100vh - 90px)' : '60vh',\n }\n }\n\n const screenWidth = typeof window !== 'undefined' ? window.innerWidth : 1024\n let width: string | number\n if (screenWidth >= 1536) width = expanded ? '96vw' : '45vw'\n else if (screenWidth >= 1280) width = expanded ? '97vw' : '55vw'\n else if (screenWidth >= 1024) width = expanded ? '98vw' : '65vw'\n else if (screenWidth >= 768) width = expanded ? '98vw' : '75vw'\n else width = expanded ? '95vw' : '90vw'\n\n const maxWidth = expanded ? 1920 : 1100\n if (typeof width === 'string' && width.includes('vw')) {\n const vwValue = parseInt(width)\n if ((screenWidth * vwValue) / 100 > maxWidth) width = maxWidth\n }\n\n if (hasChart) {\n const chartMaxWidth = expanded ? 1920 : 1400\n let chartWidth: string | number\n if (screenWidth >= 1736) chartWidth = expanded ? '98vw' : '1400px'\n else if (screenWidth >= 1280) chartWidth = expanded ? '97vw' : '68vw'\n else if (screenWidth >= 1024) chartWidth = expanded ? '98vw' : '90vw'\n else if (screenWidth >= 768) chartWidth = expanded ? '98vw' : '92vw'\n else chartWidth = expanded ? '95vw' : '95vw'\n if (typeof chartWidth === 'string' && chartWidth.includes('vw')) {\n const vwValue = parseInt(chartWidth)\n if ((screenWidth * vwValue) / 100 > chartMaxWidth) chartWidth = chartMaxWidth\n }\n return { width: chartWidth, height: expanded ? 'calc(100vh - 90px)' : '65vh' }\n }\n\n return { width, height: expanded ? 'calc(100vh - 90px)' : '60vh' }\n}\n\nexport interface StreamingChartDialogProps {\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n chartId: string\n onClose?: () => void\n /** After a successful Save-to-dashboard (pin) from this dialog; errors from the host are caught and logged. */\n onSave?: (chart: TChartResponse) => void\n}\n\nexport function StreamingChartDialog({\n isOpen,\n onOpenChange,\n chartId,\n onClose,\n onSave,\n}: StreamingChartDialogProps) {\n const [isSaving, setIsSaving] = useState(false)\n const [isMaximized, setIsMaximized] = useState(false)\n const [isExpanded, setIsExpanded] = useState(false)\n const [isChartVisible, setIsChartVisible] = useState(true)\n const [isMobileViewport, setIsMobileViewport] = useState(false)\n const { toast } = useToast()\n const storeApi = usePapermapStoreApi()\n\n const chartData = usePapermapStore((s) => s.chartData)\n const isBranching = usePapermapStore((s) => s.isBranching)\n const allMeta = usePapermapStore((s) => s.allMeta)\n const selectedChartType = usePapermapStore((s) => s.selectedChartType)\n const chartVisuals = usePapermapStore((s) => s.chartVisuals)\n const activeChatId = usePapermapStore((s) => s.editChatId || s.chatId)\n\n const title = allMeta?.title\n const hasChart = !!(chartData?.length && isChartVisible)\n const chartSplitActive = isChartVisible && Boolean(chartData?.length && selectedChartType)\n /** On <sm the chart column is hidden; widen chat only when that pane is off (or there is no chart). */\n const expandChatMessagesOnMobile = !chartSplitActive\n const dimensions = getDialogDimensions(hasChart, { expanded: isExpanded })\n const effectiveChartId = chartId || activeChatId || ''\n\n const floatingActionButtonClasses =\n 'h-8 px-3 backdrop-blur-md border border-border/50 shadow-lg hover:shadow-xl transition-all duration-200 flex items-center justify-center gap-2 text-sm font-medium'\n\n const toggleExpanded = useCallback(() => setIsExpanded((prev) => !prev), [])\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n const updateViewport = () => setIsMobileViewport(window.innerWidth < 640)\n updateViewport()\n window.addEventListener('resize', updateViewport)\n return () => window.removeEventListener('resize', updateViewport)\n }, [])\n\n useEffect(() => {\n if (isOpen && isMobileViewport) {\n setIsChartVisible(false)\n }\n }, [isOpen, isMobileViewport])\n\n const handleSaveToDashboard = async () => {\n if (!effectiveChartId) return\n const { chartSvc } = storeApi.getState().getServices()\n const dashboardId = storeApi.getState().getConfig().dashboardId\n if (!dashboardId) return\n\n try {\n setIsSaving(true)\n const chartTitle = allMeta?.title || 'Chart'\n await chartSvc.updateChartPin(effectiveChartId, true)\n toast({ title: `${chartTitle} saved to dashboard`, description: '' })\n if (onSave) {\n try {\n onSave(\n buildTChartResponseFromStreamingState({\n chartId: effectiveChartId,\n chartData,\n allMeta: allMeta || {},\n selectedChartType: selectedChartType || '',\n chartVisuals: chartVisuals || {},\n })\n )\n } catch (e) {\n console.error('StreamingChartDialog onSave:', e)\n }\n }\n } catch (error) {\n console.error('Failed to save chart:', error)\n toast({ title: 'Failed to save chart', description: '', variant: 'destructive' })\n } finally {\n setIsSaving(false)\n }\n }\n\n const handleClose = () => {\n onClose?.()\n onOpenChange(false)\n }\n\n return createPortal(\n <AnimatePresence>\n {isOpen && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0 bg-neutral-800/80 backdrop-blur-md\"\n onClick={handleClose}\n />\n\n {/* Dialog panel */}\n <motion.div\n initial={{ opacity: 0, scale: 0.98, width: 400, height: 0 }}\n animate={{\n opacity: 1,\n scale: 1,\n width:\n typeof dimensions.width === 'string' ? dimensions.width : `${dimensions.width}px`,\n height:\n typeof dimensions.height === 'string'\n ? dimensions.height\n : `${dimensions.height}px`,\n transition: {\n duration: 0.3,\n ease: EASE,\n opacity: { duration: 0.2 },\n scale: { duration: 0.3, ease: EASE },\n width: { duration: 0.3, ease: EASE },\n height: { duration: 0.3, ease: EASE },\n },\n }}\n exit={{\n opacity: 0,\n scale: 0.98,\n width: 400,\n height: 0,\n transition: { duration: 0.2, ease: EASE },\n }}\n className=\"relative rounded-3xl bg-background/85 border border-border/50 backdrop-blur-lg overflow-hidden flex flex-col streaming-chart\"\n style={{ transformOrigin: 'bottom center' }}\n onClick={(e) => {\n if (!(e.target instanceof HTMLAnchorElement)) {\n e.stopPropagation()\n e.preventDefault()\n }\n }}\n role=\"dialog\"\n aria-label={title || 'Chart View'}\n >\n <div className=\"absolute inset-0 bg-gradient-to-b from-background/10 via-background/50 to-background/10 opacity-50\" />\n <MorphGradient />\n\n {/* Content (above gradients) */}\n <motion.div\n className=\"relative flex flex-col w-full h-full z-10\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1, transition: { delay: 0.1, duration: 0.2 } }}\n >\n <AnimatePresence>\n {isBranching && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0 bg-background/60 backdrop-blur-md z-50 flex items-center justify-center rounded-3xl\"\n >\n <motion.div\n initial={{ scale: 0.9, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.9, opacity: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex flex-col items-center gap-4\"\n >\n <div className=\"size-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-lg font-medium text-foreground\">\n Branching into a new conversation\n </p>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Body: chart left, conversation right */}\n <div className=\"flex-1 flex min-h-0\">\n {/* Chart side */}\n {isChartVisible &&\n (chartData?.length && selectedChartType ? (\n <div\n className={cn(\n 'relative flex-1 py-7 px-6',\n isMobileViewport\n ? 'flex flex-col w-full border-b-0 border-r-0'\n : 'hidden sm:flex sm:flex-col border-b md:border-b-0 md:border-r border-border/50'\n )}\n >\n <div className=\"absolute top-4 right-4 z-20 flex items-center gap-1.5\">\n {/* Save */}\n {effectiveChartId ? (\n <ButtonWithTooltip\n onClick={handleSaveToDashboard}\n tooltipText=\"Save to dashboard\"\n className=\"h-8 w-8\"\n disabled={isSaving}\n >\n {isSaving ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Save className=\"h-3.5 w-3.5\" />\n )}\n </ButtonWithTooltip>\n ) : null}\n\n <ButtonWithTooltip\n onClick={() => setIsMaximized(true)}\n tooltipText=\"Maximize chart\"\n className=\"h-8 w-8\"\n disabled={!effectiveChartId}\n >\n <Maximize2 className=\"h-4 w-4\" />\n </ButtonWithTooltip>\n\n {/* Mobile: toggle chart/conversation. Desktop: hide chart. */}\n <ButtonWithTooltip\n onClick={() => setIsChartVisible(false)}\n tooltipText={isMobileViewport ? 'Show conversation' : 'Hide chart'}\n className=\"h-8 w-8\"\n >\n {isMobileViewport ? (\n <MessageSquare className=\"h-4 w-4\" />\n ) : (\n <X className=\"h-4 w-4\" />\n )}\n </ButtonWithTooltip>\n </div>\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"w-full h-full overflow-auto scrollbar-hide\">\n <ChartView\n isDialog\n className=\"h-full\"\n data={chartData}\n chartId={effectiveChartId}\n chartMeta={allMeta}\n chartType={selectedChartType || ''}\n visualizationConfig={chartVisuals}\n variant={allMeta?.variant}\n />\n </div>\n </div>\n </div>\n ) : null)}\n\n {/* Chat side */}\n <div\n className={cn(\n 'flex flex-col relative h-full',\n isMobileViewport\n ? isChartVisible && chartData?.length\n ? 'hidden'\n : 'w-full'\n : isChartVisible && chartData?.length\n ? 'sm:w-[35%] md:w-[35%] w-full'\n : 'w-full'\n )}\n >\n <StreamingChatPanel\n className=\"h-full\"\n expandMessageColumnOnMobile={expandChatMessagesOnMobile}\n autoFocusInput\n inputAction={\n chartData?.length && (isMobileViewport || !isChartVisible) ? (\n <ButtonWithTooltip\n onClick={() => {\n if (isMobileViewport) {\n setIsChartVisible((prev) => !prev)\n return\n }\n setIsChartVisible(true)\n }}\n tooltipText=\"Show chart\"\n className=\"h-9 w-9 bg-background/90 backdrop-blur-sm border rounded-full border-border/60 shadow-none shrink-0\"\n >\n <Eye className=\"h-4 w-4\" />\n </ButtonWithTooltip>\n ) : null\n }\n />\n </div>\n </div>\n\n <ChartDialog\n isOpen={isMaximized}\n onOpenChange={setIsMaximized}\n title={allMeta?.title}\n data={chartData || []}\n chartId={effectiveChartId}\n chartMeta={allMeta || {}}\n chartType={selectedChartType || ''}\n visualizationConfig={chartVisuals || {}}\n onMetaChange={() => {}}\n variant=\"\"\n onClose={() => setIsMaximized(false)}\n />\n </motion.div>\n\n {/* Floating full screen control (match ChatAssistant) */}\n <div\n className={cn('absolute bottom-16 right-4 z-20 hidden sm:flex items-center gap-2')}\n >\n <Button\n variant=\"outline\"\n onClick={toggleExpanded}\n className={cn(floatingActionButtonClasses, 'w-full')}\n >\n <FullscreenIcon className=\"h-4 w-4\" />\n {isExpanded ? 'Exit Full Screen' : 'Full Screen'}\n </Button>\n </div>\n </motion.div>\n </div>\n )}\n </AnimatePresence>,\n document.body\n )\n}\n","'use client'\n\nimport React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport {\n ArrowDown,\n ArrowUp,\n Brain,\n Copy,\n Edit2,\n FileSearch,\n Split,\n Square,\n Terminal,\n User,\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { usePapermapStore, usePapermapStoreApi } from '../store'\nimport type { Message } from '../types'\n\nimport { Alert, AlertDescription, AlertTitle } from './ui/alert'\nimport { Button } from './ui/button'\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'\nimport { MarkdownRenderer } from './ui/markdown'\nimport { ThinkingMessage } from './ui/ThinkingMessage'\nimport { ButtonWithTooltip } from './common/ButtonWithTooltip'\nimport { BookmarkButton } from './common/BookmarkButton'\nimport { BranchButton } from './common/BranchButton'\nimport { FeedbackButtons } from './common/FeedbackButtons'\nimport { ThinkingLogo } from './common/ThinkingLogo'\nimport LogoStandAlone from './LogoStandAlone'\nimport { StreamingTimeline } from './dashboard/StreamingTimeline'\nimport { toast } from '../hooks/use-toast'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from './ui/dialog'\nimport { buildTimelineFromProgressEvents } from '../lib/analytics-stream-replay'\n\nconst APP_NAME = 'Papermap'\n\nasync function copyToClipboard({\n value,\n successMessage = 'Copied to clipboard successfully',\n}: {\n value: string\n successMessage?: string\n}) {\n try {\n await navigator.clipboard.writeText(value)\n toast({ title: 'Success', description: successMessage })\n return true\n } catch (error) {\n console.error('Failed to copy to clipboard:', error)\n toast({ title: 'Error', description: 'Failed to copy to clipboard', variant: 'destructive' })\n return false\n }\n}\n\n// ── Simplified message bubble ──────────────────────────────────────\n\nfunction MessageBubble({\n message,\n children,\n expandAssistantOnMobile,\n}: {\n message: Message\n children: React.ReactNode\n expandAssistantOnMobile?: boolean\n}) {\n return (\n <div\n className={cn(\n 'rounded-2xl text-sm break-words',\n message.role === 'user'\n ? 'bg-primary ml-auto text-primary-foreground rounded-tr-sm max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px] px-4 py-2.5'\n : cn(\n 'bg-muted/50 rounded-tl-sm px-4 py-2.5 [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs [&_pre]:bg-muted [&_pre]:p-3 [&_pre]:rounded-lg [&_pre]:overflow-x-auto [&_pre]:my-2',\n expandAssistantOnMobile\n ? 'max-w-full sm:max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]'\n : 'max-w-[70vw] md:max-w-[80vw] lg:max-w-[610px]'\n )\n )}\n >\n {children}\n </div>\n )\n}\n\n// ── PanelMessageItem ─────────────────────────────────────────────\n\nconst PanelMessageItem = memo(function PanelMessageItem({\n message,\n index,\n isThinking,\n isLastMessage,\n onBookmarkMessage,\n onCollapseThought,\n bookmarkLoading,\n feedbackLoading,\n feedbackLoadingType,\n onFeedback,\n onBranch,\n onEditSave,\n onOpenAuditLog,\n hideAvatar = false,\n hideThinkingProcess = false,\n expandMessageColumnOnMobile = false,\n}: {\n message: Message\n index: number\n isThinking: boolean\n isLastMessage: boolean\n onBookmarkMessage: (index: number) => void\n onCollapseThought: (index: number) => void\n bookmarkLoading: number | null\n feedbackLoading: number | null\n feedbackLoadingType: 'positive' | 'negative' | null\n onFeedback: (index: number, type: 'positive' | 'negative') => void\n onBranch: (index: number) => void\n onEditSave: (message: Message) => void\n onOpenAuditLog: () => void\n hideAvatar?: boolean\n hideThinkingProcess?: boolean\n /** Below `sm`, let the message column use full width (streaming dialog when chart pane is hidden). */\n expandMessageColumnOnMobile?: boolean\n}) {\n const [isEditing, setIsEditing] = useState(false)\n const [editedContent, setEditedContent] = useState(message.content)\n const [originalContent] = useState(message.content)\n\n const handleEditClick = () => {\n setIsEditing(true)\n setEditedContent(message.content)\n }\n const handleCancel = () => {\n setIsEditing(false)\n setEditedContent(message.content)\n }\n const handleSave = () => {\n if (editedContent.trim()) {\n onEditSave({ ...message, content: editedContent, originalContent } as any)\n setIsEditing(false)\n }\n }\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className={cn(\n 'flex gap-3 group/message',\n message.role === 'user' ? 'flex-row-reverse items-start' : 'items-start',\n hideAvatar && 'gap-0'\n )}\n >\n {!hideAvatar && (\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n 'bg-primary',\n isLastMessage && isThinking && 'bg-transparent'\n )}\n >\n {message.role === 'user' ? (\n <User className=\"h-4 w-4 text-primary-foreground\" />\n ) : isLastMessage && isThinking ? (\n <ThinkingLogo size=\"md\" />\n ) : (\n <LogoStandAlone className=\"h-4 w-4\" />\n )}\n </div>\n )}\n <div\n className={cn(\n 'flex flex-col min-w-0',\n message.role === 'user' ? 'items-end gap-0' : 'gap-1',\n !hideAvatar &&\n (expandMessageColumnOnMobile ? 'max-sm:max-w-full max-w-[90%]' : 'max-w-[90%]'),\n hideAvatar && 'max-w-full'\n )}\n >\n {message.role === 'error' ? (\n <Alert variant=\"destructive\">\n <Terminal className=\"h-3.5 w-3.5\" />\n <AlertTitle />\n <AlertDescription>{message?.content}</AlertDescription>\n </Alert>\n ) : (\n <div className={cn('flex flex-col', message.role === 'user' ? 'gap-0' : 'gap-2')}>\n {message.thought && message.role === 'assistant' && !hideThinkingProcess && (\n <Collapsible open={message.openThought} onOpenChange={() => onCollapseThought(index)}>\n <CollapsibleTrigger className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <Brain className=\"h-3 w-3\" />\n View thinking\n </CollapsibleTrigger>\n <CollapsibleContent className=\"text-xs bg-muted/30 p-2\">\n <div className=\"pl-3 border-l-2 border-gray-500 text-gray-700 dark:text-white/80\">\n <MarkdownRenderer>{message.thought}</MarkdownRenderer>\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n <div className={cn('relative', message.role === 'user' && 'group')}>\n {isEditing && message.role === 'user' ? (\n <div className=\"flex flex-col gap-2 w-full\">\n <textarea\n value={editedContent}\n onChange={(e) => setEditedContent(e.target.value)}\n className=\"w-full rounded-xl border border-border/50 bg-background px-3 py-2.5 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary/50 resize-none min-h-[60px]\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSave()\n }\n if (e.key === 'Escape') handleCancel()\n }}\n />\n <div className=\"flex items-center justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCancel}\n className=\"h-7 px-2.5 text-xs\"\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={handleSave}\n className=\"h-7 px-2.5 text-xs\"\n disabled={!editedContent.trim()}\n >\n Send\n </Button>\n </div>\n </div>\n ) : (\n <>\n <MessageBubble\n message={message}\n expandAssistantOnMobile={expandMessageColumnOnMobile}\n >\n <MarkdownRenderer>{message.content}</MarkdownRenderer>\n {!isThinking && !message?.noIcons && (\n <div className=\"flex justify-between items-center gap-2 mt-1.5\">\n <div className=\"flex items-center gap-1\">\n {message.role === 'assistant' && message.bookmarked !== undefined && (\n <BookmarkButton\n onToggle={() => onBookmarkMessage(index)}\n isLoading={Boolean(bookmarkLoading === index)}\n isBookmarked={message.bookmarked || false}\n />\n )}\n {message.role === 'assistant' && (\n <ButtonWithTooltip\n onClick={() => copyToClipboard({ value: message.content })}\n tooltipText=\"Copy\"\n className=\"h-5 w-5 hover:bg-muted/80 transition-colors\"\n >\n <Copy className=\"h-3 w-3 text-muted-foreground\" />\n </ButtonWithTooltip>\n )}\n {message.role === 'assistant' && (\n <BranchButton onBranch={() => onBranch(index)} />\n )}\n {message.role === 'assistant' && (\n <ButtonWithTooltip\n onClick={onOpenAuditLog}\n tooltipText=\"Audit Log\"\n className=\"h-5 w-5 hover:bg-muted/80 transition-colors\"\n >\n <FileSearch className=\"h-3 w-3 text-muted-foreground\" />\n </ButtonWithTooltip>\n )}\n </div>\n {message.role === 'assistant' && (\n <FeedbackButtons\n onFeedback={(type) => onFeedback(index, type)}\n isLoading={Boolean(feedbackLoading === index)}\n selectedFeedback={message.feedback || null}\n loadingType={feedbackLoading === index ? feedbackLoadingType : null}\n />\n )}\n </div>\n )}\n </MessageBubble>\n {message.role === 'user' && !isEditing && (\n <div className=\"max-h-0 overflow-hidden group-hover/message:max-h-10 transition-all duration-200 ease-out\">\n <div className=\"flex items-center gap-1 mt-1 justify-end opacity-0 group-hover/message:opacity-100 transition-opacity duration-200\">\n {!message?.is_inherited && !message?.is_rundown && (\n <ButtonWithTooltip\n onClick={handleEditClick}\n tooltipText=\"Edit\"\n className=\"h-5 w-5 hover:bg-muted/80\"\n >\n <Edit2 className=\"h-3 w-3\" />\n </ButtonWithTooltip>\n )}\n <ButtonWithTooltip\n onClick={() => copyToClipboard({ value: message.content })}\n tooltipText=\"Copy\"\n className=\"h-5 w-5 hover:bg-muted/80\"\n >\n <Copy className=\"h-3 w-3\" />\n </ButtonWithTooltip>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n )}\n {message.status === 'done' && (\n <span className=\"text-[10px] text-muted-foreground px-1\">\n {message.role === 'user' ? 'You' : `${APP_NAME} AI`}\n </span>\n )}\n </div>\n </motion.div>\n )\n})\n\n// ── StreamingChatPanel ──────────────────────────────────────────────\n\nexport interface StreamingChatPanelProps {\n className?: string\n /**\n * When true, message rows use full available width below `sm`. Use in the streaming chart\n * dialog when the chart column is hidden so chat isn’t artificially narrow.\n */\n expandMessageColumnOnMobile?: boolean\n /** Auto-focuses the prompt input when this panel mounts (used by dialog hosts). */\n autoFocusInput?: boolean\n /** Optional action rendered beside submit button in the input row. */\n inputAction?: React.ReactNode\n}\n\nexport function StreamingChatPanel({\n className,\n expandMessageColumnOnMobile = false,\n autoFocusInput = false,\n inputAction,\n}: StreamingChatPanelProps) {\n const messages = usePapermapStore((s) => s.messages)\n const isThinking = usePapermapStore((s) => s.isLoading)\n const inputValue = usePapermapStore((s) => s.inputValue)\n const setInputValue = usePapermapStore((s) => s.setInputValue)\n const handleSubmit = usePapermapStore((s) => s.handleSubmit)\n const handleCancel = usePapermapStore((s) => s.handleCancel)\n const isLoadingMore = usePapermapStore((s) => s.isLoadingMore)\n const handleScroll = usePapermapStore((s) => s.handleScroll)\n\n const sseTimeline = usePapermapStore((s) => s.sseTimeline)\n const ssePhase = usePapermapStore((s) => s.ssePhase)\n const sseIsStreaming = usePapermapStore((s) => s.sseIsStreaming)\n const sseIsComplete = usePapermapStore((s) => s.sseIsComplete)\n const sseToolCalls = usePapermapStore((s) => s.sseToolCalls)\n const sseThoughts = usePapermapStore((s) => s.sseThoughts)\n\n const storeApi = usePapermapStoreApi()\n const refs = storeApi.getState().getRefs()\n const { chartSvc } = storeApi.getState().getServices()\n const config = storeApi.getState().getConfig()\n\n const scrollRef = useRef<HTMLDivElement>(null)\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const [showScrollButton, setShowScrollButton] = useState(false)\n const [bookmarkLoading, setBookmarkLoading] = useState<number | null>(null)\n const [feedbackLoading, setFeedbackLoading] = useState<number | null>(null)\n const [feedbackLoadingType, setFeedbackLoadingType] = useState<'positive' | 'negative' | null>(\n null\n )\n const setIsBranching = usePapermapStore((s) => s.setIsBranching)\n\n const hasActiveSSE = sseIsStreaming || sseTimeline.length > 0\n const [auditOpen, setAuditOpen] = useState(false)\n const [auditProgressEvents, setAuditProgressEvents] = useState<\n | {\n event_type?: string\n data?: Record<string, any>\n timestamp?: string\n }[]\n | undefined\n >(undefined)\n\n const auditReplayTimeline = useMemo(\n () => buildTimelineFromProgressEvents(auditProgressEvents),\n [auditProgressEvents]\n )\n\n const scrollToBottom = useCallback(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTo({ top: scrollRef.current.scrollHeight, behavior: 'smooth' })\n } else {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }\n }, [])\n\n // Always keep conversation pinned to bottom\n useEffect(() => {\n if (isLoadingMore) return\n requestAnimationFrame(() => scrollToBottom())\n }, [messages, scrollToBottom, isLoadingMore])\n\n useEffect(() => {\n if (sseIsStreaming || sseToolCalls.length > 0 || sseThoughts.length > 0) {\n const timer = setTimeout(() => {\n scrollToBottom()\n }, 100)\n return () => clearTimeout(timer)\n }\n }, [sseIsStreaming, sseToolCalls, sseThoughts, sseTimeline, scrollToBottom])\n\n useEffect(() => {\n if (!autoFocusInput) return\n const input = inputRef.current\n if (!input) return\n requestAnimationFrame(() => input.focus())\n }, [autoFocusInput])\n\n const collapseThought = useCallback(\n (index: number) => {\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((msg, i) => (i === index ? { ...msg, openThought: !msg.openThought } : msg))\n )\n },\n [storeApi]\n )\n\n const handleBookmarkMessage = useCallback(\n async (messageIndex: number) => {\n const msg = messages[messageIndex]\n if (!msg) return\n setBookmarkLoading(messageIndex)\n try {\n if (msg.bookmarked) {\n await chartSvc.removeBookmark(msg.bookmark_id || '')\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) => (i === messageIndex ? { ...m, bookmarked: false } : m))\n )\n } else {\n const result = await chartSvc.bookmarkConversation({\n llm_data_id: msg.id || msg.llm_data_id || '',\n dashboard_id: config.dashboardId,\n })\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) =>\n i === messageIndex\n ? { ...m, bookmarked: true, bookmark_id: result.data?.bookmark_id }\n : m\n )\n )\n }\n } catch (error) {\n console.error('Bookmark error:', error)\n toast({ title: 'Error', description: 'Failed to bookmark', variant: 'destructive' })\n } finally {\n setBookmarkLoading(null)\n }\n },\n [messages, chartSvc, storeApi, config.dashboardId]\n )\n\n const handleFeedback = useCallback(\n async (messageIndex: number, feedbackType: 'positive' | 'negative') => {\n const msg = messages[messageIndex]\n if (!msg || !msg.id) return\n setFeedbackLoading(messageIndex)\n setFeedbackLoadingType(feedbackType)\n try {\n await chartSvc.updateResponseLabel(msg.id, feedbackType)\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m, i) => (i === messageIndex ? { ...m, feedback: feedbackType } : m))\n )\n toast({ title: 'Success', description: 'Feedback recorded successfully!' })\n } catch (error) {\n console.error('Feedback error:', error)\n toast({ title: 'Error', description: 'Failed to record feedback', variant: 'destructive' })\n } finally {\n setFeedbackLoading(null)\n setFeedbackLoadingType(null)\n }\n },\n [messages, chartSvc, storeApi]\n )\n\n const handleBranch = useCallback(\n async (messageIndex: number) => {\n const msg = messages[messageIndex]\n const llmDataId = msg?.llm_data_id || msg?.id\n const chatIdToUse = storeApi.getState().editChatId || storeApi.getState().chatId\n if (!msg || !llmDataId || !chatIdToUse) return\n setIsBranching(true)\n try {\n const response = await chartSvc.branchConversation(config.dashboardId, llmDataId)\n const newChatId = response?.data?.new_chat_id || ''\n storeApi.getState().clearStreamingState()\n storeApi.getState().setChatId(newChatId)\n storeApi.getState().setEditChatId(null)\n // Mark as loaded so ConversationLoader doesn't overwrite our messages when chatId changes\n refs.loadedConversationChatIdRef.current = newChatId\n const branchMsg: Message = {\n role: 'branch' as any,\n content: 'Branched from Conversation',\n status: 'done',\n }\n const inherited = messages.map((m) => ({ ...m, is_inherited: true, noIcons: true }))\n storeApi.getState().setMessages([...inherited.slice(0, messageIndex + 1), branchMsg])\n toast({\n title: 'Success',\n description: `Branch created! ${response?.data?.inherited_message_count || 0} messages inherited.`,\n })\n } catch (error) {\n console.error('Branch error:', error)\n toast({ title: 'Error', description: 'Failed to create branch', variant: 'destructive' })\n } finally {\n setIsBranching(false)\n }\n },\n [messages, chartSvc, storeApi, refs, config.dashboardId]\n )\n\n const handleEditSave = useCallback(\n (editedMessage: Message) => {\n storeApi\n .getState()\n .setMessages((prev: Message[]) =>\n prev.map((m) => (m.id === editedMessage.id ? editedMessage : m))\n )\n },\n [storeApi]\n )\n\n const onScrollInternal = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (scrollRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = scrollRef.current\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight\n setShowScrollButton(distanceFromBottom > 200)\n }\n handleScroll(e)\n },\n [handleScroll]\n )\n\n const visibleMessages = useMemo(() => {\n if (messages.length <= 50) return messages\n return messages.slice(-50)\n }, [messages])\n\n const handleFormSubmit = useCallback(() => {\n const msg = inputValue.trim()\n if (!msg || isThinking) return\n handleSubmit(msg)\n }, [inputValue, isThinking, handleSubmit])\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n <Dialog open={auditOpen} onOpenChange={setAuditOpen}>\n <DialogContent className=\"sm:max-w-[540px] p-0 max-h-[85vh] overflow-hidden flex flex-col\">\n <DialogHeader className=\"px-5 pt-4 pb-3 border-b border-border/60 space-y-0\">\n <DialogTitle className=\"text-base font-semibold leading-normal\">Audit Log</DialogTitle>\n </DialogHeader>\n <div className=\"flex-1 overflow-y-auto scrollbar-hide px-3 py-3 space-y-3\">\n {auditReplayTimeline.length > 0 ? (\n <div className=\"space-y-2 border border-border/60 rounded-lg p-3 bg-muted/20\">\n <p className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n Execution Replay\n </p>\n <StreamingTimeline\n timeline={auditReplayTimeline}\n collapseThreshold={3}\n recentFullCount={1}\n />\n </div>\n ) : (\n <div className=\"rounded-lg border border-border/60 bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n No execution replay is available for this message.\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n\n {/* Message list */}\n <div className=\"flex-1 overflow-hidden\">\n <div\n ref={scrollRef}\n onScroll={onScrollInternal}\n className=\"h-full overflow-y-auto scrollbar-hide [mask-image:linear-gradient(to_bottom,transparent_0,black_6%,black_94%,transparent_100%)] min-h-0\"\n >\n <div className=\"space-y-2 py-3 px-4\">\n {isLoadingMore && (\n <div className=\"flex justify-center py-2\">\n <div className=\"size-4 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n )}\n\n {visibleMessages.map((message, index) => {\n const actualIndex = messages.length - visibleMessages.length + index\n const isLastAssistantMessage =\n message.role === 'assistant' && actualIndex === messages.length - 1\n\n if (message.role === ('branch' as any)) {\n return (\n <motion.div\n key={`branch-${actualIndex}`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex justify-center my-3\"\n >\n <div className=\"flex items-center gap-2 px-3 py-1.5 rounded-full bg-white dark:bg-muted border border-primary/20 dark:border-border\">\n <Split className=\"h-3.5 w-3.5 text-primary rotate-90\" />\n <span className=\"text-xs font-medium text-foreground\">{message.content}</span>\n </div>\n </motion.div>\n )\n }\n\n if (\n (isLastAssistantMessage && hasActiveSSE) ||\n (message.status === 'thinking' && hasActiveSSE)\n )\n return null\n\n return (\n <PanelMessageItem\n key={`${message.id || actualIndex}-${(message.content || '').slice(0, 50)}`}\n message={message}\n index={actualIndex}\n isThinking={isThinking}\n isLastMessage={actualIndex === messages.length - 1}\n onBookmarkMessage={handleBookmarkMessage}\n onCollapseThought={collapseThought}\n bookmarkLoading={bookmarkLoading}\n feedbackLoading={feedbackLoading}\n feedbackLoadingType={feedbackLoadingType}\n onFeedback={handleFeedback}\n onBranch={handleBranch}\n onEditSave={handleEditSave}\n onOpenAuditLog={() => {\n setAuditProgressEvents(message.progress_events as any)\n setAuditOpen(true)\n }}\n expandMessageColumnOnMobile={expandMessageColumnOnMobile}\n />\n )\n })}\n\n {/* SSE streaming section */}\n {(() => {\n const lastMessage = messages[messages.length - 1]\n const hasAssistantMessage = lastMessage && lastMessage.role === 'assistant'\n if (hasActiveSSE || (hasAssistantMessage && sseTimeline.length > 0)) {\n const actualIndex = hasAssistantMessage ? messages.length - 1 : -1\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex gap-2.5 items-start\"\n key={`sse-combined-${actualIndex}`}\n >\n <div\n className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-full',\n sseIsStreaming ? 'bg-transparent' : 'bg-primary'\n )}\n >\n {sseIsStreaming ? (\n <ThinkingLogo size=\"sm\" />\n ) : (\n <LogoStandAlone className=\"h-3.5 w-3.5\" />\n )}\n </div>\n <div\n className={cn(\n 'flex flex-col gap-2 w-full min-w-0',\n expandMessageColumnOnMobile ? 'max:max-w-full max-w-[85%]' : 'max-w-[85%]'\n )}\n >\n {(isThinking || sseIsStreaming || (ssePhase && !sseIsComplete)) && (\n <div className=\"flex flex-col gap-1 w-fit\">\n <div className=\"rounded-2xl rounded-tl-sm bg-muted/50 px-3 py-2.5 text-sm break-words\">\n <ThinkingMessage\n isThinking={isThinking || sseIsStreaming || !!ssePhase}\n currentPhase={ssePhase || 'Analyzing your request...'}\n />\n </div>\n <span className=\"text-[10px] text-muted-foreground pl-2\">\n {APP_NAME} AI\n </span>\n </div>\n )}\n <StreamingTimeline\n timeline={sseTimeline}\n collapseThreshold={3}\n recentFullCount={1}\n />\n {hasAssistantMessage && lastMessage && (\n <PanelMessageItem\n key={`${lastMessage.id || actualIndex}-final`}\n message={lastMessage}\n index={actualIndex}\n isThinking={isThinking}\n isLastMessage\n onBookmarkMessage={handleBookmarkMessage}\n onCollapseThought={collapseThought}\n bookmarkLoading={bookmarkLoading}\n feedbackLoading={feedbackLoading}\n feedbackLoadingType={feedbackLoadingType}\n onFeedback={handleFeedback}\n onBranch={handleBranch}\n onEditSave={handleEditSave}\n onOpenAuditLog={() => {\n setAuditProgressEvents(lastMessage.progress_events as any)\n setAuditOpen(true)\n }}\n hideAvatar\n hideThinkingProcess={hasActiveSSE}\n expandMessageColumnOnMobile={expandMessageColumnOnMobile}\n />\n )}\n </div>\n </motion.div>\n )\n }\n return null\n })()}\n\n <div ref={messagesEndRef} className=\"h-4\" />\n </div>\n </div>\n </div>\n\n {/* Scroll-to-bottom button */}\n <AnimatePresence>\n {showScrollButton && (\n <div className=\"relative\">\n <div className=\"absolute -top-10 inset-x-0 flex justify-center z-10\">\n <motion.button\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.2 }}\n onClick={scrollToBottom}\n className=\"px-2.5 py-1 rounded-full bg-background/80 hover:bg-background text-foreground/70 hover:text-foreground border border-border/50 backdrop-blur-md shadow-sm text-xs font-medium flex items-center gap-1\"\n >\n <ArrowDown className=\"h-3 w-3\" />\n Scroll to bottom\n </motion.button>\n </div>\n </div>\n )}\n </AnimatePresence>\n\n {/* Input area */}\n <div className=\"flex-none border-t border-border/30 p-3\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n handleFormSubmit()\n }}\n className=\"flex items-end gap-2\"\n >\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n const ta = e.target\n ta.style.height = 'auto'\n ta.style.height = Math.min(Math.max(36, ta.scrollHeight), 100) + 'px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleFormSubmit()\n }\n }}\n placeholder=\"Ask anything...\"\n rows={1}\n className={cn(\n 'flex-1 text-sm rounded-xl border border-border/40 bg-background/80 px-3 py-2 scrollbar-hide',\n 'ring-0 focus-visible:ring-1 focus-visible:ring-primary/30 focus:ring-0 outline-none',\n 'placeholder:text-sm placeholder:text-muted-foreground/60',\n 'resize-none min-h-[36px] max-h-[120px]'\n )}\n />\n <Button\n type={isThinking ? 'button' : 'submit'}\n size=\"icon\"\n onClick={isThinking ? handleCancel : handleFormSubmit}\n disabled={!isThinking && !inputValue.trim()}\n className=\"h-9 w-9 rounded-full shrink-0\"\n >\n {isThinking ? (\n <Square className=\"h-3.5 w-3.5 fill-current\" />\n ) : (\n <ArrowUp className=\"h-4 w-4\" />\n )}\n </Button>\n {inputAction}\n </form>\n </div>\n </div>\n )\n}\n","/**\n * Persistent link between a host-owned stable id (`id` on {@link PapermapChartCard})\n * and the Papermap backend `chat_id` (`llm_data_chat_id`).\n *\n * Stored in localStorage under a single key to avoid per-card key explosion and to allow\n * future schema upgrades (version field) without breaking hosts.\n */\n\nexport const CHART_CARD_CHAT_MAP_KEY = 'papermap.plugin.chartCardChatMap'\n\nexport type ChartCardStorageNamespace = {\n workspaceId?: string\n dashboardId?: string\n}\n\n/** Canonical link record returned to callers and accepted on upsert. */\nexport type ChartCardIdLink = {\n /** Host key (stable widget / layout / route id). */\n id: string\n /** Backend chat id used exclusively for chart API calls — never use `id` as a chat id. */\n chatId: string\n}\n\nconst STORAGE_VERSION = 1 as const\n\ntype LinkEntry = {\n chatId: string\n /** Epoch ms; useful for sync/conflict hints in future versions. */\n updatedAt?: number\n}\n\ntype ChartCardLinkDocument = {\n v: typeof STORAGE_VERSION\n entries: Record<string, LinkEntry>\n}\n\nfunction emptyDocument(): ChartCardLinkDocument {\n return { v: STORAGE_VERSION, entries: {} }\n}\n\nfunction normalizeKey(id: string): string {\n return id.trim()\n}\n\nfunction normalizeChatId(chatId: string): string {\n return chatId.trim()\n}\n\nfunction parseDocument(raw: string | null): ChartCardLinkDocument {\n if (!raw) return emptyDocument()\n try {\n const parsed = JSON.parse(raw) as unknown\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return emptyDocument()\n }\n const obj = parsed as Record<string, unknown>\n\n if (\n obj.v === STORAGE_VERSION &&\n obj.entries &&\n typeof obj.entries === 'object' &&\n !Array.isArray(obj.entries)\n ) {\n return { v: STORAGE_VERSION, entries: obj.entries as Record<string, LinkEntry> }\n }\n\n // Legacy v0: flat Record<id, chatId string>\n const entries: Record<string, LinkEntry> = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string') {\n const kid = normalizeKey(key)\n const cid = normalizeChatId(value)\n if (kid && cid) entries[kid] = { chatId: cid }\n }\n }\n return { v: STORAGE_VERSION, entries }\n } catch {\n return emptyDocument()\n }\n}\n\nfunction getScopedStorageKey(namespace?: ChartCardStorageNamespace): string {\n const workspaceId = namespace?.workspaceId?.trim()\n const dashboardId = namespace?.dashboardId?.trim()\n if (!workspaceId || !dashboardId) return CHART_CARD_CHAT_MAP_KEY\n return `${CHART_CARD_CHAT_MAP_KEY}:${workspaceId}:${dashboardId}`\n}\n\nfunction readDocument(storageKey: string): ChartCardLinkDocument {\n if (typeof window === 'undefined') return emptyDocument()\n return parseDocument(localStorage.getItem(storageKey))\n}\n\nfunction writeDocument(doc: ChartCardLinkDocument, storageKey: string): void {\n if (typeof window === 'undefined') return\n try {\n localStorage.setItem(storageKey, JSON.stringify(doc))\n } catch {\n // quota / private mode\n }\n}\n\nfunction entryToLink(id: string, entry: LinkEntry | undefined): ChartCardIdLink | null {\n if (!entry) return null\n const chatId = normalizeChatId(entry.chatId)\n if (!chatId) return null\n const nid = normalizeKey(id)\n if (!nid) return null\n return { id: nid, chatId }\n}\n\n/**\n * Returns the persisted link for `id` only if a valid `{ chatId }` entry exists.\n * Does not interpret `id` as a chat id.\n */\nexport function getChartCardIdLink(\n id: string,\n namespace?: ChartCardStorageNamespace\n): ChartCardIdLink | null {\n const nid = normalizeKey(id)\n if (!nid) return null\n const scopedKey = getScopedStorageKey(namespace)\n const scoped = readDocument(scopedKey)\n const scopedLink = entryToLink(nid, scoped.entries[nid])\n if (scopedLink) return scopedLink\n\n if (scopedKey !== CHART_CARD_CHAT_MAP_KEY) {\n const legacy = readDocument(CHART_CARD_CHAT_MAP_KEY)\n return entryToLink(nid, legacy.entries[nid])\n }\n\n return null\n}\n\n/**\n * Saves or updates the mapping `id` → `chatId`. Call after loads that yield a reliable backend chat id.\n */\nexport function upsertChartCardIdLink(\n link: ChartCardIdLink,\n namespace?: ChartCardStorageNamespace\n): void {\n const id = normalizeKey(link.id)\n const chatId = normalizeChatId(link.chatId)\n if (!id || !chatId) return\n const scopedKey = getScopedStorageKey(namespace)\n const doc = readDocument(scopedKey)\n doc.entries[id] = { chatId, updatedAt: Date.now() }\n writeDocument(doc, scopedKey)\n console.log('upsertChartCardIdLink', id, chatId)\n}\n\n/**\n * Removes the entry for `id`. If `expectedChatId` is set, removal happens only when it matches\n * the stored chat id (avoids clearing another conversation after stale swaps).\n */\nexport function removeChartCardIdLink(\n id: string,\n expectedChatId?: string,\n namespace?: ChartCardStorageNamespace\n): void {\n const nid = normalizeKey(id)\n if (!nid) return\n const scopedKey = getScopedStorageKey(namespace)\n const doc = readDocument(scopedKey)\n const entry = doc.entries[nid]\n if (!entry) return\n if (expectedChatId !== undefined) {\n const exp = normalizeChatId(expectedChatId)\n if (exp && normalizeChatId(entry.chatId) !== exp) return\n }\n delete doc.entries[nid]\n writeDocument(doc, scopedKey)\n}\n\n/**\n * Removes all persisted `id -> chatId` links for a given `chatId` in the namespace.\n * Useful after hard-delete so stale card mappings do not point to missing charts.\n */\nexport function removeChartCardLinksByChatId(\n chatId: string,\n namespace?: ChartCardStorageNamespace\n): void {\n const normalizedChatId = normalizeChatId(chatId)\n if (!normalizedChatId) return\n\n const scopedKey = getScopedStorageKey(namespace)\n const doc = readDocument(scopedKey)\n let changed = false\n\n for (const [id, entry] of Object.entries(doc.entries)) {\n if (normalizeChatId(entry.chatId) === normalizedChatId) {\n delete doc.entries[id]\n changed = true\n }\n }\n\n if (changed) writeDocument(doc, scopedKey)\n}\n\n/**\n * Resolves which **chat id** to pass to chart HTTP APIs.\n *\n * Order (host override first):\n * 1. `chartId` prop — treated as an explicit backend chat id.\n * 2. Persisted link for `cardId` — only `entry.chatId` is used for fetch; `cardId` itself is never sent as chat id.\n */\nexport function resolveChartFetchChatId(params: {\n chartIdProp?: string\n cardId?: string\n workspaceId?: string\n dashboardId?: string\n}): string | undefined {\n const fromProp = params.chartIdProp?.trim()\n if (fromProp) return fromProp\n\n const cardId = params.cardId?.trim()\n if (!cardId) return undefined\n\n const link = getChartCardIdLink(cardId, {\n workspaceId: params.workspaceId,\n dashboardId: params.dashboardId,\n })\n return link?.chatId\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport {\n Camera,\n Check,\n LayoutDashboard,\n Loader2,\n Palette,\n Pencil,\n RefreshCcw,\n Undo2,\n} from 'lucide-react'\nimport { motion } from 'framer-motion'\nimport { ButtonWithTooltip } from '../common/ButtonWithTooltip'\nimport { cn } from '../../utils/cn'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\n\nexport interface DashboardToolbarProps {\n isEditMode: boolean\n isSaving: boolean\n isTakingScreenshot: boolean\n resetState: boolean\n onEditModeToggle: () => void\n onResetLayout: () => void\n onTakeScreenshot: () => void\n onGenerateDashboard?: () => void\n isGenerating?: boolean\n isViewer?: boolean\n showToolbar?: boolean\n showScreenshot?: boolean\n showGenerateDashboard?: boolean\n editLayout?: boolean\n setThemeModalOpen?: () => void\n}\n\nconst generationTexts = ['Analyzing your data', 'Creating visuals', 'Optimizing layouts']\n\nexport function DashboardToolbar({\n isEditMode,\n isSaving,\n isTakingScreenshot,\n resetState,\n onEditModeToggle,\n onResetLayout,\n onTakeScreenshot,\n onGenerateDashboard,\n isGenerating = false,\n isViewer = false,\n showToolbar = true,\n showScreenshot = true,\n showGenerateDashboard = true,\n editLayout = true,\n setThemeModalOpen,\n}: DashboardToolbarProps) {\n const [textIndex, setTextIndex] = useState(0)\n\n useEffect(() => {\n if (!isGenerating) {\n setTextIndex(0)\n return\n }\n const interval = setInterval(() => {\n setTextIndex((cur) => (cur + 1) % generationTexts.length)\n }, 3500)\n return () => clearInterval(interval)\n }, [isGenerating])\n\n const currentText = useMemo(() => generationTexts[textIndex], [textIndex])\n\n const getEditButtonIcon = () => {\n if (isSaving) return <Loader2 className=\"size-4 animate-spin\" />\n if (isEditMode) return <Check className=\"size-4\" />\n return <Pencil className=\"size-4\" />\n }\n\n if (!showToolbar) return null\n\n return (\n <div className=\"flex items-center gap-4 rounded-3xl border dark:border-border/50 px-1 py-1 bg-background\">\n {showGenerateDashboard && !isViewer ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n className=\"group relative flex items-center gap-2 px-4 py-2 rounded-3xl bg-gradient-to-r from-violet-500/10 via-purple-500/10 to-indigo-500/10 hover:from-violet-500/20 hover:via-purple-500/20 hover:to-indigo-500/20 border border-violet-200/20 hover:border-violet-300/30 cursor-pointer transition-all duration-500 ease-out backdrop-blur-sm generate-dashboard-btn\"\n onClick={onGenerateDashboard}\n data-tour=\"generate-dashboard\"\n >\n <div className=\"absolute inset-0 rounded-2xl bg-gradient-to-r from-violet-500/5 via-purple-500/5 to-indigo-500/5 opacity-0 group-hover:opacity-100 transition-opacity duration-300\" />\n\n {isGenerating ? (\n <>\n <Loader2 className=\"size-4 animate-spin flex-shrink-0\" />\n <div className=\"w-48 overflow-hidden relative z-10\">\n <motion.span\n key={textIndex}\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n transition={{ duration: 0.4, ease: 'easeOut' }}\n className=\"text-sm font-medium block\"\n >\n {currentText}\n </motion.span>\n </div>\n </>\n ) : (\n <>\n <LayoutDashboard className=\"size-4 text-violet-600 dark:text-violet-400 group-hover:scale-110 transition-transform duration-200 flex-shrink-0\" />\n <span className=\"text-sm font-medium relative z-10 text-violet-700 dark:text-violet-300\">\n Generate Dashboard\n </span>\n </>\n )}\n </div>\n </TooltipTrigger>\n <TooltipContent>\n <p>Experimental feature</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n\n {showScreenshot ? (\n <ButtonWithTooltip\n variant=\"ghost\"\n size=\"icon\"\n onClick={onTakeScreenshot}\n disabled={isTakingScreenshot}\n tooltipText=\"Take Screenshot\"\n data-tour=\"screenshot-btn\"\n >\n {isTakingScreenshot ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Camera className=\"size-4\" />\n )}\n </ButtonWithTooltip>\n ) : null}\n\n {isEditMode ? (\n <ButtonWithTooltip\n variant=\"ghost\"\n size=\"icon\"\n onClick={onResetLayout}\n tooltipText={resetState ? 'Reset Layout' : 'Restore Layout'}\n data-tour=\"reset-layout-btn\"\n >\n {resetState ? <RefreshCcw className=\"size-4\" /> : <Undo2 className=\"size-4\" />}\n </ButtonWithTooltip>\n ) : null}\n\n {editLayout && !isViewer ? (\n <ButtonWithTooltip\n variant=\"ghost\"\n size=\"icon\"\n onClick={onEditModeToggle}\n disabled={isSaving}\n tooltipText={isEditMode ? (isSaving ? 'Saving...' : 'Save Changes') : 'Edit Layout'}\n data-tour=\"edit-mode-btn\"\n >\n {getEditButtonIcon()}\n </ButtonWithTooltip>\n ) : null}\n\n {!isViewer ? (\n <ButtonWithTooltip\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setThemeModalOpen?.()}\n tooltipText=\"Customize dashboard theme\"\n >\n <Palette className=\"size-4\" />\n </ButtonWithTooltip>\n ) : null}\n </div>\n )\n}\n","'use client'\n\nimport { useCallback, type RefObject } from 'react'\n\nexport function useAutoResize(\n textareaRef: RefObject<HTMLTextAreaElement | null>,\n minHeight: number = 40,\n maxHeight: number = 120\n) {\n const resize = useCallback(() => {\n const textarea = textareaRef.current\n if (!textarea) return\n\n textarea.style.height = 'auto'\n const scrollHeight = textarea.scrollHeight\n const newHeight = Math.min(Math.max(minHeight, scrollHeight), maxHeight)\n textarea.style.height = newHeight + 'px'\n }, [textareaRef, minHeight, maxHeight])\n\n return { resize }\n}\n","'use client'\n\nimport 'react-grid-layout/css/styles.css'\nimport 'react-resizable/css/styles.css'\n\nimport { Loader2 } from 'lucide-react'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Responsive, WidthProvider } from 'react-grid-layout'\nimport type { ResponsiveProps } from 'react-grid-layout'\nimport { ENDPOINTS } from '../../api/endpoints'\nimport { SSEStreamClient } from '../../api/sse-client'\nimport { PapermapChartCard } from '../../components/PapermapChartCard'\nimport { PapermapChat } from '../../components/PapermapChat'\nimport {\n ThemeCustomizationSettings,\n type ThemeSaveMeta,\n} from '../../components/theme/ThemeCustomizationSettings'\nimport { Card } from '../../components/ui/card'\nimport { DashboardToolbar } from '../../components/dashboard'\nimport { Dialog, DialogContent } from '../../components/ui/dialog'\nimport {\n PapermapProvider,\n usePapermapConnectionOptional,\n usePapermapStore,\n usePapermapStoreApi,\n usePapermapStoreApiOptional,\n} from '../../store'\nimport type { TChartResponse } from '../../types/chart'\nimport type { DashboardTheme, PapermapGridDashboardLayouts, TLayout } from '../../types/dashboard'\nimport { EVENT_NAME } from '../../types/streaming'\nimport { useToast } from '../../hooks/use-toast'\nimport { unwrapWorkspacePayload } from '../../services/workspace.service'\nimport { cn } from '../../utils/cn'\nimport { generateThemeCSS, generateThemeStyles } from '../../utils/dashboard-theme'\nimport { resolveDashboardThemeFromWorkspace } from '../../utils/resolve-dashboard-theme'\nimport { mergeWorkspaceMetaTheme } from '../../utils/workspace-theme-persist'\nimport { takeScreenshot, waitForChartsToLoad } from '../../utils/screenshot'\nimport { EMPTY_HANDLES, GRID_BREAKPOINTS, GRID_COLS, LAYOUT_HANDLE } from './constants'\nimport { getDefaultLayout, isFallbackLayout } from './layout'\nimport { GRID_RESIZE_HANDLE_STYLES } from './styles'\n\nconst ResponsiveGridLayout = WidthProvider(Responsive) as React.ComponentType<ResponsiveProps>\n\nexport interface PapermapGridDashboardProps {\n token?: string\n workspaceId?: string\n dashboardId?: string\n apiUrl?: string\n charts?: TChartResponse[]\n layouts?: PapermapGridDashboardLayouts\n onLayoutsChange?: (layouts: PapermapGridDashboardLayouts) => void\n isEditMode?: boolean\n showToolbar?: boolean\n showScreenshot?: boolean\n showGenerateDashboard?: boolean\n editLayout?: boolean\n isViewer?: boolean\n onEditChart?: (chartId: string) => void\n onDeleteChart?: (chartId: string) => void\n onPinChange?: (chartId: string, pinned: boolean) => void\n onGenerateDashboard?: () => void\n isGenerating?: boolean\n onTakeScreenshot?: () => void\n onThemeModalOpen?: () => void\n /**\n * Custom content inside the theme dialog. When omitted, the built-in\n * `ThemeCustomizationSettings` UI is used; save updates local theme and calls\n * `onDashboardThemeChange` when provided.\n */\n renderThemeModal?: (close: () => void) => React.ReactNode\n /**\n * Called after a successful save from the built-in theme modal (or local-only save when\n * `persistWorkspaceTheme` is false). `undefined` means the user saved the app-default preset.\n */\n onDashboardThemeChange?: (theme: DashboardTheme | undefined) => void\n /**\n * When true (default), saving from the built-in theme UI GET/PUTs workspace `meta.theme`\n * for this `dashboardId`, matching the main Papermap app.\n */\n persistWorkspaceTheme?: boolean\n /** Custom dashboard theme. Sets CSS variables and scoped overrides on the grid container. */\n dashboardTheme?: DashboardTheme\n showHeader?: boolean\n enableFetch?: boolean\n showChatAssistant?: boolean\n variant?: 'default' | 'streaming'\n}\n\nexport function PapermapGridDashboard({\n token,\n workspaceId,\n dashboardId,\n apiUrl,\n ...rest\n}: PapermapGridDashboardProps) {\n const parentStore = usePapermapStoreApiOptional()\n const connection = usePapermapConnectionOptional()\n const resolvedToken = token ?? connection?.token\n const resolvedWorkspaceId = workspaceId ?? connection?.workspaceId\n const resolvedDashboardId = dashboardId ?? connection?.dashboardId\n const resolvedApiUrl = apiUrl ?? connection?.apiUrl\n\n if (!resolvedToken || !resolvedWorkspaceId || !resolvedDashboardId) {\n throw new Error(\n 'PapermapGridDashboard requires token, workspaceId, and dashboardId from props or PapermapProvider.'\n )\n }\n\n const inner = (\n <GridDashboardInner\n {...rest}\n token={resolvedToken}\n workspaceId={resolvedWorkspaceId}\n dashboardId={resolvedDashboardId}\n apiUrl={resolvedApiUrl}\n />\n )\n\n if (parentStore) return inner\n\n return (\n <PapermapProvider\n token={resolvedToken}\n workspaceId={resolvedWorkspaceId}\n dashboardId={resolvedDashboardId}\n apiUrl={resolvedApiUrl}\n >\n {inner}\n </PapermapProvider>\n )\n}\n\nfunction GridDashboardInner({\n token,\n workspaceId = '',\n dashboardId,\n apiUrl,\n charts: chartsProp,\n layouts: layoutsProp,\n onLayoutsChange,\n isEditMode = false,\n showToolbar = true,\n showScreenshot = true,\n showGenerateDashboard = true,\n editLayout = true,\n isViewer = false,\n onEditChart,\n onDeleteChart,\n onPinChange,\n onGenerateDashboard,\n isGenerating = false,\n onTakeScreenshot,\n onThemeModalOpen,\n renderThemeModal,\n onDashboardThemeChange,\n persistWorkspaceTheme = true,\n dashboardTheme,\n showHeader = true,\n enableFetch = true,\n showChatAssistant = false,\n variant = 'default',\n}: PapermapGridDashboardProps) {\n const storeApi = usePapermapStoreApi()\n const { toast } = useToast()\n const sseIsComplete = usePapermapStore((s) => s.sseIsComplete)\n const sseIsStreaming = usePapermapStore((s) => s.sseIsStreaming)\n const sseRequestId = usePapermapStore((s) => s.sseRequestId)\n const { chartSvc, workspaceSvc } = storeApi.getState().getServices()\n\n const [fetchedCharts, setFetchedCharts] = useState<TChartResponse[]>([])\n const [isLoading, setIsLoading] = useState(enableFetch && !chartsProp?.length)\n const [error, setError] = useState<string | null>(null)\n const [internalLayouts, setInternalLayouts] = useState<PapermapGridDashboardLayouts>({\n lg: [],\n md: [],\n sm: [],\n xs: [],\n xxs: [],\n })\n const [tempLayouts, setTempLayouts] = useState<PapermapGridDashboardLayouts>({})\n const [isEditModeInternal, setIsEditModeInternal] = useState(isEditMode)\n const [isSavingLayout, setIsSavingLayout] = useState(false)\n const [dashboardTitle, setDashboardTitle] = useState<string>('')\n const [isTakingScreenshotInternal, setIsTakingScreenshotInternal] = useState(false)\n const [isGeneratingInternal, setIsGeneratingInternal] = useState(false)\n const [papermapChatToolbarHeight, setPapermapChatToolbarHeight] = useState(0)\n const [themeModalOpen, setThemeModalOpen] = useState(false)\n const [localDashboardTheme, setLocalDashboardTheme] = useState<DashboardTheme | undefined>()\n const [workspaceEntity, setWorkspaceEntity] = useState<Record<string, any> | null>(null)\n const [workspaceThemeLoading, setWorkspaceThemeLoading] = useState(false)\n const [isSavingWorkspaceTheme, setIsSavingWorkspaceTheme] = useState(false)\n\n const resolvedRemoteTheme = useMemo(\n () => resolveDashboardThemeFromWorkspace(workspaceEntity, dashboardId ?? ''),\n [workspaceEntity, dashboardId]\n )\n\n const appliedDashboardTheme = dashboardTheme ?? localDashboardTheme ?? resolvedRemoteTheme\n\n useEffect(() => {\n setLocalDashboardTheme(undefined)\n }, [dashboardId])\n\n useEffect(() => {\n setWorkspaceEntity(null)\n }, [workspaceId])\n\n const handleThemeModalOpen = useCallback(() => {\n setThemeModalOpen(true)\n onThemeModalOpen?.()\n }, [onThemeModalOpen])\n\n // Bootstrap: load workspace so grid theme matches main / embedded dashboard (useDashboardTheme rules)\n useEffect(() => {\n if (!persistWorkspaceTheme) return\n let cancelled = false\n workspaceSvc\n .getWorkspace(workspaceId ?? '')\n .then((raw) => {\n if (cancelled) return\n setWorkspaceEntity(unwrapWorkspacePayload(raw))\n })\n .catch(() => {\n // Silent on mount — token may lack workspace scope; modal save will surface errors\n })\n return () => {\n cancelled = true\n }\n }, [workspaceId, persistWorkspaceTheme, workspaceSvc])\n\n // Refresh workspace when theme modal opens (editor needs current meta)\n useEffect(() => {\n if (!themeModalOpen || renderThemeModal || !persistWorkspaceTheme) {\n if (!themeModalOpen) setWorkspaceThemeLoading(false)\n return\n }\n\n let cancelled = false\n setWorkspaceThemeLoading(true)\n workspaceSvc\n .getWorkspace(workspaceId ?? '')\n .then((raw) => {\n if (cancelled) return\n setWorkspaceEntity(unwrapWorkspacePayload(raw))\n })\n .catch((err: unknown) => {\n if (cancelled) return\n const message = err instanceof Error ? err.message : 'Could not load workspace theme.'\n toast({\n variant: 'destructive',\n title: 'Could not load workspace',\n description: message,\n })\n })\n .finally(() => {\n if (!cancelled) setWorkspaceThemeLoading(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [themeModalOpen, workspaceId, renderThemeModal, persistWorkspaceTheme, workspaceSvc, toast])\n\n const initialThemeForModal = appliedDashboardTheme\n\n const handleBuiltInThemeSave = useCallback(\n async (theme: DashboardTheme, meta: ThemeSaveMeta) => {\n if (persistWorkspaceTheme) {\n setIsSavingWorkspaceTheme(true)\n try {\n const raw = await workspaceSvc.getWorkspace(workspaceId)\n const ws = unwrapWorkspacePayload(raw)\n const nextMeta = mergeWorkspaceMetaTheme(\n ws.meta,\n dashboardId ?? '',\n theme,\n meta.selectedPreset\n )\n await workspaceSvc.updateWorkspace(workspaceId, { ...ws, meta: nextMeta })\n\n try {\n const refreshed = await workspaceSvc.getWorkspace(workspaceId)\n setWorkspaceEntity(unwrapWorkspacePayload(refreshed))\n } catch {\n // Grid still reflects saved theme via local state below\n }\n\n if (meta.selectedPreset === 'default') {\n setLocalDashboardTheme(undefined)\n onDashboardThemeChange?.(undefined)\n } else {\n setLocalDashboardTheme(theme)\n onDashboardThemeChange?.(theme)\n }\n toast({\n title: 'Success',\n description: 'Theme settings saved to workspace preferences.',\n })\n setThemeModalOpen(false)\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to save theme settings'\n toast({\n title: 'Error',\n description: message,\n variant: 'destructive',\n })\n throw err\n } finally {\n setIsSavingWorkspaceTheme(false)\n }\n } else {\n if (meta.selectedPreset === 'default') {\n setLocalDashboardTheme(undefined)\n onDashboardThemeChange?.(undefined)\n } else {\n setLocalDashboardTheme(theme)\n onDashboardThemeChange?.(theme)\n }\n setThemeModalOpen(false)\n }\n },\n [persistWorkspaceTheme, workspaceSvc, workspaceId, dashboardId, onDashboardThemeChange, toast]\n )\n\n const coerceLayout = useCallback((layout: any[]): TLayout[] => {\n if (!Array.isArray(layout)) return []\n return layout\n .map((item) => ({\n ...item,\n i: String(item?.i ?? ''),\n x: Number(item?.x ?? 0),\n y: Number(item?.y ?? 0),\n w: Number(item?.w ?? 0),\n h: Number(item?.h ?? 0),\n }))\n .filter(\n (item) =>\n !!item.i &&\n Number.isFinite(item.x) &&\n Number.isFinite(item.y) &&\n Number.isFinite(item.w) &&\n Number.isFinite(item.h)\n ) as TLayout[]\n }, [])\n\n const prevSseCompleteRef = useRef(false)\n const prevSseStreamingRef = useRef(false)\n const prevSseRequestIdRef = useRef<string | null>(null)\n const streamClientRef = useRef<SSEStreamClient | null>(null)\n const dashboardMetaLayoutRef = useRef<TLayout[]>([])\n const onLayoutsChangeRef = useRef(onLayoutsChange)\n const layoutsPropRef = useRef(layoutsProp)\n const isFetchingRef = useRef(false)\n const [isDashboardChanging, setIsDashboardChanging] = useState(false)\n const previousDashboardIdRef = useRef<string | undefined>(dashboardId)\n\n const isLayoutsControlled = useMemo(() => {\n if (typeof layoutsProp === 'undefined') return false\n return Object.values(layoutsProp ?? {}).some((v) => Array.isArray(v) && v.length > 0)\n }, [layoutsProp])\n\n const isLayoutsControlledRef = useRef(isLayoutsControlled)\n useEffect(() => {\n isLayoutsControlledRef.current = isLayoutsControlled\n }, [isLayoutsControlled])\n\n const availableHandles = useMemo(\n () => (isEditModeInternal || isEditMode ? LAYOUT_HANDLE.RESIZE : EMPTY_HANDLES),\n [isEditModeInternal, isEditMode]\n )\n const availableHandlesRef = useRef(availableHandles)\n\n useEffect(() => {\n onLayoutsChangeRef.current = onLayoutsChange\n }, [onLayoutsChange])\n\n useEffect(() => {\n layoutsPropRef.current = layoutsProp\n }, [layoutsProp])\n\n useEffect(() => {\n availableHandlesRef.current = availableHandles\n }, [availableHandles])\n\n useEffect(() => {\n if (\n previousDashboardIdRef.current !== dashboardId &&\n previousDashboardIdRef.current !== undefined &&\n dashboardId\n ) {\n setIsDashboardChanging(true)\n }\n previousDashboardIdRef.current = dashboardId\n }, [dashboardId])\n\n const fetchDashboardCharts = useCallback(async () => {\n if (!enableFetch || !dashboardId || isFetchingRef.current) return\n isFetchingRef.current = true\n setIsLoading(true)\n setError(null)\n streamClientRef.current?.abort()\n\n try {\n const baseRes = await chartSvc.getCharts({\n dashboard_id: dashboardId,\n page: 1,\n per_page: 40,\n pin: true,\n })\n const basePayload = baseRes?.data ?? baseRes\n const baseCharts = Array.isArray(basePayload?.chats)\n ? basePayload.chats\n : Array.isArray(basePayload)\n ? basePayload\n : []\n const dashboardInfo = basePayload?.dashboardInfo\n const meta = Array.isArray(dashboardInfo?.meta) ? dashboardInfo.meta : []\n const normalizedMeta = coerceLayout(meta)\n const safeMeta = isFallbackLayout(normalizedMeta) ? [] : normalizedMeta\n dashboardMetaLayoutRef.current = safeMeta\n if (dashboardInfo?.title) setDashboardTitle(dashboardInfo.title)\n\n setFetchedCharts(baseCharts)\n if (!isLayoutsControlledRef.current) {\n const mergedLayout = getDefaultLayout({\n items: baseCharts,\n existingLayout: safeMeta,\n availableHandles: availableHandlesRef.current,\n })\n const nextLayouts: PapermapGridDashboardLayouts = {\n lg: [...mergedLayout],\n md: [...mergedLayout],\n sm: [...mergedLayout],\n xs: [...mergedLayout],\n xxs: [...mergedLayout],\n }\n setInternalLayouts(nextLayouts)\n onLayoutsChangeRef.current?.(nextLayouts)\n }\n setIsLoading(false)\n\n const streamUrl = new URL(\n ENDPOINTS.streamChat,\n storeApi.getState().getServices().baseUrl\n ).toString()\n const streamClient = new SSEStreamClient()\n streamClientRef.current = streamClient\n const streamedChartsById = new Map<string, TChartResponse>(\n baseCharts.map((chart: TChartResponse) => [chart.llm_data_chat_id, chart])\n )\n\n const mergeChunk = (raw: string) => {\n try {\n let parsed: any = JSON.parse(raw)\n if (typeof parsed === 'string') parsed = JSON.parse(parsed)\n const nextChat: TChartResponse | undefined = parsed?.chat ?? parsed?.data?.chat ?? parsed\n const chatId = nextChat?.llm_data_chat_id\n if (!chatId) return\n\n streamedChartsById.set(chatId, nextChat)\n const nextCharts = Array.from(streamedChartsById.values())\n setFetchedCharts(nextCharts)\n\n if (!isLayoutsControlledRef.current) {\n setInternalLayouts((prev) => {\n const prevLayout = coerceLayout(prev?.lg ?? [])\n const baseLayout = isFallbackLayout(prevLayout)\n ? dashboardMetaLayoutRef.current\n : prevLayout\n const mergedLayout = getDefaultLayout({\n items: nextCharts,\n existingLayout: baseLayout,\n availableHandles: availableHandlesRef.current,\n })\n const nextLayouts: PapermapGridDashboardLayouts = {\n lg: [...mergedLayout],\n md: [...mergedLayout],\n sm: [...mergedLayout],\n xs: [...mergedLayout],\n xxs: [...mergedLayout],\n }\n onLayoutsChangeRef.current?.(nextLayouts)\n return nextLayouts\n })\n }\n } catch {\n // ignore malformed chunks\n }\n }\n\n streamClient\n .on(EVENT_NAME.CHART, (data) => mergeChunk(data))\n .on(EVENT_NAME.STREAM, (data) => mergeChunk(data))\n .onError((err) => {\n console.error('Grid dashboard stream error:', err)\n })\n .stream({\n url: streamUrl,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...storeApi.getState().getServices().authHeaders,\n },\n body: JSON.stringify({\n dashboard_id: dashboardId,\n pin: true,\n page: 1,\n per_page: 40,\n }),\n })\n } catch (err: any) {\n setError(err?.message || 'Failed to load dashboard charts')\n } finally {\n setIsLoading(false)\n isFetchingRef.current = false\n }\n }, [chartSvc, coerceLayout, dashboardId, enableFetch, storeApi])\n\n useEffect(() => {\n if (!enableFetch || isEditModeInternal || isEditMode) return\n fetchDashboardCharts()\n }, [enableFetch, fetchDashboardCharts, isEditMode, isEditModeInternal])\n\n const handleDeleteChartInternal = useCallback(\n (chartId: string) => {\n // When a chart is deleted from inside the grid, refresh the pinned charts\n // so the removed tile disappears immediately.\n void fetchDashboardCharts().finally(() => {\n onDeleteChart?.(chartId)\n })\n },\n [fetchDashboardCharts, onDeleteChart]\n )\n\n useEffect(() => {\n if (enableFetch || !chartsProp?.length) return\n setIsLoading(false)\n if (!isLayoutsControlledRef.current) {\n const mergedLayout = getDefaultLayout({\n items: chartsProp,\n existingLayout: [],\n availableHandles: availableHandlesRef.current,\n })\n const nextLayouts: PapermapGridDashboardLayouts = {\n lg: [...mergedLayout],\n md: [...mergedLayout],\n sm: [...mergedLayout],\n xs: [...mergedLayout],\n xxs: [...mergedLayout],\n }\n setInternalLayouts(nextLayouts)\n }\n }, [chartsProp, enableFetch])\n\n useEffect(() => () => streamClientRef.current?.abort(), [])\n\n useEffect(() => {\n const transitionedToComplete = sseIsComplete && !prevSseCompleteRef.current\n if (enableFetch && !isEditModeInternal && !isEditMode && transitionedToComplete) {\n fetchDashboardCharts()\n }\n prevSseCompleteRef.current = sseIsComplete\n }, [enableFetch, fetchDashboardCharts, isEditMode, isEditModeInternal, sseIsComplete])\n\n useEffect(() => {\n const requestCleared = !!prevSseRequestIdRef.current && !sseRequestId\n const streamStopped = prevSseStreamingRef.current && !sseIsStreaming\n if (enableFetch && !isEditModeInternal && !isEditMode && (requestCleared || streamStopped)) {\n fetchDashboardCharts()\n }\n prevSseStreamingRef.current = sseIsStreaming\n prevSseRequestIdRef.current = sseRequestId\n }, [\n enableFetch,\n fetchDashboardCharts,\n isEditMode,\n isEditModeInternal,\n sseIsStreaming,\n sseRequestId,\n ])\n\n const charts = useMemo(() => {\n if (enableFetch) return fetchedCharts\n return chartsProp?.length ? chartsProp : fetchedCharts\n }, [chartsProp, enableFetch, fetchedCharts])\n\n const layouts = useMemo(() => {\n return isLayoutsControlled ? (layoutsProp as PapermapGridDashboardLayouts) : internalLayouts\n }, [internalLayouts, layoutsProp, isLayoutsControlled])\n\n useEffect(() => {\n if (!enableFetch || !charts?.length || isLayoutsControlled || isEditModeInternal || isEditMode)\n return\n const mergedLayout = getDefaultLayout({\n items: charts,\n existingLayout: dashboardMetaLayoutRef.current,\n availableHandles: availableHandlesRef.current,\n })\n const nextLayouts: PapermapGridDashboardLayouts = {\n lg: [...mergedLayout],\n md: [...mergedLayout],\n sm: [...mergedLayout],\n xs: [...mergedLayout],\n xxs: [...mergedLayout],\n }\n setInternalLayouts(nextLayouts)\n }, [charts, enableFetch, isEditMode, isEditModeInternal, isLayoutsControlled])\n\n useEffect(() => {\n if (!isLoading && charts?.length) {\n setIsDashboardChanging(false)\n }\n }, [charts, isLoading])\n\n const handleLayoutChange = (_current: TLayout[], allLayouts: { [key: string]: TLayout[] }) => {\n const mergedLayouts = (() => {\n const source = isLayoutsControlled\n ? (layoutsProp as PapermapGridDashboardLayouts)\n : internalLayouts\n const next: PapermapGridDashboardLayouts = { ...allLayouts }\n for (const bp in allLayouts) {\n next[bp] = allLayouts[bp].map((item) => {\n const old = source?.[bp]?.find((l) => l.i === item.i)\n const isPlaceholder = item.w <= 1 && item.h <= 1\n if (isPlaceholder && old) return { ...old }\n return { ...item }\n })\n }\n return next\n })()\n\n if (!isLayoutsControlledRef.current) setInternalLayouts(mergedLayouts)\n onLayoutsChange?.(mergedLayouts)\n }\n\n const randomColorScheme = () => {\n const schemes = ['blue', 'green', 'red', 'yellow', 'purple', 'orange', 'pink', 'teal']\n return schemes[Math.floor(Math.random() * schemes.length)]\n }\n\n const handleGenerateDashboard = useCallback(async () => {\n if (onGenerateDashboard) {\n onGenerateDashboard()\n return\n }\n if (!workspaceId || !dashboardId) return\n setIsGeneratingInternal(true)\n try {\n await chartSvc.generateProactiveDashboard({\n workspace_id: workspaceId,\n dashboard_id: dashboardId,\n color_scheme: randomColorScheme(),\n })\n await fetchDashboardCharts()\n } catch (err: any) {\n console.error('Generate dashboard failed:', err)\n } finally {\n setIsGeneratingInternal(false)\n }\n }, [chartSvc, dashboardId, fetchDashboardCharts, onGenerateDashboard, workspaceId])\n\n const handleTakeScreenshot = useCallback(async () => {\n if (onTakeScreenshot) {\n onTakeScreenshot()\n return\n }\n setIsTakingScreenshotInternal(true)\n await new Promise((resolve) => setTimeout(resolve, 1000))\n await waitForChartsToLoad(5000)\n try {\n await takeScreenshot({ selector: '.layout', additionalWidth: 30, additionalHeight: 0 })\n } catch (err) {\n console.error('Screenshot failed:', err)\n } finally {\n setIsTakingScreenshotInternal(false)\n }\n }, [onTakeScreenshot])\n\n const onClickEditModeToggle = useCallback(async () => {\n const currentlyEditing = isEditModeInternal || isEditMode\n\n if (currentlyEditing) {\n if (!dashboardId) return\n setIsSavingLayout(true)\n try {\n await chartSvc.updateDashboardLayout(dashboardId, layouts.lg ?? [])\n setIsEditModeInternal(false)\n } catch (err) {\n console.error('Save layout failed:', err)\n } finally {\n setIsSavingLayout(false)\n }\n return\n }\n\n const nextLg = (layouts.lg ?? []).map((item) => ({\n ...item,\n resizeHandles: LAYOUT_HANDLE.RESIZE,\n }))\n const nextLayouts: PapermapGridDashboardLayouts = {\n ...layouts,\n lg: nextLg,\n }\n\n if (!layoutsProp) setInternalLayouts(nextLayouts)\n onLayoutsChange?.(nextLayouts)\n setIsEditModeInternal(true)\n }, [chartSvc, dashboardId, isEditMode, isEditModeInternal, layouts, layoutsProp, onLayoutsChange])\n\n const handleResetLayout = useCallback(() => {\n if (Object.keys(tempLayouts).length) {\n setInternalLayouts(tempLayouts)\n setTempLayouts({})\n onLayoutsChangeRef.current?.(tempLayouts)\n return\n }\n\n setTempLayouts(layouts)\n const defaultLayout = getDefaultLayout({\n items: charts,\n existingLayout: [],\n availableHandles: availableHandlesRef.current,\n })\n const resetLayouts: PapermapGridDashboardLayouts = {\n lg: defaultLayout,\n md: defaultLayout,\n sm: defaultLayout,\n xs: defaultLayout,\n xxs: defaultLayout,\n }\n setInternalLayouts(resetLayouts)\n onLayoutsChangeRef.current?.(resetLayouts)\n }, [charts, layouts, tempLayouts])\n\n const themeStyles = useMemo(\n () => generateThemeStyles(appliedDashboardTheme),\n [appliedDashboardTheme]\n )\n const themeCSS = useMemo(() => generateThemeCSS(appliedDashboardTheme), [appliedDashboardTheme])\n\n const showLoader = (isLoading && !charts?.length) || isDashboardChanging\n\n const papermapChat = showChatAssistant ? (\n <PapermapChat\n token={token}\n workspaceId={workspaceId}\n dashboardId={dashboardId}\n onToolbarHeightChange={setPapermapChatToolbarHeight}\n showToolbar={true}\n />\n ) : null\n\n if (error) {\n return (\n <>\n <Card className=\"relative flex h-full min-h-[240px] items-center justify-center\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </Card>\n {papermapChat}\n </>\n )\n }\n\n if (!charts?.length && !isLoading) {\n return (\n <>\n <div className=\"w-full h-full flex items-center justify-center text-sm text-muted-foreground\">\n No charts to display\n </div>\n {papermapChat}\n </>\n )\n }\n\n const effectiveIsGenerating = isGenerating || isGeneratingInternal\n const effectiveIsTakingScreenshot = isTakingScreenshotInternal\n const resetState = Object.keys(tempLayouts).length ? false : true\n const gridKey = `grid-${dashboardId}-${charts.length}-${charts.map((c) => c.llm_data_chat_id).join('-')}`\n\n return (\n <div\n className={cn(\n 'papermap-grid-dashboard w-full h-full overflow-y-auto',\n appliedDashboardTheme && 'dashboard-theme bg-dashboard-bg'\n )}\n style={{\n ...themeStyles,\n paddingBottom: showChatAssistant ? papermapChatToolbarHeight + 60 : undefined,\n }}\n data-dashboard-theme={appliedDashboardTheme ? 'custom' : undefined}\n data-edit-mode={isEditModeInternal || isEditMode ? 'true' : 'false'}\n >\n <style>{GRID_RESIZE_HANDLE_STYLES}</style>\n {themeCSS && appliedDashboardTheme && <style>{themeCSS}</style>}\n <div className=\"space-y-2\">\n <div className=\"px-8 lg:px-16 flex flex-col md:flex-row md:items-center justify-between gap-4 md:gap-8\">\n {showHeader ? (\n <div>\n <h2 className=\"text-2xl lg:text-3xl font-bold tracking-tight\">\n {dashboardTitle || 'Dashboard'} {isLoading ? 'Loading...' : ''}\n </h2>\n </div>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <div data-tour=\"dashboard-toolbar\">\n <DashboardToolbar\n isEditMode={isEditModeInternal || isEditMode}\n isSaving={isSavingLayout}\n isTakingScreenshot={effectiveIsTakingScreenshot}\n resetState={resetState}\n onEditModeToggle={onClickEditModeToggle}\n onResetLayout={handleResetLayout}\n onTakeScreenshot={handleTakeScreenshot}\n onGenerateDashboard={handleGenerateDashboard}\n isGenerating={effectiveIsGenerating}\n setThemeModalOpen={handleThemeModalOpen}\n isViewer={isViewer}\n showToolbar={showToolbar}\n showScreenshot={showScreenshot}\n showGenerateDashboard={showGenerateDashboard}\n editLayout={editLayout}\n />\n </div>\n </div>\n </div>\n <div className=\"px-3 lg:px-12\" data-tour=\"charts-grid\">\n <ResponsiveGridLayout\n key={gridKey}\n className=\"layout\"\n layouts={layouts}\n breakpoints={GRID_BREAKPOINTS}\n cols={GRID_COLS}\n resizeHandles={availableHandles}\n isResizable={(isEditModeInternal || isEditMode) && !isSavingLayout}\n isDraggable={(isEditModeInternal || isEditMode) && !isSavingLayout}\n autoSize={true}\n width={typeof window !== 'undefined' ? window.innerWidth - 100 : 1200}\n draggableHandle=\".drag-handle\"\n margin={[20, 30]}\n compactType=\"vertical\"\n preventCollision={false}\n onLayoutChange={handleLayoutChange}\n >\n {charts.map((chart) => {\n const chatId = chart.llm_data_chat_id\n if (!chatId) return null\n return (\n <div\n key={chatId}\n className={cn(\n (isEditModeInternal || isEditMode) && !isSavingLayout && 'drag-handle'\n )}\n >\n <PapermapChartCard\n token={token}\n workspaceId={workspaceId}\n dashboardId={dashboardId}\n apiUrl={apiUrl}\n chartId={chatId}\n chart={chart}\n showToolbar={showToolbar}\n isEditMode={(isEditModeInternal || isEditMode) && !isSavingLayout}\n isViewer={isViewer}\n variant={variant}\n // onEditClick={onEditChart}\n onDelete={handleDeleteChartInternal}\n onPinChange={onPinChange}\n />\n </div>\n )\n })}\n </ResponsiveGridLayout>\n </div>\n </div>\n {papermapChat}\n\n {!isViewer && showToolbar ? (\n <Dialog open={themeModalOpen} onOpenChange={setThemeModalOpen}>\n <DialogContent className=\"w-[90vw] max-w-[90vw] max-h-[90vh] overflow-y-auto scrollbar-hide\">\n {renderThemeModal ? (\n renderThemeModal(() => setThemeModalOpen(false))\n ) : persistWorkspaceTheme && workspaceThemeLoading ? (\n <div className=\"flex flex-col items-center justify-center gap-3 py-24\">\n <Loader2 className=\"size-10 animate-spin text-primary\" />\n <p className=\"text-sm text-muted-foreground\">Loading workspace…</p>\n </div>\n ) : (\n <ThemeCustomizationSettings\n key={`${dashboardId}-${workspaceId}-${workspaceThemeLoading ? 'loading' : 'ready'}`}\n initialTheme={initialThemeForModal}\n isSaving={isSavingWorkspaceTheme}\n onSave={handleBuiltInThemeSave}\n />\n )}\n </DialogContent>\n </Dialog>\n ) : null}\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Loader2, Palette, Sparkles, Edit2, X, RotateCcw, ChevronDown } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu'\nimport { cn } from '../../utils/cn'\nimport type { DashboardTheme, ThemePreset } from './types'\nimport {\n themePresets,\n themePresetList,\n ThemeColorSection,\n ThemeTypographySection,\n ThemePresetSelector,\n ContrastWarnings,\n ThemePreview,\n useThemeValidation,\n} from './index'\n\nexport type ThemeSaveMeta = { selectedPreset: ThemePreset | 'custom' }\n\nexport interface ThemeCustomizationSettingsProps {\n /** Current theme to edit. Falls back to the default preset when omitted. */\n initialTheme?: DashboardTheme\n /**\n * Called when the user clicks Save. `selectedPreset` is `'default` when saving\n * app default theme (workspace should drop this dashboard from `meta.theme`).\n */\n onSave?: (theme: DashboardTheme, meta: ThemeSaveMeta) => void | Promise<void>\n /** Called when the user clicks Close / X without saving. */\n onClose?: () => void\n /** Show a saving spinner while the host persists. */\n isSaving?: boolean\n}\n\nexport function ThemeCustomizationSettings({\n initialTheme,\n onSave,\n onClose,\n isSaving = false,\n}: ThemeCustomizationSettingsProps) {\n const [theme, setTheme] = React.useState<DashboardTheme>(initialTheme || themePresets.default)\n const [previousTheme, setPreviousTheme] = React.useState<DashboardTheme | null>(\n initialTheme || null\n )\n const [selectedPreset, setSelectedPreset] = React.useState<ThemePreset | 'custom'>(() =>\n findMatchingPreset(initialTheme || themePresets.default)\n )\n const [hasChanges, setHasChanges] = React.useState(false)\n const [isEditingFromPreview, setIsEditingFromPreview] = React.useState(false)\n const [hoveredPreset, setHoveredPreset] = React.useState<ThemePreset | null>(null)\n\n const { contrastWarnings, validateThemeContrast } = useThemeValidation()\n\n // Sync if the host changes initialTheme\n React.useEffect(() => {\n if (initialTheme) {\n setTheme(initialTheme)\n setPreviousTheme(initialTheme)\n setSelectedPreset(findMatchingPreset(initialTheme))\n setHasChanges(false)\n }\n }, [initialTheme])\n\n const handleColorChange = React.useCallback(\n (key: keyof DashboardTheme, value: string | number) => {\n setTheme((prev) => ({ ...prev, [key]: value }))\n setSelectedPreset('custom')\n setHasChanges(true)\n },\n []\n )\n\n const handlePresetSelect = React.useCallback((preset: ThemePreset) => {\n setSelectedPreset(preset)\n setTheme(themePresets[preset])\n setHasChanges(true)\n setHoveredPreset(null)\n }, [])\n\n // Throttle preset hover\n const hoverThrottleRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const hoverLastRef = React.useRef(0)\n const hoverPendingRef = React.useRef<ThemePreset | null>(null)\n const THROTTLE_MS = 80\n const handlePresetHover = React.useCallback((preset: ThemePreset | null) => {\n if (preset === null) {\n if (hoverThrottleRef.current) {\n clearTimeout(hoverThrottleRef.current)\n hoverThrottleRef.current = null\n }\n hoverPendingRef.current = null\n setHoveredPreset(null)\n return\n }\n const now = Date.now()\n const elapsed = now - hoverLastRef.current\n if (elapsed >= THROTTLE_MS || hoverLastRef.current === 0) {\n hoverLastRef.current = now\n setHoveredPreset(preset)\n if (hoverThrottleRef.current) {\n clearTimeout(hoverThrottleRef.current)\n hoverThrottleRef.current = null\n }\n } else {\n hoverPendingRef.current = preset\n if (!hoverThrottleRef.current) {\n hoverThrottleRef.current = setTimeout(() => {\n hoverThrottleRef.current = null\n hoverLastRef.current = Date.now()\n setHoveredPreset(hoverPendingRef.current)\n }, THROTTLE_MS - elapsed)\n }\n }\n }, [])\n\n const previewTheme = React.useMemo(() => {\n if (hoveredPreset) return themePresets[hoveredPreset]\n return theme\n }, [hoveredPreset, theme])\n\n // Debounced preview for the chart / ThemePreview component\n const [debouncedPreviewTheme, setDebouncedPreviewTheme] =\n React.useState<DashboardTheme>(previewTheme)\n const debounceFirstRunRef = React.useRef(true)\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n React.useEffect(() => {\n if (debounceFirstRunRef.current) {\n debounceFirstRunRef.current = false\n setDebouncedPreviewTheme(previewTheme)\n return\n }\n if (hoveredPreset === null) {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current)\n debounceTimeoutRef.current = null\n }\n setDebouncedPreviewTheme(previewTheme)\n return\n }\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current)\n debounceTimeoutRef.current = setTimeout(() => {\n debounceTimeoutRef.current = null\n setDebouncedPreviewTheme(previewTheme)\n }, 200)\n return () => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current)\n }\n }, [previewTheme, hoveredPreset])\n\n const ThemePreviewCard = React.useMemo(\n () => (\n <Card className=\"border-2 shadow-sm lg:col-span-9\">\n <CardHeader className=\"pb-4\">\n <div className=\"space-y-1\">\n <CardTitle className=\"text-lg font-semibold\">Theme Preview</CardTitle>\n <CardDescription className=\"text-sm\">\n See how your theme will look when applied\n </CardDescription>\n </div>\n </CardHeader>\n <CardContent>\n <div\n className=\"p-8 rounded-xl border-2 shadow-lg transition-all duration-500 ease-in-out\"\n style={{\n backgroundColor: previewTheme.dashboardBg,\n borderColor: previewTheme.outline,\n fontFamily: `\"${previewTheme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n transitionProperty: 'background-color, border-color, font-family',\n }}\n >\n <ThemePreview theme={debouncedPreviewTheme} />\n </div>\n </CardContent>\n </Card>\n ),\n [previewTheme, debouncedPreviewTheme]\n )\n\n // Debounced contrast validation\n const validationTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n React.useEffect(() => {\n if (validationTimeoutRef.current) clearTimeout(validationTimeoutRef.current)\n validationTimeoutRef.current = setTimeout(() => {\n validationTimeoutRef.current = null\n validateThemeContrast(theme)\n }, 200)\n return () => {\n if (validationTimeoutRef.current) clearTimeout(validationTimeoutRef.current)\n }\n }, [theme, validateThemeContrast])\n\n const handleSave = React.useCallback(async () => {\n if (isSaving) return\n try {\n await onSave?.(theme, { selectedPreset })\n setPreviousTheme({ ...theme })\n setHasChanges(false)\n } catch {\n // Host handles toasts; keep dirty state so the user can retry\n }\n }, [theme, isSaving, onSave, selectedPreset])\n\n const revertToPreviousTheme = React.useCallback(() => {\n if (previousTheme) {\n setTheme(previousTheme)\n setSelectedPreset(findMatchingPreset(previousTheme))\n setHasChanges(false)\n }\n }, [previousTheme])\n\n const revertToDefaultTheme = React.useCallback(() => {\n setTheme(themePresets.default)\n setSelectedPreset('default')\n setHasChanges(false)\n }, [])\n\n return (\n <div className=\"relative space-y-8 px-0\">\n {isSaving && (\n <div\n className={cn(\n 'absolute inset-0 z-10 flex flex-col items-center justify-center rounded-lg',\n 'bg-background/80 backdrop-blur-sm'\n )}\n >\n <Loader2 className=\"size-10 animate-spin text-primary\" />\n <p className=\"mt-3 text-sm font-medium text-muted-foreground\">Saving theme...</p>\n </div>\n )}\n\n {/* Header */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10\">\n <Palette className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <h3 className=\"text-2xl font-bold tracking-tight\">Theme Customization</h3>\n <p className=\"text-sm text-muted-foreground mt-1\">\n Customize the appearance of this dashboard\n </p>\n </div>\n </div>\n {onClose && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose}>\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-12 gap-6\">\n {!isEditingFromPreview && (\n <>\n <Card className=\"border-2 shadow-sm lg:col-span-3\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-1\">\n <CardTitle className=\"text-lg font-semibold\">Theme Presets</CardTitle>\n <CardDescription className=\"text-sm\">\n Choose a preset theme or customize your own\n </CardDescription>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsEditingFromPreview(true)}\n className=\"shrink-0 shadow-sm\"\n >\n <Edit2 className=\"h-4 w-4 mr-2\" />\n Customize\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"pt-0\">\n <ThemePresetSelector\n value={selectedPreset}\n onValueChange={handlePresetSelect}\n presets={themePresetList}\n themePresets={themePresets}\n onHover={handlePresetHover}\n />\n </CardContent>\n </Card>\n {ThemePreviewCard}\n </>\n )}\n\n {isEditingFromPreview && (\n <>\n <div className=\"space-y-6 animate-fade-in transition-all duration-500 lg:col-span-3\">\n <Card className=\"border-2 shadow-xl bg-gradient-to-br from-background via-background to-primary/5 relative overflow-hidden\">\n <CardHeader className=\"pb-6 relative z-10\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-2\">\n <CardTitle className=\"text-xl font-bold flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-primary/20 to-primary/10 border border-primary/20 shadow-lg\">\n <Sparkles className=\"h-5 w-5 text-primary\" />\n </div>\n <span className=\"bg-gradient-to-r from-foreground to-foreground/70 bg-clip-text text-transparent\">\n Theme Settings\n </span>\n </CardTitle>\n <CardDescription className=\"text-sm ml-[52px] font-medium\">\n Customize colors, typography, and styling\n </CardDescription>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setIsEditingFromPreview(false)}\n className=\"shrink-0 h-10 w-10 rounded-lg hover:bg-destructive/10 hover:text-destructive transition-all duration-200 hover:scale-110\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"pt-2 relative z-10\">\n <div className=\"max-h-[calc(100vh-14rem)] overflow-y-auto pr-2 space-y-6 scrollbar-hide\">\n <div className=\"space-y-6\">\n <div className=\"flex items-center gap-3 pb-2\">\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-border to-transparent\" />\n <div className=\"flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/5 border border-primary/10\">\n <Palette className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold text-primary\">Colors</span>\n </div>\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-border to-transparent\" />\n </div>\n <div className=\"pl-2\">\n <ThemeColorSection theme={theme} onColorChange={handleColorChange} />\n </div>\n </div>\n\n <ContrastWarnings warnings={contrastWarnings} />\n\n <div className=\"space-y-6\">\n <div className=\"flex items-center gap-3 pb-2\">\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-border to-transparent\" />\n <div className=\"flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/5 border border-primary/10\">\n <Edit2 className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold text-primary\">\n Typography & Styling\n </span>\n </div>\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent via-border to-transparent\" />\n </div>\n <div className=\"pl-2\">\n <ThemeTypographySection\n theme={theme}\n onFontFamilyChange={(value) => handleColorChange('fontFamily', value)}\n onBorderRadiusChange={(value) => handleColorChange('borderRadius', value)}\n />\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n {ThemePreviewCard}\n </>\n )}\n </div>\n\n {/* Action Buttons */}\n <Card className=\"border-2 shadow-sm bg-muted/30\">\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex flex-wrap gap-3\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" disabled={isSaving} className=\"shadow-sm\">\n <RotateCcw className=\"h-4 w-4 mr-2\" />\n Revert Theme\n <ChevronDown className=\"h-4 w-4 ml-2\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={revertToPreviousTheme} disabled={!previousTheme}>\n Revert to Previous Theme\n </DropdownMenuItem>\n <DropdownMenuItem onClick={revertToDefaultTheme}>\n Revert to Default Theme\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <Button\n onClick={handleSave}\n disabled={\n isSaving || (!hasChanges && (selectedPreset === 'custom' || !selectedPreset))\n }\n className=\"shadow-md\"\n size=\"lg\"\n >\n {isSaving ? <Loader2 className=\"size-4 animate-spin\" /> : 'Save Changes'}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )\n}\n\nfunction findMatchingPreset(themeToMatch: DashboardTheme): ThemePreset | 'custom' {\n const match = Object.entries(themePresets).find(([_, presetTheme]) =>\n Object.keys(presetTheme).every(\n (key) =>\n presetTheme[key as keyof DashboardTheme] === themeToMatch[key as keyof DashboardTheme]\n )\n )\n return match ? (match[0] as ThemePreset) : 'custom'\n}\n","import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport * as React from 'react'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\nimport { cn } from '../../utils/cn'\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border/70 bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border/70 bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)} {...props} />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => (\n <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n)\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut'\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import type { DashboardTheme, ThemePreset } from './types'\n\nexport const defaultTheme: DashboardTheme = {\n primary: '#1F4A05',\n secondary: '#5F7D52',\n interactive: '#CBD6BA',\n container: '#D9ECD9',\n module: '#E9F7DF',\n accent: '#8E8B78',\n outline: '#CADDC2',\n dialog: '#FFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#E9F7DF',\n dashboardBg: '#D9ECD9',\n cardIcons: '#1F4A05',\n cardText: '#1F4A05',\n cardTitle: '#1F4A05',\n buttonPrimary: '#1F4A05',\n buttonSecondary: '#5F7D52',\n buttonText: '#FFFFFF',\n}\n\nexport const themePresets: Record<ThemePreset, DashboardTheme> = {\n default: {\n primary: 'hsl(var(--primary))',\n secondary: 'hsl(var(--muted-foreground))',\n interactive: 'hsl(var(--border))',\n container: 'hsl(var(--background))',\n module: 'hsl(var(--card))',\n accent: 'hsl(var(--accent))',\n outline: 'hsl(var(--border))',\n dialog: 'hsl(var(--popover))',\n fontFamily: 'Nunito',\n borderRadius: 0.5,\n cardBg: 'hsl(var(--card))',\n dashboardBg: 'hsl(var(--background))',\n cardIcons: 'hsl(var(--foreground))',\n cardText: 'hsl(var(--card-foreground))',\n cardTitle: 'hsl(var(--foreground))',\n buttonPrimary: 'hsl(var(--primary))',\n buttonSecondary: 'hsl(var(--secondary))',\n buttonText: 'hsl(var(--primary-foreground))',\n },\n green: { ...defaultTheme },\n blue: {\n primary: '#1E40AF',\n secondary: '#3B82F6',\n interactive: '#93C5FD',\n container: '#DBEAFE',\n module: '#EFF6FF',\n accent: '#60A5FA',\n outline: '#BFDBFE',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#EFF6FF',\n dashboardBg: '#DBEAFE',\n cardIcons: '#1E40AF',\n cardText: '#1E40AF',\n cardTitle: '#1E40AF',\n buttonPrimary: '#1E40AF',\n buttonSecondary: '#3B82F6',\n buttonText: '#FFFFFF',\n },\n lime: {\n primary: '#065F46',\n secondary: '#10B981',\n interactive: '#6EE7B7',\n container: '#D1FAE5',\n module: '#ECFDF5',\n accent: '#34D399',\n outline: '#A7F3D0',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#ECFDF5',\n dashboardBg: '#D1FAE5',\n cardIcons: '#065F46',\n cardText: '#065F46',\n cardTitle: '#065F46',\n buttonPrimary: '#065F46',\n buttonSecondary: '#10B981',\n buttonText: '#FFFFFF',\n },\n purple: {\n primary: '#5B21B6',\n secondary: '#8B5CF6',\n interactive: '#C4B5FD',\n container: '#EDE9FE',\n module: '#F5F3FF',\n accent: '#A78BFA',\n outline: '#DDD6FE',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#F5F3FF',\n dashboardBg: '#EDE9FE',\n cardIcons: '#5B21B6',\n cardText: '#5B21B6',\n cardTitle: '#5B21B6',\n buttonPrimary: '#5B21B6',\n buttonSecondary: '#8B5CF6',\n buttonText: '#FFFFFF',\n },\n ocean: {\n primary: '#0E7490',\n secondary: '#06B6D4',\n interactive: '#67E8F9',\n container: '#CFFAFE',\n module: '#ECFEFF',\n accent: '#22D3EE',\n outline: '#A5F3FC',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#ECFEFF',\n dashboardBg: '#CFFAFE',\n cardIcons: '#0E7490',\n cardText: '#0E7490',\n cardTitle: '#0E7490',\n buttonPrimary: '#0E7490',\n buttonSecondary: '#06B6D4',\n buttonText: '#FFFFFF',\n },\n sunset: {\n primary: '#C2410C',\n secondary: '#F97316',\n interactive: '#FDBA74',\n container: '#FFEDD5',\n module: '#FFF7ED',\n accent: '#FB923C',\n outline: '#FED7AA',\n dialog: '#FFFFFF',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#FFF7ED',\n dashboardBg: '#FFEDD5',\n cardIcons: '#C2410C',\n cardText: '#C2410C',\n cardTitle: '#C2410C',\n buttonPrimary: '#C2410C',\n buttonSecondary: '#F97316',\n buttonText: '#FFFFFF',\n },\n dark: {\n primary: '#F9FAFB',\n secondary: '#E5E7EB',\n interactive: '#9CA3AF',\n container: '#111827',\n module: '#1F2937',\n accent: '#D1D5DB',\n outline: '#374151',\n dialog: '#1F2937',\n fontFamily: 'Nunito',\n borderRadius: 0.8,\n cardBg: '#1F2937',\n dashboardBg: '#111827',\n cardIcons: '#F9FAFB',\n cardText: '#F9FAFB',\n cardTitle: '#F9FAFB',\n buttonPrimary: '#F9FAFB',\n buttonSecondary: '#E5E7EB',\n buttonText: '#111827',\n },\n minimal: {\n primary: '#000000',\n secondary: '#4B5563',\n interactive: '#9CA3AF',\n container: '#F9FAFB',\n module: '#FFFFFF',\n accent: '#6B7280',\n outline: '#E5E7EB',\n dialog: '#FFFFFF',\n fontFamily: 'Source Sans Pro',\n borderRadius: 0.25,\n cardBg: '#FFFFFF',\n dashboardBg: '#F9FAFB',\n cardIcons: '#000000',\n cardText: '#000000',\n cardTitle: '#000000',\n buttonPrimary: '#000000',\n buttonSecondary: '#4B5563',\n buttonText: '#FFFFFF',\n },\n}\n\nexport const themePresetList: ThemePreset[] = [\n 'default',\n 'green',\n 'blue',\n 'lime',\n 'purple',\n 'ocean',\n 'sunset',\n 'dark',\n 'minimal',\n]\n\nexport const presetDisplayNames: Record<ThemePreset, string> = {\n default: 'Default',\n green: 'Forest',\n blue: 'Azure',\n lime: 'Mint',\n purple: 'Violet',\n ocean: 'Ocean',\n sunset: 'Blaze',\n dark: 'Midnight',\n minimal: 'Minimal',\n}\n","import React from 'react'\nimport { cn } from '../../utils/cn'\nimport { getContrastRatio, getContrastLevel } from './utils/colorUtils'\n\ninterface ContrastIndicatorProps {\n foreground: string\n background: string\n label: string\n}\n\nfunction ContrastIndicatorInner({ foreground, background, label }: ContrastIndicatorProps) {\n const ratio = getContrastRatio(foreground, background)\n if (ratio === null) return null\n\n const { level, passes } = getContrastLevel(ratio)\n const ratioText = ratio.toFixed(2)\n\n return (\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"text-muted-foreground\">Contrast:</span>\n <span\n className={cn(\n 'font-mono font-semibold',\n passes ? 'text-green-600 dark:text-green-400' : 'text-destructive'\n )}\n >\n {ratioText}:1\n </span>\n <span\n className={cn(\n 'px-1.5 py-0.5 rounded text-[10px] font-medium',\n level === 'AAA' && 'bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-300',\n level === 'AA' && 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300',\n level === 'AA-Large' &&\n 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900 dark:text-yellow-300',\n level === 'Fail' && 'bg-destructive/20 text-destructive'\n )}\n >\n {level}\n </span>\n </div>\n )\n}\n\nexport const ContrastIndicator = React.memo(ContrastIndicatorInner)\n","export function normalizeHex(hex: string): string {\n if (!hex) return '#000000'\n hex = hex.replace('#', '')\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((char) => char + char)\n .join('')\n }\n if (hex.length !== 6) return '#000000'\n return `#${hex}`\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const normalized = normalizeHex(hex)\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(normalized)\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null\n}\n\nexport function getRelativeLuminance(rgb: { r: number; g: number; b: number }): number {\n const [r, g, b] = [rgb.r, rgb.g, rgb.b].map((val) => {\n val = val / 255\n return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4)\n })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\nexport function getContrastRatio(color1: string, color2: string): number | null {\n const rgb1 = hexToRgb(color1)\n const rgb2 = hexToRgb(color2)\n if (!rgb1 || !rgb2) return null\n\n const lum1 = getRelativeLuminance(rgb1)\n const lum2 = getRelativeLuminance(rgb2)\n const lighter = Math.max(lum1, lum2)\n const darker = Math.min(lum1, lum2)\n return (lighter + 0.05) / (darker + 0.05)\n}\n\nexport function getContrastLevel(ratio: number): {\n level: 'AAA' | 'AA' | 'AA-Large' | 'Fail'\n passes: boolean\n} {\n if (ratio >= 7) return { level: 'AAA', passes: true }\n if (ratio >= 4.5) return { level: 'AA', passes: true }\n if (ratio >= 3) return { level: 'AA-Large', passes: true }\n return { level: 'Fail', passes: false }\n}\n\nexport function validateColorContrast(\n foreground: string,\n background: string,\n context: string\n): { valid: boolean; ratio: number; level: string; message: string } {\n const ratio = getContrastRatio(foreground, background)\n if (ratio === null) {\n return {\n valid: false,\n ratio: 0,\n level: 'Error',\n message: `Invalid color format for ${context}`,\n }\n }\n\n const { level, passes } = getContrastLevel(ratio)\n return {\n valid: passes,\n ratio: Math.round(ratio * 100) / 100,\n level,\n message: passes\n ? `${context}: Contrast ratio ${ratio.toFixed(2)}:1 meets ${level} standards`\n : `${context}: Contrast ratio ${ratio.toFixed(2)}:1 does NOT meet WCAG standards (minimum 4.5:1 for normal text, 3:1 for large text)`,\n }\n}\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../utils/cn'\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n)\n\nconst Label = React.forwardRef<\n HTMLLabelElement,\n React.LabelHTMLAttributes<HTMLLabelElement> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <label ref={ref} className={cn(labelVariants(), className)} {...props} />\n))\nLabel.displayName = 'Label'\n\nexport { Label }\n","import React from 'react'\nimport { Label } from '../ui/label'\nimport { Input } from '../ui/input'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { Info } from 'lucide-react'\nimport { normalizeHex } from './utils/colorUtils'\nimport { ContrastIndicator } from './ContrastIndicator'\nimport type { DashboardTheme } from './types'\n\ninterface ThemeColorInputProps {\n id: string\n label: string\n colorKey: keyof DashboardTheme\n value: string\n placeholder?: string\n onColorChange: (key: keyof DashboardTheme, value: string | number) => void\n theme: DashboardTheme\n showContrast?: boolean\n contrastForeground?: string\n contrastBackground?: string\n contrastLabel?: string\n description?: string\n}\n\nfunction ThemeColorInputInner({\n id,\n label,\n colorKey,\n value,\n placeholder,\n onColorChange,\n showContrast = false,\n contrastForeground,\n contrastBackground,\n contrastLabel,\n description,\n}: ThemeColorInputProps) {\n const onChange = (v: string) => onColorChange(colorKey, v)\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Label htmlFor={id}>{label}</Label>\n {description && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Info className=\"h-3.5 w-3.5 text-muted-foreground cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-xs\">\n <p className=\"text-sm\">{description}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <Input\n id={id}\n type=\"color\"\n value={normalizeHex(value)}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-10 w-16 cursor-pointer\"\n />\n <Input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder || value}\n className=\"flex-1 font-mono text-sm\"\n />\n </div>\n {showContrast && contrastForeground && contrastBackground && (\n <ContrastIndicator\n foreground={contrastForeground}\n background={contrastBackground}\n label={contrastLabel || 'contrast'}\n />\n )}\n </div>\n )\n}\n\nfunction propsAreEqual(prev: ThemeColorInputProps, next: ThemeColorInputProps): boolean {\n return (\n prev.id === next.id &&\n prev.label === next.label &&\n prev.colorKey === next.colorKey &&\n prev.value === next.value &&\n prev.placeholder === next.placeholder &&\n prev.showContrast === next.showContrast &&\n prev.contrastForeground === next.contrastForeground &&\n prev.contrastBackground === next.contrastBackground &&\n prev.contrastLabel === next.contrastLabel &&\n prev.description === next.description &&\n prev.onColorChange === next.onColorChange\n )\n}\n\nexport const ThemeColorInput = React.memo(ThemeColorInputInner, propsAreEqual)\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\n\nconst Input = React.forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement>>(\n ({ className, type, ...props }, ref) => (\n <input\n type={type}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import { ThemeColorInput } from './ThemeColorInput'\nimport type { DashboardTheme } from './types'\n\ninterface ThemeColorSectionProps {\n theme: DashboardTheme\n onColorChange: (key: keyof DashboardTheme, value: string | number) => void\n}\n\nexport function ThemeColorSection({ theme, onColorChange }: ThemeColorSectionProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4\">\n <ThemeColorInput\n id=\"primary-color\"\n label=\"Primary\"\n colorKey=\"primary\"\n value={theme.primary}\n placeholder=\"#1F4A05\"\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.primary}\n contrastBackground={theme.container || theme.dashboardBg || '#FFFFFF'}\n contrastLabel=\"on container\"\n description=\"Main brand color used for headings, primary buttons, and key UI elements\"\n />\n <ThemeColorInput\n id=\"secondary-color\"\n label=\"Secondary\"\n colorKey=\"secondary\"\n value={theme.secondary}\n placeholder=\"#5F7D52\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Secondary brand color used for secondary buttons and supporting elements\"\n />\n <ThemeColorInput\n id=\"interactive-color\"\n label=\"Interactive\"\n colorKey=\"interactive\"\n value={theme.interactive}\n placeholder=\"#CBD6BA\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Color for interactive elements like hover states and active links\"\n />\n <ThemeColorInput\n id=\"container-color\"\n label=\"Container\"\n colorKey=\"container\"\n value={theme.container}\n placeholder=\"#D9ECD9\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Background color for main containers and page sections\"\n />\n <ThemeColorInput\n id=\"module-color\"\n label=\"Module\"\n colorKey=\"module\"\n value={theme.module}\n placeholder=\"#E9F7DF\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Background color for navigation bars and elevated surfaces\"\n />\n <ThemeColorInput\n id=\"accent-color\"\n label=\"Accent\"\n colorKey=\"accent\"\n value={theme.accent}\n placeholder=\"#8E8B78\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Accent color for highlights, badges, and special emphasis\"\n />\n <ThemeColorInput\n id=\"outline-color\"\n label=\"Outline\"\n colorKey=\"outline\"\n value={theme.outline}\n placeholder=\"#CADDC2\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Color for borders, dividers, and outline elements\"\n />\n <ThemeColorInput\n id=\"dialog-color\"\n label=\"Dialog\"\n colorKey=\"dialog\"\n value={theme.dialog}\n placeholder=\"#FFF\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Background color for dialogs, modals, and popovers\"\n />\n <ThemeColorInput\n id=\"card-bg-color\"\n label=\"Card Background\"\n colorKey=\"cardBg\"\n value={theme.cardBg || theme.module}\n placeholder={theme.module}\n onColorChange={onColorChange}\n theme={theme}\n description=\"Background color specifically for chart cards and content cards\"\n />\n <ThemeColorInput\n id=\"dashboard-bg-color\"\n label=\"Dashboard Background\"\n colorKey=\"dashboardBg\"\n value={theme.dashboardBg || theme.container}\n placeholder={theme.container}\n onColorChange={onColorChange}\n theme={theme}\n description=\"Main background color for the entire dashboard view\"\n />\n <ThemeColorInput\n id=\"card-icons-color\"\n label=\"Card Icons\"\n colorKey=\"cardIcons\"\n value={theme.cardIcons || theme.primary}\n placeholder={theme.primary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.cardIcons || theme.primary}\n contrastBackground={theme.cardBg || theme.module || '#FFFFFF'}\n contrastLabel=\"on card\"\n description=\"Color for icons displayed on cards and chart cards\"\n />\n <ThemeColorInput\n id=\"card-title-color\"\n label=\"Card Title\"\n colorKey=\"cardTitle\"\n value={theme.cardTitle || theme.primary}\n placeholder={theme.primary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.cardTitle || theme.primary}\n contrastBackground={theme.cardBg || theme.module || '#FFFFFF'}\n contrastLabel=\"on card\"\n description=\"Text color for card titles and headings within cards\"\n />\n <ThemeColorInput\n id=\"card-text-color\"\n label=\"Card Text\"\n colorKey=\"cardText\"\n value={theme.cardText || theme.primary}\n placeholder={theme.primary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.cardText || theme.primary}\n contrastBackground={theme.cardBg || theme.module || '#FFFFFF'}\n contrastLabel=\"on card\"\n description=\"Text color for body text and content within cards\"\n />\n <ThemeColorInput\n id=\"button-primary-color\"\n label=\"Button Primary\"\n colorKey=\"buttonPrimary\"\n value={theme.buttonPrimary || theme.primary}\n placeholder={theme.primary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.buttonText || '#FFFFFF'}\n contrastBackground={theme.buttonPrimary || theme.primary}\n contrastLabel=\"button text\"\n description=\"Background color for primary action buttons\"\n />\n <ThemeColorInput\n id=\"button-secondary-color\"\n label=\"Button Secondary\"\n colorKey=\"buttonSecondary\"\n value={theme.buttonSecondary || theme.secondary}\n placeholder={theme.secondary}\n onColorChange={onColorChange}\n theme={theme}\n showContrast\n contrastForeground={theme.buttonText || '#FFFFFF'}\n contrastBackground={theme.buttonSecondary || theme.secondary}\n contrastLabel=\"button text\"\n description=\"Background color for secondary action buttons\"\n />\n <ThemeColorInput\n id=\"button-text-color\"\n label=\"Button Text\"\n colorKey=\"buttonText\"\n value={theme.buttonText || '#FFFFFF'}\n placeholder=\"#FFFFFF\"\n onColorChange={onColorChange}\n theme={theme}\n description=\"Text color for text displayed on buttons\"\n />\n </div>\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\nimport { cn } from '../../utils/cn'\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn('relative flex w-full touch-none select-none items-center', className)}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20\">\n <SliderPrimitive.Range className=\"absolute h-full bg-primary\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n))\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n","import { Label } from '../ui/label'\nimport { Slider } from '../ui/slider'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { Info } from 'lucide-react'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'\nimport type { DashboardTheme } from './types'\n\nconst fontFamilies = [\n 'Nunito',\n 'Inter',\n 'Roboto',\n 'Open Sans',\n 'Lato',\n 'Montserrat',\n 'Poppins',\n 'Source Sans Pro',\n 'Raleway',\n 'Ubuntu',\n 'Playfair Display',\n 'Merriweather',\n]\n\ninterface ThemeTypographySectionProps {\n theme: DashboardTheme\n onFontFamilyChange: (value: string) => void\n onBorderRadiusChange: (value: number) => void\n}\n\nexport function ThemeTypographySection({\n theme,\n onFontFamilyChange,\n onBorderRadiusChange,\n}: ThemeTypographySectionProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Label htmlFor=\"font-family\">Font Family</Label>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Info className=\"h-3.5 w-3.5 text-muted-foreground cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-xs\">\n <p className=\"text-sm\">\n Choose the font family used throughout the dashboard. This affects all text\n elements including headings, body text, and UI labels.\n </p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n <Select value={theme.fontFamily} onValueChange={onFontFamilyChange}>\n <SelectTrigger id=\"font-family\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {fontFamilies.map((font) => (\n <SelectItem key={font} value={font}>\n {font}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Label htmlFor=\"border-radius\">Border Radius</Label>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Info className=\"h-3.5 w-3.5 text-muted-foreground cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-xs\">\n <p className=\"text-sm\">\n Adjust the roundness of corners for cards, buttons, and other UI elements.\n Higher values create more rounded corners.\n </p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n <span className=\"text-sm text-muted-foreground\">{theme.borderRadius}rem</span>\n </div>\n <Slider\n id=\"border-radius\"\n min={0}\n max={2}\n step={0.1}\n value={[theme.borderRadius]}\n onValueChange={([value]) => onBorderRadiusChange(value)}\n className=\"w-full\"\n />\n </div>\n </div>\n )\n}\n","import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'\nimport { Label } from '../ui/label'\nimport { Check } from 'lucide-react'\nimport { cn } from '../../utils/cn'\nimport type { ThemePreset, DashboardTheme } from './types'\nimport { presetDisplayNames } from './constants'\n\ninterface ThemePresetSelectorProps {\n value: ThemePreset | 'custom'\n onValueChange: (value: ThemePreset) => void\n presets: ThemePreset[]\n themePresets: Record<ThemePreset, DashboardTheme>\n onHover?: (preset: ThemePreset | null) => void\n}\n\nexport function ThemePresetSelector({\n value,\n onValueChange,\n presets,\n themePresets,\n onHover,\n}: ThemePresetSelectorProps) {\n const selectValue = value === 'custom' ? '' : value\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"theme-preset\" className=\"text-sm font-medium\">\n Quick Select\n </Label>\n <Select\n value={selectValue}\n onValueChange={(val) => {\n if (val) onValueChange(val as ThemePreset)\n }}\n >\n <SelectTrigger id=\"theme-preset\" className=\"h-9\">\n <SelectValue placeholder={value === 'custom' ? 'Custom' : 'Select a preset'} />\n </SelectTrigger>\n <SelectContent>\n {presets.map((preset) => (\n <SelectItem key={preset} value={preset}>\n {presetDisplayNames[preset]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n {presets.map((preset) => {\n const presetTheme = themePresets[preset]\n const isSelected = value === preset\n return (\n <button\n key={preset}\n type=\"button\"\n onClick={() => onValueChange(preset)}\n className={cn(\n 'relative group w-full flex items-center gap-3 p-3 rounded-lg border-2 transition-all duration-200 text-left',\n 'hover:shadow-md active:scale-[0.98]',\n 'bg-card backdrop-blur-sm',\n isSelected ? 'shadow-sm' : 'border-border/60 hover:bg-accent/50'\n )}\n style={\n {\n borderColor: isSelected ? presetTheme.outline : undefined,\n boxShadow: isSelected ? `0 0 0 2px ${presetTheme.primary}4D` : undefined,\n } as React.CSSProperties\n }\n onMouseEnter={(e) => {\n if (!isSelected) e.currentTarget.style.borderColor = presetTheme.primary\n onHover?.(preset)\n }}\n onMouseLeave={(e) => {\n if (!isSelected) e.currentTarget.style.borderColor = ''\n onHover?.(null)\n }}\n >\n <div\n className=\"h-12 w-12 rounded-lg border-2 border-background shadow-sm flex-shrink-0 relative overflow-hidden\"\n style={{\n background: `linear-gradient(135deg, ${presetTheme.primary} 0%, ${presetTheme.secondary} 50%, ${presetTheme.interactive} 100%)`,\n }}\n >\n <div className=\"absolute inset-0 bg-gradient-to-br from-white/10 to-transparent\" />\n {isSelected && (\n <div\n className=\"absolute inset-0 flex items-center justify-center drop-shadow-sm\"\n style={{ backgroundColor: `${presetTheme.primary}33` }}\n >\n <Check\n className=\"h-4 w-4 drop-shadow-sm stroke-[3px]\"\n style={{ color: presetTheme.container }}\n />\n </div>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"font-semibold text-sm tracking-tight truncate\">\n {presetDisplayNames[preset]}\n </span>\n </div>\n <div className=\"flex gap-1.5\">\n {[\n presetTheme.primary,\n presetTheme.secondary,\n presetTheme.interactive,\n presetTheme.accent,\n ].map((color, i) => (\n <div\n key={i}\n className=\"h-4 w-4 rounded border border-background/50 shadow-sm\"\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n </div>\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import { X } from 'lucide-react'\n\ninterface ContrastWarning {\n valid: boolean\n ratio: number\n level: string\n message: string\n}\n\ninterface ContrastWarningsProps {\n warnings: ContrastWarning[]\n}\n\nexport function ContrastWarnings({ warnings }: ContrastWarningsProps) {\n if (warnings.length === 0) return null\n\n return (\n <div className=\"space-y-4\">\n <div className=\"rounded-lg border-2 border-destructive/50 bg-destructive/10 p-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5\">\n <X className=\"h-5 w-5 text-destructive\" />\n </div>\n <div className=\"flex-1 space-y-2\">\n <h4 className=\"text-sm font-semibold text-destructive\">Contrast Ratio Warnings</h4>\n <p className=\"text-xs text-muted-foreground\">\n The following color combinations do not meet WCAG accessibility standards. Please\n adjust colors to ensure proper contrast for readability.\n </p>\n <ul className=\"space-y-1.5 text-xs\">\n {warnings.map((warning, index) => (\n <li key={index} className=\"flex items-start gap-2 text-destructive/90\">\n <span className=\"mt-0.5\">•</span>\n <span>\n <strong>{warning.message}</strong> (Ratio: {warning.ratio}:1)\n </span>\n </li>\n ))}\n </ul>\n <p className=\"text-xs text-muted-foreground mt-2\">\n <strong>WCAG Standards:</strong> Normal text requires 4.5:1 contrast, large text\n (18pt+) requires 3:1 contrast, enhanced (AAA) requires 7:1 contrast.\n </p>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import React, { useMemo, useState } from 'react'\nimport { Maximize2, Pencil, Trash2 } from 'lucide-react'\nimport { BarChart } from '../charts/BarChart'\nimport { PieChart } from '../charts/PieChart'\nimport type { DashboardTheme } from './types'\n\ninterface ThemePreviewProps {\n theme: DashboardTheme\n}\n\nfunction getThemeChartColors(theme: DashboardTheme): string[] {\n return [\n theme.primary,\n theme.accent,\n theme.secondary,\n theme.interactive,\n theme.buttonPrimary ?? theme.primary,\n ].filter(Boolean)\n}\n\nconst CHART_PREVIEW_CONFIG: {\n title: string\n subtitle: string\n type: 'bar' | 'pie'\n data: Record<string, string | number>[]\n x_key: string\n y_key: string\n showLegend: boolean\n}[] = [\n {\n title: 'Monthly Revenue',\n subtitle: 'Example bar chart visualization',\n type: 'bar',\n data: [\n { month: 'Jan', value: 450 },\n { month: 'Feb', value: 520 },\n { month: 'Mar', value: 480 },\n { month: 'Apr', value: 600 },\n { month: 'May', value: 550 },\n { month: 'Jun', value: 680 },\n ],\n x_key: 'month',\n y_key: 'value',\n showLegend: false,\n },\n {\n title: 'Data Distribution',\n subtitle: 'Example pie chart visualization',\n type: 'pie',\n data: [\n { name: 'Sales', value: 35 },\n { name: 'Marketing', value: 28 },\n { name: 'Support', value: 22 },\n { name: 'Other', value: 15 },\n ],\n x_key: 'name',\n y_key: 'value',\n showLegend: true,\n },\n]\n\nfunction ThemePreviewInner({ theme }: ThemePreviewProps) {\n const [hoveredId, setHoveredId] = useState<string | null>(null)\n\n const transitionStyle = {\n transition:\n 'color 0.5s ease-in-out, background-color 0.5s ease-in-out, border-color 0.5s ease-in-out, border-radius 0.5s ease-in-out',\n }\n\n const chartColors = useMemo(() => getThemeChartColors(theme), [theme])\n const cardStyle = useMemo(\n () => ({\n backgroundColor: theme.cardBg,\n borderColor: theme.outline,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }),\n [theme]\n )\n\n const fontStyle = {\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n }\n\n return (\n <div className=\"space-y-6\">\n <div\n className=\"mb-6 pb-4 border-b transition-colors duration-400 ease-in-out\"\n style={{\n borderColor: theme.outline,\n ...transitionStyle,\n }}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <h2\n className=\"text-2xl font-bold transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.primary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n Dashboard Preview\n </h2>\n <div className=\"flex items-center gap-2\">\n <div\n className=\"px-3 py-1.5 rounded-md text-xs font-medium transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: theme.secondary,\n color: theme.buttonText,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n Active\n </div>\n <button\n type=\"button\"\n className=\"px-4 py-2 rounded-md text-sm font-medium transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor:\n hoveredId === 'header-action' ? theme.interactive : theme.buttonPrimary,\n color: theme.buttonText,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n onMouseEnter={() => setHoveredId('header-action')}\n onMouseLeave={() => setHoveredId(null)}\n >\n Action\n </button>\n </div>\n </div>\n <p\n className=\"text-sm transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.secondary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n This preview demonstrates how your theme will appear across different components\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4 mb-6\">\n {[\n { title: 'Total Users', value: '12,345', change: '+12%' },\n { title: 'Revenue', value: '$45,678', change: '+8%' },\n { title: 'Growth', value: '23.4%', change: '+5%' },\n ].map((stat, idx) => (\n <div\n key={idx}\n className=\"p-5 rounded-lg border shadow-sm transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: theme.cardBg,\n borderColor: theme.outline,\n borderRadius: `${theme.borderRadius}rem`,\n ...fontStyle,\n ...transitionStyle,\n }}\n >\n <p\n className=\"text-sm mb-2 transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.cardTitle,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n {stat.title}\n </p>\n <div className=\"flex items-baseline justify-between\">\n <h3\n className=\"text-2xl font-bold transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.cardText,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n {stat.value}\n </h3>\n <span\n className=\"text-xs font-medium px-2 py-1 rounded transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: theme.interactive,\n color: theme.cardTitle,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n {stat.change}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"mb-6\">\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {CHART_PREVIEW_CONFIG.map((chart, idx) => (\n <div\n key={idx}\n className=\"group relative p-5 rounded-lg border transition-all duration-400 ease-in-out\"\n style={cardStyle}\n >\n <div\n className=\"absolute top-4 right-4 z-30 flex h-10 w-auto shrink-0 items-center justify-end gap-2 transition-colors duration-400 ease-in-out\"\n style={{ color: theme.cardIcons ?? theme.primary, ...transitionStyle }}\n aria-hidden\n >\n {(['maximize', 'edit', 'delete'] as const).map((action) => {\n const id = `card-${idx}-${action}`\n const isHovered = hoveredId === id\n const Icon =\n action === 'maximize' ? Maximize2 : action === 'edit' ? Pencil : Trash2\n return (\n <button\n key={action}\n type=\"button\"\n className=\"flex size-9 shrink-0 items-center justify-center rounded-md p-1.5 disabled:pointer-events-none\"\n style={{\n backgroundColor: isHovered ? theme.container : undefined,\n borderRadius: `${theme.borderRadius}rem`,\n ...transitionStyle,\n }}\n tabIndex={-1}\n aria-label={`${action} (preview)`}\n onMouseEnter={() => setHoveredId(id)}\n onMouseLeave={() => setHoveredId(null)}\n >\n <Icon className=\"size-4 shrink-0\" />\n </button>\n )\n })}\n </div>\n <div className=\"mb-4 min-w-0 pr-24\">\n <h3\n className=\"text-lg font-semibold mb-1 transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.cardTitle,\n fontFamily: cardStyle.fontFamily,\n ...transitionStyle,\n }}\n >\n {chart.title}\n </h3>\n <p\n className=\"text-sm transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.cardText ?? theme.cardTitle,\n fontFamily: cardStyle.fontFamily,\n ...transitionStyle,\n }}\n >\n {chart.subtitle}\n </p>\n </div>\n <div className=\"h-[250px] w-full min-h-0\">\n {chart.type === 'bar' ? (\n <BarChart\n data={chart.data}\n chartMeta={{ showLegend: chart.showLegend }}\n visualizationConfig={{\n x_key: chart.x_key,\n y_key: chart.y_key,\n colors: chartColors,\n }}\n />\n ) : (\n <PieChart\n data={chart.data}\n chartMeta={{ showLegend: chart.showLegend }}\n visualizationConfig={{\n x_key: chart.x_key,\n y_key: chart.y_key,\n colors: chartColors,\n }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <div\n className=\"p-6 rounded-lg border shadow-lg max-w-md mx-auto transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: theme.dialog,\n borderColor: theme.outline,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n <h4\n className=\"text-lg font-semibold mb-2 transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.primary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n Dialog Preview\n </h4>\n <p\n className=\"text-sm mb-4 transition-colors duration-400 ease-in-out\"\n style={{\n color: theme.secondary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n >\n This is how dialogs and modals will appear with your theme settings.\n </p>\n <div className=\"flex gap-2 justify-end\">\n <button\n type=\"button\"\n className=\"px-4 py-2 rounded-md text-sm font-medium border transition-all duration-400 ease-in-out\"\n style={{\n backgroundColor: hoveredId === 'dialog-cancel' ? theme.interactive : 'transparent',\n color: theme.secondary,\n borderColor: theme.outline,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n onMouseEnter={() => setHoveredId('dialog-cancel')}\n onMouseLeave={() => setHoveredId(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"px-4 py-2 rounded-md text-sm font-medium transition-all duration-300 ease-in-out\"\n style={{\n backgroundColor:\n hoveredId === 'dialog-confirm' ? theme.interactive : theme.buttonPrimary,\n color: theme.buttonText,\n borderRadius: `${theme.borderRadius}rem`,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n ...transitionStyle,\n }}\n onMouseEnter={() => setHoveredId('dialog-confirm')}\n onMouseLeave={() => setHoveredId(null)}\n >\n Confirm\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport const ThemePreview = React.memo(ThemePreviewInner)\n","import { useState, useCallback } from 'react'\nimport type { DashboardTheme } from '../types'\nimport { validateColorContrast } from '../utils/colorUtils'\n\nexport function useThemeValidation() {\n const [contrastWarnings, setContrastWarnings] = useState<\n Array<{ valid: boolean; ratio: number; level: string; message: string }>\n >([])\n\n const validateThemeContrast = useCallback((themeToValidate: DashboardTheme) => {\n const warnings: Array<{ valid: boolean; ratio: number; level: string; message: string }> = []\n\n const primaryOnContainer = validateColorContrast(\n themeToValidate.primary,\n themeToValidate.container || themeToValidate.dashboardBg || '#FFFFFF',\n 'Primary text on dashboard background'\n )\n if (!primaryOnContainer.valid) warnings.push(primaryOnContainer)\n\n const primaryOnModule = validateColorContrast(\n themeToValidate.primary,\n themeToValidate.module || themeToValidate.cardBg || '#FFFFFF',\n 'Primary text on card background'\n )\n if (!primaryOnModule.valid) warnings.push(primaryOnModule)\n\n const buttonTextOnPrimary = validateColorContrast(\n themeToValidate.buttonText || '#FFFFFF',\n themeToValidate.buttonPrimary || themeToValidate.primary,\n 'Button text on primary button'\n )\n if (!buttonTextOnPrimary.valid) warnings.push(buttonTextOnPrimary)\n\n const buttonTextOnSecondary = validateColorContrast(\n themeToValidate.buttonText || '#FFFFFF',\n themeToValidate.buttonSecondary || themeToValidate.secondary,\n 'Button text on secondary button'\n )\n if (!buttonTextOnSecondary.valid) warnings.push(buttonTextOnSecondary)\n\n const iconsOnCard = validateColorContrast(\n themeToValidate.cardIcons || themeToValidate.primary,\n themeToValidate.cardBg || themeToValidate.module || '#FFFFFF',\n 'Card icons on card background'\n )\n if (!iconsOnCard.valid) warnings.push(iconsOnCard)\n\n const cardTitleOnCard = validateColorContrast(\n themeToValidate.cardTitle || themeToValidate.primary,\n themeToValidate.cardBg || themeToValidate.module || '#FFFFFF',\n 'Card title on card background'\n )\n if (!cardTitleOnCard.valid) warnings.push(cardTitleOnCard)\n\n const cardTextOnCard = validateColorContrast(\n themeToValidate.cardText || themeToValidate.primary,\n themeToValidate.cardBg || themeToValidate.module || '#FFFFFF',\n 'Card text on card background'\n )\n if (!cardTextOnCard.valid) warnings.push(cardTextOnCard)\n\n const secondaryOnContainer = validateColorContrast(\n themeToValidate.secondary,\n themeToValidate.container || themeToValidate.dashboardBg || '#FFFFFF',\n 'Secondary text on dashboard background'\n )\n if (!secondaryOnContainer.valid) warnings.push(secondaryOnContainer)\n\n setContrastWarnings(warnings)\n return warnings\n }, [])\n\n return { contrastWarnings, validateThemeContrast }\n}\n","import type { DashboardTheme } from '../types/dashboard'\nimport type React from 'react'\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const r = parseInt(hex.slice(1, 3), 16)\n const g = parseInt(hex.slice(3, 5), 16)\n const b = parseInt(hex.slice(5, 7), 16)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\nexport function generateThemeStyles(\n theme: DashboardTheme | undefined\n): React.CSSProperties | undefined {\n if (!theme) return undefined\n return {\n '--theme-primary': theme.primary,\n '--theme-secondary': theme.secondary,\n '--theme-interactive': theme.interactive,\n '--theme-container': theme.container,\n '--theme-module': theme.module,\n '--theme-accent': theme.accent,\n '--theme-outline': theme.outline,\n '--theme-dialog': theme.dialog,\n '--theme-font-family': `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n '--theme-border-radius': `${theme.borderRadius}rem`,\n '--theme-card-bg': theme.cardBg || theme.module,\n '--theme-card-text': theme.cardText || theme.primary,\n '--theme-card-title': theme.cardTitle || theme.primary,\n '--theme-dashboard-bg': theme.dashboardBg || theme.container,\n '--theme-card-icons': theme.cardIcons || theme.primary,\n '--theme-button-primary': theme.buttonPrimary || theme.primary,\n '--theme-button-secondary': theme.buttonSecondary || theme.secondary,\n '--theme-button-text': theme.buttonText || theme.primary,\n fontFamily: `\"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif`,\n backgroundColor: theme.dashboardBg || theme.container,\n } as React.CSSProperties\n}\n\nexport function generateThemeCSS(theme: DashboardTheme | undefined): string {\n if (!theme) return ''\n const p10 = hexToRgba(theme.primary, 0.1)\n const p20 = hexToRgba(theme.primary, 0.2)\n const p30 = hexToRgba(theme.primary, 0.3)\n const p5 = hexToRgba(theme.primary, 0.05)\n const scope = '.dashboard-theme:not(.skip-dashboard-theme)'\n const scopes = `${scope}, ${scope}.dark, ${scope}.light, .dark ${scope}, .light ${scope}`\n return `\n ${scopes} {\n --theme-primary: ${theme.primary} !important;\n --theme-secondary: ${theme.secondary} !important;\n --theme-interactive: ${theme.interactive} !important;\n --theme-container: ${theme.container} !important;\n --theme-module: ${theme.module} !important;\n --theme-accent: ${theme.accent} !important;\n --theme-outline: ${theme.outline} !important;\n --theme-dialog: ${theme.dialog} !important;\n --theme-font-family: \"${theme.fontFamily}\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n --theme-border-radius: ${theme.borderRadius}rem !important;\n --theme-card-bg: ${theme.cardBg || theme.module} !important;\n --theme-card-text: ${theme.cardText || theme.primary} !important;\n --theme-card-title: ${theme.cardTitle || theme.primary} !important;\n --theme-dashboard-bg: ${theme.dashboardBg || theme.container} !important;\n --theme-card-icons: ${theme.cardIcons || theme.primary} !important;\n --theme-button-primary: ${theme.buttonPrimary || theme.primary} !important;\n --theme-button-secondary: ${theme.buttonSecondary || theme.secondary} !important;\n --theme-button-text: ${theme.buttonText || theme.primary} !important;\n font-family: var(--theme-font-family) !important;\n }\n ${scope} .chart-card, .dark ${scope} .chart-card, .light ${scope} .chart-card {\n background-color: var(--theme-card-bg) !important;\n color: var(--theme-card-text) !important;\n border-color: var(--theme-outline) !important;\n border-radius: var(--theme-border-radius) !important;\n }\n ${scope} button, .dark ${scope} button, .light ${scope} button {\n border-radius: var(--theme-border-radius) !important;\n }\n ${scope} button[data-variant=\"default\"], ${scope} .bg-primary,\n .dark ${scope} button[data-variant=\"default\"],\n .light ${scope} button[data-variant=\"default\"] {\n background-color: var(--theme-button-primary) !important;\n color: var(--theme-container) !important;\n }\n ${scope} button[data-variant=\"outline\"], ${scope} .border-input, ${scope} .border-outline,\n .dark ${scope} button[data-variant=\"outline\"], .dark ${scope} .border-outline,\n .light ${scope} button[data-variant=\"outline\"], .light ${scope} .border-outline {\n border-color: var(--theme-outline) !important;\n color: var(--theme-button-text) !important;\n }\n ${scope} button[data-variant=\"secondary\"], ${scope} .bg-secondary,\n .dark ${scope} button[data-variant=\"secondary\"],\n .light ${scope} button[data-variant=\"secondary\"] {\n background-color: var(--theme-secondary) !important;\n color: var(--theme-button-text) !important;\n }\n ${scope} .card, .dark ${scope} .card, .light ${scope} .card {\n background-color: var(--theme-card-bg) !important;\n border-color: var(--theme-outline) !important;\n border-radius: var(--theme-border-radius) !important;\n }\n ${scope} .bg-card, .dark ${scope} .bg-card, .light ${scope} .bg-card {\n background-color: var(--theme-card-bg) !important;\n }\n ${scope} .bg-module, .dark ${scope} .bg-module, .light ${scope} .bg-module {\n background-color: var(--theme-module) !important;\n }\n ${scope} .text-primary, .dark ${scope} .text-primary, .light ${scope} .text-primary {\n color: var(--theme-primary) !important;\n }\n ${scope} .bg-accent, .dark ${scope} .bg-accent, .light ${scope} .bg-accent {\n background-color: var(--theme-accent) !important;\n }\n ${scope} .bg-dashboard-bg, .dark ${scope} .bg-dashboard-bg, .light ${scope} .bg-dashboard-bg {\n background-color: var(--theme-dashboard-bg) !important;\n }\n ${scope} .hover\\\\:bg-accent:hover, .dark ${scope} .hover\\\\:bg-accent:hover, .light ${scope} .hover\\\\:bg-accent:hover {\n background-color: var(--theme-interactive) !important;\n color: var(--theme-primary) !important;\n }\n ${scope} h2, .dark ${scope} h2, .light ${scope} h2 {\n color: var(--theme-primary) !important;\n font-family: var(--theme-font-family) !important;\n }\n ${scope} .generate-dashboard-btn, .dark ${scope} .generate-dashboard-btn, .light ${scope} .generate-dashboard-btn {\n background: linear-gradient(to right, ${p10}, ${p10}, ${p10}) !important;\n border-color: ${p20} !important;\n }\n ${scope} .generate-dashboard-btn:hover, .dark ${scope} .generate-dashboard-btn:hover, .light ${scope} .generate-dashboard-btn:hover {\n background: linear-gradient(to right, ${p20}, ${p20}, ${p20}) !important;\n border-color: ${p30} !important;\n }\n ${scope} .generate-dashboard-btn .absolute, .dark ${scope} .generate-dashboard-btn .absolute, .light ${scope} .generate-dashboard-btn .absolute {\n background: linear-gradient(to right, ${p5}, ${p5}, ${p5}) !important;\n }\n ${scope} .generate-dashboard-btn svg, ${scope} .generate-dashboard-btn span,\n .dark ${scope} .generate-dashboard-btn svg, .dark ${scope} .generate-dashboard-btn span,\n .light ${scope} .generate-dashboard-btn svg, .light ${scope} .generate-dashboard-btn span {\n color: var(--theme-primary) !important;\n }\n ${scope} .dashboard-toolbar-btn:hover, .dark ${scope} .dashboard-toolbar-btn:hover, .light ${scope} .dashboard-toolbar-btn:hover {\n background-color: ${p10} !important;\n }\n `\n}\n","import type { DashboardTheme } from '../types/dashboard'\n\n/**\n * Same resolution order as main-app `useDashboardTheme` (embedded + in-app dashboard):\n * 1. `meta.apply_theme_to_all_dashboards` + `meta.default_theme`\n * 2. `meta.theme[dashboardId]` (falls back to `default_dashboard` when `dashboardId` is empty)\n */\nexport function resolveDashboardThemeFromWorkspace(\n workspace: { meta?: Record<string, any>; default_dashboard?: string } | null | undefined,\n dashboardId: string\n): DashboardTheme | undefined {\n if (!workspace?.meta) return undefined\n const { meta } = workspace\n if (meta.apply_theme_to_all_dashboards && meta.default_theme) {\n return meta.default_theme as DashboardTheme\n }\n const id = dashboardId?.trim() || workspace.default_dashboard\n if (id && meta.theme?.[id]) {\n return meta.theme[id] as DashboardTheme\n }\n return undefined\n}\n","import type { DashboardTheme } from '../types/dashboard'\nimport type { ThemePreset } from '../components/theme/types'\n\n/**\n * Mirrors main-app ThemeCustomizationSettings: default preset removes this dashboard\n * from `meta.theme`; other presets persist `meta.theme[dashboardId]`.\n */\nexport function mergeWorkspaceMetaTheme(\n meta: Record<string, any> | undefined,\n dashboardId: string,\n theme: DashboardTheme,\n selectedPreset: ThemePreset | 'custom'\n): Record<string, any> {\n const nextMeta = { ...(meta || {}) }\n const currentThemePreferences = { ...(nextMeta.theme || {}) } as Record<string, DashboardTheme>\n const isDefaultTheme = selectedPreset === 'default'\n if (isDefaultTheme) {\n const { [dashboardId]: _removed, ...rest } = currentThemePreferences\n nextMeta.theme = rest\n } else {\n nextMeta.theme = { ...currentThemePreferences, [dashboardId]: theme }\n }\n return nextMeta\n}\n","import type { ResizeHandle } from './layout'\n\nexport const GRID_BREAKPOINTS = { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }\nexport const GRID_COLS = { lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }\n\nexport const LAYOUT_HANDLE: { RESIZE: ResizeHandle[]; MOVE: ResizeHandle[] } = {\n RESIZE: ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'],\n MOVE: ['nw', 'ne', 'se', 'sw'],\n}\n\nexport const EMPTY_HANDLES: ResizeHandle[] = []\n","import type { TChartResponse } from '../../types/chart'\nimport type { TLayout } from '../../types/dashboard'\n\nexport type ResizeHandle = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw'\n\nexport const getChartCardSize = ({\n chartType,\n chartData = [],\n variant,\n}: {\n chartType: string | undefined\n chartData?: any\n variant?: string | undefined\n}) => {\n if (chartType === 'tile') {\n if (variant === 'horizontal') {\n return { w: 4 * (chartData?.length || 1), h: 1 }\n }\n return { w: 4, h: chartData?.length || 1 }\n }\n return { w: 4, h: 3.2 }\n}\n\nexport const isFallbackLayout = (layout: TLayout[]): boolean => {\n if (!layout || layout.length === 0) return false\n return layout.every((item) => item.w === 1 && item.h === 1 && item.x === 0)\n}\n\nexport const getDefaultLayout = ({\n items,\n existingLayout = [],\n availableHandles = [],\n}: {\n items: TChartResponse[]\n existingLayout?: TLayout[]\n availableHandles?: ResizeHandle[]\n}) => {\n // Start with existing layout or empty array\n const layout = [...existingLayout]\n const existingItemIds = new Set(layout.map((item) => item.i))\n const missingItems = items.filter((item) => !existingItemIds.has(item.llm_data_chat_id))\n\n // If no missing items, return existing layout\n if (missingItems.length === 0) {\n return layout\n }\n\n let x_axis = 0\n let y_axis = 0\n\n if (layout.length > 0) {\n const maxY = Math.max(...layout.map((item) => item.y + item.h))\n y_axis = Math.ceil(maxY)\n }\n\n for (let i = 0; i < missingItems.length; i++) {\n const { w, h } = getChartCardSize({\n chartType: missingItems[i].chart_response?.chart_type,\n chartData: missingItems[i].chart_response?.data,\n })\n layout.push({\n i: missingItems[i].llm_data_chat_id,\n x: x_axis,\n y: y_axis,\n w,\n h,\n resizeHandles: availableHandles,\n })\n x_axis += 4\n if (x_axis >= 12) {\n y_axis++\n x_axis = 0\n }\n }\n\n return layout\n}\n","export const GRID_RESIZE_HANDLE_STYLES = `\n .papermap-grid-dashboard .react-grid-item.react-grid-placeholder {\n background-color: lightblue !important;\n opacity: 0.5 !important;\n border: 2px dashed #007bff !important;\n border-radius: 10px !important;\n box-sizing: border-box;\n transition: none;\n }\n\n .papermap-grid-dashboard .react-grid-item.react-grid-placeholder.placeholder-resizing {\n transition: none;\n }\n\n .papermap-grid-dashboard .react-resizable-handle {\n z-index: 100;\n }\n\n .papermap-grid-dashboard[data-edit-mode='false'] .react-grid-item > .react-resizable-handle {\n display: none !important;\n opacity: 0 !important;\n visibility: hidden !important;\n }\n\n .papermap-grid-dashboard[data-edit-mode='true'] .react-grid-item > .react-resizable-handle {\n display: block !important;\n opacity: 1 !important;\n visibility: visible !important;\n }\n\n .papermap-grid-dashboard[data-edit-mode='true'] .react-grid-item > .react-resizable-handle::after {\n border-right: 2px solid !important;\n border-bottom: 2px solid !important;\n }\n\n .dark .papermap-grid-dashboard .react-resizable-handle {\n filter: invert(1);\n }\n`\n"],"mappings":"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","names":["import_react","import_framer_motion","import_lucide_react","import_react","import_react","import_react_query","Axios","import_react","getToolIndex","props","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_framer_motion","import_lucide_react","React","import_class_variance_authority","import_jsx_runtime","React","import_class_variance_authority","import_lucide_react","import_jsx_runtime","CollapsibleTrigger","CollapsibleContent","import_react","import_prism","import_jsx_runtime","MarkdownRenderer","Markdown","remarkGfm","rehypeRaw","React","SyntaxHighlighter","import_jsx_runtime","import_react","React","import_lucide_react","import_jsx_runtime","import_lucide_react","import_react_syntax_highlighter","import_prism","React","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_framer_motion","import_lucide_react","import_jsx_runtime","import_react","import_framer_motion","import_lucide_react","import_react_syntax_highlighter","import_prism","import_jsx_runtime","SyntaxHighlighter","_SyntaxHighlighter","getResolvedTheme","React","import_jsx_runtime","import_jsx_runtime","SyntaxHighlighter","_SyntaxHighlighter","getResolvedTheme","React","import_lucide_react","import_framer_motion","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","Lottie","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_lucide_react","import_framer_motion","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react_query","import_jsx_runtime","import_react","import_lucide_react","React","import_jsx_runtime","import_react","import_lucide_react","import_lucide_react","import_react","import_lucide_react","React","import_lucide_react","import_jsx_runtime","import_react","React","import_jsx_runtime","config","import_jsx_runtime","RechartsAreaChart","import_recharts","import_jsx_runtime","RechartsBarChart","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_recharts","import_jsx_runtime","RechartsLineChart","import_lucide_react","import_jsx_runtime","import_recharts","import_react","import_jsx_runtime","innerRadius","RechartsPieChart","ChartTooltip","import_recharts","import_jsx_runtime","RechartsRadarChart","import_recharts","import_jsx_runtime","RechartsScatterChart","import_jsx_runtime","import_jsx_runtime","toast","takeScreenshot","import_jsx_runtime","toast","takeScreenshot","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_framer_motion","import_jsx_runtime","import_jsx_runtime","count","MessageItem","CollapsibleTrigger","CollapsibleContent","import_jsx_runtime","React","import_jsx_runtime","Separator","React","import_jsx_runtime","React","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","React","import_jsx_runtime","EASE","Separator","import_react","import_lucide_react","import_react_query","import_framer_motion","import_lucide_react","import_react","import_react_dom","import_react","import_framer_motion","import_lucide_react","import_jsx_runtime","APP_NAME","copyToClipboard","PanelMessageItem","CollapsibleTrigger","CollapsibleContent","import_jsx_runtime","EASE","toast","import_jsx_runtime","import_react","import_lucide_react","import_framer_motion","import_jsx_runtime","import_react","import_styles","import_lucide_react","import_react","React","import_lucide_react","React","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","React","React","import_class_variance_authority","import_jsx_runtime","Label","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Label","React","import_jsx_runtime","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Label","import_lucide_react","import_jsx_runtime","themePresets","Label","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","Icon","React","import_react","import_jsx_runtime","import_jsx_runtime","toast"]}
|