@copilotz/chat-ui 0.1.0 → 0.1.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/README.md +405 -13
- package/dist/index.cjs +861 -567
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +39 -1
- package/dist/index.d.ts +39 -1
- package/dist/index.js +775 -478
- package/dist/index.js.map +1 -1
- package/dist/styles.css +246 -18
- package/package.json +6 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/chat/ChatUI.tsx","../src/config/chatConfig.ts","../src/components/chat/Message.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/badge.tsx","../src/components/ui/card.tsx","../src/components/ui/textarea.tsx","../src/components/ui/tooltip.tsx","../src/components/chat/Sidebar.tsx","../src/components/ui/input.tsx","../src/components/ui/sidebar.tsx","../src/hooks/use-mobile.ts","../src/components/ui/separator.tsx","../src/components/ui/sheet.tsx","../src/components/ui/dialog.tsx","../src/components/ui/alert-dialog.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/chat/UserMenu.tsx","../src/components/chat/ChatHeader.tsx","../src/components/chat/ChatInput.tsx","../src/components/chat/UserContext.tsx","../src/components/ui/progress.tsx","../src/components/chat/UserProfile.tsx","../src/components/ui/scroll-area.tsx","../src/components/chat/ThreadManager.tsx","../src/lib/chatUtils.ts"],"sourcesContent":["export * from './components/chat/ChatUI';\nexport * from './components/chat/ChatHeader';\nexport * from './components/chat/ChatInput';\nexport * from './components/chat/Message';\nexport * from './components/chat/Sidebar';\nexport * from './components/chat/ThreadManager';\nexport * from './components/chat/UserContext';\nexport * from './components/chat/UserMenu';\nexport * from './components/chat/UserProfile';\nexport * from './config/chatConfig';\nexport * from './types/chatTypes';\nexport * from './lib/utils';\nexport * from './lib/chatUtils';\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n ChatV2Props,\n MediaAttachment,\n MessageActionEvent,\n StateCallback,\n ChatState,\n ChatUserContext,\n} from '../../types/chatTypes';\nimport { defaultChatConfig, mergeConfig } from '../../config/chatConfig';\nimport { Message } from './Message';\nimport { Sidebar } from './Sidebar';\nimport { ChatHeader } from './ChatHeader';\nimport { ChatInput } from './ChatInput';\nimport { UserProfile } from './UserProfile';\nimport { useChatUserContext } from './UserContext';\nimport { Card, CardContent } from '../ui/card';\nimport { ScrollArea } from '../ui/scroll-area';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { SidebarProvider, SidebarInset } from '../ui/sidebar';\nimport { Sparkles } from 'lucide-react';\n\n// ChatUI is a purely presentational component\nexport const ChatUI: React.FC<ChatV2Props> = ({\n messages = [],\n threads = [],\n currentThreadId = null,\n config: userConfig,\n sidebar: _sidebar,\n isGenerating = false,\n callbacks = {},\n user,\n assistant,\n suggestions = [],\n className = '',\n onAddMemory,\n onUpdateMemory,\n onDeleteMemory,\n}) => {\n // Merge configuration with defaults\n const config = mergeConfig(defaultChatConfig, userConfig);\n\n // Mobile detection\n const [isMobile, setIsMobile] = useState(false);\n\n // Built-in user profile panel state\n const [isUserProfileOpen, setIsUserProfileOpen] = useState(false);\n\n // Try to get user context for custom fields (may not be available if used outside provider)\n let userContext: ChatUserContext | undefined;\n try {\n const contextValue = useChatUserContext();\n userContext = contextValue?.context;\n } catch {\n // ChatUI used outside of ChatUserContextProvider, that's okay\n userContext = undefined;\n }\n\n // Check if desktop on initial render\n const getInitialSidebarState = () => {\n if (typeof globalThis.innerWidth === 'number') {\n return globalThis.innerWidth >= 1024; // Open on desktop (lg+)\n }\n return false;\n };\n\n // Internal state for UI only\n const [state, setState] = useState<ChatState>({\n input: '',\n attachments: [],\n isRecording: false,\n selectedThreadId: currentThreadId,\n isAtBottom: true,\n showSidebar: getInitialSidebarState(), // Open by default on desktop\n showThreads: false, // No longer used for main sidebar\n editingMessageId: null,\n isSidebarCollapsed: false, // No longer used for main sidebar\n });\n\n // Update internal selected thread if prop changes\n useEffect(() => {\n if (currentThreadId !== state.selectedThreadId) {\n setState(prev => ({ ...prev, selectedThreadId: currentThreadId }));\n }\n }, [currentThreadId]);\n\n // Refs\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const scrollAreaRef = useRef<HTMLDivElement>(null);\n\n // Mobile custom overlay mount/unmount for smooth transitions\n const [isCustomMounted, setIsCustomMounted] = useState(false);\n const [isCustomVisible, setIsCustomVisible] = useState(false);\n\n // Create state callback helpers\n const createStateCallback = useCallback(\n (setter?: (value: React.SetStateAction<ChatState>) => void): StateCallback<ChatState> => ({\n setState: (newState) => setter?.(newState),\n getState: () => state,\n }),\n [state]\n );\n\n // Mobile detection effect\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(globalThis.innerWidth < 1024); // lg breakpoint\n };\n\n checkMobile();\n globalThis.addEventListener('resize', checkMobile);\n return () => globalThis.removeEventListener('resize', checkMobile);\n }, []);\n\n // Animate mobile custom component overlay\n useEffect(() => {\n if (!isMobile || !config.customComponent?.component) return;\n if (state.showSidebar) {\n setIsCustomMounted(true);\n requestAnimationFrame(() => setIsCustomVisible(true));\n } else {\n setIsCustomVisible(false);\n const t = setTimeout(() => setIsCustomMounted(false), 200);\n return () => clearTimeout(t);\n }\n }, [state.showSidebar, isMobile, config.customComponent]);\n\n // Auto-scroll to bottom\n useEffect(() => {\n if (!state.isAtBottom) return;\n const viewport = scrollAreaRef.current;\n if (!viewport) return;\n const target = viewport.scrollHeight;\n try {\n viewport.scrollTo({ top: target, behavior: 'smooth' });\n } catch {\n viewport.scrollTop = target;\n }\n }, [messages, state.isAtBottom]);\n\n // Handle scroll position\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollHeight, clientHeight } = e.currentTarget;\n const isAtBottom = scrollHeight - scrollTop - clientHeight < 50;\n setState(prev => ({ ...prev, isAtBottom }));\n }, []);\n\n // Message handling\n const handleSendMessage = useCallback((\n content: string,\n attachments: MediaAttachment[] = []\n ) => {\n if (!content.trim() && attachments.length === 0) return;\n \n // Call external callback\n callbacks.onSendMessage?.(content, attachments, createStateCallback());\n\n // Clear input\n setState(prev => ({\n ...prev,\n input: '',\n attachments: []\n }));\n }, [callbacks, createStateCallback]);\n\n // Message actions\n const handleMessageAction = useCallback((event: MessageActionEvent) => {\n const { action, messageId, content } = event;\n\n switch (action) {\n case 'copy':\n callbacks.onCopyMessage?.(messageId, content || '', createStateCallback());\n break;\n case 'edit':\n if (content) {\n callbacks.onEditMessage?.(messageId, content, createStateCallback());\n }\n break;\n case 'regenerate':\n callbacks.onRegenerateMessage?.(messageId, createStateCallback());\n break;\n case 'delete':\n callbacks.onDeleteMessage?.(messageId, createStateCallback());\n break;\n }\n }, [callbacks, createStateCallback]);\n\n // Thread management\n const handleCreateThread = useCallback((title?: string) => {\n callbacks.onCreateThread?.(title, createStateCallback(setState));\n }, [callbacks, createStateCallback]);\n\n const handleSelectThread = useCallback((threadId: string) => {\n callbacks.onSelectThread?.(threadId, createStateCallback());\n }, [callbacks, createStateCallback]);\n\n const handleRenameThread = useCallback((threadId: string, newTitle: string) => {\n callbacks.onRenameThread?.(threadId, newTitle, createStateCallback());\n }, [callbacks, createStateCallback]);\n\n const handleDeleteThread = useCallback((threadId: string) => {\n callbacks.onDeleteThread?.(threadId, createStateCallback());\n }, [callbacks, createStateCallback]);\n\n const handleArchiveThread = useCallback((threadId: string) => {\n callbacks.onArchiveThread?.(threadId, createStateCallback());\n }, [callbacks, createStateCallback]);\n\n // Close sidebar handler\n const closeSidebar = useCallback(() => {\n setState(prev => ({ ...prev, showSidebar: false }));\n }, []);\n\n // Render custom component with props if it's a function\n const renderCustomComponent = useCallback(() => {\n const component = config?.customComponent?.component;\n if (!component) return null;\n if (typeof component === 'function') {\n return component({ onClose: closeSidebar, isMobile });\n }\n return component;\n }, [config?.customComponent?.component, closeSidebar, isMobile]);\n\n // Render suggestions\n const renderSuggestions = () => {\n if (messages.length > 0 || !suggestions.length) return null;\n\n return (\n <div className=\"text-center py-8\">\n <div className=\"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 mb-4\">\n <Sparkles className=\"w-8 h-8 text-primary\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">{config.branding.title}</h3>\n <p className=\"text-muted-foreground mb-6\">{config.branding.subtitle}</p>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3 max-w-2xl mx-auto\">\n {suggestions.map((suggestion, index) => (\n <Card\n key={index}\n className=\"cursor-pointer hover:bg-muted/50 transition-colors\"\n onClick={() => handleSendMessage(suggestion)}\n >\n <CardContent className=\"p-4 text-left\">\n <p className=\"text-sm\">{suggestion}</p>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n };\n\n return (\n <TooltipProvider>\n <SidebarProvider defaultOpen>\n <div className={`flex h-[100svh] md:h-screen bg-background w-full overflow-hidden ${className}`}>\n \n <Sidebar\n threads={threads}\n currentThreadId={state.selectedThreadId}\n config={config}\n onCreateThread={handleCreateThread}\n onSelectThread={handleSelectThread}\n onRenameThread={handleRenameThread}\n onDeleteThread={handleDeleteThread}\n onArchiveThread={handleArchiveThread}\n // User menu props\n user={user ? {\n id: user.id,\n name: user.name,\n email: user.email,\n avatar: user.avatar,\n } : null}\n userMenuCallbacks={{\n onViewProfile: () => {\n setIsUserProfileOpen(true);\n callbacks.onViewProfile?.();\n },\n onOpenSettings: callbacks.onOpenSettings,\n onThemeChange: callbacks.onThemeChange,\n onLogout: callbacks.onLogout,\n }}\n currentTheme={config.ui.theme === 'auto' ? 'system' : config.ui.theme}\n showThemeOptions={!!callbacks.onThemeChange}\n />\n\n <SidebarInset>\n <div className=\"flex flex-col h-full min-h-0\">\n {/* Header */}\n <ChatHeader\n config={config}\n currentThreadTitle={threads.find(t => t.id === state.selectedThreadId)?.title}\n // onSidebarToggle is now handled by SidebarTrigger inside ChatHeader\n isMobile={isMobile}\n onCustomComponentToggle={() => setState(prev => ({ ...prev, showSidebar: !prev.showSidebar }))}\n onNewThread={handleCreateThread}\n showCustomComponentButton={!!config?.customComponent?.component}\n />\n\n <div className=\"flex flex-1 flex-row min-h-0 overflow-hidden\">\n {/* Main Chat Area */}\n <div className=\"flex-1 flex flex-col min-h-0\">\n {/* Messages */}\n <ScrollArea\n ref={scrollAreaRef}\n className=\"flex-1 min-h-0\"\n viewportClassName=\"p-4 overscroll-contain\"\n onScrollCapture={handleScroll}\n >\n <div className=\"max-w-4xl mx-auto space-y-4 pb-4\">\n {renderSuggestions()}\n\n {messages.map((message) => (\n <Message\n key={message.id}\n message={message}\n userAvatar={user?.avatar}\n userName={user?.name}\n assistantAvatar={assistant?.avatar}\n assistantName={assistant?.name}\n showTimestamp={config.ui.showTimestamps}\n showAvatar={config.ui.showAvatars}\n enableCopy={config.features.enableMessageCopy}\n enableEdit={config.features.enableMessageEditing}\n enableRegenerate={config.features.enableRegeneration}\n enableToolCallsDisplay={config.features.enableToolCallsDisplay}\n compactMode={config.ui.compactMode}\n onAction={handleMessageAction}\n toolUsedLabel={config.labels.toolUsed}\n thinkingLabel={config.labels.thinking}\n />\n ))}\n\n <div ref={messagesEndRef} />\n </div>\n </ScrollArea>\n\n {/* Input */}\n <div className=\"bg-background pb-[env(safe-area-inset-bottom)]\">\n <ChatInput\n value={state.input}\n onChange={(value) => setState(prev => ({ ...prev, input: value }))}\n onSubmit={handleSendMessage}\n attachments={state.attachments}\n onAttachmentsChange={(attachments) =>\n setState(prev => ({ ...prev, attachments }))\n }\n placeholder={config.labels.inputPlaceholder}\n disabled={false}\n isGenerating={isGenerating}\n onStopGeneration={callbacks.onStopGeneration}\n enableFileUpload={config.features.enableFileUpload}\n enableAudioRecording={config.features.enableAudioRecording}\n maxAttachments={config.features.maxAttachments}\n maxFileSize={config.features.maxFileSize}\n config={config}\n />\n </div>\n </div>\n\n {/* Right sidebar custom component for desktop */}\n {config?.customComponent?.component && !isMobile && (\n <div\n className={`h-full transition-all duration-300 ease-in-out overflow-hidden ${\n state.showSidebar ? 'w-80' : 'w-0'\n }`}\n >\n {state.showSidebar && (\n <div className=\"flex flex-col h-full border-l bg-background animate-in slide-in-from-right-4 duration-300 w-80\">\n {renderCustomComponent()}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </SidebarInset>\n\n {/* Mobile custom sidebar overlay with smooth transitions (slides from right) */}\n {isCustomMounted && config.customComponent?.component && isMobile && (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n <div\n className={`absolute inset-0 bg-background/80 backdrop-blur-sm transition-opacity duration-200 ease-out ${\n isCustomVisible ? 'opacity-100' : 'opacity-0'\n }`}\n style={{ willChange: 'opacity' }}\n onClick={closeSidebar}\n />\n {/* Panel - slides from right */}\n <div\n className={`absolute top-0 right-0 h-full w-full bg-background transform-gpu transition-transform duration-200 ease-out ${\n isCustomVisible ? 'translate-x-0' : 'translate-x-full'\n }`}\n style={{ willChange: 'transform' }}\n >\n <div className=\"h-full flex flex-col\">\n {renderCustomComponent()}\n </div>\n </div>\n </div>\n )}\n\n {/* Built-in User Profile Panel */}\n <UserProfile\n isOpen={isUserProfileOpen}\n onClose={() => setIsUserProfileOpen(false)}\n user={user ? {\n id: user.id,\n name: user.name,\n email: user.email,\n avatar: user.avatar,\n } : null}\n customFields={userContext?.customFields}\n memories={userContext?.memories?.items}\n onLogout={callbacks.onLogout}\n onAddMemory={onAddMemory}\n onUpdateMemory={onUpdateMemory}\n onDeleteMemory={onDeleteMemory}\n />\n </div>\n </SidebarProvider>\n </TooltipProvider>\n );\n};\n","import { ChatConfig } from '../types/chatTypes';\n\n// Default configuration\nexport const defaultChatConfig: Required<ChatConfig> = {\n\n branding: {\n logo: null,\n avatar: null,\n title: 'Chat Assistant',\n subtitle: 'How can I help you today?',\n },\n \n labels: {\n inputPlaceholder: 'Type your message...',\n sendButton: 'Send',\n sendMessageTooltip: 'Send message',\n newThread: 'New Conversation',\n deleteThread: 'Delete Conversation',\n copyMessage: 'Copy',\n editMessage: 'Edit',\n regenerateMessage: 'Regenerate',\n stopGeneration: 'Stop',\n stopGenerationTooltip: 'Stop generation',\n attachFiles: 'Attach Files',\n attachFileTooltip: 'Attach file',\n recordAudio: 'Record Audio',\n recordAudioTooltip: 'Record audio',\n // Header labels\n exportData: 'Export data',\n importData: 'Import data',\n clearAll: 'Clear all',\n sidebarToggle: 'Menu',\n customComponentToggle: 'Toggle',\n settings: 'Settings',\n toggleDarkMode: 'Toggle Dark Mode',\n lightMode: 'Light Mode',\n darkMode: 'Dark Mode',\n // Sidebar labels\n newChat: 'New Conversation',\n search: 'Search conversations...',\n customComponentLabel: 'Custom',\n showArchived: 'Show Archived',\n hideArchived: 'Hide Archived',\n noThreadsFound: 'No conversations found',\n noThreadsYet: 'No conversations yet',\n deleteConfirmTitle: 'Delete Conversation',\n deleteConfirmDescription: 'Are you sure you want to delete this conversation? This action cannot be undone. All messages will be permanently lost.',\n renameThread: 'Rename',\n archiveThread: 'Archive',\n unarchiveThread: 'Unarchive',\n today: 'Today',\n yesterday: 'Yesterday',\n createNewThread: 'Create New Conversation',\n threadNamePlaceholder: 'Conversation name (optional)',\n cancel: 'Cancel',\n create: 'Create Conversation',\n footerLabel: 'Assistant can make mistakes. Check the AI results.',\n toolUsed: 'Tool Used',\n daysAgo: 'days ago',\n inputHelpText: 'Press Enter to send, Shift+Enter to add a new line.',\n thinking: 'Thinking...',\n defaultThreadName: 'Main Thread',\n },\n \n features: {\n enableThreads: true,\n enableFileUpload: true,\n enableAudioRecording: true,\n enableMessageEditing: true,\n enableMessageCopy: true,\n enableRegeneration: true,\n enableToolCallsDisplay: true,\n maxAttachments: 4,\n maxFileSize: 10 * 1024 * 1024, // 10MB\n },\n \n ui: {\n theme: 'auto' as const,\n showTimestamps: false,\n showAvatars: true,\n compactMode: false,\n showWordCount: false,\n },\n \n customComponent: {},\n headerActions: null,\n};\n\n// Deep merge function for configurations\nexport function mergeConfig(_baseConfig: ChatConfig, userConfig?: Partial<ChatConfig>): Required<ChatConfig> {\n if (!userConfig) return defaultChatConfig;\n\n return {\n branding: {\n ...defaultChatConfig.branding,\n ...userConfig.branding,\n },\n labels: {\n ...defaultChatConfig.labels,\n ...userConfig.labels,\n },\n features: {\n ...defaultChatConfig.features,\n ...userConfig.features,\n },\n ui: {\n ...defaultChatConfig.ui,\n ...userConfig.ui,\n },\n customComponent: userConfig.customComponent || defaultChatConfig.customComponent,\n headerActions: userConfig.headerActions || defaultChatConfig.headerActions,\n };\n}\n\n// Predefined configuration presets\nexport const chatConfigPresets = {\n minimal: {\n features: {\n enableThreads: false,\n enableFileUpload: false,\n enableAudioRecording: false,\n enableMessageEditing: false,\n enableMessageCopy: true,\n enableRegeneration: true,\n enableToolCallsDisplay: false,\n },\n ui: {\n compactMode: true,\n showTimestamps: false,\n showAvatars: false,\n },\n } as Partial<ChatConfig>,\n\n full: {\n features: {\n enableThreads: true,\n enableFileUpload: true,\n enableAudioRecording: true,\n enableMessageEditing: true,\n enableMessageCopy: true,\n enableRegeneration: true,\n enableToolCallsDisplay: true,\n },\n ui: {\n showTimestamps: true,\n showAvatars: true,\n compactMode: false,\n showWordCount: true,\n },\n } as Partial<ChatConfig>,\n\n developer: {\n features: {\n enableThreads: true,\n enableFileUpload: true,\n enableAudioRecording: false,\n enableMessageEditing: true,\n enableMessageCopy: true,\n enableRegeneration: true,\n enableToolCallsDisplay: true,\n },\n ui: {\n showTimestamps: true,\n showAvatars: true,\n compactMode: false,\n showWordCount: true,\n },\n } as Partial<ChatConfig>,\n\n customer_support: {\n branding: {\n title: 'Customer Support',\n subtitle: 'How can I help you today?',\n },\n features: {\n enableThreads: true,\n enableFileUpload: true,\n enableAudioRecording: false,\n enableMessageEditing: false,\n enableMessageCopy: true,\n enableRegeneration: false,\n enableToolCallsDisplay: false,\n },\n ui: {\n showTimestamps: true,\n showAvatars: true,\n compactMode: false,\n },\n } as Partial<ChatConfig>,\n} as const;\n\n// Configuration validation\nexport function validateConfig(config: ChatConfig): string[] {\n const errors: string[] = [];\n\n // Validate features\n if (config.features?.maxAttachments && config.features.maxAttachments < 1) {\n errors.push('maxAttachments must be at least 1');\n }\n\n if (config.features?.maxFileSize && config.features.maxFileSize < 1024) {\n errors.push('maxFileSize must be at least 1024 bytes (1KB)');\n }\n\n // Validate branding\n if (config.branding?.title && typeof config.branding.title !== 'string') {\n errors.push('branding.title must be a string');\n }\n\n return errors;\n}\n\n// Theme utilities\nexport const themeUtils = {\n getSystemTheme: (): 'light' | 'dark' => {\n if (typeof globalThis.matchMedia === 'undefined') return 'light';\n return globalThis.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n },\n\n resolveTheme: (theme: 'light' | 'dark' | 'auto'): 'light' | 'dark' => {\n return theme === 'auto' ? themeUtils.getSystemTheme() : theme;\n },\n\n applyTheme: (theme: 'light' | 'dark' | 'auto') => {\n if (typeof document === 'undefined') return;\n \n const resolvedTheme = themeUtils.resolveTheme(theme);\n document.documentElement.classList.toggle('dark', resolvedTheme === 'dark');\n },\n};\n\n// Feature flags utility\nexport const featureFlags = {\n isEnabled: (config: Required<ChatConfig>, feature: keyof Required<ChatConfig>['features']): boolean => {\n return config.features[feature] === true;\n },\n\n getEnabledFeatures: (config: Required<ChatConfig>): string[] => {\n return Object.entries(config.features)\n .filter(([_, enabled]) => enabled === true)\n .map(([feature]) => feature);\n },\n\n hasAnyFeature: (config: Required<ChatConfig>, features: (keyof Required<ChatConfig>['features'])[]): boolean => {\n return features.some(feature => featureFlags.isEnabled(config, feature));\n },\n};\n\n// Configuration hooks for React components\nexport const configUtils = {\n createConfigHook: (config: Required<ChatConfig>) => {\n return {\n config,\n isFeatureEnabled: (feature: keyof Required<ChatConfig>['features']) => \n featureFlags.isEnabled(config, feature),\n getLabel: (key: keyof Required<ChatConfig>['labels']) => \n config.labels[key],\n getBranding: () => config.branding,\n getUI: () => config.ui,\n };\n },\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeHighlight from 'rehype-highlight';\nimport { ChatMessage, MediaAttachment, ToolCall, MessageActionEvent } from '../../types/chatTypes';\nimport { Button } from '../ui/button';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport { Badge } from '../ui/badge';\nimport { Card, CardContent } from '../ui/card';\nimport { Textarea } from '../ui/textarea';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip';\nimport {\n Copy,\n Edit,\n RotateCcw,\n Check,\n X,\n Play,\n Pause,\n Wrench,\n Clock,\n ChevronRight,\n ChevronDown\n} from 'lucide-react';\n\n\ninterface MessageProps {\n message: ChatMessage;\n isUser?: boolean;\n userAvatar?: string;\n userName?: string;\n assistantAvatar?: React.ReactNode;\n assistantName?: string;\n showTimestamp?: boolean;\n showAvatar?: boolean;\n enableCopy?: boolean;\n enableEdit?: boolean;\n enableRegenerate?: boolean;\n enableToolCallsDisplay?: boolean;\n compactMode?: boolean;\n onAction?: (event: MessageActionEvent) => void;\n className?: string;\n toolUsedLabel?: string;\n thinkingLabel?: string;\n}\n\n// Thinking indicator component\nconst ThinkingIndicator: React.FC<{ label?: string }> = ({ label = 'Thinking...' }) => {\n return (\n <div className=\"flex items-center gap-2 py-2\">\n <div className=\"flex gap-1\">\n <span \n className=\"inline-block w-2 h-2 bg-primary rounded-full animate-bounce\" \n style={{ animationDelay: '0ms' }} \n />\n <span \n className=\"inline-block w-2 h-2 bg-primary rounded-full animate-bounce\" \n style={{ animationDelay: '150ms' }} \n />\n <span \n className=\"inline-block w-2 h-2 bg-primary rounded-full animate-bounce\" \n style={{ animationDelay: '300ms' }} \n />\n </div>\n <span className=\"text-sm text-muted-foreground animate-pulse\">{label}</span>\n </div>\n );\n};\n\n// Streaming text component for real-time markdown rendering\nconst StreamingText: React.FC<{ content: string; isStreaming?: boolean; thinkingLabel?: string }> = ({\n content,\n isStreaming = false,\n thinkingLabel = 'Thinking...'\n}) => {\n const hasContent = content.trim().length > 0;\n\n return (\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n {hasContent ? (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={isStreaming ? [] : [rehypeHighlight]}\n components={{\n code: ({ node, className, children, ...props }) => {\n const inline = (props as { inline?: boolean }).inline;\n const match = /language-(\\w+)/.exec(className || '');\n return !inline && match ? (\n <pre className=\"relative\">\n <code className={className} {...props}>\n {children}\n </code>\n </pre>\n ) : (\n <code className=\"bg-muted px-1 py-0.5 rounded text-sm\" {...props}>\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n ) : isStreaming ? (\n // Show thinking indicator while waiting for first token\n <ThinkingIndicator label={thinkingLabel} />\n ) : null}\n {isStreaming && hasContent && (\n <span className=\"inline-block w-2 h-4 bg-primary animate-pulse ml-1\" />\n )}\n </div>\n );\n};\n\n// Media attachment renderer\nconst MediaRenderer: React.FC<{ attachment: MediaAttachment }> = ({ attachment }) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const audioRef = useRef<HTMLAudioElement>(null);\n const videoRef = useRef<HTMLVideoElement>(null);\n\n const togglePlayback = () => {\n if (attachment.kind === 'audio' && audioRef.current) {\n if (isPlaying) {\n audioRef.current.pause();\n } else {\n audioRef.current.play();\n }\n setIsPlaying(!isPlaying);\n } else if (attachment.kind === 'video' && videoRef.current) {\n if (isPlaying) {\n videoRef.current.pause();\n } else {\n videoRef.current.play();\n }\n setIsPlaying(!isPlaying);\n }\n };\n\n const formatDuration = (ms?: number) => {\n if (!ms) return '';\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n return `${minutes}:${(seconds % 60).toString().padStart(2, '0')}`;\n };\n\n switch (attachment.kind) {\n case 'image':\n return (\n <div className=\"relative rounded-lg overflow-hidden border bg-muted/20 max-w-md\">\n <img\n src={attachment.dataUrl}\n alt={attachment.fileName || 'Attachment'}\n className=\"w-full h-auto object-cover\"\n loading=\"lazy\"\n />\n {attachment.fileName && (\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/50 text-white text-xs p-2\">\n {attachment.fileName}\n </div>\n )}\n </div>\n );\n\n case 'audio':\n return (\n <div className=\"flex w-full max-w-md py-0 min-w-64 items-center gap-3\">\n <audio\n ref={audioRef}\n src={attachment.dataUrl}\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onEnded={() => setIsPlaying(false)}\n className=\"w-full mt-2\"\n controls\n />\n </div>\n );\n\n case 'video':\n return (\n <div className=\"relative rounded-lg overflow-hidden border bg-muted/20 max-w-lg\">\n <video\n ref={videoRef}\n src={attachment.dataUrl}\n poster={attachment.poster}\n controls\n className=\"w-full h-auto\"\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onEnded={() => setIsPlaying(false)}\n />\n {attachment.fileName && (\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/50 text-white text-xs p-2\">\n {attachment.fileName}\n </div>\n )}\n </div>\n );\n\n default:\n return null;\n }\n};\n\n// Tool calls display component\nconst ToolCallsDisplay: React.FC<{ toolCalls: ToolCall[]; label?: string }> = ({ toolCalls, label }) => {\n const [expandedCall, setExpandedCall] = useState<string | null>(null);\n\n const getStatusIcon = (status: ToolCall['status']) => {\n switch (status) {\n case 'pending':\n return <Clock className=\"h-3 w-3 text-muted-foreground\" />;\n case 'running':\n return <div className=\"h-3 w-3 border-2 border-primary border-t-transparent rounded-full animate-spin\" />;\n case 'completed':\n return <Check className=\"h-3 w-3 text-green-500\" />;\n case 'failed':\n return <X className=\"h-3 w-3 text-destructive\" />;\n }\n };\n\n const getStatusBadgeClasses = (status: ToolCall['status']) => {\n switch (status) {\n case 'pending':\n return 'bg-muted text-muted-foreground';\n case 'running':\n return 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300';\n case 'completed':\n return 'bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-300';\n case 'failed':\n return 'bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-300';\n }\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-xs uppercase tracking-wide text-muted-foreground font-semibold\">\n <Wrench className=\"h-3 w-3\" />\n {label || 'Ferramenta utilizada'}\n </div>\n {toolCalls.map((call) => {\n const isExpanded = expandedCall === call.id;\n const ToggleIcon = isExpanded ? ChevronDown : ChevronRight;\n\n return (\n <Card key={call.id} className=\"border border-dashed border-primary/40 bg-card/60\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between gap-3 px-3 py-2 text-left\"\n onClick={() => setExpandedCall(isExpanded ? null : call.id)}\n >\n <div className=\"flex items-center gap-2\">\n {getStatusIcon(call.status)}\n <span className=\"font-medium text-sm\">{call.name}</span>\n <Badge variant=\"secondary\" className={getStatusBadgeClasses(call.status)}>\n {call.status}\n </Badge>\n </div>\n <ToggleIcon className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n {isExpanded && (\n <CardContent className=\"pt-0 pb-3 px-3 text-xs space-y-2\">\n <div>\n <div className=\"font-medium text-muted-foreground mb-1\">Args</div>\n <pre className=\"rounded bg-muted p-2 overflow-x-auto text-xs\">\n {JSON.stringify(call.arguments, null, 2)}\n </pre>\n </div>\n {typeof call.result !== 'undefined' && (\n <div>\n <div className=\"font-medium text-muted-foreground mb-1\">Result</div>\n <pre className=\"rounded bg-muted p-2 overflow-x-auto text-xs\">\n {JSON.stringify(call.result, null, 2)}\n </pre>\n </div>\n )}\n {call.startTime && call.endTime && (\n <div className=\"text-muted-foreground\">\n Executed in {call.endTime - call.startTime}ms\n </div>\n )}\n </CardContent>\n )}\n </Card>\n );\n })}\n </div>\n );\n};\n\nexport const Message: React.FC<MessageProps> = ({\n message,\n isUser,\n userAvatar,\n userName = 'Você',\n assistantAvatar,\n assistantName = 'Assistente',\n showTimestamp = false,\n showAvatar = true,\n enableCopy = true,\n enableEdit = true,\n enableRegenerate = true,\n enableToolCallsDisplay = false,\n compactMode = false,\n onAction,\n className = '',\n toolUsedLabel,\n thinkingLabel = 'Thinking...',\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editContent, setEditContent] = useState(message.content);\n const [showActions, setShowActions] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const messageIsUser = isUser ?? message.role === 'user';\n const canEdit = enableEdit && messageIsUser;\n const canRegenerate = enableRegenerate && !messageIsUser;\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(message.content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onAction?.({ action: 'copy', messageId: message.id, content: message.content });\n } catch (error) {\n console.error('Failed to copy message:', error);\n }\n };\n\n const handleEdit = () => {\n if (isEditing) {\n if (editContent.trim() !== message.content) {\n onAction?.({ action: 'edit', messageId: message.id, content: editContent.trim() });\n }\n setIsEditing(false);\n } else {\n setEditContent(message.content);\n setIsEditing(true);\n }\n };\n\n const handleCancelEdit = () => {\n setEditContent(message.content);\n setIsEditing(false);\n };\n\n const handleRegenerate = () => {\n onAction?.({ action: 'regenerate', messageId: message.id });\n };\n\n const formatTime = (timestamp: number) => {\n return new Date(timestamp).toLocaleTimeString('pt-BR', {\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n return (\n <TooltipProvider>\n <div\n className={`flex w-full flex-col ${className} max-w-[800px] mx-auto`}\n onMouseEnter={() => setShowActions(true)}\n onMouseLeave={() => setShowActions(false)}\n >\n\n <div className={`flex gap-3 ${messageIsUser ? 'flex-row-reverse' : 'flex-row'} w-full mb-1`}>\n {/* Avatar */}\n {showAvatar && (\n <div className={`flex-shrink-0 ${compactMode ? 'mt-1' : 'mt-0'}`}>\n <Avatar className={compactMode ? 'h-6 w-6' : 'h-8 w-8'}>\n {messageIsUser ? (\n <>\n <AvatarImage src={userAvatar} alt={userName} />\n <AvatarFallback className=\"bg-primary text-primary-foreground\">\n {userName.charAt(0).toUpperCase()}\n </AvatarFallback>\n </>\n ) : (\n <>\n {assistantAvatar || (\n <AvatarFallback className=\"bg-secondary text-secondary-foreground\">\n AI\n </AvatarFallback>\n )}\n </>\n )}\n </Avatar>\n </div>\n )}\n\n {/* Message Content */}\n {/* Header */}\n <div className={`flex items-center gap-2 mb-1 ${messageIsUser ? 'flex-row-reverse' : 'flex-row'}`}>\n <span className={`font-medium ${compactMode ? 'text-sm' : 'text-base'}`}>\n {messageIsUser ? userName : assistantName}\n </span>\n {showTimestamp && (\n <span className=\"text-xs text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {message.isEdited && (\n <Badge variant=\"outline\" className=\"text-xs\">\n editado\n </Badge>\n )}\n </div>\n </div>\n\n <div className={`flex-1 min-w-0 ${messageIsUser ? 'text-right' : 'text-left'}`}>\n\n {/* Message Body */}\n <div className={`relative inline-flex flex-col ${messageIsUser\n ? 'rounded-lg p-3 bg-primary text-primary-foreground ml-auto max-w-[85%]'\n : 'max-w-[85%]'\n }`}>\n {isEditing ? (\n <div className=\"space-y-2\">\n <Textarea\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n className=\"min-h-[100px] resize-none\"\n autoFocus\n />\n <div className=\"flex gap-2 justify-end\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleCancelEdit}>\n <X className=\"h-4 w-4 mr-1\" />\n Cancelar\n </Button>\n <Button size=\"sm\" onClick={handleEdit}>\n <Check className=\"h-4 w-4 mr-1\" />\n Salvar\n </Button>\n </div>\n </div>\n ) : (\n <>\n {/* Tool Calls */}\n {enableToolCallsDisplay && message.toolCalls && message.toolCalls.length > 0 && (\n <div className=\"mb-3\">\n <ToolCallsDisplay toolCalls={message.toolCalls} label={toolUsedLabel} />\n </div>\n )}\n\n <StreamingText\n content={message.content}\n isStreaming={message.isStreaming}\n thinkingLabel={thinkingLabel}\n />\n\n {/* Attachments */}\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {message.attachments.map((attachment, index) => (\n <MediaRenderer key={index} attachment={attachment} />\n ))}\n </div>\n )}\n </>\n )}\n\n {/* Action Buttons */}\n {!isEditing && (showActions || copied) && (\n <div className={`absolute -top-2 flex gap-1 ${messageIsUser ? '-left-2' : '-right-2'\n }`}>\n {enableCopy && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={handleCopy}\n >\n {copied ? (\n <Check className=\"h-3 w-3 text-green-500\" />\n ) : (\n <Copy className=\"h-3 w-3\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {copied ? 'Copiado!' : 'Copiar'}\n </TooltipContent>\n </Tooltip>\n )}\n\n {canEdit && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={handleEdit}\n >\n <Edit className=\"h-3 w-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n Editar\n </TooltipContent>\n </Tooltip>\n )}\n\n {canRegenerate && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={handleRegenerate}\n >\n <RotateCcw className=\"h-3 w-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n Regenerar\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </TooltipProvider>\n );\n};\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport type { ChatConfig } from \"../types/chatTypes\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport const formatDate = (timestamp: number, labels?: ChatConfig['labels']) => {\n const date = new Date(timestamp);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return labels?.today || 'Today';\n } else if (diffDays === 1) {\n return labels?.yesterday || 'Yesterday';\n } else if (diffDays < 7) {\n return `${diffDays} ${labels?.daysAgo || 'days ago'}`;\n } else {\n return date.toLocaleDateString('en-US', {\n day: '2-digit',\n month: 'short',\n });\n }\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-primary 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 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React, { useState, useRef, useEffect } from 'react';\nimport { ChatThread } from '../../types/chatTypes';\nimport { Button } from '../ui/button';\nimport { Input } from '../ui/input';\nimport {\n Sidebar as ShadcnSidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarRail,\n useSidebar,\n} from '../ui/sidebar';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '../ui/dialog';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '../ui/alert-dialog';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport {\n Plus,\n MoreHorizontal,\n Edit2,\n Trash2,\n Archive,\n Search,\n Filter,\n} from 'lucide-react';\nimport { UserMenu, UserMenuUser, UserMenuCallbacks, UserMenuConfig } from './UserMenu';\n\nexport interface SidebarConfig {\n labels?: {\n newChat?: string;\n search?: string;\n customComponentLabel?: string;\n showArchived?: string;\n hideArchived?: string;\n noThreadsFound?: string;\n noThreadsYet?: string;\n deleteConfirmTitle?: string;\n deleteConfirmDescription?: string;\n renameThread?: string;\n archiveThread?: string;\n unarchiveThread?: string;\n deleteThread?: string;\n today?: string;\n yesterday?: string;\n createNewThread?: string;\n threadNamePlaceholder?: string;\n cancel?: string;\n create?: string;\n daysAgo?: string;\n };\n branding?: {\n logo?: React.ReactNode;\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n };\n userMenu?: UserMenuConfig;\n}\n\nexport interface SidebarProps extends React.ComponentProps<typeof ShadcnSidebar> {\n threads: ChatThread[];\n currentThreadId?: string | null;\n config: SidebarConfig;\n onCreateThread?: (title?: string) => void;\n onSelectThread?: (threadId: string) => void;\n onRenameThread?: (threadId: string, newTitle: string) => void;\n onDeleteThread?: (threadId: string) => void;\n onArchiveThread?: (threadId: string) => void;\n // User menu props\n user?: UserMenuUser | null;\n userMenuCallbacks?: UserMenuCallbacks;\n currentTheme?: 'light' | 'dark' | 'system';\n showThemeOptions?: boolean;\n /** Additional items to render in the user menu */\n userMenuAdditionalItems?: React.ReactNode;\n}\n\n// Create thread dialog\nconst CreateThreadDialog: React.FC<{\n config: SidebarConfig;\n onCreateThread: (title?: string) => void;\n trigger?: React.ReactNode;\n}> = ({ config, onCreateThread, trigger }) => {\n const [title, setTitle] = useState('');\n const [isOpen, setIsOpen] = useState(false);\n\n const handleCreate = () => {\n onCreateThread(title.trim() || undefined);\n setTitle('');\n setIsOpen(false);\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n <DialogTrigger asChild>\n {trigger || (\n <Button className=\"w-full justify-start\" variant=\"outline\">\n <Plus className=\"mr-2 h-4 w-4\" />\n {config.labels?.newChat || 'New Chat'}\n </Button>\n )}\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{config.labels?.createNewThread || 'New Conversation'}</DialogTitle>\n <DialogDescription>\n Give your new conversation a name or leave blank to auto-generate one.\n </DialogDescription>\n </DialogHeader>\n <Input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={config.labels?.threadNamePlaceholder || \"Conversation name\"}\n onKeyDown={(e) => e.key === 'Enter' && handleCreate()}\n autoFocus\n />\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setIsOpen(false)}>\n {config.labels?.cancel || 'Cancel'}\n </Button>\n <Button onClick={handleCreate}>\n {config.labels?.create || 'Create'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst ThreadInitialsIcon = ({ title }: { title: string }) => {\n const initials = title\n ?.split(' ')\n .map((n) => n[0])\n .slice(0, 2)\n .join('')\n .toUpperCase() || '?';\n \n return (\n <div className=\"flex shrink-0 items-center justify-center rounded bg-muted text-[10px] font-medium\">\n {initials}\n </div>\n );\n};\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n threads,\n currentThreadId,\n config,\n onCreateThread,\n onSelectThread,\n onRenameThread,\n onDeleteThread,\n onArchiveThread,\n // User menu props\n user,\n userMenuCallbacks,\n currentTheme,\n showThemeOptions = true,\n userMenuAdditionalItems,\n ...props\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [showArchived, setShowArchived] = useState(false);\n const [deleteThreadId, setDeleteThreadId] = useState<string | null>(null);\n const [editingThreadId, setEditingThreadId] = useState<string | null>(null);\n const [editTitle, setEditTitle] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n \n // Use the sidebar context to control expansion\n const { setOpen } = useSidebar();\n\n useEffect(() => {\n if (editingThreadId && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [editingThreadId]);\n\n // Filter threads based on search and archive filter\n const filteredThreads = threads.filter(thread => {\n const title = (thread.title ?? '').toString();\n const matchesSearch = title.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesArchiveFilter = showArchived || !thread.isArchived;\n return matchesSearch && matchesArchiveFilter;\n });\n\n // Group threads by date\n const groupedThreads = filteredThreads.reduce((groups, thread) => {\n const date = new Date(thread.updatedAt);\n const today = new Date();\n const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);\n\n let groupKey: string;\n if (date.toDateString() === today.toDateString()) {\n groupKey = config.labels?.today || 'Today';\n } else if (date.toDateString() === yesterday.toDateString()) {\n groupKey = config.labels?.yesterday || 'Yesterday';\n } else {\n groupKey = date.toLocaleDateString('en-US', {\n weekday: 'long',\n day: '2-digit',\n month: 'long',\n });\n }\n\n if (!groups[groupKey]) {\n groups[groupKey] = [];\n }\n groups[groupKey].push(thread);\n return groups;\n }, {} as Record<string, ChatThread[]>);\n\n const handleDeleteThread = (threadId: string) => {\n onDeleteThread?.(threadId);\n setDeleteThreadId(null);\n };\n\n const startEditing = (thread: ChatThread) => {\n setEditingThreadId(thread.id);\n setEditTitle(thread.title || '');\n };\n\n const saveEdit = () => {\n if (editingThreadId && editTitle.trim()) {\n onRenameThread?.(editingThreadId, editTitle.trim());\n }\n setEditingThreadId(null);\n };\n\n const cancelEdit = () => {\n setEditingThreadId(null);\n };\n\n return (\n <ShadcnSidebar collapsible=\"icon\" {...props}>\n <SidebarHeader>\n {/* New Chat Button */}\n {onCreateThread && (\n <CreateThreadDialog \n config={config} \n onCreateThread={onCreateThread} \n trigger={\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton\n size=\"lg\"\n className=\"w-full justify-start gap-2 border border-sidebar-border shadow-sm hover:bg-sidebar-accent hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:justify-center\"\n tooltip={config.labels?.newChat || 'New Chat'}\n >\n <Plus className=\"size-4\" />\n <span className=\"group-data-[collapsible=icon]:hidden\">{config.labels?.newChat || 'New Chat'}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n }\n />\n )}\n \n {/* Search */}\n <div className=\"px-2 py-1 mt-6\">\n {/* Expanded View: Input */}\n <div className=\"relative group-data-[collapsible=icon]:hidden\">\n <Search className=\"pointer-events-none absolute left-2 top-1/2 size-4 -translate-y-1/2 select-none opacity-50\" />\n <Input\n className=\"pl-8 h-8 bg-sidebar-accent/50 border-sidebar-border focus-visible:ring-1 focus-visible:ring-sidebar-ring\"\n placeholder={config.labels?.search || \"Search...\"}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n \n {/* Collapsed View: Search Icon Button (expands sidebar on click) */}\n <div className=\"hidden group-data-[collapsible=icon]:flex justify-center\">\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\" \n onClick={() => setOpen(true)}\n title={config.labels?.search || \"Search\"}\n >\n <Search className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </SidebarHeader>\n\n <SidebarContent>\n {/* Archive Filter Toggle (if needed) */}\n {threads.some(t => t.isArchived) && (\n <div className=\"px-4 py-2 mt-2 group-data-[collapsible=icon]:hidden\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowArchived(!showArchived)}\n className=\"h-6 text-xs w-full justify-start text-muted-foreground\"\n >\n <Filter className=\"mr-2 h-3 w-3\" />\n {showArchived ? \n (config.labels?.hideArchived || 'Hide Archived') : \n (config.labels?.showArchived || 'Show Archived')\n }\n </Button>\n </div>\n )}\n\n {Object.keys(groupedThreads).length === 0 ? (\n <div className=\"px-4 py-8 text-center text-muted-foreground group-data-[collapsible=icon]:hidden\">\n <div className=\"mx-auto h-8 w-8 mb-2 flex items-center justify-center rounded-full bg-muted/50\">\n <Plus className=\"h-4 w-4 opacity-50\" />\n </div>\n <p className=\"text-xs\">\n {searchQuery ? \n (config.labels?.noThreadsFound || 'No conversations found') : \n (config.labels?.noThreadsYet || 'No conversations yet')\n }\n </p>\n </div>\n ) : (\n Object.entries(groupedThreads).map(([group, groupThreads]) => (\n <SidebarGroup className=\"mt-2\" key={group}>\n <SidebarGroupLabel className=\"group-data-[collapsible=icon]:hidden\">{group}</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {groupThreads.map((thread) => (\n <SidebarMenuItem key={thread.id}>\n {editingThreadId === thread.id ? (\n <div className=\"flex items-center gap-1 px-2 py-1\">\n <Input\n ref={inputRef}\n value={editTitle}\n onChange={(e) => setEditTitle(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') saveEdit();\n if (e.key === 'Escape') cancelEdit();\n }}\n onBlur={saveEdit}\n className=\"h-7 text-sm\"\n />\n </div>\n ) : (\n <SidebarMenuButton\n isActive={currentThreadId === thread.id}\n onClick={() => onSelectThread?.(thread.id)}\n tooltip={thread.title}\n >\n <ThreadInitialsIcon title={thread.title || '?'} />\n <div className=\"flex flex-col items-start gap-0.5 flex-1 min-w-0 group-data-[collapsible=icon]:hidden\">\n <span className=\"truncate w-full\">{thread.title || 'New Chat'}</span>\n </div>\n {thread.isArchived && <Archive className=\"ml-auto h-3 w-3 opacity-50 group-data-[collapsible=icon]:hidden\" />}\n </SidebarMenuButton>\n )}\n \n {!editingThreadId && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuAction showOnHover>\n <MoreHorizontal />\n <span className=\"sr-only\">More</span>\n </SidebarMenuAction>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-48\" side=\"right\" align=\"start\">\n <DropdownMenuItem onClick={() => startEditing(thread)}>\n <Edit2 className=\"mr-2 h-4 w-4\" />\n <span>{config.labels?.renameThread || 'Rename'}</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => onArchiveThread?.(thread.id)}>\n <Archive className=\"mr-2 h-4 w-4\" />\n <span>\n {thread.isArchived ? \n (config.labels?.unarchiveThread || 'Unarchive') : \n (config.labels?.archiveThread || 'Archive')\n }\n </span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem \n onClick={() => setDeleteThreadId(thread.id)}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n <span>{config.labels?.deleteThread || 'Delete'}</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n ))\n )}\n </SidebarContent>\n \n <SidebarFooter>\n <UserMenu\n user={user}\n config={config.userMenu}\n callbacks={userMenuCallbacks}\n currentTheme={currentTheme}\n showThemeOptions={showThemeOptions}\n additionalItems={userMenuAdditionalItems}\n />\n </SidebarFooter>\n \n <SidebarRail />\n\n {/* Delete confirmation dialog */}\n <AlertDialog open={!!deleteThreadId} onOpenChange={() => setDeleteThreadId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{config.labels?.deleteConfirmTitle || 'Delete Conversation'}</AlertDialogTitle>\n <AlertDialogDescription>\n {config.labels?.deleteConfirmDescription ||\n 'Are you sure you want to delete this conversation? This action cannot be undone.'\n }\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>{config.labels?.cancel || 'Cancel'}</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => deleteThreadId && handleDeleteThread(deleteThreadId)}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {config.labels?.deleteThread || 'Delete'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </ShadcnSidebar>\n );\n};\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nimport { useIsMobile } from \"../../hooks/use-mobile\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Separator } from \"./separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet\"\nimport { Skeleton } from \"./skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n \n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"bg-background relative flex w-full flex-1 flex-col\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"bg-background h-8 w-full shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\n\nimport { cn } from \"../../lib/utils\"\nimport { buttonVariants } from \"./button\"\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n \"bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return (\n <AlertDialogPrimitive.Action\n className={cn(buttonVariants(), className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogCancel({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return (\n <AlertDialogPrimitive.Cancel\n className={cn(buttonVariants({ variant: \"outline\" }), className)}\n {...props}\n />\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n","import * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground 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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import React from 'react';\nimport {\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n useSidebar,\n} from '../ui/sidebar';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuLabel,\n} from '../ui/dropdown-menu';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport {\n User,\n Settings,\n LogOut,\n ChevronsUpDown,\n Moon,\n Sun,\n Palette,\n} from 'lucide-react';\n\nexport interface UserMenuConfig {\n labels?: {\n profile?: string;\n settings?: string;\n theme?: string;\n lightMode?: string;\n darkMode?: string;\n systemTheme?: string;\n logout?: string;\n guest?: string;\n };\n}\n\nexport interface UserMenuUser {\n id: string;\n name?: string;\n email?: string;\n avatar?: string;\n}\n\nexport interface UserMenuCallbacks {\n onViewProfile?: () => void;\n onOpenSettings?: () => void;\n onThemeChange?: (theme: 'light' | 'dark' | 'system') => void;\n onLogout?: () => void;\n}\n\nexport interface UserMenuProps {\n user?: UserMenuUser | null;\n config?: UserMenuConfig;\n callbacks?: UserMenuCallbacks;\n currentTheme?: 'light' | 'dark' | 'system';\n /** Show theme options in the menu */\n showThemeOptions?: boolean;\n /** Additional menu items to render */\n additionalItems?: React.ReactNode;\n}\n\n// Get initials from name or email\nconst getInitials = (name?: string, email?: string): string => {\n if (name) {\n return name\n .split(' ')\n .map((n) => n[0])\n .slice(0, 2)\n .join('')\n .toUpperCase();\n }\n if (email) {\n return email[0].toUpperCase();\n }\n return 'U';\n};\n\n// Get display name\nconst getDisplayName = (user?: UserMenuUser | null, guestLabel?: string): string => {\n if (!user) return guestLabel || 'Guest';\n return user.name || user.email?.split('@')[0] || guestLabel || 'Guest';\n};\n\nexport const UserMenu: React.FC<UserMenuProps> = ({\n user,\n config,\n callbacks,\n currentTheme = 'system',\n showThemeOptions = true,\n additionalItems,\n}) => {\n const { isMobile } = useSidebar();\n\n const labels = {\n profile: config?.labels?.profile || 'Profile',\n settings: config?.labels?.settings || 'Settings',\n theme: config?.labels?.theme || 'Theme',\n lightMode: config?.labels?.lightMode || 'Light',\n darkMode: config?.labels?.darkMode || 'Dark',\n systemTheme: config?.labels?.systemTheme || 'System',\n logout: config?.labels?.logout || 'Log out',\n guest: config?.labels?.guest || 'Guest',\n };\n\n const displayName = getDisplayName(user, labels.guest);\n const initials = getInitials(user?.name, user?.email);\n\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\"\n tooltip={displayName}\n >\n <Avatar className=\"h-8 w-8 rounded-lg\">\n {user?.avatar && <AvatarImage src={user.avatar} alt={displayName} />}\n <AvatarFallback className=\"rounded-lg bg-primary/10 text-primary text-xs font-medium\">\n {initials}\n </AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight group-data-[collapsible=icon]:hidden\">\n <span className=\"truncate font-medium\">{displayName}</span>\n {user?.email && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {user.email}\n </span>\n )}\n </div>\n <ChevronsUpDown className=\"ml-auto size-4 group-data-[collapsible=icon]:hidden\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg\"\n side={isMobile ? 'bottom' : 'right'}\n align=\"end\"\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"p-0 font-normal\">\n <div className=\"flex items-center gap-2 px-1 py-1.5 text-left text-sm\">\n <Avatar className=\"h-8 w-8 rounded-lg\">\n {user?.avatar && <AvatarImage src={user.avatar} alt={displayName} />}\n <AvatarFallback className=\"rounded-lg bg-primary/10 text-primary text-xs font-medium\">\n {initials}\n </AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{displayName}</span>\n {user?.email && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {user.email}\n </span>\n )}\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n \n {/* Profile */}\n {callbacks?.onViewProfile && (\n <DropdownMenuItem onClick={callbacks.onViewProfile}>\n <User className=\"mr-2 h-4 w-4\" />\n <span>{labels.profile}</span>\n </DropdownMenuItem>\n )}\n\n {/* Settings */}\n {callbacks?.onOpenSettings && (\n <DropdownMenuItem onClick={callbacks.onOpenSettings}>\n <Settings className=\"mr-2 h-4 w-4\" />\n <span>{labels.settings}</span>\n </DropdownMenuItem>\n )}\n\n {/* Additional items */}\n {additionalItems}\n\n {/* Theme options */}\n {showThemeOptions && callbacks?.onThemeChange && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem \n onClick={() => callbacks.onThemeChange?.('light')}\n className={currentTheme === 'light' ? 'bg-accent' : ''}\n >\n <Sun className=\"mr-2 h-4 w-4\" />\n <span>{labels.lightMode}</span>\n </DropdownMenuItem>\n <DropdownMenuItem \n onClick={() => callbacks.onThemeChange?.('dark')}\n className={currentTheme === 'dark' ? 'bg-accent' : ''}\n >\n <Moon className=\"mr-2 h-4 w-4\" />\n <span>{labels.darkMode}</span>\n </DropdownMenuItem>\n <DropdownMenuItem \n onClick={() => callbacks.onThemeChange?.('system')}\n className={currentTheme === 'system' ? 'bg-accent' : ''}\n >\n <Palette className=\"mr-2 h-4 w-4\" />\n <span>{labels.systemTheme}</span>\n </DropdownMenuItem>\n </>\n )}\n\n {/* Logout */}\n {callbacks?.onLogout && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem \n onClick={callbacks.onLogout}\n className=\"text-destructive focus:text-destructive focus:bg-destructive/10\"\n >\n <LogOut className=\"mr-2 h-4 w-4\" />\n <span>{labels.logout}</span>\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n );\n};\n\nexport default UserMenu;\n","import React from 'react';\nimport { Card, CardHeader, CardTitle } from '../ui/card';\nimport { Button } from '../ui/button';\nimport { Avatar, AvatarFallback } from '../ui/avatar';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport {\n Bot,\n MoreVertical,\n Download,\n Upload,\n Trash2,\n Plus,\n Menu,\n Moon,\n Sun,\n} from 'lucide-react';\nimport { ReactNode } from 'react';\nimport { SidebarTrigger } from '../ui/sidebar';\n\nexport interface ChatHeaderConfig {\n branding?: {\n logo?: ReactNode;\n title?: string;\n subtitle?: string;\n };\n labels?: {\n newThread?: string;\n exportData?: string;\n importData?: string;\n clearAll?: string;\n sidebarToggle?: string;\n customComponentToggle?: string;\n settings?: string;\n toggleDarkMode?: string;\n lightMode?: string;\n darkMode?: string;\n };\n customComponent?: {\n label?: string;\n icon?: ReactNode;\n onClick?: () => void;\n };\n /** Additional actions to render in the header (before the settings menu) */\n headerActions?: ReactNode;\n}\n\nexport interface ChatHeaderProps {\n config: ChatHeaderConfig;\n currentThreadTitle?: string | null;\n onSidebarToggle?: () => void;\n onCustomComponentToggle?: () => void;\n onNewThread?: () => void;\n onExportData?: () => void;\n onImportData?: (file: File) => void;\n onClearAll?: () => void;\n showCustomComponentButton?: boolean;\n isMobile?: boolean;\n className?: string;\n}\n\nexport const ChatHeader: React.FC<ChatHeaderProps> = ({\n config,\n currentThreadTitle,\n onSidebarToggle: _onSidebarToggle,\n onCustomComponentToggle,\n onNewThread,\n onExportData,\n onImportData,\n onClearAll,\n showCustomComponentButton,\n isMobile,\n className = '',\n}) => {\n const [isDarkMode, setIsDarkMode] = React.useState(() => {\n if (typeof window === 'undefined') return false;\n return document.documentElement.classList.contains('dark');\n });\n\n React.useEffect(() => {\n const observer = new MutationObserver(() => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n // Listen for system theme changes\n const mediaQuery = globalThis.matchMedia('(prefers-color-scheme: dark)');\n const handleSystemThemeChange = (e: MediaQueryListEvent) => {\n const savedTheme = localStorage.getItem('theme');\n if (!savedTheme) {\n // Only update if user hasn't set an explicit preference\n setIsDarkMode(e.matches);\n }\n };\n\n mediaQuery.addEventListener('change', handleSystemThemeChange);\n\n return () => {\n observer.disconnect();\n mediaQuery.removeEventListener('change', handleSystemThemeChange);\n };\n }, []);\n\n const toggleDarkMode = () => {\n const isDark = document.documentElement.classList.contains('dark');\n if (isDark) {\n document.documentElement.classList.remove('dark');\n localStorage.setItem('theme', 'light');\n } else {\n document.documentElement.classList.add('dark');\n localStorage.setItem('theme', 'dark');\n }\n setIsDarkMode(!isDark);\n };\n\n\n const handleImportClick = () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json';\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && onImportData) {\n onImportData(file);\n }\n };\n input.click();\n };\n\n return (\n <Card\n data-chat-header\n className={`py-0 border-b rounded-none relative z-10 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/80 ${className}`}\n style={isMobile ? { paddingTop: 'env(safe-area-inset-top)' } : undefined}\n >\n <CardHeader className=\"p-2\">\n <div className=\"flex items-center justify-between\">\n {/* Left side - Sidebar toggle */}\n <div className=\"flex items-center gap-3\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"-ml-1\" />\n </TooltipTrigger>\n <TooltipContent>\n {config.labels?.sidebarToggle || 'Toggle Sidebar'}\n </TooltipContent>\n </Tooltip>\n </div>\n\n {/* Center - Logo and Title */}\n <div className=\"flex items-center gap-3 flex-1 justify-center\">\n {config.branding?.logo || (\n <Avatar className=\"h-8 w-8\">\n <AvatarFallback>\n <Bot className=\"h-4 w-4\" />\n </AvatarFallback>\n </Avatar>\n )}\n <div className=\"text-center hidden md:block\">\n <CardTitle className=\"text-sm font-medium\">\n {config.branding?.title || 'Chat Assistant'}\n </CardTitle>\n </div>\n {/* Mobile only title if needed, or keep it simple */}\n <div className=\"md:hidden text-sm font-medium truncate max-w-[150px]\">\n {currentThreadTitle || config.branding?.title || 'Chat'}\n </div>\n </div>\n\n {/* Right side - Custom component button + Settings menu */}\n <div className=\"flex items-center gap-1\">\n {/* Custom component toggle button (desktop + mobile) */}\n {showCustomComponentButton && config.customComponent && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={onCustomComponentToggle}\n >\n {config.customComponent.icon || <Menu className=\"h-4 w-4\" />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {config.customComponent.label || config.labels?.customComponentToggle || 'Toggle'}\n </TooltipContent>\n </Tooltip>\n )}\n\n {/* Custom header actions (passed from parent) */}\n {config.headerActions}\n\n {/* Settings dropdown menu */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onNewThread && (\n <>\n <DropdownMenuItem onClick={() => onNewThread?.()} className=\"font-medium text-primary\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {config.labels?.newThread || 'New Thread'}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n\n {onExportData && (\n <DropdownMenuItem onClick={onExportData}>\n <Download className=\"h-4 w-4 mr-2\" />\n {config.labels?.exportData || 'Export Data'}\n </DropdownMenuItem>\n )}\n\n {onImportData && (\n <DropdownMenuItem onClick={handleImportClick}>\n <Upload className=\"h-4 w-4 mr-2\" />\n {config.labels?.importData || 'Import Data'}\n </DropdownMenuItem>\n )}\n\n {(onExportData || onImportData) && (\n <DropdownMenuSeparator />\n )}\n\n <DropdownMenuItem onClick={toggleDarkMode}>\n {isDarkMode ? (\n <>\n <Sun className=\"h-4 w-4 mr-2\" />\n {config.labels?.lightMode || 'Light Mode'}\n </>\n ) : (\n <>\n <Moon className=\"h-4 w-4 mr-2\" />\n {config.labels?.darkMode || 'Dark Mode'}\n </>\n )}\n </DropdownMenuItem>\n\n {onClearAll && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onClearAll}\n className=\"text-destructive\"\n >\n <Trash2 className=\"h-4 w-4 mr-2\" />\n {config.labels?.clearAll || 'Clear All'}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </CardHeader>\n </Card>\n );\n};\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { useChatUserContext } from './UserContext';\nimport { MediaAttachment, FileUploadProgress, ChatConfig } from '../../types/chatTypes';\nimport { Button } from '../ui/button';\nimport { Textarea } from '../ui/textarea';\nimport { Card, CardContent } from '../ui/card';\nimport { Badge } from '../ui/badge';\nimport { Progress } from '../ui/progress';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip';\nimport {\n Send,\n Paperclip,\n Mic,\n MicOff,\n Image,\n Video,\n FileText,\n X,\n Square,\n Play,\n Pause,\n RotateCcw,\n Loader2,\n} from 'lucide-react';\n\ninterface ChatInputProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (content: string, attachments: MediaAttachment[]) => void;\n attachments: MediaAttachment[];\n onAttachmentsChange: (attachments: MediaAttachment[]) => void;\n placeholder?: string;\n disabled?: boolean;\n isGenerating?: boolean;\n onStopGeneration?: () => void;\n enableFileUpload?: boolean;\n enableAudioRecording?: boolean;\n maxAttachments?: number;\n maxFileSize?: number;\n acceptedFileTypes?: string[];\n className?: string;\n config?: ChatConfig;\n}\n\n// File upload progress component\nconst FileUploadItem: React.FC<{\n file: { name: string; type?: string; size?: number };\n progress: number;\n onCancel: () => void;\n}> = ({ file, progress, onCancel }) => {\n const guessTypeFromName = (name?: string): string => {\n const ext = (name || '').split('.').pop()?.toLowerCase();\n switch (ext) {\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n case 'webp':\n case 'bmp':\n case 'svg':\n return 'image/*';\n case 'mp4':\n case 'mov':\n case 'm4v':\n case 'webm':\n return 'video/*';\n case 'mp3':\n case 'wav':\n case 'm4a':\n case 'ogg':\n return 'audio/*';\n default:\n return '';\n }\n };\n\n const getFileIcon = (type?: string, name?: string) => {\n const t = typeof type === 'string' && type.length > 0 ? type : guessTypeFromName(name);\n if (t.startsWith('image/')) return <Image className=\"h-4 w-4\" />;\n if (t.startsWith('video/')) return <Video className=\"h-4 w-4\" />;\n if (t.startsWith('audio/')) return <Mic className=\"h-4 w-4\" />;\n return <FileText className=\"h-4 w-4\" />;\n };\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n };\n\n return (\n <Card className=\"relative\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n {getFileIcon(file.type, file.name)}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{file.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size ?? 0)}\n </p>\n <Progress value={progress} className=\"h-1 mt-1\" />\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={onCancel}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n );\n};\n\n// Attachment preview component\nconst AttachmentPreview: React.FC<{\n attachment: MediaAttachment;\n onRemove: () => void;\n}> = ({ attachment, onRemove }) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const audioRef = useRef<HTMLAudioElement>(null);\n\n const handlePlayPause = () => {\n if (audioRef.current) {\n if (isPlaying) {\n audioRef.current.pause();\n } else {\n audioRef.current.play();\n }\n setIsPlaying(!isPlaying);\n }\n };\n\n const formatDuration = (ms?: number) => {\n if (!ms) return '';\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n return `${minutes}:${(seconds % 60).toString().padStart(2, '0')}`;\n };\n\n return (\n <Card className=\"relative group\">\n <CardContent className=\"p-2\">\n {attachment.kind === 'image' && (\n <div className=\"relative\">\n <img\n src={attachment.dataUrl}\n alt={attachment.fileName || 'Anexo'}\n className=\"w-full h-20 object-cover rounded\"\n />\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity rounded flex items-center justify-center\">\n <Button\n variant=\"destructive\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={onRemove}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n </div>\n )}\n\n {attachment.kind === 'video' && (\n <div className=\"relative\">\n <video\n src={attachment.dataUrl}\n poster={attachment.poster}\n className=\"w-full h-20 object-cover rounded\"\n muted\n />\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity rounded flex items-center justify-center\">\n <Button\n variant=\"destructive\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={onRemove}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n <Badge className=\"absolute bottom-1 right-1 text-xs\">\n {formatDuration(attachment.durationMs)}\n </Badge>\n </div>\n )}\n\n {attachment.kind === 'audio' && (\n <div className=\"flex items-center gap-2 p-2\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={handlePlayPause}\n >\n {isPlaying ? <Pause className=\"h-3 w-3\" /> : <Play className=\"h-3 w-3\" />}\n </Button>\n <div className=\"flex-1\">\n <p className=\"text-xs font-medium\">\n {attachment.fileName || 'Áudio'}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {formatDuration(attachment.durationMs)}\n </p>\n </div>\n <audio\n ref={audioRef}\n src={attachment.dataUrl}\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onEnded={() => setIsPlaying(false)}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={onRemove}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n )}\n\n {attachment.fileName && attachment.kind !== 'audio' && (\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/70 text-white text-xs p-1 rounded-b\">\n <p className=\"truncate\">{attachment.fileName}</p>\n </div>\n )}\n </CardContent>\n </Card>\n );\n};\n\n// Audio recording component\nconst AudioRecorder: React.FC<{\n isRecording: boolean;\n onStartRecording: () => void;\n onStopRecording: () => void;\n onCancel: () => void;\n recordingDuration: number;\n config?: ChatConfig;\n}> = ({ isRecording, onStartRecording, onStopRecording, onCancel, recordingDuration, config }) => {\n const formatTime = (seconds: number) => {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n };\n\n if (!isRecording) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onStartRecording}\n className=\"h-10 w-10\"\n >\n <Mic className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config?.labels?.recordAudioTooltip}</TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <Card className=\"border-red-200 bg-red-50 dark:border-red-800 dark:bg-red-950\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"h-3 w-3 bg-red-500 rounded-full animate-pulse\" />\n <span className=\"text-sm font-medium text-red-700 dark:text-red-300\">\n Gravando\n </span>\n </div>\n <Badge variant=\"outline\" className=\"text-xs\">\n {formatTime(recordingDuration)}\n </Badge>\n <div className=\"flex gap-1 ml-auto\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onCancel}\n >\n <X className=\"h-3 w-3 mr-1\" />\n Cancelar\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={onStopRecording}\n >\n <Square className=\"h-3 w-3 mr-1\" />\n Parar\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n};\n\nexport const ChatInput: React.FC<ChatInputProps> = ({\n value,\n onChange,\n onSubmit,\n attachments,\n onAttachmentsChange,\n placeholder = 'Digite sua mensagem...',\n disabled = false,\n isGenerating = false,\n onStopGeneration,\n enableFileUpload = true,\n enableAudioRecording = true,\n maxAttachments = 4,\n maxFileSize = 10 * 1024 * 1024, // 10MB\n acceptedFileTypes = ['image/*', 'video/*', 'audio/*'],\n className = '',\n config,\n}) => {\n const [isRecording, setIsRecording] = useState(false);\n const { setContext } = useChatUserContext();\n const [recordingDuration, setRecordingDuration] = useState(0);\n const [uploadProgress, setUploadProgress] = useState<Map<string, FileUploadProgress>>(new Map());\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const recordingStartTime = useRef<number>(0);\n const recordingInterval = useRef<ReturnType<typeof setInterval> | null>(null);\n const mediaStreamRef = useRef<MediaStream | null>(null);\n\n // Cleanup recording on unmount\n useEffect(() => {\n return () => {\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach(track => track.stop());\n }\n if (recordingInterval.current) {\n clearInterval(recordingInterval.current);\n }\n };\n }, []);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if ((!value.trim() && attachments.length === 0) || disabled || isGenerating) return;\n\n onSubmit(value.trim(), attachments);\n onChange('');\n onAttachmentsChange([]);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey && !e.ctrlKey && window.innerWidth > 768) {\n e.preventDefault();\n handleSubmit(e as any);\n }\n };\n\n const processFile = async (file: File): Promise<MediaAttachment | null> => {\n if (file.size > maxFileSize) {\n alert(`Arquivo muito grande. Máximo permitido: ${Math.round(maxFileSize / 1024 / 1024)}MB`);\n return null;\n }\n\n const fileId = `${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n // Start upload progress\n setUploadProgress(prev => new Map(prev.set(fileId, {\n fileName: file.name,\n progress: 0,\n status: 'uploading',\n })));\n\n try {\n // Simulate upload progress\n for (let progress = 0; progress <= 100; progress += 20) {\n await new Promise(resolve => setTimeout(resolve, 100));\n setUploadProgress(prev => new Map(prev.set(fileId, {\n fileName: file.name,\n progress,\n status: 'uploading',\n })));\n }\n\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\n setUploadProgress(prev => {\n const newMap = new Map(prev);\n newMap.delete(fileId);\n return newMap;\n });\n\n const attachment: MediaAttachment = {\n kind: file.type.startsWith('image/') ? 'image' :\n file.type.startsWith('video/') ? 'video' :\n file.type.startsWith('audio/') ? 'audio' : 'image',\n dataUrl,\n mimeType: file.type,\n fileName: file.name,\n size: file.size,\n };\n\n // For video files, try to get duration\n if (attachment.kind === 'video') {\n try {\n const video = document.createElement('video');\n video.src = dataUrl;\n await new Promise((resolve) => {\n video.onloadedmetadata = resolve;\n });\n attachment.durationMs = video.duration * 1000;\n } catch (error) {\n console.warn('Could not get video duration:', error);\n }\n }\n\n // If it's an image, mark as latest reference image in shared context\n if (attachment.kind === 'image') {\n setContext({ lastReferenceImage: { dataUrl: attachment.dataUrl, mimeType: attachment.mimeType, addedAt: Date.now() } });\n }\n return attachment;\n } catch (error) {\n console.error('Error processing file:', error);\n setUploadProgress(prev => {\n const newMap = new Map(prev);\n newMap.delete(fileId);\n return newMap;\n });\n alert('Erro ao processar arquivo');\n return null;\n }\n };\n\n const handleFileSelect = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n\n const remainingSlots = maxAttachments - attachments.length;\n const filesToProcess = Array.from(files).slice(0, remainingSlots);\n\n for (const file of filesToProcess) {\n const attachment = await processFile(file);\n if (attachment) {\n onAttachmentsChange([...attachments, attachment]);\n }\n }\n\n // Reset input\n e.target.value = '';\n };\n\n const handleDrop = useCallback(async (e: React.DragEvent) => {\n e.preventDefault();\n if (!enableFileUpload) return;\n\n const files = Array.from(e.dataTransfer.files);\n const remainingSlots = maxAttachments - attachments.length;\n const filesToProcess = files.slice(0, remainingSlots);\n\n for (const file of filesToProcess) {\n const attachment = await processFile(file);\n if (attachment) {\n onAttachmentsChange([...attachments, attachment]);\n }\n }\n }, [attachments, enableFileUpload, maxAttachments, onAttachmentsChange]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n }, []);\n\n const startRecording = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n mediaStreamRef.current = stream;\n\n const mediaRecorder = new MediaRecorder(stream);\n mediaRecorderRef.current = mediaRecorder;\n\n const chunks: BlobPart[] = [];\n mediaRecorder.ondataavailable = (e) => {\n chunks.push(e.data);\n };\n\n mediaRecorder.onstop = async () => {\n const blob = new Blob(chunks, { type: 'audio/webm' });\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n\n const attachment: MediaAttachment = {\n kind: 'audio',\n dataUrl,\n mimeType: blob.type,\n durationMs: recordingDuration * 1000,\n fileName: `audio_${new Date().toISOString().slice(0, 19)}.webm`,\n size: blob.size,\n };\n\n onAttachmentsChange([...attachments, attachment]);\n\n // Cleanup\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach(track => track.stop());\n mediaStreamRef.current = null;\n }\n };\n\n recordingStartTime.current = Date.now();\n setRecordingDuration(0);\n setIsRecording(true);\n mediaRecorder.start();\n\n recordingInterval.current = setInterval(() => {\n const duration = Math.floor((Date.now() - recordingStartTime.current) / 1000);\n setRecordingDuration(duration);\n }, 1000);\n\n } catch (error) {\n console.error('Error starting recording:', error);\n alert('Não foi possível acessar o microfone');\n }\n };\n\n const stopRecording = () => {\n if (mediaRecorderRef.current && isRecording) {\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n if (recordingInterval.current) {\n clearInterval(recordingInterval.current);\n }\n }\n };\n\n const cancelRecording = () => {\n if (mediaRecorderRef.current && isRecording) {\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n if (recordingInterval.current) {\n clearInterval(recordingInterval.current);\n }\n // Don't process the recording\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach(track => track.stop());\n mediaStreamRef.current = null;\n }\n }\n };\n\n const removeAttachment = (index: number) => {\n const newAttachments = attachments.filter((_, i) => i !== index);\n onAttachmentsChange(newAttachments);\n };\n\n const canAddMoreAttachments = attachments.length < maxAttachments;\n\n return (\n <TooltipProvider>\n {/* <Card className={`border-t py-0 bg-transparent ${className}`}> */}\n {/* <CardContent className=\"p-4 pb-1 space-y-4 bg-transparent\"> */}\n {/* Upload progress */}\n <div className={`border-t py-0 bg-transparent ${className}`}>\n <div className=\"px-0 md:p-2 pb-1 space-y-4 bg-transparent\">\n {uploadProgress.size > 0 && (\n <div className=\"space-y-2\">\n {Array.from(uploadProgress.entries()).map(([id, progress]) => (\n <FileUploadItem\n key={id}\n file={{ name: progress.fileName } as File}\n progress={progress.progress}\n onCancel={() => {\n setUploadProgress(prev => {\n const newMap = new Map(prev);\n newMap.delete(id);\n return newMap;\n });\n }}\n />\n ))}\n </div>\n )}\n\n {/* Audio recording */}\n {isRecording && (\n <AudioRecorder\n isRecording={isRecording}\n onStartRecording={startRecording}\n onStopRecording={stopRecording}\n onCancel={cancelRecording}\n recordingDuration={recordingDuration}\n config={config}\n />\n )}\n\n {/* Attachments preview */}\n {attachments.length > 0 && (\n <div className=\"grid grid-cols-4 gap-2\">\n {attachments.map((attachment, index) => (\n <AttachmentPreview\n key={index}\n attachment={attachment}\n onRemove={() => removeAttachment(index)}\n />\n ))}\n </div>\n )}\n\n {/* Input area */}\n <form onSubmit={handleSubmit} className=\"mb-1 flex justify-center\">\n <div\n className=\"flex items-end gap-2 p-3 border rounded-lg bg-background w-full md:min-w-3xl max-w-3xl\"\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n >\n {/* File upload */}\n {enableFileUpload && canAddMoreAttachments && (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedFileTypes.join(',')}\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-10 w-10\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n fileInputRef.current?.click();\n }}\n disabled={disabled}\n >\n <Paperclip className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config?.labels?.attachFileTooltip}</TooltipContent>\n </Tooltip>\n </>\n )}\n\n {/* Text input */}\n <div className=\"flex-1\">\n <Textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n className=\"max-h-[120px] resize-none border-0 bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0\"\n rows={1}\n />\n </div>\n\n {/* Audio recording */}\n {enableAudioRecording && !isRecording && canAddMoreAttachments && !value.trim() && (\n <AudioRecorder\n isRecording={isRecording}\n onStartRecording={startRecording}\n onStopRecording={stopRecording}\n onCancel={cancelRecording}\n recordingDuration={recordingDuration}\n config={config}\n />\n )}\n\n {/* Submit/Stop button */}\n {isGenerating ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-10 w-10\"\n onClick={onStopGeneration}\n >\n <Square className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config?.labels?.stopGenerationTooltip}</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"submit\"\n size=\"icon\"\n className=\"h-10 w-10\"\n disabled={disabled || (!value.trim() && attachments.length === 0)}\n >\n {disabled ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config?.labels?.sendMessageTooltip}</TooltipContent>\n </Tooltip>\n )}\n </div>\n </form>\n\n {/* Help text */}\n <div className=\"text-[10px] text-muted-foreground text-center\">\n {window.innerWidth > 768 ? config?.labels?.inputHelpText : ''}\n\n {attachments.length > 0 && (\n <> • {attachments.length}/{maxAttachments} anexos</>\n )}\n {config?.labels?.footerLabel && (\n <> • {config.labels.footerLabel}</>\n )}\n </div>\n </div>\n </div>\n {/* </CardContent>\n </Card> */}\n </TooltipProvider >\n );\n};\n","import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport type { ChatUserContext } from '../../types/chatTypes';\n\ntype Setter = (next: Partial<ChatUserContext> | ((prev: ChatUserContext) => Partial<ChatUserContext>)) => void;\n\ninterface ChatUserContextValue {\n context: ChatUserContext;\n setContext: Setter;\n resetContext: () => void;\n}\n\nconst Ctx = createContext<ChatUserContextValue | undefined>(undefined);\n\nexport const ChatUserContextProvider: React.FC<{ children: React.ReactNode; initial?: Partial<ChatUserContext> }>\n = ({ children, initial }) => {\n const [ctx, setCtx] = useState<ChatUserContext>(() => ({\n updatedAt: Date.now(),\n ...(initial ?? {}),\n }));\n\n useEffect(() => {\n if (!initial) return;\n setCtx(prev => ({\n ...prev,\n ...initial,\n updatedAt: Date.now(),\n }));\n }, [initial]);\n\n const setPartial = useCallback<Setter>((next) => {\n setCtx(prev => {\n const partial = typeof next === 'function' ? next(prev) : next;\n return { ...prev, ...partial, updatedAt: Date.now() };\n });\n }, []);\n\n const value = useMemo<ChatUserContextValue>(() => ({\n context: ctx,\n setContext: setPartial,\n resetContext: () => setCtx({ updatedAt: Date.now() })\n }), [ctx, setPartial]);\n\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n};\n\nexport function useChatUserContext(): ChatUserContextValue {\n const v = useContext(Ctx);\n if (!v) throw new Error('useChatUserContext must be used within ChatUserContextProvider');\n return v;\n}\n","import * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Progress({\n className,\n value,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"bg-primary/20 relative h-2 w-full overflow-hidden rounded-full\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"bg-primary h-full w-full flex-1 transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","import React, { useState } from 'react';\nimport { Sheet, SheetContent, SheetHeader, SheetTitle } from '../ui/sheet';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport { ScrollArea } from '../ui/scroll-area';\nimport { Button } from '../ui/button';\nimport { Separator } from '../ui/separator';\nimport { Input } from '../ui/input';\nimport { Textarea } from '../ui/textarea';\nimport { cn } from '../../lib/utils';\nimport {\n User,\n Mail,\n AtSign,\n Calendar,\n MapPin,\n Phone,\n Globe,\n Building,\n Briefcase,\n Users,\n UserPlus,\n Image,\n BadgeCheck,\n FileText,\n Brain,\n Plus,\n Trash2,\n Target,\n Lightbulb,\n Info,\n Heart,\n Bot,\n Pencil,\n Check,\n X,\n} from 'lucide-react';\nimport type { MemoryItem } from '../../types/chatTypes';\n\nexport interface UserProfileConfig {\n labels?: {\n title?: string;\n basicInfo?: string;\n customFields?: string;\n memories?: string;\n addMemory?: string;\n noMemories?: string;\n close?: string;\n noCustomFields?: string;\n };\n}\n\nexport interface UserProfileUser {\n id: string;\n name?: string;\n email?: string;\n avatar?: string;\n}\n\n// Custom field definition - can be extended by login/external components\nexport interface CustomField {\n key: string;\n label: string;\n value: string | number | boolean | null | undefined;\n type?: 'text' | 'email' | 'phone' | 'url' | 'date' | 'number' | 'boolean';\n icon?: React.ReactNode;\n}\n\nexport interface UserProfileProps {\n isOpen: boolean;\n onClose: () => void;\n user?: UserProfileUser | null;\n /** Custom fields from userContext.customFields */\n customFields?: CustomField[] | Record<string, unknown>;\n /** User memories */\n memories?: MemoryItem[];\n config?: UserProfileConfig;\n /** Called when user wants to edit their profile */\n onEditProfile?: () => void;\n /** Called when user wants to logout */\n onLogout?: () => void;\n /** Called when user adds a memory */\n onAddMemory?: (content: string, category?: MemoryItem['category']) => void;\n /** Called when user updates a memory */\n onUpdateMemory?: (memoryId: string, content: string) => void;\n /** Called when user deletes a memory */\n onDeleteMemory?: (memoryId: string) => void;\n className?: string;\n}\n\n// Get initials from name or email\nconst getInitials = (name?: string, email?: string): string => {\n if (name) {\n return name\n .split(' ')\n .map((n) => n[0])\n .slice(0, 2)\n .join('')\n .toUpperCase();\n }\n if (email) {\n return email[0].toUpperCase();\n }\n return 'U';\n};\n\n// Map field types to icons\nconst getFieldIcon = (type?: string, key?: string): React.ReactNode => {\n const iconClass = 'h-4 w-4 text-muted-foreground';\n \n // Check by type first\n switch (type) {\n case 'email':\n return <Mail className={iconClass} />;\n case 'phone':\n return <Phone className={iconClass} />;\n case 'url':\n return <Globe className={iconClass} />;\n case 'date':\n return <Calendar className={iconClass} />;\n }\n \n // Check by common key names\n const lowerKey = key?.toLowerCase() || '';\n \n if (lowerKey.includes('follower')) return <Users className={iconClass} />;\n if (lowerKey.includes('following')) return <UserPlus className={iconClass} />;\n if (lowerKey.includes('post') || lowerKey.includes('publication')) return <Image className={iconClass} />;\n if (lowerKey.includes('verified') || lowerKey.includes('badge')) return <BadgeCheck className={iconClass} />;\n if (lowerKey.includes('bio')) return <FileText className={iconClass} />;\n \n // General fields\n if (lowerKey.includes('email')) return <Mail className={iconClass} />;\n if (lowerKey.includes('phone') || lowerKey.includes('tel')) return <Phone className={iconClass} />;\n if (lowerKey.includes('location') || lowerKey.includes('address') || lowerKey.includes('city')) return <MapPin className={iconClass} />;\n if (lowerKey.includes('company') || lowerKey.includes('org')) return <Building className={iconClass} />;\n if (lowerKey.includes('job') || lowerKey.includes('role') || lowerKey.includes('title') || lowerKey.includes('position')) return <Briefcase className={iconClass} />;\n if (lowerKey.includes('website') || lowerKey.includes('url') || lowerKey.includes('link')) return <Globe className={iconClass} />;\n if (lowerKey.includes('username') || lowerKey.includes('handle')) return <AtSign className={iconClass} />;\n if (lowerKey.includes('date') || lowerKey.includes('birthday') || lowerKey.includes('joined')) return <Calendar className={iconClass} />;\n \n return <User className={iconClass} />;\n};\n\n// Format value for display\nconst formatValue = (value: unknown, type?: string, key?: string): string => {\n if (value === null || value === undefined) return '-';\n if (typeof value === 'boolean') {\n if (key?.toLowerCase().includes('verified')) {\n return value ? 'Verified ✓' : 'Not verified';\n }\n return value ? 'Yes' : 'No';\n }\n if (type === 'date' && (typeof value === 'string' || typeof value === 'number')) {\n try {\n return new Date(value).toLocaleDateString('en-US');\n } catch {\n return String(value);\n }\n }\n return String(value);\n};\n\n// Convert Record<string, unknown> to CustomField[]\nconst normalizeCustomFields = (fields?: CustomField[] | Record<string, unknown>): CustomField[] => {\n if (!fields) return [];\n \n if (Array.isArray(fields)) {\n return fields;\n }\n \n // Convert object to array of fields\n return Object.entries(fields)\n .filter(([_, value]) => value !== null && value !== undefined && value !== '')\n .map(([key, value]) => ({\n key,\n label: key\n .replace(/([A-Z])/g, ' $1')\n .replace(/[_-]/g, ' ')\n .replace(/^\\w/, (c) => c.toUpperCase())\n .trim(),\n value: value as string | number | boolean,\n }));\n};\n\n// Get icon for memory category\nconst getMemoryCategoryIcon = (category?: MemoryItem['category']): React.ReactNode => {\n const iconClass = 'h-4 w-4 text-muted-foreground';\n switch (category) {\n case 'preference':\n return <Heart className={iconClass} />;\n case 'fact':\n return <Info className={iconClass} />;\n case 'goal':\n return <Target className={iconClass} />;\n case 'context':\n return <Lightbulb className={iconClass} />;\n default:\n return <Brain className={iconClass} />;\n }\n};\n\n// Get label for memory category\nconst getMemoryCategoryLabel = (category?: MemoryItem['category']): string => {\n switch (category) {\n case 'preference':\n return 'Preferência';\n case 'fact':\n return 'Fato';\n case 'goal':\n return 'Meta';\n case 'context':\n return 'Contexto';\n default:\n return 'Outro';\n }\n};\n\nexport const UserProfile: React.FC<UserProfileProps> = ({\n isOpen,\n onClose,\n user,\n customFields,\n memories = [],\n config,\n onEditProfile,\n onLogout,\n onAddMemory,\n onUpdateMemory,\n onDeleteMemory,\n className,\n}) => {\n const [newMemoryContent, setNewMemoryContent] = useState('');\n const [isAddingMemory, setIsAddingMemory] = useState(false);\n const [editingMemoryId, setEditingMemoryId] = useState<string | null>(null);\n const [editingMemoryContent, setEditingMemoryContent] = useState('');\n\n const handleAddMemory = () => {\n if (newMemoryContent.trim() && onAddMemory) {\n onAddMemory(newMemoryContent.trim(), 'other');\n setNewMemoryContent('');\n setIsAddingMemory(false);\n }\n };\n\n const handleStartEdit = (memory: MemoryItem) => {\n setEditingMemoryId(memory.id);\n setEditingMemoryContent(memory.content);\n };\n\n const handleSaveEdit = () => {\n if (editingMemoryId && editingMemoryContent.trim() && onUpdateMemory) {\n onUpdateMemory(editingMemoryId, editingMemoryContent.trim());\n setEditingMemoryId(null);\n setEditingMemoryContent('');\n }\n };\n\n const handleCancelEdit = () => {\n setEditingMemoryId(null);\n setEditingMemoryContent('');\n };\n\n const labels = {\n title: config?.labels?.title || 'Profile',\n basicInfo: config?.labels?.basicInfo || 'Account',\n customFields: config?.labels?.customFields || 'Details',\n memories: config?.labels?.memories || 'Memories',\n addMemory: config?.labels?.addMemory || 'Add memory',\n noMemories: config?.labels?.noMemories || 'No memories yet',\n close: config?.labels?.close || 'Close',\n noCustomFields: config?.labels?.noCustomFields || 'No additional information',\n };\n\n const displayName = user?.name || user?.email?.split('@')[0] || 'User';\n const initials = getInitials(user?.name, user?.email);\n const normalizedFields = normalizeCustomFields(customFields);\n\n return (\n <Sheet open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <SheetContent\n side=\"right\"\n className={cn('w-full sm:max-w-md p-0 flex flex-col h-full overflow-hidden', className)}\n >\n <SheetHeader className=\"px-6 py-4 border-b shrink-0\">\n <div className=\"flex items-center justify-between\">\n <SheetTitle>{labels.title}</SheetTitle>\n </div>\n </SheetHeader>\n\n <ScrollArea className=\"flex-1 min-h-0\">\n <div className=\"p-6 space-y-6\">\n {/* User header */}\n <div className=\"flex flex-col items-center text-center space-y-4\">\n <Avatar className=\"h-24 w-24 shrink-0\">\n {user?.avatar && <AvatarImage src={user.avatar} alt={displayName} />}\n <AvatarFallback className=\"text-2xl bg-primary/10 text-primary\">\n {initials}\n </AvatarFallback>\n </Avatar>\n <div className=\"w-full px-2\">\n <h2 className=\"text-xl font-semibold break-words\">{displayName}</h2>\n {user?.email && (\n <p className=\"text-sm text-muted-foreground break-words\">{user.email}</p>\n )}\n </div>\n </div>\n\n <Separator />\n\n {/* Basic info */}\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-medium text-muted-foreground uppercase tracking-wider\">\n {labels.basicInfo}\n </h3>\n <div className=\"space-y-2\">\n <div className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground\">Name</p>\n <p className=\"text-sm font-medium break-words\">{displayName}</p>\n </div>\n </div>\n {user?.email && (\n <div className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50\">\n <AtSign className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground\">Handle</p>\n <p className=\"text-sm font-medium break-words\">{user.email}</p>\n </div>\n </div>\n )}\n {user?.id && user.id !== user?.name && user.id !== user?.email && (\n <div className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground\">ID</p>\n <p className=\"text-sm font-medium break-words\">{user.id}</p>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Custom fields */}\n {normalizedFields.length > 0 && (\n <>\n <Separator />\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-medium text-muted-foreground uppercase tracking-wider\">\n {labels.customFields}\n </h3>\n <div className=\"space-y-2\">\n {normalizedFields.map((field) => {\n const isBioField = field.key.toLowerCase().includes('bio');\n return (\n <div\n key={field.key}\n className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50\"\n >\n <div className=\"mt-0.5 shrink-0\">\n {field.icon || getFieldIcon(field.type, field.key)}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground\">{field.label}</p>\n <p className={cn(\n \"text-sm font-medium\",\n isBioField ? \"whitespace-pre-wrap break-words\" : \"break-words\"\n )}>\n {formatValue(field.value, field.type, field.key)}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </>\n )}\n\n {/* Memories section */}\n <Separator />\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-muted-foreground uppercase tracking-wider flex items-center gap-2\">\n <Brain className=\"h-4 w-4\" />\n {labels.memories}\n </h3>\n {onAddMemory && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2\"\n onClick={() => setIsAddingMemory(true)}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n {/* Add memory input */}\n {isAddingMemory && onAddMemory && (\n <div className=\"flex gap-2\">\n <Input\n value={newMemoryContent}\n onChange={(e) => setNewMemoryContent(e.target.value)}\n placeholder=\"O que devo lembrar?\"\n className=\"flex-1 h-9\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleAddMemory();\n if (e.key === 'Escape') {\n setIsAddingMemory(false);\n setNewMemoryContent('');\n }\n }}\n autoFocus\n />\n <Button size=\"sm\" onClick={handleAddMemory} disabled={!newMemoryContent.trim()}>\n Salvar\n </Button>\n </div>\n )}\n\n {/* Memory list */}\n <div className=\"space-y-2\">\n {memories.length === 0 ? (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n {labels.noMemories}\n </p>\n ) : (\n memories.map((memory) => {\n const isEditing = editingMemoryId === memory.id;\n \n return (\n <div\n key={memory.id}\n className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50 group\"\n >\n <div className=\"mt-0.5 shrink-0\">\n {memory.source === 'agent' ? (\n <Bot className=\"h-4 w-4 text-primary\" />\n ) : (\n getMemoryCategoryIcon(memory.category)\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"text-xs text-muted-foreground\">\n {getMemoryCategoryLabel(memory.category)}\n </span>\n <span className=\"text-xs text-muted-foreground\">•</span>\n <span className=\"text-xs text-muted-foreground\">\n {memory.source === 'agent' ? 'IA' : 'Você'}\n </span>\n </div>\n {isEditing ? (\n <div className=\"space-y-2\">\n <Textarea\n value={editingMemoryContent}\n onChange={(e) => setEditingMemoryContent(e.target.value)}\n className=\"min-h-[60px] text-sm resize-none\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n handleSaveEdit();\n }\n if (e.key === 'Escape') {\n handleCancelEdit();\n }\n }}\n />\n <div className=\"flex gap-1 justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2\"\n onClick={handleCancelEdit}\n >\n <X className=\"h-3.5 w-3.5 mr-1\" />\n Cancelar\n </Button>\n <Button\n size=\"sm\"\n className=\"h-7 px-2\"\n onClick={handleSaveEdit}\n disabled={!editingMemoryContent.trim()}\n >\n <Check className=\"h-3.5 w-3.5 mr-1\" />\n Salvar\n </Button>\n </div>\n </div>\n ) : (\n <p className=\"text-sm break-words\">{memory.content}</p>\n )}\n </div>\n {!isEditing && (onUpdateMemory || onDeleteMemory) && (\n <div className=\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity shrink-0\">\n {onUpdateMemory && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => handleStartEdit(memory)}\n >\n <Pencil className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </Button>\n )}\n {onDeleteMemory && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => onDeleteMemory(memory.id)}\n >\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n </div>\n </div>\n </ScrollArea>\n\n {/* Footer actions */}\n <div className=\"p-4 border-t space-y-2 shrink-0\">\n {onEditProfile && (\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={onEditProfile}\n >\n Edit Profile\n </Button>\n )}\n {onLogout && (\n <Button\n variant=\"destructive\"\n className=\"w-full\"\n onClick={onLogout}\n >\n Log out\n </Button>\n )}\n </div>\n </SheetContent>\n </Sheet>\n );\n};\n\nexport default UserProfile;\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst ScrollArea = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof ScrollAreaPrimitive.Root> & {\n viewportClassName?: string\n }\n>(({ className, children, viewportClassName, onScroll, onScrollCapture, ...props }, ref) => {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={ref as React.Ref<HTMLDivElement>}\n data-slot=\"scroll-area-viewport\"\n className={cn(\n \"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1\",\n viewportClassName\n )}\n onScroll={onScroll as any}\n onScrollCapture={onScrollCapture as any}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n})\nScrollArea.displayName = \"ScrollArea\"\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","import React, { useState, useRef, useEffect } from 'react';\nimport { ChatThread, ChatConfig } from '../../types/chatTypes';\nimport { formatDate } from '../../lib/utils';\nimport { Button } from '../ui/button';\nimport { Input } from '../ui/input';\nimport { Card, CardContent, CardHeader, CardTitle } from '../ui/card';\nimport { Badge } from '../ui/badge';\nimport { ScrollArea } from '../ui/scroll-area';\nimport { Separator } from '../ui/separator';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '../ui/dialog';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '../ui/alert-dialog';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport { TooltipProvider } from '../ui/tooltip';\nimport {\n Plus,\n MessageSquare,\n MoreVertical,\n Edit2,\n Trash2,\n Archive,\n Search,\n Filter,\n Calendar,\n Hash,\n X,\n Check,\n} from 'lucide-react';\n\ninterface ThreadManagerProps {\n threads: ChatThread[];\n currentThreadId?: string | null;\n config?: ChatConfig;\n onCreateThread?: (title?: string) => void;\n onSelectThread?: (threadId: string) => void;\n onRenameThread?: (threadId: string, newTitle: string) => void;\n onDeleteThread?: (threadId: string) => void;\n onArchiveThread?: (threadId: string) => void;\n isOpen?: boolean;\n onClose?: () => void;\n className?: string;\n}\n\n// Individual thread item component\nconst ThreadItem: React.FC<{\n thread: ChatThread;\n isActive: boolean;\n config?: ChatConfig;\n onSelect: () => void;\n onRename: (newTitle: string) => void;\n onDelete: () => void;\n onArchive: () => void;\n}> = ({ thread, isActive, config, onSelect, onRename, onDelete, onArchive }) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editTitle, setEditTitle] = useState(thread.title);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing]);\n\n const handleSaveEdit = () => {\n const trimmedTitle = editTitle.trim();\n if (trimmedTitle && trimmedTitle !== thread.title) {\n onRename(trimmedTitle);\n }\n setIsEditing(false);\n };\n\n const handleCancelEdit = () => {\n setEditTitle(thread.title);\n setIsEditing(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleSaveEdit();\n } else if (e.key === 'Escape') {\n handleCancelEdit();\n }\n };\n\n return (\n <Card className={`cursor-pointer transition-all duration-200 hover:shadow-md py-0 ${\n isActive ? 'ring-2 ring-primary bg-primary/5' : 'hover:bg-muted/50'\n }`}>\n <CardContent className=\"p-3 max-w-sm\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\" onClick={onSelect}>\n {isEditing ? (\n <div className=\"flex items-center gap-2\">\n <Input\n ref={inputRef}\n value={editTitle}\n onChange={(e) => setEditTitle(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleSaveEdit}\n className=\"h-8 text-sm\"\n placeholder={config?.labels?.threadNamePlaceholder || \"Conversation name\"}\n />\n <Button size=\"sm\" variant=\"ghost\" onClick={handleSaveEdit}>\n <Check className=\"h-3 w-3\" />\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={handleCancelEdit}>\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n ) : (\n <>\n <h4 className=\"font-medium text-sm truncate mb-1\">\n {thread.title}\n </h4>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <div className=\"flex items-center gap-1\">\n <Hash className=\"h-3 w-3\" />\n {thread.messageCount} msgs\n </div>\n <Separator orientation=\"vertical\" className=\"h-3\" />\n <div className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatDate(thread.updatedAt, config?.labels)}\n </div>\n {thread.isArchived && (\n <>\n <Separator orientation=\"vertical\" className=\"h-3\" />\n <Badge variant=\"secondary\" className=\"text-xs\">\n <Archive className=\"h-2 w-2 mr-1\" />\n {config?.labels?.archiveThread || 'Archived'}\n </Badge>\n </>\n )}\n </div>\n </>\n )}\n </div>\n\n {!isEditing && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6 m-auto\">\n <MoreVertical className=\"h-3 w-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setIsEditing(true)}>\n <Edit2 className=\"h-4 w-4 mr-2\" />\n {config?.labels?.renameThread || 'Rename'}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onArchive}>\n <Archive className=\"h-4 w-4 mr-2\" />\n {thread.isArchived \n ? (config?.labels?.unarchiveThread || 'Unarchive')\n : (config?.labels?.archiveThread || 'Archive')}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} className=\"text-destructive\">\n <Trash2 className=\"h-4 w-4 mr-2\" />\n {config?.labels?.deleteThread || 'Delete'}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </CardContent>\n </Card>\n );\n};\n\n// Create thread dialog\nconst CreateThreadDialog: React.FC<{\n onCreateThread: (title?: string) => void;\n config?: ChatConfig;\n}> = ({ onCreateThread, config }) => {\n const [title, setTitle] = useState('');\n const [isOpen, setIsOpen] = useState(false);\n\n const handleCreate = () => {\n onCreateThread(title.trim() || undefined);\n setTitle('');\n setIsOpen(false);\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n <DialogTrigger asChild>\n <Button variant=\"outline\" className=\"w-full\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {config?.labels?.createNewThread || 'New Conversation'}\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{config?.labels?.createNewThread || 'Create New Conversation'}</DialogTitle>\n <DialogDescription>\n Give your new conversation a name or leave blank to auto-generate one.\n </DialogDescription>\n </DialogHeader>\n <Input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={config?.labels?.threadNamePlaceholder || \"Conversation name (optional)\"}\n onKeyDown={(e) => e.key === 'Enter' && handleCreate()}\n autoFocus\n />\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setIsOpen(false)}>\n {config?.labels?.cancel || 'Cancel'}\n </Button>\n <Button onClick={handleCreate}>\n {config?.labels?.create || 'Create'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport const ThreadManager: React.FC<ThreadManagerProps> = ({\n threads,\n currentThreadId,\n config,\n onCreateThread,\n onSelectThread,\n onRenameThread,\n onDeleteThread,\n onArchiveThread,\n isOpen = false,\n onClose,\n className = '',\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [showArchived, setShowArchived] = useState(false);\n const [deleteThreadId, setDeleteThreadId] = useState<string | null>(null);\n\n // Filter threads based on search and archive filter\n const filteredThreads = threads.filter(thread => {\n const title = (thread.title ?? '').toString();\n const matchesSearch = title.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesArchiveFilter = showArchived || !thread.isArchived;\n return matchesSearch && matchesArchiveFilter;\n });\n\n // Group threads by date\n const groupedThreads = filteredThreads.reduce((groups, thread) => {\n const date = new Date(thread.updatedAt);\n const today = new Date();\n const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);\n \n let groupKey: string;\n if (date.toDateString() === today.toDateString()) {\n groupKey = config?.labels?.today || 'Today';\n } else if (date.toDateString() === yesterday.toDateString()) {\n groupKey = config?.labels?.yesterday || 'Yesterday';\n } else {\n groupKey = date.toLocaleDateString('en-US', {\n weekday: 'long',\n day: '2-digit',\n month: 'long',\n });\n }\n\n if (!groups[groupKey]) {\n groups[groupKey] = [];\n }\n groups[groupKey].push(thread);\n return groups;\n }, {} as Record<string, ChatThread[]>);\n\n const handleDeleteThread = (threadId: string) => {\n onDeleteThread?.(threadId);\n setDeleteThreadId(null);\n };\n\n if (!isOpen) return null;\n\n return (\n <TooltipProvider>\n <div className={`fixed inset-0 z-50 bg-background/80 backdrop-blur-sm ${className}`}>\n <div className=\"fixed left-0 top-0 h-full w-full max-w-md border-r bg-background shadow-lg\">\n <Card className=\"h-full border-0 rounded-none\">\n <CardHeader className=\"border-b\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-5 w-5\" />\n {config?.labels?.newChat || 'Conversations'}\n </CardTitle>\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose} >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n \n {/* Search and filters */}\n <div className=\"space-y-3\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder={config?.labels?.search || \"Search conversations...\"}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n \n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowArchived(!showArchived)}\n className=\"text-xs\"\n >\n <Filter className=\"h-3 w-3 mr-1\" />\n {showArchived \n ? (config?.labels?.hideArchived || 'Hide Archived')\n : (config?.labels?.showArchived || 'Show Archived')}\n </Button>\n \n <Badge variant=\"secondary\" className=\"text-xs\">\n {filteredThreads.length} / {threads.length}\n </Badge>\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"p-0 flex-1\">\n <div className=\"p-4\">\n {onCreateThread && (\n <CreateThreadDialog onCreateThread={onCreateThread} config={config} />\n )}\n </div>\n\n <ScrollArea className=\"h-[calc(100vh-280px)]\">\n <div className=\"px-4 pb-4 space-y-4\">\n {Object.keys(groupedThreads).length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground\">\n <MessageSquare className=\"h-12 w-12 mx-auto mb-3 opacity-50\" />\n <p className=\"text-sm\">\n {searchQuery \n ? (config?.labels?.noThreadsFound || 'No conversations found')\n : (config?.labels?.noThreadsYet || 'No conversations yet')}\n </p>\n </div>\n ) : (\n Object.entries(groupedThreads).map(([group, groupThreads]: [string, ChatThread[]]) => (\n <div key={group}>\n <h3 className=\"text-sm font-medium text-muted-foreground mb-2 px-2\">\n {group}\n </h3>\n <div className=\"space-y-2\">\n {groupThreads.map((thread) => (\n <ThreadItem\n key={thread.id}\n thread={thread}\n isActive={currentThreadId === thread.id}\n config={config}\n onSelect={() => onSelectThread?.(thread.id)}\n onRename={(newTitle) => onRenameThread?.(thread.id, newTitle)}\n onDelete={() => setDeleteThreadId(thread.id)}\n onArchive={() => onArchiveThread?.(thread.id)}\n />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n </ScrollArea>\n </CardContent>\n </Card>\n </div>\n\n {/* Delete confirmation dialog */}\n <AlertDialog open={!!deleteThreadId} onOpenChange={() => setDeleteThreadId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{config?.labels?.deleteConfirmTitle || 'Delete Conversation'}</AlertDialogTitle>\n <AlertDialogDescription>\n {config?.labels?.deleteConfirmDescription || 'Are you sure you want to delete this conversation? This action cannot be undone.'}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>{config?.labels?.cancel || 'Cancel'}</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => deleteThreadId && handleDeleteThread(deleteThreadId)}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {config?.labels?.deleteThread || 'Delete'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n </TooltipProvider>\n );\n};\n","import { ChatMessage, ChatThread, MediaAttachment } from '../types/chatTypes';\n\nexport const chatUtils = {\n generateId: (): string => \n (globalThis.crypto?.randomUUID?.() ?? `id-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`),\n\n generateMessageId: (): string => chatUtils.generateId(),\n generateThreadId: (): string => chatUtils.generateId(),\n \n createMessage: (\n role: 'user' | 'assistant' | 'system',\n content: string,\n attachments?: MediaAttachment[]\n ): ChatMessage => ({\n id: chatUtils.generateMessageId(),\n role,\n content,\n timestamp: Date.now(),\n attachments,\n isComplete: true,\n }),\n\n createThread: (title: string): ChatThread => ({\n id: chatUtils.generateThreadId(),\n title,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messageCount: 0,\n }),\n\n generateThreadTitle: (firstMessage: string): string => {\n const cleaned = firstMessage.replace(/[^\\w\\s]/g, '').trim();\n const words = cleaned.split(/\\s+/).slice(0, 6);\n return words.join(' ') || 'Nova Conversa';\n },\n};\n\n"],"mappings":"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","names":["Sidebar","import_react","import_jsx_runtime","import_react_slot","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","ReactMarkdown","remarkGfm","rehypeHighlight","import_react","import_jsx_runtime","React","import_react_slot","import_class_variance_authority","import_lucide_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","open","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","Sidebar","import_react","import_lucide_react","import_jsx_runtime","React","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","getInitials","import_lucide_react","import_jsx_runtime","Sidebar","import_react","import_lucide_react","import_jsx_runtime","CreateThreadDialog"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/chat/ChatUI.tsx","../src/config/chatConfig.ts","../src/components/chat/Message.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/badge.tsx","../src/components/ui/card.tsx","../src/components/ui/textarea.tsx","../src/components/ui/tooltip.tsx","../src/components/chat/Sidebar.tsx","../src/components/ui/input.tsx","../src/components/ui/sidebar.tsx","../src/hooks/use-mobile.ts","../src/components/ui/separator.tsx","../src/components/ui/sheet.tsx","../src/components/ui/skeleton.tsx","../src/components/ui/dialog.tsx","../src/components/ui/alert-dialog.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/chat/UserMenu.tsx","../src/components/chat/ChatHeader.tsx","../src/components/chat/ChatInput.tsx","../src/components/chat/UserContext.tsx","../src/components/ui/progress.tsx","../src/components/chat/UserProfile.tsx","../src/components/ui/scroll-area.tsx","../src/components/chat/ThreadManager.tsx","../src/lib/chatUtils.ts"],"sourcesContent":["export * from './components/chat/ChatUI';\nexport * from './components/chat/ChatHeader';\nexport * from './components/chat/ChatInput';\nexport * from './components/chat/Message';\nexport * from './components/chat/Sidebar';\nexport * from './components/chat/ThreadManager';\nexport * from './components/chat/UserContext';\nexport * from './components/chat/UserMenu';\nexport * from './components/chat/UserProfile';\nexport * from './config/chatConfig';\nexport * from './types/chatTypes';\nexport * from './lib/utils';\nexport * from './lib/chatUtils';\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport {\n ChatV2Props,\n MediaAttachment,\n MessageActionEvent,\n StateCallback,\n ChatState,\n ChatUserContext,\n} from '../../types/chatTypes';\nimport { defaultChatConfig, mergeConfig } from '../../config/chatConfig';\nimport { Message } from './Message';\nimport { Sidebar } from './Sidebar';\nimport { ChatHeader } from './ChatHeader';\nimport { ChatInput } from './ChatInput';\nimport { UserProfile } from './UserProfile';\nimport { useChatUserContext } from './UserContext';\nimport { ScrollArea } from '../ui/scroll-area';\nimport { Skeleton } from '../ui/skeleton';\nimport { TooltipProvider } from '../ui/tooltip';\nimport { SidebarProvider, SidebarInset } from '../ui/sidebar';\nimport { Sparkles, ArrowRight, MessageSquare, Lightbulb, Zap, HelpCircle } from 'lucide-react';\n\n// ChatUI is a purely presentational component\nexport const ChatUI: React.FC<ChatV2Props> = ({\n messages = [],\n threads = [],\n currentThreadId = null,\n config: userConfig,\n sidebar: _sidebar,\n isGenerating = false,\n isMessagesLoading = false,\n callbacks = {},\n user,\n assistant,\n suggestions = [],\n messageSuggestions = {},\n agentOptions = [],\n selectedAgentId = null,\n onSelectAgent,\n className = '',\n onAddMemory,\n onUpdateMemory,\n onDeleteMemory,\n initialInput,\n onInitialInputConsumed,\n}) => {\n // Merge configuration with defaults\n const config = mergeConfig(defaultChatConfig, userConfig);\n\n // Mobile detection\n const [isMobile, setIsMobile] = useState(false);\n\n // Built-in user profile panel state\n const [isUserProfileOpen, setIsUserProfileOpen] = useState(false);\n\n // Try to get user context for custom fields (may not be available if used outside provider)\n let userContext: ChatUserContext | undefined;\n try {\n const contextValue = useChatUserContext();\n userContext = contextValue?.context;\n } catch {\n // ChatUI used outside of ChatUserContextProvider, that's okay\n userContext = undefined;\n }\n\n // Check if desktop on initial render\n const getInitialSidebarState = () => {\n if (typeof globalThis.innerWidth === 'number') {\n return globalThis.innerWidth >= 1024; // Open on desktop (lg+)\n }\n return false;\n };\n\n // Separate input state to avoid full re-renders on every keystroke\n const [inputValue, setInputValue] = useState('');\n const [attachments, setAttachments] = useState<MediaAttachment[]>([]);\n\n // Internal state for UI only (excluding input to optimize re-renders)\n const [state, setState] = useState<Omit<ChatState, 'input' | 'attachments'>>({\n isRecording: false,\n selectedThreadId: currentThreadId,\n isAtBottom: true,\n showSidebar: getInitialSidebarState(), // Open by default on desktop\n showThreads: false, // No longer used for main sidebar\n editingMessageId: null,\n isSidebarCollapsed: false, // No longer used for main sidebar\n });\n\n // Update internal selected thread if prop changes\n useEffect(() => {\n if (currentThreadId !== state.selectedThreadId) {\n setState(prev => ({ ...prev, selectedThreadId: currentThreadId }));\n }\n }, [currentThreadId]);\n\n // Track if initialInput has been applied\n const initialInputApplied = useRef(false);\n const initialInputConsumedRef = useRef(false);\n\n // Apply initialInput when provided\n useEffect(() => {\n if (initialInput && !initialInputApplied.current) {\n setInputValue(initialInput);\n initialInputApplied.current = true;\n }\n }, [initialInput]);\n\n // Refs\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const scrollAreaRef = useRef<HTMLDivElement>(null);\n\n // Refs for state to avoid recreating callbacks on every state change\n const stateRef = useRef(state);\n const inputValueRef = useRef(inputValue);\n const attachmentsRef = useRef(attachments);\n\n // Keep refs in sync with state\n useEffect(() => { stateRef.current = state; }, [state]);\n useEffect(() => { inputValueRef.current = inputValue; }, [inputValue]);\n useEffect(() => { attachmentsRef.current = attachments; }, [attachments]);\n\n // Mobile custom overlay mount/unmount for smooth transitions\n const [isCustomMounted, setIsCustomMounted] = useState(false);\n const [isCustomVisible, setIsCustomVisible] = useState(false);\n\n // Create state callback helpers - uses refs to avoid recreating on every state change\n const createStateCallback = useCallback(\n (setter?: (value: React.SetStateAction<ChatState>) => void): StateCallback<ChatState> => ({\n setState: (newState) => setter?.(newState),\n getState: () => ({\n ...stateRef.current,\n input: inputValueRef.current,\n attachments: attachmentsRef.current,\n }),\n }),\n [] // No dependencies - uses refs for latest state\n );\n\n // Mobile detection effect\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(globalThis.innerWidth < 1024); // lg breakpoint\n };\n\n checkMobile();\n globalThis.addEventListener('resize', checkMobile);\n return () => globalThis.removeEventListener('resize', checkMobile);\n }, []);\n\n // Animate mobile custom component overlay\n useEffect(() => {\n if (!isMobile || !config.customComponent?.component) return;\n if (state.showSidebar) {\n setIsCustomMounted(true);\n requestAnimationFrame(() => setIsCustomVisible(true));\n } else {\n setIsCustomVisible(false);\n const t = setTimeout(() => setIsCustomMounted(false), 200);\n return () => clearTimeout(t);\n }\n }, [state.showSidebar, isMobile, config.customComponent]);\n\n // Auto-scroll to bottom\n useEffect(() => {\n if (!state.isAtBottom) return;\n const viewport = scrollAreaRef.current;\n if (!viewport) return;\n const target = viewport.scrollHeight;\n try {\n viewport.scrollTo({ top: target, behavior: 'smooth' });\n } catch {\n viewport.scrollTop = target;\n }\n }, [messages, state.isAtBottom]);\n\n // Handle scroll position\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollHeight, clientHeight } = e.currentTarget;\n const isAtBottom = scrollHeight - scrollTop - clientHeight < 50;\n setState(prev => ({ ...prev, isAtBottom }));\n }, []);\n\n // Message handling\n const handleSendMessage = useCallback((\n content: string,\n messageAttachments: MediaAttachment[] = []\n ) => {\n if (!content.trim() && messageAttachments.length === 0) return;\n \n // Call external callback\n callbacks.onSendMessage?.(content, messageAttachments, createStateCallback());\n\n // Mark initial input as consumed when message is sent\n if (initialInputApplied.current && !initialInputConsumedRef.current) {\n initialInputConsumedRef.current = true;\n onInitialInputConsumed?.();\n }\n\n // Clear input (using separate state for performance)\n setInputValue('');\n setAttachments([]);\n }, [callbacks, createStateCallback, onInitialInputConsumed]);\n\n // Message actions\n const handleMessageAction = useCallback((event: MessageActionEvent) => {\n const { action, messageId, content } = event;\n\n switch (action) {\n case 'copy':\n callbacks.onCopyMessage?.(messageId, content || '', createStateCallback());\n break;\n case 'edit':\n if (content) {\n callbacks.onEditMessage?.(messageId, content, createStateCallback());\n }\n break;\n case 'regenerate':\n callbacks.onRegenerateMessage?.(messageId, createStateCallback());\n break;\n case 'delete':\n callbacks.onDeleteMessage?.(messageId, createStateCallback());\n break;\n }\n }, [callbacks, createStateCallback]);\n\n // Thread management\n const handleCreateThread = useCallback((title?: string) => {\n callbacks.onCreateThread?.(title, createStateCallback());\n }, [callbacks, createStateCallback]);\n\n const handleSelectThread = useCallback((threadId: string) => {\n callbacks.onSelectThread?.(threadId, createStateCallback());\n }, [callbacks, createStateCallback]);\n\n const handleRenameThread = useCallback((threadId: string, newTitle: string) => {\n callbacks.onRenameThread?.(threadId, newTitle, createStateCallback());\n }, [callbacks, createStateCallback]);\n\n const handleDeleteThread = useCallback((threadId: string) => {\n callbacks.onDeleteThread?.(threadId, createStateCallback());\n }, [callbacks, createStateCallback]);\n\n const handleArchiveThread = useCallback((threadId: string) => {\n callbacks.onArchiveThread?.(threadId, createStateCallback());\n }, [callbacks, createStateCallback]);\n\n // Close sidebar handler\n const closeSidebar = useCallback(() => {\n setState(prev => ({ ...prev, showSidebar: false }));\n }, []);\n\n // Render custom component with props if it's a function\n const renderCustomComponent = useCallback(() => {\n const component = config?.customComponent?.component;\n if (!component) return null;\n if (typeof component === 'function') {\n return component({ onClose: closeSidebar, isMobile });\n }\n return component;\n }, [config?.customComponent?.component, closeSidebar, isMobile]);\n\n // Icon components for suggestion cards (cycle through these)\n const SuggestionIconComponents = [MessageSquare, Lightbulb, Zap, HelpCircle];\n\n // Render suggestions\n const renderSuggestions = () => {\n if (messages.length > 0 || !suggestions.length) return null;\n\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] py-8 px-4\">\n {/* Hero section */}\n <div className=\"text-center mb-8\">\n <div className=\"inline-flex items-center justify-center w-14 h-14 rounded-2xl bg-gradient-to-br from-primary/20 to-primary/5 mb-4 shadow-sm\">\n <Sparkles className=\"w-7 h-7 text-primary\" />\n </div>\n <h2 className=\"text-xl font-semibold mb-2\">{config.branding.title}</h2>\n <p className=\"text-muted-foreground text-sm max-w-md\">{config.branding.subtitle}</p>\n </div>\n\n {/* Suggestion cards */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 w-full max-w-2xl\">\n {suggestions.map((suggestion, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => handleSendMessage(suggestion)}\n className=\"group relative flex items-start gap-3 p-4 text-left rounded-xl border bg-card hover:bg-accent/50 hover:border-accent transition-all duration-200 hover:shadow-sm\"\n >\n {(() => {\n const IconComponent = SuggestionIconComponents[index % SuggestionIconComponents.length];\n return (\n <div className=\"flex items-center justify-center w-8 h-8 rounded-lg bg-primary/10 text-primary shrink-0 group-hover:bg-primary/15 transition-colors\">\n <IconComponent className=\"h-4 w-4\" />\n </div>\n );\n })()}\n <div className=\"flex-1 min-w-0 pr-6\">\n <p className=\"text-sm font-medium leading-snug line-clamp-2\">{suggestion}</p>\n </div>\n <ArrowRight className=\"absolute right-4 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\" />\n </button>\n ))}\n </div>\n </div>\n );\n };\n\n const renderInlineSuggestions = (messageId: string) => {\n const items = messageSuggestions?.[messageId];\n if (!items || items.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2 mt-2 ml-11\">\n {items.map((suggestion, index) => (\n <button\n key={`${messageId}-suggestion-${index}`}\n type=\"button\"\n onClick={() => handleSendMessage(suggestion)}\n className=\"group inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border border-border bg-background hover:bg-accent hover:border-accent-foreground/20 transition-all duration-150 text-foreground/80 hover:text-foreground\"\n >\n <Sparkles className=\"h-3 w-3 text-primary opacity-70 group-hover:opacity-100\" />\n <span className=\"max-w-[200px] truncate\">{suggestion}</span>\n </button>\n ))}\n </div>\n );\n };\n\n const renderMessageLoadingSkeleton = () => (\n <div className=\"space-y-6 py-2\">\n {[0, 1, 2, 3].map((index) => {\n const isUserRow = index % 2 === 1;\n return (\n <div\n key={`message-skeleton-${index}`}\n className={`flex gap-3 ${isUserRow ? 'justify-end' : 'justify-start'}`}\n >\n {!isUserRow && <Skeleton className=\"h-8 w-8 rounded-full shrink-0\" />}\n <div className={`space-y-2 ${isUserRow ? 'w-[70%]' : 'w-[75%]'}`}>\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-[85%]\" />\n </div>\n {isUserRow && <Skeleton className=\"h-8 w-8 rounded-full shrink-0\" />}\n </div>\n );\n })}\n </div>\n );\n\n const shouldShowAgentSelector = Boolean(\n config.agentSelector?.enabled &&\n onSelectAgent &&\n agentOptions.length > 0 &&\n (!config.agentSelector?.hideIfSingle || agentOptions.length > 1)\n );\n\n return (\n <TooltipProvider>\n <SidebarProvider defaultOpen>\n <div className={`flex h-[100svh] md:h-screen bg-background w-full overflow-hidden ${className}`}>\n \n <Sidebar\n threads={threads}\n currentThreadId={state.selectedThreadId}\n config={config}\n onCreateThread={handleCreateThread}\n onSelectThread={handleSelectThread}\n onRenameThread={handleRenameThread}\n onDeleteThread={handleDeleteThread}\n onArchiveThread={handleArchiveThread}\n // User menu props\n user={user ? {\n id: user.id,\n name: user.name,\n email: user.email,\n avatar: user.avatar,\n } : null}\n userMenuCallbacks={{\n onViewProfile: () => {\n setIsUserProfileOpen(true);\n callbacks.onViewProfile?.();\n },\n onOpenSettings: callbacks.onOpenSettings,\n onThemeChange: callbacks.onThemeChange,\n onLogout: callbacks.onLogout,\n }}\n currentTheme={config.ui.theme === 'auto' ? 'system' : config.ui.theme}\n showThemeOptions={!!callbacks.onThemeChange}\n />\n\n <SidebarInset>\n <div className=\"flex flex-col h-full min-h-0\">\n {/* Header */}\n <ChatHeader\n config={config}\n currentThreadTitle={threads.find(t => t.id === state.selectedThreadId)?.title}\n // onSidebarToggle is now handled by SidebarTrigger inside ChatHeader\n isMobile={isMobile}\n onCustomComponentToggle={() => setState(prev => ({ ...prev, showSidebar: !prev.showSidebar }))}\n onNewThread={handleCreateThread}\n showCustomComponentButton={!!config?.customComponent?.component}\n showAgentSelector={shouldShowAgentSelector}\n agentOptions={agentOptions}\n selectedAgentId={selectedAgentId}\n onSelectAgent={onSelectAgent}\n />\n\n <div className=\"flex flex-1 flex-row min-h-0 overflow-hidden\">\n {/* Main Chat Area */}\n <div className=\"flex-1 flex flex-col min-h-0\">\n {/* Messages */}\n <ScrollArea\n ref={scrollAreaRef}\n className=\"flex-1 min-h-0\"\n viewportClassName=\"p-4 overscroll-contain\"\n onScrollCapture={handleScroll}\n >\n <div className=\"max-w-4xl mx-auto space-y-4 pb-4\">\n {isMessagesLoading ? (\n renderMessageLoadingSkeleton()\n ) : (\n <>\n {renderSuggestions()}\n\n {messages.map((message, index) => {\n // Check if this message is from the same sender as the previous one\n const prevMessage = index > 0 ? messages[index - 1] : null;\n const isGrouped = prevMessage !== null && prevMessage.role === message.role;\n \n return (\n <div key={message.id} className={isGrouped ? 'space-y-1 -mt-2' : 'space-y-2'}>\n <Message\n message={message}\n userAvatar={user?.avatar}\n userName={user?.name}\n assistantAvatar={assistant?.avatar}\n assistantName={assistant?.name}\n showTimestamp={config.ui.showTimestamps}\n showAvatar={config.ui.showAvatars}\n enableCopy={config.features.enableMessageCopy}\n enableEdit={config.features.enableMessageEditing}\n enableRegenerate={config.features.enableRegeneration}\n enableToolCallsDisplay={config.features.enableToolCallsDisplay}\n compactMode={config.ui.compactMode}\n onAction={handleMessageAction}\n toolUsedLabel={config.labels.toolUsed}\n thinkingLabel={config.labels.thinking}\n isGrouped={isGrouped}\n />\n {message.role === 'assistant' && renderInlineSuggestions(message.id)}\n </div>\n );\n })}\n </>\n )}\n\n <div ref={messagesEndRef} />\n </div>\n </ScrollArea>\n\n {/* Input */}\n <div className=\"bg-background pb-[env(safe-area-inset-bottom)]\">\n <ChatInput\n value={inputValue}\n onChange={(value) => {\n setInputValue(value);\n // Mark initial input as consumed when user modifies it\n if (initialInputApplied.current && !initialInputConsumedRef.current) {\n initialInputConsumedRef.current = true;\n onInitialInputConsumed?.();\n }\n }}\n onSubmit={handleSendMessage}\n attachments={attachments}\n onAttachmentsChange={setAttachments}\n placeholder={config.labels.inputPlaceholder}\n disabled={false}\n isGenerating={isGenerating}\n onStopGeneration={callbacks.onStopGeneration}\n enableFileUpload={config.features.enableFileUpload}\n enableAudioRecording={config.features.enableAudioRecording}\n maxAttachments={config.features.maxAttachments}\n maxFileSize={config.features.maxFileSize}\n config={config}\n />\n </div>\n </div>\n\n {/* Right sidebar custom component for desktop */}\n {config?.customComponent?.component && !isMobile && (\n <div\n className={`h-full transition-all duration-300 ease-in-out overflow-hidden ${\n state.showSidebar ? 'w-80' : 'w-0'\n }`}\n >\n {state.showSidebar && (\n <div className=\"flex flex-col h-full border-l bg-background animate-in slide-in-from-right-4 duration-300 w-80\">\n {renderCustomComponent()}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </SidebarInset>\n\n {/* Mobile custom sidebar overlay with smooth transitions (slides from right) */}\n {isCustomMounted && config.customComponent?.component && isMobile && (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n <div\n className={`absolute inset-0 bg-background/80 backdrop-blur-sm transition-opacity duration-200 ease-out ${\n isCustomVisible ? 'opacity-100' : 'opacity-0'\n }`}\n style={{ willChange: 'opacity' }}\n onClick={closeSidebar}\n />\n {/* Panel - slides from right */}\n <div\n className={`absolute top-0 right-0 h-full w-full bg-background transform-gpu transition-transform duration-200 ease-out ${\n isCustomVisible ? 'translate-x-0' : 'translate-x-full'\n }`}\n style={{ willChange: 'transform' }}\n >\n <div className=\"h-full flex flex-col\">\n {renderCustomComponent()}\n </div>\n </div>\n </div>\n )}\n\n {/* Built-in User Profile Panel - only render when open to avoid Radix focus conflicts */}\n {isUserProfileOpen && (\n <UserProfile\n isOpen={isUserProfileOpen}\n onClose={() => setIsUserProfileOpen(false)}\n user={user ? {\n id: user.id,\n name: user.name,\n email: user.email,\n avatar: user.avatar,\n } : null}\n customFields={userContext?.customFields}\n memories={userContext?.memories?.items}\n onLogout={callbacks.onLogout}\n onAddMemory={onAddMemory}\n onUpdateMemory={onUpdateMemory}\n onDeleteMemory={onDeleteMemory}\n />\n )}\n </div>\n </SidebarProvider>\n </TooltipProvider>\n );\n};\n","import { ChatConfig } from '../types/chatTypes';\n\n// Default configuration\nexport const defaultChatConfig: Required<ChatConfig> = {\n\n branding: {\n logo: null,\n avatar: null,\n title: 'Chat Assistant',\n subtitle: 'How can I help you today?',\n },\n\n agentSelector: {\n enabled: false,\n label: 'Select agent',\n hideIfSingle: true,\n },\n \n labels: {\n inputPlaceholder: 'Type your message...',\n sendButton: 'Send',\n sendMessageTooltip: 'Send message',\n newThread: 'New Conversation',\n deleteThread: 'Delete Conversation',\n copyMessage: 'Copy',\n editMessage: 'Edit',\n regenerateMessage: 'Regenerate',\n stopGeneration: 'Stop',\n stopGenerationTooltip: 'Stop generation',\n attachFiles: 'Attach Files',\n attachFileTooltip: 'Attach file',\n recordAudio: 'Record Audio',\n recordAudioTooltip: 'Record audio',\n // Header labels\n exportData: 'Export data',\n importData: 'Import data',\n clearAll: 'Clear all',\n sidebarToggle: 'Menu',\n customComponentToggle: 'Toggle',\n settings: 'Settings',\n toggleDarkMode: 'Toggle Dark Mode',\n lightMode: 'Light Mode',\n darkMode: 'Dark Mode',\n // Sidebar labels\n newChat: 'New Conversation',\n search: 'Search conversations...',\n customComponentLabel: 'Custom',\n showArchived: 'Show Archived',\n hideArchived: 'Hide Archived',\n noThreadsFound: 'No conversations found',\n noThreadsYet: 'No conversations yet',\n deleteConfirmTitle: 'Delete Conversation',\n deleteConfirmDescription: 'Are you sure you want to delete this conversation? This action cannot be undone. All messages will be permanently lost.',\n renameThread: 'Rename',\n archiveThread: 'Archive',\n unarchiveThread: 'Unarchive',\n today: 'Today',\n yesterday: 'Yesterday',\n createNewThread: 'Create New Conversation',\n threadNamePlaceholder: 'Conversation name (optional)',\n cancel: 'Cancel',\n create: 'Create Conversation',\n footerLabel: 'Assistant can make mistakes. Check the AI results.',\n toolUsed: 'Tool Used',\n daysAgo: 'days ago',\n inputHelpText: 'Press Enter to send, Shift+Enter to add a new line.',\n thinking: 'Thinking...',\n defaultThreadName: 'Main Thread',\n },\n \n features: {\n enableThreads: true,\n enableFileUpload: true,\n enableAudioRecording: true,\n enableMessageEditing: true,\n enableMessageCopy: true,\n enableRegeneration: true,\n enableToolCallsDisplay: true,\n maxAttachments: 4,\n maxFileSize: 10 * 1024 * 1024, // 10MB\n },\n \n ui: {\n theme: 'auto' as const,\n showTimestamps: false,\n showAvatars: true,\n compactMode: false,\n showWordCount: false,\n },\n \n customComponent: {},\n headerActions: null,\n};\n\n// Deep merge function for configurations\nexport function mergeConfig(_baseConfig: ChatConfig, userConfig?: Partial<ChatConfig>): Required<ChatConfig> {\n if (!userConfig) return defaultChatConfig;\n\n return {\n branding: {\n ...defaultChatConfig.branding,\n ...userConfig.branding,\n },\n labels: {\n ...defaultChatConfig.labels,\n ...userConfig.labels,\n },\n features: {\n ...defaultChatConfig.features,\n ...userConfig.features,\n },\n ui: {\n ...defaultChatConfig.ui,\n ...userConfig.ui,\n },\n agentSelector: {\n ...defaultChatConfig.agentSelector,\n ...userConfig.agentSelector,\n },\n customComponent: userConfig.customComponent || defaultChatConfig.customComponent,\n headerActions: userConfig.headerActions || defaultChatConfig.headerActions,\n };\n}\n\n// Predefined configuration presets\nexport const chatConfigPresets = {\n minimal: {\n features: {\n enableThreads: false,\n enableFileUpload: false,\n enableAudioRecording: false,\n enableMessageEditing: false,\n enableMessageCopy: true,\n enableRegeneration: true,\n enableToolCallsDisplay: false,\n },\n ui: {\n compactMode: true,\n showTimestamps: false,\n showAvatars: false,\n },\n } as Partial<ChatConfig>,\n\n full: {\n features: {\n enableThreads: true,\n enableFileUpload: true,\n enableAudioRecording: true,\n enableMessageEditing: true,\n enableMessageCopy: true,\n enableRegeneration: true,\n enableToolCallsDisplay: true,\n },\n ui: {\n showTimestamps: true,\n showAvatars: true,\n compactMode: false,\n showWordCount: true,\n },\n } as Partial<ChatConfig>,\n\n developer: {\n features: {\n enableThreads: true,\n enableFileUpload: true,\n enableAudioRecording: false,\n enableMessageEditing: true,\n enableMessageCopy: true,\n enableRegeneration: true,\n enableToolCallsDisplay: true,\n },\n ui: {\n showTimestamps: true,\n showAvatars: true,\n compactMode: false,\n showWordCount: true,\n },\n } as Partial<ChatConfig>,\n\n customer_support: {\n branding: {\n title: 'Customer Support',\n subtitle: 'How can I help you today?',\n },\n features: {\n enableThreads: true,\n enableFileUpload: true,\n enableAudioRecording: false,\n enableMessageEditing: false,\n enableMessageCopy: true,\n enableRegeneration: false,\n enableToolCallsDisplay: false,\n },\n ui: {\n showTimestamps: true,\n showAvatars: true,\n compactMode: false,\n },\n } as Partial<ChatConfig>,\n} as const;\n\n// Configuration validation\nexport function validateConfig(config: ChatConfig): string[] {\n const errors: string[] = [];\n\n // Validate features\n if (config.features?.maxAttachments && config.features.maxAttachments < 1) {\n errors.push('maxAttachments must be at least 1');\n }\n\n if (config.features?.maxFileSize && config.features.maxFileSize < 1024) {\n errors.push('maxFileSize must be at least 1024 bytes (1KB)');\n }\n\n // Validate branding\n if (config.branding?.title && typeof config.branding.title !== 'string') {\n errors.push('branding.title must be a string');\n }\n\n return errors;\n}\n\n// Theme utilities\nexport const themeUtils = {\n getSystemTheme: (): 'light' | 'dark' => {\n if (typeof globalThis.matchMedia === 'undefined') return 'light';\n return globalThis.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n },\n\n resolveTheme: (theme: 'light' | 'dark' | 'auto'): 'light' | 'dark' => {\n return theme === 'auto' ? themeUtils.getSystemTheme() : theme;\n },\n\n applyTheme: (theme: 'light' | 'dark' | 'auto') => {\n if (typeof document === 'undefined') return;\n \n const resolvedTheme = themeUtils.resolveTheme(theme);\n document.documentElement.classList.toggle('dark', resolvedTheme === 'dark');\n },\n};\n\n// Feature flags utility\nexport const featureFlags = {\n isEnabled: (config: Required<ChatConfig>, feature: keyof Required<ChatConfig>['features']): boolean => {\n return config.features[feature] === true;\n },\n\n getEnabledFeatures: (config: Required<ChatConfig>): string[] => {\n return Object.entries(config.features)\n .filter(([_, enabled]) => enabled === true)\n .map(([feature]) => feature);\n },\n\n hasAnyFeature: (config: Required<ChatConfig>, features: (keyof Required<ChatConfig>['features'])[]): boolean => {\n return features.some(feature => featureFlags.isEnabled(config, feature));\n },\n};\n\n// Configuration hooks for React components\nexport const configUtils = {\n createConfigHook: (config: Required<ChatConfig>) => {\n return {\n config,\n isFeatureEnabled: (feature: keyof Required<ChatConfig>['features']) => \n featureFlags.isEnabled(config, feature),\n getLabel: (key: keyof Required<ChatConfig>['labels']) => \n config.labels[key],\n getBranding: () => config.branding,\n getUI: () => config.ui,\n };\n },\n};\n","import React, { useState, useRef, useEffect, memo } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeHighlight from 'rehype-highlight';\nimport { ChatMessage, MediaAttachment, ToolCall, MessageActionEvent } from '../../types/chatTypes';\nimport { Button } from '../ui/button';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport { Badge } from '../ui/badge';\nimport { Card, CardContent } from '../ui/card';\nimport { Textarea } from '../ui/textarea';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip';\nimport {\n Copy,\n Edit,\n RotateCcw,\n Check,\n X,\n Play,\n Pause,\n Wrench,\n Clock,\n ChevronRight,\n ChevronDown\n} from 'lucide-react';\n\n\ninterface MessageProps {\n message: ChatMessage;\n isUser?: boolean;\n userAvatar?: string;\n userName?: string;\n assistantAvatar?: React.ReactNode;\n assistantName?: string;\n showTimestamp?: boolean;\n showAvatar?: boolean;\n enableCopy?: boolean;\n enableEdit?: boolean;\n enableRegenerate?: boolean;\n enableToolCallsDisplay?: boolean;\n compactMode?: boolean;\n onAction?: (event: MessageActionEvent) => void;\n className?: string;\n toolUsedLabel?: string;\n thinkingLabel?: string;\n /** When true, hides the avatar and name (for grouped consecutive messages from same sender) */\n isGrouped?: boolean;\n}\n\n// Thinking indicator component - memoized since it's rendered during streaming\nconst ThinkingIndicator: React.FC<{ label?: string }> = memo(function ThinkingIndicator({ label = 'Thinking...' }: { label?: string }) {\n return (\n <div className=\"flex items-center gap-2 py-2\">\n <div className=\"flex gap-1\">\n <span \n className=\"inline-block w-2 h-2 bg-primary rounded-full animate-bounce\" \n style={{ animationDelay: '0ms' }} \n />\n <span \n className=\"inline-block w-2 h-2 bg-primary rounded-full animate-bounce\" \n style={{ animationDelay: '150ms' }} \n />\n <span \n className=\"inline-block w-2 h-2 bg-primary rounded-full animate-bounce\" \n style={{ animationDelay: '300ms' }} \n />\n </div>\n <span className=\"text-sm text-muted-foreground animate-pulse\">{label}</span>\n </div>\n );\n});\n\n// Memoized markdown components configuration to prevent recreation on every render\nconst markdownComponents = {\n code: ({ node, className, children, ...props }: any) => {\n const inline = (props as { inline?: boolean }).inline;\n const match = /language-(\\w+)/.exec(className || '');\n return !inline && match ? (\n <pre className=\"relative\">\n <code className={className} {...props}>\n {children}\n </code>\n </pre>\n ) : (\n <code className=\"bg-muted px-1 py-0.5 rounded text-sm\" {...props}>\n {children}\n </code>\n );\n },\n};\n\n// Memoized plugins arrays to prevent recreation\nconst remarkPluginsDefault = [remarkGfm];\nconst rehypePluginsDefault = [rehypeHighlight];\nconst rehypePluginsEmpty: never[] = [];\n\n// Streaming text component for real-time markdown rendering - memoized to prevent unnecessary re-renders\nconst StreamingText: React.FC<{ content: string; isStreaming?: boolean; thinkingLabel?: string }> = memo(function StreamingText({\n content,\n isStreaming = false,\n thinkingLabel = 'Thinking...'\n}: { content: string; isStreaming?: boolean; thinkingLabel?: string }) {\n const hasContent = content.trim().length > 0;\n\n return (\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n {hasContent ? (\n <ReactMarkdown\n remarkPlugins={remarkPluginsDefault}\n rehypePlugins={isStreaming ? rehypePluginsEmpty : rehypePluginsDefault}\n components={markdownComponents}\n >\n {content}\n </ReactMarkdown>\n ) : isStreaming ? (\n // Show thinking indicator while waiting for first token\n <ThinkingIndicator label={thinkingLabel} />\n ) : null}\n {isStreaming && hasContent && (\n <span className=\"inline-block w-2 h-4 bg-primary animate-pulse ml-1\" />\n )}\n </div>\n );\n});\n\n// Media attachment renderer - memoized to prevent unnecessary re-renders\nconst MediaRenderer: React.FC<{ attachment: MediaAttachment }> = memo(function MediaRenderer({ attachment }) {\n const [isPlaying, setIsPlaying] = useState(false);\n const audioRef = useRef<HTMLAudioElement>(null);\n const videoRef = useRef<HTMLVideoElement>(null);\n\n const togglePlayback = () => {\n if (attachment.kind === 'audio' && audioRef.current) {\n if (isPlaying) {\n audioRef.current.pause();\n } else {\n audioRef.current.play();\n }\n setIsPlaying(!isPlaying);\n } else if (attachment.kind === 'video' && videoRef.current) {\n if (isPlaying) {\n videoRef.current.pause();\n } else {\n videoRef.current.play();\n }\n setIsPlaying(!isPlaying);\n }\n };\n\n const formatDuration = (ms?: number) => {\n if (!ms) return '';\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n return `${minutes}:${(seconds % 60).toString().padStart(2, '0')}`;\n };\n\n switch (attachment.kind) {\n case 'image':\n return (\n <div className=\"relative rounded-lg overflow-hidden border bg-muted/20 max-w-md\">\n <img\n src={attachment.dataUrl}\n alt={attachment.fileName || 'Attachment'}\n className=\"w-full h-auto object-cover\"\n loading=\"lazy\"\n />\n {attachment.fileName && (\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/50 text-white text-xs p-2\">\n {attachment.fileName}\n </div>\n )}\n </div>\n );\n\n case 'audio':\n return (\n <div className=\"flex w-full max-w-md py-0 min-w-64 items-center gap-3\">\n <audio\n ref={audioRef}\n src={attachment.dataUrl}\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onEnded={() => setIsPlaying(false)}\n className=\"w-full mt-2\"\n controls\n />\n </div>\n );\n\n case 'video':\n return (\n <div className=\"relative rounded-lg overflow-hidden border bg-muted/20 max-w-lg\">\n <video\n ref={videoRef}\n src={attachment.dataUrl}\n poster={attachment.poster}\n controls\n className=\"w-full h-auto\"\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onEnded={() => setIsPlaying(false)}\n />\n {attachment.fileName && (\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/50 text-white text-xs p-2\">\n {attachment.fileName}\n </div>\n )}\n </div>\n );\n\n default:\n return null;\n }\n});\n\n// Tool calls display component - memoized to prevent unnecessary re-renders\nconst ToolCallsDisplay: React.FC<{ toolCalls: ToolCall[]; label?: string }> = memo(function ToolCallsDisplay({ toolCalls, label }) {\n const [expandedCall, setExpandedCall] = useState<string | null>(null);\n\n const getStatusIcon = (status: ToolCall['status']) => {\n switch (status) {\n case 'pending':\n return <Clock className=\"h-3 w-3 text-muted-foreground\" />;\n case 'running':\n return <div className=\"h-3 w-3 border-2 border-primary border-t-transparent rounded-full animate-spin\" />;\n case 'completed':\n return <Check className=\"h-3 w-3 text-green-500\" />;\n case 'failed':\n return <X className=\"h-3 w-3 text-destructive\" />;\n }\n };\n\n const getStatusBadgeClasses = (status: ToolCall['status']) => {\n switch (status) {\n case 'pending':\n return 'bg-muted text-muted-foreground';\n case 'running':\n return 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300';\n case 'completed':\n return 'bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-300';\n case 'failed':\n return 'bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-300';\n }\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-xs uppercase tracking-wide text-muted-foreground font-semibold\">\n <Wrench className=\"h-3 w-3\" />\n {label || 'Ferramenta utilizada'}\n </div>\n {toolCalls.map((call) => {\n const isExpanded = expandedCall === call.id;\n const ToggleIcon = isExpanded ? ChevronDown : ChevronRight;\n\n return (\n <Card key={call.id} className=\"border border-dashed border-primary/40 bg-card/60\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between gap-3 px-3 py-2 text-left\"\n onClick={() => setExpandedCall(isExpanded ? null : call.id)}\n >\n <div className=\"flex items-center gap-2\">\n {getStatusIcon(call.status)}\n <span className=\"font-medium text-sm\">{call.name}</span>\n <Badge variant=\"secondary\" className={getStatusBadgeClasses(call.status)}>\n {call.status}\n </Badge>\n </div>\n <ToggleIcon className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n {isExpanded && (\n <CardContent className=\"pt-0 pb-3 px-3 text-xs space-y-2\">\n <div>\n <div className=\"font-medium text-muted-foreground mb-1\">Args</div>\n <pre className=\"rounded bg-muted p-2 overflow-x-auto text-xs\">\n {JSON.stringify(call.arguments, null, 2)}\n </pre>\n </div>\n {typeof call.result !== 'undefined' && (\n <div>\n <div className=\"font-medium text-muted-foreground mb-1\">Result</div>\n <pre className=\"rounded bg-muted p-2 overflow-x-auto text-xs\">\n {JSON.stringify(call.result, null, 2)}\n </pre>\n </div>\n )}\n {call.startTime && call.endTime && (\n <div className=\"text-muted-foreground\">\n Executed in {call.endTime - call.startTime}ms\n </div>\n )}\n </CardContent>\n )}\n </Card>\n );\n })}\n </div>\n );\n});\n\n// Custom comparison function for React.memo to avoid unnecessary re-renders\nconst arePropsEqual = (prevProps: MessageProps, nextProps: MessageProps): boolean => {\n // Compare message content and streaming state\n if (prevProps.message.id !== nextProps.message.id) return false;\n if (prevProps.message.content !== nextProps.message.content) return false;\n if (prevProps.message.isStreaming !== nextProps.message.isStreaming) return false;\n if (prevProps.message.isComplete !== nextProps.message.isComplete) return false;\n if (prevProps.message.isEdited !== nextProps.message.isEdited) return false;\n if (prevProps.message.timestamp !== nextProps.message.timestamp) return false;\n \n // Compare tool calls (by reference first, then by length for quick check)\n if (prevProps.message.toolCalls !== nextProps.message.toolCalls) {\n const prevCalls = prevProps.message.toolCalls;\n const nextCalls = nextProps.message.toolCalls;\n if (!prevCalls || !nextCalls || prevCalls.length !== nextCalls.length) return false;\n // Deep check tool call status changes\n for (let i = 0; i < prevCalls.length; i++) {\n if (prevCalls[i].id !== nextCalls[i].id ||\n prevCalls[i].status !== nextCalls[i].status ||\n prevCalls[i].result !== nextCalls[i].result) {\n return false;\n }\n }\n }\n \n // Compare attachments by reference (usually stable)\n if (prevProps.message.attachments !== nextProps.message.attachments) {\n const prevAtt = prevProps.message.attachments;\n const nextAtt = nextProps.message.attachments;\n if (!prevAtt || !nextAtt || prevAtt.length !== nextAtt.length) return false;\n }\n \n // Compare other props\n if (prevProps.isUser !== nextProps.isUser) return false;\n if (prevProps.userAvatar !== nextProps.userAvatar) return false;\n if (prevProps.userName !== nextProps.userName) return false;\n if (prevProps.assistantName !== nextProps.assistantName) return false;\n if (prevProps.showTimestamp !== nextProps.showTimestamp) return false;\n if (prevProps.showAvatar !== nextProps.showAvatar) return false;\n if (prevProps.enableCopy !== nextProps.enableCopy) return false;\n if (prevProps.enableEdit !== nextProps.enableEdit) return false;\n if (prevProps.enableRegenerate !== nextProps.enableRegenerate) return false;\n if (prevProps.enableToolCallsDisplay !== nextProps.enableToolCallsDisplay) return false;\n if (prevProps.compactMode !== nextProps.compactMode) return false;\n if (prevProps.className !== nextProps.className) return false;\n if (prevProps.toolUsedLabel !== nextProps.toolUsedLabel) return false;\n if (prevProps.thinkingLabel !== nextProps.thinkingLabel) return false;\n if (prevProps.isGrouped !== nextProps.isGrouped) return false;\n \n // onAction callback - skip comparison since it should be stable with useCallback\n // assistantAvatar is a ReactNode - compare by reference\n if (prevProps.assistantAvatar !== nextProps.assistantAvatar) return false;\n \n return true;\n};\n\nexport const Message: React.FC<MessageProps> = memo(({\n message,\n isUser,\n userAvatar,\n userName = 'Você',\n assistantAvatar,\n assistantName = 'Assistente',\n showTimestamp = false,\n showAvatar = true,\n enableCopy = true,\n enableEdit = true,\n enableRegenerate = true,\n enableToolCallsDisplay = false,\n compactMode = false,\n onAction,\n className = '',\n toolUsedLabel,\n thinkingLabel = 'Thinking...',\n isGrouped = false,\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editContent, setEditContent] = useState(message.content);\n const [showActions, setShowActions] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const messageIsUser = isUser ?? message.role === 'user';\n const canEdit = enableEdit && messageIsUser;\n const canRegenerate = enableRegenerate && !messageIsUser;\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(message.content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onAction?.({ action: 'copy', messageId: message.id, content: message.content });\n } catch (error) {\n console.error('Failed to copy message:', error);\n }\n };\n\n const handleEdit = () => {\n if (isEditing) {\n if (editContent.trim() !== message.content) {\n onAction?.({ action: 'edit', messageId: message.id, content: editContent.trim() });\n }\n setIsEditing(false);\n } else {\n setEditContent(message.content);\n setIsEditing(true);\n }\n };\n\n const handleCancelEdit = () => {\n setEditContent(message.content);\n setIsEditing(false);\n };\n\n const handleRegenerate = () => {\n onAction?.({ action: 'regenerate', messageId: message.id });\n };\n\n const formatTime = (timestamp: number) => {\n return new Date(timestamp).toLocaleTimeString('pt-BR', {\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n return (\n <TooltipProvider>\n <div\n className={`flex w-full flex-col ${className} max-w-[800px] mx-auto`}\n onMouseEnter={() => setShowActions(true)}\n onMouseLeave={() => setShowActions(false)}\n >\n\n {/* Header row with avatar and name - hidden when grouped */}\n {!isGrouped && (\n <div className={`flex gap-3 ${messageIsUser ? 'flex-row-reverse' : 'flex-row'} w-full mb-1`}>\n {/* Avatar */}\n {showAvatar && (\n <div className={`flex-shrink-0 ${compactMode ? 'mt-1' : 'mt-0'}`}>\n <Avatar className={compactMode ? 'h-6 w-6' : 'h-8 w-8'}>\n {messageIsUser ? (\n <>\n <AvatarImage src={userAvatar} alt={userName} />\n <AvatarFallback className=\"bg-primary text-primary-foreground\">\n {userName.charAt(0).toUpperCase()}\n </AvatarFallback>\n </>\n ) : (\n <>\n {assistantAvatar || (\n <AvatarFallback className=\"bg-secondary text-secondary-foreground\">\n AI\n </AvatarFallback>\n )}\n </>\n )}\n </Avatar>\n </div>\n )}\n\n {/* Header */}\n <div className={`flex items-center gap-2 mb-1 ${messageIsUser ? 'flex-row-reverse' : 'flex-row'}`}>\n <span className={`font-medium ${compactMode ? 'text-sm' : 'text-base'}`}>\n {messageIsUser ? userName : assistantName}\n </span>\n {showTimestamp && (\n <span className=\"text-xs text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {message.isEdited && (\n <Badge variant=\"outline\" className=\"text-xs\">\n editado\n </Badge>\n )}\n </div>\n </div>\n )}\n\n {/* Add left margin for grouped messages to align with content under avatar */}\n <div className={`flex-1 min-w-0 ${messageIsUser ? 'text-right' : 'text-left'} ${isGrouped && showAvatar && !messageIsUser ? (compactMode ? 'ml-9' : 'ml-11') : ''} ${isGrouped && showAvatar && messageIsUser ? (compactMode ? 'mr-9' : 'mr-11') : ''}`}>\n\n {/* Message Body */}\n <div className={`relative inline-flex flex-col ${messageIsUser\n ? 'rounded-lg p-3 bg-primary text-primary-foreground ml-auto max-w-[85%]'\n : 'max-w-[85%]'\n }`}>\n {isEditing ? (\n <div className=\"space-y-2\">\n <Textarea\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n className=\"min-h-[100px] resize-none\"\n autoFocus\n />\n <div className=\"flex gap-2 justify-end\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleCancelEdit}>\n <X className=\"h-4 w-4 mr-1\" />\n Cancelar\n </Button>\n <Button size=\"sm\" onClick={handleEdit}>\n <Check className=\"h-4 w-4 mr-1\" />\n Salvar\n </Button>\n </div>\n </div>\n ) : (\n <>\n {/* Tool Calls */}\n {enableToolCallsDisplay && message.toolCalls && message.toolCalls.length > 0 && (\n <div className=\"mb-3\">\n <ToolCallsDisplay toolCalls={message.toolCalls} label={toolUsedLabel} />\n </div>\n )}\n\n <StreamingText\n content={message.content}\n isStreaming={message.isStreaming}\n thinkingLabel={thinkingLabel}\n />\n\n {/* Attachments */}\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {message.attachments.map((attachment, index) => (\n <MediaRenderer key={index} attachment={attachment} />\n ))}\n </div>\n )}\n </>\n )}\n\n {/* Action Buttons */}\n {!isEditing && (showActions || copied) && (\n <div className={`absolute -top-2 flex gap-1 ${messageIsUser ? '-left-2' : '-right-2'\n }`}>\n {enableCopy && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={handleCopy}\n >\n {copied ? (\n <Check className=\"h-3 w-3 text-green-500\" />\n ) : (\n <Copy className=\"h-3 w-3\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {copied ? 'Copiado!' : 'Copiar'}\n </TooltipContent>\n </Tooltip>\n )}\n\n {canEdit && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={handleEdit}\n >\n <Edit className=\"h-3 w-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n Editar\n </TooltipContent>\n </Tooltip>\n )}\n\n {canRegenerate && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={handleRegenerate}\n >\n <RotateCcw className=\"h-3 w-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n Regenerar\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </TooltipProvider>\n );\n}, arePropsEqual);\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport type { ChatConfig } from \"../types/chatTypes\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport const formatDate = (timestamp: number, labels?: ChatConfig['labels']) => {\n const date = new Date(timestamp);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return labels?.today || 'Today';\n } else if (diffDays === 1) {\n return labels?.yesterday || 'Yesterday';\n } else if (diffDays < 7) {\n return `${diffDays} ${labels?.daysAgo || 'days ago'}`;\n } else {\n return date.toLocaleDateString('en-US', {\n day: '2-digit',\n month: 'short',\n });\n }\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-primary 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 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React, { useState, useRef, useEffect } from 'react';\nimport { ChatThread } from '../../types/chatTypes';\nimport { Button } from '../ui/button';\nimport { Input } from '../ui/input';\nimport {\n Sidebar as ShadcnSidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarRail,\n useSidebar,\n} from '../ui/sidebar';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '../ui/dialog';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '../ui/alert-dialog';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport {\n Plus,\n MoreHorizontal,\n Edit2,\n Trash2,\n Archive,\n Search,\n Filter,\n Bot,\n} from 'lucide-react';\nimport { UserMenu, UserMenuUser, UserMenuCallbacks, UserMenuConfig } from './UserMenu';\nimport { Avatar, AvatarFallback } from '../ui/avatar';\n\nexport interface SidebarConfig {\n labels?: {\n newChat?: string;\n search?: string;\n customComponentLabel?: string;\n showArchived?: string;\n hideArchived?: string;\n noThreadsFound?: string;\n noThreadsYet?: string;\n deleteConfirmTitle?: string;\n deleteConfirmDescription?: string;\n renameThread?: string;\n archiveThread?: string;\n unarchiveThread?: string;\n deleteThread?: string;\n today?: string;\n yesterday?: string;\n createNewThread?: string;\n threadNamePlaceholder?: string;\n cancel?: string;\n create?: string;\n daysAgo?: string;\n };\n branding?: {\n logo?: React.ReactNode;\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n };\n userMenu?: UserMenuConfig;\n}\n\nexport interface SidebarProps extends React.ComponentProps<typeof ShadcnSidebar> {\n threads: ChatThread[];\n currentThreadId?: string | null;\n config: SidebarConfig;\n onCreateThread?: (title?: string) => void;\n onSelectThread?: (threadId: string) => void;\n onRenameThread?: (threadId: string, newTitle: string) => void;\n onDeleteThread?: (threadId: string) => void;\n onArchiveThread?: (threadId: string) => void;\n // User menu props\n user?: UserMenuUser | null;\n userMenuCallbacks?: UserMenuCallbacks;\n currentTheme?: 'light' | 'dark' | 'system';\n showThemeOptions?: boolean;\n /** Additional items to render in the user menu */\n userMenuAdditionalItems?: React.ReactNode;\n}\n\n// Create thread dialog\nconst CreateThreadDialog: React.FC<{\n config: SidebarConfig;\n onCreateThread: (title?: string) => void;\n trigger?: React.ReactNode;\n}> = ({ config, onCreateThread, trigger }) => {\n const [title, setTitle] = useState('');\n const [isOpen, setIsOpen] = useState(false);\n\n const handleCreate = () => {\n onCreateThread(title.trim() || undefined);\n setTitle('');\n setIsOpen(false);\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n <DialogTrigger asChild>\n {trigger || (\n <Button className=\"w-full justify-start\" variant=\"outline\">\n <Plus className=\"mr-2 h-4 w-4\" />\n {config.labels?.newChat || 'New Chat'}\n </Button>\n )}\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{config.labels?.createNewThread || 'New Conversation'}</DialogTitle>\n <DialogDescription>\n Give your new conversation a name or leave blank to auto-generate one.\n </DialogDescription>\n </DialogHeader>\n <Input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={config.labels?.threadNamePlaceholder || \"Conversation name\"}\n onKeyDown={(e) => e.key === 'Enter' && handleCreate()}\n autoFocus\n />\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setIsOpen(false)}>\n {config.labels?.cancel || 'Cancel'}\n </Button>\n <Button onClick={handleCreate}>\n {config.labels?.create || 'Create'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst ThreadInitialsIcon = ({ title }: { title: string }) => {\n const initials = title\n ?.split(' ')\n .map((n) => n[0])\n .slice(0, 2)\n .join('')\n .toUpperCase() || '?';\n \n return (\n <div className=\"flex shrink-0 items-center justify-center rounded bg-muted text-[10px] font-medium\">\n {initials}\n </div>\n );\n};\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n threads,\n currentThreadId,\n config,\n onCreateThread,\n onSelectThread,\n onRenameThread,\n onDeleteThread,\n onArchiveThread,\n // User menu props\n user,\n userMenuCallbacks,\n currentTheme,\n showThemeOptions = true,\n userMenuAdditionalItems,\n ...props\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [showArchived, setShowArchived] = useState(false);\n const [deleteThreadId, setDeleteThreadId] = useState<string | null>(null);\n const [editingThreadId, setEditingThreadId] = useState<string | null>(null);\n const [editTitle, setEditTitle] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n \n // Use the sidebar context to control expansion\n const { setOpen } = useSidebar();\n\n useEffect(() => {\n if (editingThreadId && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [editingThreadId]);\n\n // Filter threads based on search and archive filter\n const filteredThreads = threads.filter(thread => {\n const title = (thread.title ?? '').toString();\n const matchesSearch = title.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesArchiveFilter = showArchived || !thread.isArchived;\n return matchesSearch && matchesArchiveFilter;\n });\n\n // Group threads by date\n const groupedThreads = filteredThreads.reduce((groups, thread) => {\n const date = new Date(thread.updatedAt);\n const today = new Date();\n const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);\n\n let groupKey: string;\n if (date.toDateString() === today.toDateString()) {\n groupKey = config.labels?.today || 'Today';\n } else if (date.toDateString() === yesterday.toDateString()) {\n groupKey = config.labels?.yesterday || 'Yesterday';\n } else {\n groupKey = date.toLocaleDateString('en-US', {\n weekday: 'long',\n day: '2-digit',\n month: 'long',\n });\n }\n\n if (!groups[groupKey]) {\n groups[groupKey] = [];\n }\n groups[groupKey].push(thread);\n return groups;\n }, {} as Record<string, ChatThread[]>);\n\n const handleDeleteThread = (threadId: string) => {\n onDeleteThread?.(threadId);\n setDeleteThreadId(null);\n };\n\n const startEditing = (thread: ChatThread) => {\n setEditingThreadId(thread.id);\n setEditTitle(thread.title || '');\n };\n\n const saveEdit = () => {\n if (editingThreadId && editTitle.trim()) {\n onRenameThread?.(editingThreadId, editTitle.trim());\n }\n setEditingThreadId(null);\n };\n\n const cancelEdit = () => {\n setEditingThreadId(null);\n };\n\n return (\n <ShadcnSidebar collapsible=\"icon\" {...props}>\n <SidebarHeader>\n {/* Branding / Logo */}\n <div className=\"flex items-center gap-3 px-2 py-3\">\n <div className=\"flex items-center justify-center shrink-0\">\n {config.branding?.logo || (\n <Avatar className=\"h-8 w-8\">\n <AvatarFallback className=\"bg-primary text-primary-foreground\">\n <Bot className=\"h-4 w-4\" />\n </AvatarFallback>\n </Avatar>\n )}\n </div>\n <div className=\"flex flex-col min-w-0 group-data-[collapsible=icon]:hidden\">\n <span className=\"text-sm font-semibold truncate\">\n {config.branding?.title || 'Chat'}\n </span>\n {config.branding?.subtitle && (\n <span className=\"text-xs text-muted-foreground truncate\">\n {config.branding.subtitle}\n </span>\n )}\n </div>\n </div>\n\n {/* New Chat Button */}\n {onCreateThread && (\n <CreateThreadDialog \n config={config} \n onCreateThread={onCreateThread} \n trigger={\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton\n size=\"lg\"\n className=\"w-full justify-start gap-2 border border-sidebar-border shadow-sm hover:bg-sidebar-accent hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:justify-center\"\n tooltip={config.labels?.newChat || 'New Chat'}\n >\n <Plus className=\"size-4\" />\n <span className=\"group-data-[collapsible=icon]:hidden\">{config.labels?.newChat || 'New Chat'}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n }\n />\n )}\n \n {/* Search */}\n <div className=\"px-2 py-1 mt-4\">\n {/* Expanded View: Input */}\n <div className=\"relative group-data-[collapsible=icon]:hidden\">\n <Search className=\"pointer-events-none absolute left-2 top-1/2 size-4 -translate-y-1/2 select-none opacity-50\" />\n <Input\n className=\"pl-8 h-8 bg-sidebar-accent/50 border-sidebar-border focus-visible:ring-1 focus-visible:ring-sidebar-ring\"\n placeholder={config.labels?.search || \"Search...\"}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n \n {/* Collapsed View: Search Icon Button (expands sidebar on click) */}\n <div className=\"hidden group-data-[collapsible=icon]:flex justify-center\">\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\" \n onClick={() => setOpen(true)}\n title={config.labels?.search || \"Search\"}\n >\n <Search className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </SidebarHeader>\n\n <SidebarContent>\n {/* Archive Filter Toggle (if needed) */}\n {threads.some(t => t.isArchived) && (\n <div className=\"px-4 py-2 mt-2 group-data-[collapsible=icon]:hidden\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowArchived(!showArchived)}\n className=\"h-6 text-xs w-full justify-start text-muted-foreground\"\n >\n <Filter className=\"mr-2 h-3 w-3\" />\n {showArchived ? \n (config.labels?.hideArchived || 'Hide Archived') : \n (config.labels?.showArchived || 'Show Archived')\n }\n </Button>\n </div>\n )}\n\n {Object.keys(groupedThreads).length === 0 ? (\n <div className=\"px-4 py-8 text-center text-muted-foreground group-data-[collapsible=icon]:hidden\">\n <div className=\"mx-auto h-8 w-8 mb-2 flex items-center justify-center rounded-full bg-muted/50\">\n <Plus className=\"h-4 w-4 opacity-50\" />\n </div>\n <p className=\"text-xs\">\n {searchQuery ? \n (config.labels?.noThreadsFound || 'No conversations found') : \n (config.labels?.noThreadsYet || 'No conversations yet')\n }\n </p>\n </div>\n ) : (\n Object.entries(groupedThreads).map(([group, groupThreads]) => (\n <SidebarGroup className=\"mt-2\" key={group}>\n <SidebarGroupLabel className=\"group-data-[collapsible=icon]:hidden\">{group}</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {groupThreads.map((thread) => (\n <SidebarMenuItem key={thread.id}>\n {editingThreadId === thread.id ? (\n <div className=\"flex items-center gap-1 px-2 py-1\">\n <Input\n ref={inputRef}\n value={editTitle}\n onChange={(e) => setEditTitle(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') saveEdit();\n if (e.key === 'Escape') cancelEdit();\n }}\n onBlur={saveEdit}\n className=\"h-7 text-sm\"\n />\n </div>\n ) : (\n <SidebarMenuButton\n isActive={currentThreadId === thread.id}\n onClick={() => onSelectThread?.(thread.id)}\n tooltip={thread.title}\n >\n <ThreadInitialsIcon title={thread.title || '?'} />\n <div className=\"flex flex-col items-start gap-0.5 flex-1 min-w-0 group-data-[collapsible=icon]:hidden\">\n <span className=\"truncate w-full\">{thread.title || 'New Chat'}</span>\n </div>\n {thread.isArchived && <Archive className=\"ml-auto h-3 w-3 opacity-50 group-data-[collapsible=icon]:hidden\" />}\n </SidebarMenuButton>\n )}\n \n {!editingThreadId && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuAction showOnHover>\n <MoreHorizontal />\n <span className=\"sr-only\">More</span>\n </SidebarMenuAction>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-48\" side=\"right\" align=\"start\">\n <DropdownMenuItem onClick={() => startEditing(thread)}>\n <Edit2 className=\"mr-2 h-4 w-4\" />\n <span>{config.labels?.renameThread || 'Rename'}</span>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => onArchiveThread?.(thread.id)}>\n <Archive className=\"mr-2 h-4 w-4\" />\n <span>\n {thread.isArchived ? \n (config.labels?.unarchiveThread || 'Unarchive') : \n (config.labels?.archiveThread || 'Archive')\n }\n </span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem \n onClick={() => setDeleteThreadId(thread.id)}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n <span>{config.labels?.deleteThread || 'Delete'}</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n ))\n )}\n </SidebarContent>\n \n <SidebarFooter>\n <UserMenu\n user={user}\n config={config.userMenu}\n callbacks={userMenuCallbacks}\n currentTheme={currentTheme}\n showThemeOptions={showThemeOptions}\n additionalItems={userMenuAdditionalItems}\n />\n </SidebarFooter>\n \n <SidebarRail />\n\n {/* Delete confirmation dialog - only render when needed to avoid Radix focus conflicts */}\n {deleteThreadId && (\n <AlertDialog open={!!deleteThreadId} onOpenChange={() => setDeleteThreadId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{config.labels?.deleteConfirmTitle || 'Delete Conversation'}</AlertDialogTitle>\n <AlertDialogDescription>\n {config.labels?.deleteConfirmDescription ||\n 'Are you sure you want to delete this conversation? This action cannot be undone.'\n }\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>{config.labels?.cancel || 'Cancel'}</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => deleteThreadId && handleDeleteThread(deleteThreadId)}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {config.labels?.deleteThread || 'Delete'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )}\n </ShadcnSidebar>\n );\n};\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nimport { useIsMobile } from \"../../hooks/use-mobile\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Separator } from \"./separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet\"\nimport { Skeleton } from \"./skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n \n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"bg-background relative flex w-full flex-1 flex-col\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"bg-background h-8 w-full shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Clean up body styles that Radix may leave behind.\n * This fixes an issue where pointer-events: none gets stuck on body.\n */\nfunction cleanupBodyStyles() {\n if (typeof document !== 'undefined' && document.body.style.pointerEvents === 'none') {\n document.body.style.pointerEvents = '';\n }\n}\n\nfunction Sheet({ open, onOpenChange, ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n // Track previous open state to detect close transition\n const prevOpenRef = React.useRef(open);\n\n React.useEffect(() => {\n // When transitioning from open to closed, ensure cleanup after animation\n if (prevOpenRef.current === true && open === false) {\n const timeout = setTimeout(cleanupBodyStyles, 350); // After close animation (300ms + buffer)\n return () => clearTimeout(timeout);\n }\n prevOpenRef.current = open;\n }, [open]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n cleanupBodyStyles();\n };\n }, []);\n\n return <SheetPrimitive.Root data-slot=\"sheet\" open={open} onOpenChange={onOpenChange} {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:pointer-events-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n aria-describedby={undefined}\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { cn } from \"../../lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"bg-accent animate-pulse rounded-md\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Clean up body styles that Radix may leave behind.\n * This fixes an issue where pointer-events: none gets stuck on body.\n */\nfunction cleanupBodyStyles() {\n if (typeof document !== 'undefined' && document.body.style.pointerEvents === 'none') {\n document.body.style.pointerEvents = '';\n }\n}\n\nfunction Dialog({\n open,\n onOpenChange,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n // Track previous open state to detect close transition\n const prevOpenRef = React.useRef(open);\n\n React.useEffect(() => {\n // When transitioning from open to closed, ensure cleanup after animation\n if (prevOpenRef.current === true && open === false) {\n const timeout = setTimeout(cleanupBodyStyles, 250); // After close animation (200ms + buffer)\n return () => clearTimeout(timeout);\n }\n prevOpenRef.current = open;\n }, [open]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n cleanupBodyStyles();\n };\n }, []);\n\n return <DialogPrimitive.Root data-slot=\"dialog\" open={open} onOpenChange={onOpenChange} {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:pointer-events-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n aria-describedby={undefined}\n className={cn(\n \"bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\n\nimport { cn } from \"../../lib/utils\"\nimport { buttonVariants } from \"./button\"\n\n/**\n * Clean up body styles that Radix may leave behind.\n * This fixes an issue where pointer-events: none gets stuck on body.\n */\nfunction cleanupBodyStyles() {\n if (typeof document !== 'undefined' && document.body.style.pointerEvents === 'none') {\n document.body.style.pointerEvents = '';\n }\n}\n\nfunction AlertDialog({\n open,\n onOpenChange,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n // Track previous open state to detect close transition\n const prevOpenRef = React.useRef(open);\n\n React.useEffect(() => {\n // When transitioning from open to closed, ensure cleanup after animation\n if (prevOpenRef.current === true && open === false) {\n const timeout = setTimeout(cleanupBodyStyles, 250); // After close animation (200ms + buffer)\n return () => clearTimeout(timeout);\n }\n prevOpenRef.current = open;\n }, [open]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n cleanupBodyStyles();\n };\n }, []);\n\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" open={open} onOpenChange={onOpenChange} {...props} />\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:pointer-events-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n \"bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return (\n <AlertDialogPrimitive.Action\n className={cn(buttonVariants(), className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogCancel({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return (\n <AlertDialogPrimitive.Cancel\n className={cn(buttonVariants({ variant: \"outline\" }), className)}\n {...props}\n />\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n","import * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground 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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import React from 'react';\nimport {\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n useSidebar,\n} from '../ui/sidebar';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n DropdownMenuLabel,\n} from '../ui/dropdown-menu';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport {\n User,\n Settings,\n LogOut,\n ChevronsUpDown,\n Moon,\n Sun,\n Palette,\n} from 'lucide-react';\n\nexport interface UserMenuConfig {\n labels?: {\n profile?: string;\n settings?: string;\n theme?: string;\n lightMode?: string;\n darkMode?: string;\n systemTheme?: string;\n logout?: string;\n guest?: string;\n };\n}\n\nexport interface UserMenuUser {\n id: string;\n name?: string;\n email?: string;\n avatar?: string;\n}\n\nexport interface UserMenuCallbacks {\n onViewProfile?: () => void;\n onOpenSettings?: () => void;\n onThemeChange?: (theme: 'light' | 'dark' | 'system') => void;\n onLogout?: () => void;\n}\n\nexport interface UserMenuProps {\n user?: UserMenuUser | null;\n config?: UserMenuConfig;\n callbacks?: UserMenuCallbacks;\n currentTheme?: 'light' | 'dark' | 'system';\n /** Show theme options in the menu */\n showThemeOptions?: boolean;\n /** Additional menu items to render */\n additionalItems?: React.ReactNode;\n}\n\n// Get initials from name or email\nconst getInitials = (name?: string, email?: string): string => {\n if (name) {\n return name\n .split(' ')\n .map((n) => n[0])\n .slice(0, 2)\n .join('')\n .toUpperCase();\n }\n if (email) {\n return email[0].toUpperCase();\n }\n return 'U';\n};\n\n// Get display name\nconst getDisplayName = (user?: UserMenuUser | null, guestLabel?: string): string => {\n if (!user) return guestLabel || 'Guest';\n return user.name || user.email?.split('@')[0] || guestLabel || 'Guest';\n};\n\nexport const UserMenu: React.FC<UserMenuProps> = ({\n user,\n config,\n callbacks,\n currentTheme = 'system',\n showThemeOptions = true,\n additionalItems,\n}) => {\n const { isMobile } = useSidebar();\n\n const labels = {\n profile: config?.labels?.profile || 'Profile',\n settings: config?.labels?.settings || 'Settings',\n theme: config?.labels?.theme || 'Theme',\n lightMode: config?.labels?.lightMode || 'Light',\n darkMode: config?.labels?.darkMode || 'Dark',\n systemTheme: config?.labels?.systemTheme || 'System',\n logout: config?.labels?.logout || 'Log out',\n guest: config?.labels?.guest || 'Guest',\n };\n\n const displayName = getDisplayName(user, labels.guest);\n const initials = getInitials(user?.name, user?.email);\n\n return (\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton\n size=\"lg\"\n className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\"\n tooltip={displayName}\n >\n <Avatar className=\"h-8 w-8 rounded-lg\">\n {user?.avatar && <AvatarImage src={user.avatar} alt={displayName} />}\n <AvatarFallback className=\"rounded-lg bg-primary/10 text-primary text-xs font-medium\">\n {initials}\n </AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight group-data-[collapsible=icon]:hidden\">\n <span className=\"truncate font-medium\">{displayName}</span>\n {user?.email && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {user.email}\n </span>\n )}\n </div>\n <ChevronsUpDown className=\"ml-auto size-4 group-data-[collapsible=icon]:hidden\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg\"\n side={isMobile ? 'bottom' : 'right'}\n align=\"end\"\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"p-0 font-normal\">\n <div className=\"flex items-center gap-2 px-1 py-1.5 text-left text-sm\">\n <Avatar className=\"h-8 w-8 rounded-lg\">\n {user?.avatar && <AvatarImage src={user.avatar} alt={displayName} />}\n <AvatarFallback className=\"rounded-lg bg-primary/10 text-primary text-xs font-medium\">\n {initials}\n </AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{displayName}</span>\n {user?.email && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {user.email}\n </span>\n )}\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n \n {/* Profile */}\n {callbacks?.onViewProfile && (\n <DropdownMenuItem onClick={callbacks.onViewProfile}>\n <User className=\"mr-2 h-4 w-4\" />\n <span>{labels.profile}</span>\n </DropdownMenuItem>\n )}\n\n {/* Settings */}\n {callbacks?.onOpenSettings && (\n <DropdownMenuItem onClick={callbacks.onOpenSettings}>\n <Settings className=\"mr-2 h-4 w-4\" />\n <span>{labels.settings}</span>\n </DropdownMenuItem>\n )}\n\n {/* Additional items */}\n {additionalItems}\n\n {/* Theme options */}\n {showThemeOptions && callbacks?.onThemeChange && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem \n onClick={() => callbacks.onThemeChange?.('light')}\n className={currentTheme === 'light' ? 'bg-accent' : ''}\n >\n <Sun className=\"mr-2 h-4 w-4\" />\n <span>{labels.lightMode}</span>\n </DropdownMenuItem>\n <DropdownMenuItem \n onClick={() => callbacks.onThemeChange?.('dark')}\n className={currentTheme === 'dark' ? 'bg-accent' : ''}\n >\n <Moon className=\"mr-2 h-4 w-4\" />\n <span>{labels.darkMode}</span>\n </DropdownMenuItem>\n <DropdownMenuItem \n onClick={() => callbacks.onThemeChange?.('system')}\n className={currentTheme === 'system' ? 'bg-accent' : ''}\n >\n <Palette className=\"mr-2 h-4 w-4\" />\n <span>{labels.systemTheme}</span>\n </DropdownMenuItem>\n </>\n )}\n\n {/* Logout */}\n {callbacks?.onLogout && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem \n onClick={callbacks.onLogout}\n className=\"text-destructive focus:text-destructive focus:bg-destructive/10\"\n >\n <LogOut className=\"mr-2 h-4 w-4\" />\n <span>{labels.logout}</span>\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n );\n};\n\nexport default UserMenu;\n","import React from 'react';\nimport { Card, CardHeader } from '../ui/card';\nimport { Button } from '../ui/button';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport {\n Bot,\n MoreVertical,\n Download,\n Upload,\n Trash2,\n Plus,\n Menu,\n Moon,\n Sun,\n ChevronDown,\n Check,\n} from 'lucide-react';\nimport { ReactNode } from 'react';\nimport { SidebarTrigger } from '../ui/sidebar';\nimport type { AgentOption } from '../../types/chatTypes';\n\nexport interface ChatHeaderConfig {\n branding?: {\n logo?: ReactNode;\n title?: string;\n subtitle?: string;\n };\n agentSelector?: {\n enabled?: boolean;\n label?: string;\n hideIfSingle?: boolean;\n };\n labels?: {\n newThread?: string;\n exportData?: string;\n importData?: string;\n clearAll?: string;\n sidebarToggle?: string;\n customComponentToggle?: string;\n settings?: string;\n toggleDarkMode?: string;\n lightMode?: string;\n darkMode?: string;\n };\n customComponent?: {\n label?: string;\n icon?: ReactNode;\n onClick?: () => void;\n };\n /** Additional actions to render in the header (before the settings menu) */\n headerActions?: ReactNode;\n}\n\nexport interface ChatHeaderProps {\n config: ChatHeaderConfig;\n currentThreadTitle?: string | null;\n onSidebarToggle?: () => void;\n onCustomComponentToggle?: () => void;\n onNewThread?: () => void;\n onExportData?: () => void;\n onImportData?: (file: File) => void;\n onClearAll?: () => void;\n showCustomComponentButton?: boolean;\n isMobile?: boolean;\n showAgentSelector?: boolean;\n agentOptions?: AgentOption[];\n selectedAgentId?: string | null;\n onSelectAgent?: (agentId: string) => void;\n className?: string;\n}\n\nexport const ChatHeader: React.FC<ChatHeaderProps> = ({\n config,\n currentThreadTitle,\n onSidebarToggle: _onSidebarToggle,\n onCustomComponentToggle,\n onNewThread,\n onExportData,\n onImportData,\n onClearAll,\n showCustomComponentButton,\n isMobile,\n showAgentSelector = false,\n agentOptions = [],\n selectedAgentId = null,\n onSelectAgent,\n className = '',\n}) => {\n const [isDarkMode, setIsDarkMode] = React.useState(() => {\n if (typeof window === 'undefined') return false;\n return document.documentElement.classList.contains('dark');\n });\n\n React.useEffect(() => {\n const observer = new MutationObserver(() => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n // Listen for system theme changes\n const mediaQuery = globalThis.matchMedia('(prefers-color-scheme: dark)');\n const handleSystemThemeChange = (e: MediaQueryListEvent) => {\n const savedTheme = localStorage.getItem('theme');\n if (!savedTheme) {\n // Only update if user hasn't set an explicit preference\n setIsDarkMode(e.matches);\n }\n };\n\n mediaQuery.addEventListener('change', handleSystemThemeChange);\n\n return () => {\n observer.disconnect();\n mediaQuery.removeEventListener('change', handleSystemThemeChange);\n };\n }, []);\n\n const toggleDarkMode = () => {\n const isDark = document.documentElement.classList.contains('dark');\n if (isDark) {\n document.documentElement.classList.remove('dark');\n localStorage.setItem('theme', 'light');\n } else {\n document.documentElement.classList.add('dark');\n localStorage.setItem('theme', 'dark');\n }\n setIsDarkMode(!isDark);\n };\n\n\n const handleImportClick = () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json';\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && onImportData) {\n onImportData(file);\n }\n };\n input.click();\n };\n\n const selectedAgent = agentOptions.find((agent) => agent.id === selectedAgentId) || null;\n const agentPlaceholder = config.agentSelector?.label || 'Select agent';\n\n return (\n <Card\n data-chat-header\n className={`py-0 border-b rounded-none relative z-10 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/80 ${className}`}\n style={isMobile ? { paddingTop: 'env(safe-area-inset-top)' } : undefined}\n >\n <CardHeader className=\"p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n {/* Left side - Sidebar toggle + Agent Selector */}\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"-ml-1\" />\n </TooltipTrigger>\n <TooltipContent>\n {config.labels?.sidebarToggle || 'Toggle Sidebar'}\n </TooltipContent>\n </Tooltip>\n\n {/* Agent Selector - ChatGPT style */}\n {showAgentSelector && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n className=\"h-9 px-3 gap-1.5 font-medium text-base hover:bg-accent/50\"\n >\n {selectedAgent?.avatarUrl ? (\n <Avatar className=\"h-5 w-5\">\n <AvatarImage src={selectedAgent.avatarUrl} alt={selectedAgent.name} />\n <AvatarFallback className=\"text-[10px]\">\n {selectedAgent.name.charAt(0).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n ) : null}\n <span className=\"max-w-[200px] truncate\">\n {selectedAgent?.name || agentPlaceholder}\n </span>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-[280px]\">\n {agentOptions.map((agent) => {\n const isSelected = agent.id === selectedAgentId;\n return (\n <DropdownMenuItem\n key={agent.id}\n onClick={() => onSelectAgent?.(agent.id)}\n className=\"flex items-start gap-3 p-3 cursor-pointer\"\n >\n {agent.avatarUrl ? (\n <Avatar className=\"h-6 w-6 mt-0.5 shrink-0\">\n <AvatarImage src={agent.avatarUrl} alt={agent.name} />\n <AvatarFallback className=\"text-[10px]\">\n {agent.name.charAt(0).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n ) : (\n <div className=\"h-6 w-6 mt-0.5 shrink-0 flex items-center justify-center rounded-full bg-primary/10\">\n <Bot className=\"h-3.5 w-3.5 text-primary\" />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium text-sm\">{agent.name}</span>\n {isSelected && (\n <Check className=\"h-4 w-4 text-primary shrink-0\" />\n )}\n </div>\n {agent.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">\n {agent.description}\n </p>\n )}\n </div>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* Mobile title when no agent selector */}\n {!showAgentSelector && isMobile && (\n <span className=\"text-sm font-medium truncate max-w-[150px] ml-2\">\n {currentThreadTitle || config.branding?.title || 'Chat'}\n </span>\n )}\n </div>\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Right side - Custom component button + Settings menu */}\n <div className=\"flex items-center gap-1\">\n {/* Custom component toggle button (desktop + mobile) */}\n {showCustomComponentButton && config.customComponent && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={onCustomComponentToggle}\n >\n {config.customComponent.icon || <Menu className=\"h-4 w-4\" />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {config.customComponent.label || config.labels?.customComponentToggle || 'Toggle'}\n </TooltipContent>\n </Tooltip>\n )}\n\n {/* Custom header actions (passed from parent) */}\n {config.headerActions}\n\n {/* Settings dropdown menu */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onNewThread && (\n <>\n <DropdownMenuItem onClick={() => onNewThread?.()} className=\"font-medium text-primary\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {config.labels?.newThread || 'New Thread'}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n\n {onExportData && (\n <DropdownMenuItem onClick={onExportData}>\n <Download className=\"h-4 w-4 mr-2\" />\n {config.labels?.exportData || 'Export Data'}\n </DropdownMenuItem>\n )}\n\n {onImportData && (\n <DropdownMenuItem onClick={handleImportClick}>\n <Upload className=\"h-4 w-4 mr-2\" />\n {config.labels?.importData || 'Import Data'}\n </DropdownMenuItem>\n )}\n\n {(onExportData || onImportData) && (\n <DropdownMenuSeparator />\n )}\n\n <DropdownMenuItem onClick={toggleDarkMode}>\n {isDarkMode ? (\n <>\n <Sun className=\"h-4 w-4 mr-2\" />\n {config.labels?.lightMode || 'Light Mode'}\n </>\n ) : (\n <>\n <Moon className=\"h-4 w-4 mr-2\" />\n {config.labels?.darkMode || 'Dark Mode'}\n </>\n )}\n </DropdownMenuItem>\n\n {onClearAll && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onClearAll}\n className=\"text-destructive\"\n >\n <Trash2 className=\"h-4 w-4 mr-2\" />\n {config.labels?.clearAll || 'Clear All'}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </CardHeader>\n </Card>\n );\n};\n","import React, { useState, useRef, useCallback, useEffect, memo } from 'react';\nimport { useChatUserContext } from './UserContext';\nimport { MediaAttachment, FileUploadProgress, ChatConfig } from '../../types/chatTypes';\nimport { Button } from '../ui/button';\nimport { Textarea } from '../ui/textarea';\nimport { Card, CardContent } from '../ui/card';\nimport { Badge } from '../ui/badge';\nimport { Progress } from '../ui/progress';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip';\nimport {\n Send,\n Paperclip,\n Mic,\n MicOff,\n Image,\n Video,\n FileText,\n X,\n Square,\n Play,\n Pause,\n RotateCcw,\n Loader2,\n} from 'lucide-react';\n\ninterface ChatInputProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (content: string, attachments: MediaAttachment[]) => void;\n attachments: MediaAttachment[];\n onAttachmentsChange: (attachments: MediaAttachment[]) => void;\n placeholder?: string;\n disabled?: boolean;\n isGenerating?: boolean;\n onStopGeneration?: () => void;\n enableFileUpload?: boolean;\n enableAudioRecording?: boolean;\n maxAttachments?: number;\n maxFileSize?: number;\n acceptedFileTypes?: string[];\n className?: string;\n config?: ChatConfig;\n}\n\n// File upload progress component - memoized\nconst FileUploadItem: React.FC<{\n file: { name: string; type?: string; size?: number };\n progress: number;\n onCancel: () => void;\n}> = memo(function FileUploadItem({ file, progress, onCancel }) {\n const guessTypeFromName = (name?: string): string => {\n const ext = (name || '').split('.').pop()?.toLowerCase();\n switch (ext) {\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n case 'webp':\n case 'bmp':\n case 'svg':\n return 'image/*';\n case 'mp4':\n case 'mov':\n case 'm4v':\n case 'webm':\n return 'video/*';\n case 'mp3':\n case 'wav':\n case 'm4a':\n case 'ogg':\n return 'audio/*';\n default:\n return '';\n }\n };\n\n const getFileIcon = (type?: string, name?: string) => {\n const t = typeof type === 'string' && type.length > 0 ? type : guessTypeFromName(name);\n if (t.startsWith('image/')) return <Image className=\"h-4 w-4\" />;\n if (t.startsWith('video/')) return <Video className=\"h-4 w-4\" />;\n if (t.startsWith('audio/')) return <Mic className=\"h-4 w-4\" />;\n return <FileText className=\"h-4 w-4\" />;\n };\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n };\n\n return (\n <Card className=\"relative\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n {getFileIcon(file.type, file.name)}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{file.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size ?? 0)}\n </p>\n <Progress value={progress} className=\"h-1 mt-1\" />\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={onCancel}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n );\n});\n\n// Attachment preview component - memoized\nconst AttachmentPreview: React.FC<{\n attachment: MediaAttachment;\n onRemove: () => void;\n}> = memo(function AttachmentPreview({ attachment, onRemove }) {\n const [isPlaying, setIsPlaying] = useState(false);\n const audioRef = useRef<HTMLAudioElement>(null);\n\n const handlePlayPause = () => {\n if (audioRef.current) {\n if (isPlaying) {\n audioRef.current.pause();\n } else {\n audioRef.current.play();\n }\n setIsPlaying(!isPlaying);\n }\n };\n\n const formatDuration = (ms?: number) => {\n if (!ms) return '';\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n return `${minutes}:${(seconds % 60).toString().padStart(2, '0')}`;\n };\n\n return (\n <Card className=\"relative group\">\n <CardContent className=\"p-2\">\n {attachment.kind === 'image' && (\n <div className=\"relative\">\n <img\n src={attachment.dataUrl}\n alt={attachment.fileName || 'Anexo'}\n className=\"w-full h-20 object-cover rounded\"\n />\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity rounded flex items-center justify-center\">\n <Button\n variant=\"destructive\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={onRemove}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n </div>\n )}\n\n {attachment.kind === 'video' && (\n <div className=\"relative\">\n <video\n src={attachment.dataUrl}\n poster={attachment.poster}\n className=\"w-full h-20 object-cover rounded\"\n muted\n />\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity rounded flex items-center justify-center\">\n <Button\n variant=\"destructive\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={onRemove}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n <Badge className=\"absolute bottom-1 right-1 text-xs\">\n {formatDuration(attachment.durationMs)}\n </Badge>\n </div>\n )}\n\n {attachment.kind === 'audio' && (\n <div className=\"flex items-center gap-2 p-2\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={handlePlayPause}\n >\n {isPlaying ? <Pause className=\"h-3 w-3\" /> : <Play className=\"h-3 w-3\" />}\n </Button>\n <div className=\"flex-1\">\n <p className=\"text-xs font-medium\">\n {attachment.fileName || 'Áudio'}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {formatDuration(attachment.durationMs)}\n </p>\n </div>\n <audio\n ref={audioRef}\n src={attachment.dataUrl}\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onEnded={() => setIsPlaying(false)}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={onRemove}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n )}\n\n {attachment.fileName && attachment.kind !== 'audio' && (\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/70 text-white text-xs p-1 rounded-b\">\n <p className=\"truncate\">{attachment.fileName}</p>\n </div>\n )}\n </CardContent>\n </Card>\n );\n});\n\n// Audio recording component - memoized\nconst AudioRecorder: React.FC<{\n isRecording: boolean;\n onStartRecording: () => void;\n onStopRecording: () => void;\n onCancel: () => void;\n recordingDuration: number;\n config?: ChatConfig;\n}> = memo(function AudioRecorder({ isRecording, onStartRecording, onStopRecording, onCancel, recordingDuration, config }) {\n const formatTime = (seconds: number) => {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n };\n\n if (!isRecording) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onStartRecording}\n className=\"h-10 w-10\"\n >\n <Mic className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config?.labels?.recordAudioTooltip}</TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <Card className=\"border-red-200 bg-red-50 dark:border-red-800 dark:bg-red-950\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"h-3 w-3 bg-red-500 rounded-full animate-pulse\" />\n <span className=\"text-sm font-medium text-red-700 dark:text-red-300\">\n Gravando\n </span>\n </div>\n <Badge variant=\"outline\" className=\"text-xs\">\n {formatTime(recordingDuration)}\n </Badge>\n <div className=\"flex gap-1 ml-auto\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onCancel}\n >\n <X className=\"h-3 w-3 mr-1\" />\n Cancelar\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={onStopRecording}\n >\n <Square className=\"h-3 w-3 mr-1\" />\n Parar\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n});\n\nexport const ChatInput: React.FC<ChatInputProps> = memo(function ChatInput({\n value,\n onChange,\n onSubmit,\n attachments,\n onAttachmentsChange,\n placeholder = 'Digite sua mensagem...',\n disabled = false,\n isGenerating = false,\n onStopGeneration,\n enableFileUpload = true,\n enableAudioRecording = true,\n maxAttachments = 4,\n maxFileSize = 10 * 1024 * 1024, // 10MB\n acceptedFileTypes = ['image/*', 'video/*', 'audio/*'],\n className = '',\n config,\n}: ChatInputProps) {\n const [isRecording, setIsRecording] = useState(false);\n const { setContext } = useChatUserContext();\n const [recordingDuration, setRecordingDuration] = useState(0);\n const [uploadProgress, setUploadProgress] = useState<Map<string, FileUploadProgress>>(new Map());\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const recordingStartTime = useRef<number>(0);\n const recordingInterval = useRef<ReturnType<typeof setInterval> | null>(null);\n const mediaStreamRef = useRef<MediaStream | null>(null);\n\n // Cleanup recording on unmount\n useEffect(() => {\n return () => {\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach(track => track.stop());\n }\n if (recordingInterval.current) {\n clearInterval(recordingInterval.current);\n }\n };\n }, []);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if ((!value.trim() && attachments.length === 0) || disabled || isGenerating) return;\n\n onSubmit(value.trim(), attachments);\n onChange('');\n onAttachmentsChange([]);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey && !e.ctrlKey && window.innerWidth > 768) {\n e.preventDefault();\n handleSubmit(e as any);\n }\n };\n\n const processFile = async (file: File): Promise<MediaAttachment | null> => {\n if (file.size > maxFileSize) {\n alert(`Arquivo muito grande. Máximo permitido: ${Math.round(maxFileSize / 1024 / 1024)}MB`);\n return null;\n }\n\n const fileId = `${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n // Start upload progress\n setUploadProgress(prev => new Map(prev.set(fileId, {\n fileName: file.name,\n progress: 0,\n status: 'uploading',\n })));\n\n try {\n // Simulate upload progress\n for (let progress = 0; progress <= 100; progress += 20) {\n await new Promise(resolve => setTimeout(resolve, 100));\n setUploadProgress(prev => new Map(prev.set(fileId, {\n fileName: file.name,\n progress,\n status: 'uploading',\n })));\n }\n\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\n setUploadProgress(prev => {\n const newMap = new Map(prev);\n newMap.delete(fileId);\n return newMap;\n });\n\n const attachment: MediaAttachment = {\n kind: file.type.startsWith('image/') ? 'image' :\n file.type.startsWith('video/') ? 'video' :\n file.type.startsWith('audio/') ? 'audio' : 'image',\n dataUrl,\n mimeType: file.type,\n fileName: file.name,\n size: file.size,\n };\n\n // For video files, try to get duration\n if (attachment.kind === 'video') {\n try {\n const video = document.createElement('video');\n video.src = dataUrl;\n await new Promise((resolve) => {\n video.onloadedmetadata = resolve;\n });\n attachment.durationMs = video.duration * 1000;\n } catch (error) {\n console.warn('Could not get video duration:', error);\n }\n }\n\n // If it's an image, mark as latest reference image in shared context\n if (attachment.kind === 'image') {\n setContext({ lastReferenceImage: { dataUrl: attachment.dataUrl, mimeType: attachment.mimeType, addedAt: Date.now() } });\n }\n return attachment;\n } catch (error) {\n console.error('Error processing file:', error);\n setUploadProgress(prev => {\n const newMap = new Map(prev);\n newMap.delete(fileId);\n return newMap;\n });\n alert('Erro ao processar arquivo');\n return null;\n }\n };\n\n const handleFileSelect = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n\n const remainingSlots = maxAttachments - attachments.length;\n const filesToProcess = Array.from(files).slice(0, remainingSlots);\n\n for (const file of filesToProcess) {\n const attachment = await processFile(file);\n if (attachment) {\n onAttachmentsChange([...attachments, attachment]);\n }\n }\n\n // Reset input\n e.target.value = '';\n };\n\n const handleDrop = useCallback(async (e: React.DragEvent) => {\n e.preventDefault();\n if (!enableFileUpload) return;\n\n const files = Array.from(e.dataTransfer.files);\n const remainingSlots = maxAttachments - attachments.length;\n const filesToProcess = files.slice(0, remainingSlots);\n\n for (const file of filesToProcess) {\n const attachment = await processFile(file);\n if (attachment) {\n onAttachmentsChange([...attachments, attachment]);\n }\n }\n }, [attachments, enableFileUpload, maxAttachments, onAttachmentsChange]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n }, []);\n\n const startRecording = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n mediaStreamRef.current = stream;\n\n const mediaRecorder = new MediaRecorder(stream);\n mediaRecorderRef.current = mediaRecorder;\n\n const chunks: BlobPart[] = [];\n mediaRecorder.ondataavailable = (e) => {\n chunks.push(e.data);\n };\n\n mediaRecorder.onstop = async () => {\n const blob = new Blob(chunks, { type: 'audio/webm' });\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n\n const attachment: MediaAttachment = {\n kind: 'audio',\n dataUrl,\n mimeType: blob.type,\n durationMs: recordingDuration * 1000,\n fileName: `audio_${new Date().toISOString().slice(0, 19)}.webm`,\n size: blob.size,\n };\n\n onAttachmentsChange([...attachments, attachment]);\n\n // Cleanup\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach(track => track.stop());\n mediaStreamRef.current = null;\n }\n };\n\n recordingStartTime.current = Date.now();\n setRecordingDuration(0);\n setIsRecording(true);\n mediaRecorder.start();\n\n recordingInterval.current = setInterval(() => {\n const duration = Math.floor((Date.now() - recordingStartTime.current) / 1000);\n setRecordingDuration(duration);\n }, 1000);\n\n } catch (error) {\n console.error('Error starting recording:', error);\n alert('Não foi possível acessar o microfone');\n }\n };\n\n const stopRecording = () => {\n if (mediaRecorderRef.current && isRecording) {\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n if (recordingInterval.current) {\n clearInterval(recordingInterval.current);\n }\n }\n };\n\n const cancelRecording = () => {\n if (mediaRecorderRef.current && isRecording) {\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n if (recordingInterval.current) {\n clearInterval(recordingInterval.current);\n }\n // Don't process the recording\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach(track => track.stop());\n mediaStreamRef.current = null;\n }\n }\n };\n\n const removeAttachment = (index: number) => {\n const newAttachments = attachments.filter((_, i) => i !== index);\n onAttachmentsChange(newAttachments);\n };\n\n const canAddMoreAttachments = attachments.length < maxAttachments;\n\n return (\n <TooltipProvider>\n {/* <Card className={`border-t py-0 bg-transparent ${className}`}> */}\n {/* <CardContent className=\"p-4 pb-1 space-y-4 bg-transparent\"> */}\n {/* Upload progress */}\n <div className={`border-t py-0 bg-transparent ${className}`}>\n <div className=\"px-0 md:p-2 pb-1 space-y-4 bg-transparent\">\n {uploadProgress.size > 0 && (\n <div className=\"space-y-2\">\n {Array.from(uploadProgress.entries()).map(([id, progress]) => (\n <FileUploadItem\n key={id}\n file={{ name: progress.fileName } as File}\n progress={progress.progress}\n onCancel={() => {\n setUploadProgress(prev => {\n const newMap = new Map(prev);\n newMap.delete(id);\n return newMap;\n });\n }}\n />\n ))}\n </div>\n )}\n\n {/* Audio recording */}\n {isRecording && (\n <AudioRecorder\n isRecording={isRecording}\n onStartRecording={startRecording}\n onStopRecording={stopRecording}\n onCancel={cancelRecording}\n recordingDuration={recordingDuration}\n config={config}\n />\n )}\n\n {/* Attachments preview */}\n {attachments.length > 0 && (\n <div className=\"grid grid-cols-4 gap-2\">\n {attachments.map((attachment, index) => (\n <AttachmentPreview\n key={index}\n attachment={attachment}\n onRemove={() => removeAttachment(index)}\n />\n ))}\n </div>\n )}\n\n {/* Input area */}\n <form onSubmit={handleSubmit} className=\"mb-1 flex justify-center\">\n <div\n className=\"flex items-end gap-2 p-3 border rounded-lg bg-background w-full md:min-w-3xl max-w-3xl\"\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n >\n {/* File upload */}\n {enableFileUpload && canAddMoreAttachments && (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedFileTypes.join(',')}\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-10 w-10\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n fileInputRef.current?.click();\n }}\n disabled={disabled}\n >\n <Paperclip className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config?.labels?.attachFileTooltip}</TooltipContent>\n </Tooltip>\n </>\n )}\n\n {/* Text input */}\n <div className=\"flex-1\">\n <Textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isGenerating}\n className=\"max-h-[120px] resize-none border-0 bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0\"\n rows={1}\n />\n </div>\n\n {/* Audio recording */}\n {enableAudioRecording && !isRecording && canAddMoreAttachments && !value.trim() && (\n <AudioRecorder\n isRecording={isRecording}\n onStartRecording={startRecording}\n onStopRecording={stopRecording}\n onCancel={cancelRecording}\n recordingDuration={recordingDuration}\n config={config}\n />\n )}\n\n {/* Submit/Stop button */}\n {isGenerating ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-10 w-10\"\n onClick={onStopGeneration}\n >\n <Square className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config?.labels?.stopGenerationTooltip}</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"submit\"\n size=\"icon\"\n className=\"h-10 w-10\"\n disabled={disabled || (!value.trim() && attachments.length === 0)}\n >\n {disabled ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{config?.labels?.sendMessageTooltip}</TooltipContent>\n </Tooltip>\n )}\n </div>\n </form>\n\n {/* Help text */}\n <div className=\"text-[10px] text-muted-foreground text-center\">\n {window.innerWidth > 768 ? config?.labels?.inputHelpText : ''}\n\n {attachments.length > 0 && (\n <> • {attachments.length}/{maxAttachments} anexos</>\n )}\n {config?.labels?.footerLabel && (\n <> • {config.labels.footerLabel}</>\n )}\n </div>\n </div>\n </div>\n {/* </CardContent>\n </Card> */}\n </TooltipProvider >\n );\n});\n","import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport type { ChatUserContext } from '../../types/chatTypes';\n\ntype Setter = (next: Partial<ChatUserContext> | ((prev: ChatUserContext) => Partial<ChatUserContext>)) => void;\n\ninterface ChatUserContextValue {\n context: ChatUserContext;\n setContext: Setter;\n resetContext: () => void;\n}\n\nconst Ctx = createContext<ChatUserContextValue | undefined>(undefined);\n\nexport const ChatUserContextProvider: React.FC<{ children: React.ReactNode; initial?: Partial<ChatUserContext> }>\n = ({ children, initial }) => {\n const [ctx, setCtx] = useState<ChatUserContext>(() => ({\n updatedAt: Date.now(),\n ...(initial ?? {}),\n }));\n\n useEffect(() => {\n if (!initial) return;\n setCtx(prev => ({\n ...prev,\n ...initial,\n updatedAt: Date.now(),\n }));\n }, [initial]);\n\n const setPartial = useCallback<Setter>((next) => {\n setCtx(prev => {\n const partial = typeof next === 'function' ? next(prev) : next;\n return { ...prev, ...partial, updatedAt: Date.now() };\n });\n }, []);\n\n const value = useMemo<ChatUserContextValue>(() => ({\n context: ctx,\n setContext: setPartial,\n resetContext: () => setCtx({ updatedAt: Date.now() })\n }), [ctx, setPartial]);\n\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n};\n\nexport function useChatUserContext(): ChatUserContextValue {\n const v = useContext(Ctx);\n if (!v) throw new Error('useChatUserContext must be used within ChatUserContextProvider');\n return v;\n}\n","import * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Progress({\n className,\n value,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"bg-primary/20 relative h-2 w-full overflow-hidden rounded-full\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"bg-primary h-full w-full flex-1 transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","import React, { useState } from 'react';\nimport { Sheet, SheetContent, SheetHeader, SheetTitle } from '../ui/sheet';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport { ScrollArea } from '../ui/scroll-area';\nimport { Button } from '../ui/button';\nimport { Separator } from '../ui/separator';\nimport { Input } from '../ui/input';\nimport { Textarea } from '../ui/textarea';\nimport { cn } from '../../lib/utils';\nimport {\n User,\n Mail,\n AtSign,\n Calendar,\n MapPin,\n Phone,\n Globe,\n Building,\n Briefcase,\n Users,\n UserPlus,\n Image,\n BadgeCheck,\n FileText,\n Brain,\n Plus,\n Trash2,\n Target,\n Lightbulb,\n Info,\n Heart,\n Bot,\n Pencil,\n Check,\n X,\n} from 'lucide-react';\nimport type { MemoryItem } from '../../types/chatTypes';\n\nexport interface UserProfileConfig {\n labels?: {\n title?: string;\n basicInfo?: string;\n customFields?: string;\n memories?: string;\n addMemory?: string;\n noMemories?: string;\n close?: string;\n noCustomFields?: string;\n };\n}\n\nexport interface UserProfileUser {\n id: string;\n name?: string;\n email?: string;\n avatar?: string;\n}\n\n// Custom field definition - can be extended by login/external components\nexport interface CustomField {\n key: string;\n label: string;\n value: string | number | boolean | null | undefined;\n type?: 'text' | 'email' | 'phone' | 'url' | 'date' | 'number' | 'boolean';\n icon?: React.ReactNode;\n}\n\nexport interface UserProfileProps {\n isOpen: boolean;\n onClose: () => void;\n user?: UserProfileUser | null;\n /** Custom fields from userContext.customFields */\n customFields?: CustomField[] | Record<string, unknown>;\n /** User memories */\n memories?: MemoryItem[];\n config?: UserProfileConfig;\n /** Called when user wants to edit their profile */\n onEditProfile?: () => void;\n /** Called when user wants to logout */\n onLogout?: () => void;\n /** Called when user adds a memory */\n onAddMemory?: (content: string, category?: MemoryItem['category']) => void;\n /** Called when user updates a memory */\n onUpdateMemory?: (memoryId: string, content: string) => void;\n /** Called when user deletes a memory */\n onDeleteMemory?: (memoryId: string) => void;\n className?: string;\n}\n\n// Get initials from name or email\nconst getInitials = (name?: string, email?: string): string => {\n if (name) {\n return name\n .split(' ')\n .map((n) => n[0])\n .slice(0, 2)\n .join('')\n .toUpperCase();\n }\n if (email) {\n return email[0].toUpperCase();\n }\n return 'U';\n};\n\n// Map field types to icons\nconst getFieldIcon = (type?: string, key?: string): React.ReactNode => {\n const iconClass = 'h-4 w-4 text-muted-foreground';\n \n // Check by type first\n switch (type) {\n case 'email':\n return <Mail className={iconClass} />;\n case 'phone':\n return <Phone className={iconClass} />;\n case 'url':\n return <Globe className={iconClass} />;\n case 'date':\n return <Calendar className={iconClass} />;\n }\n \n // Check by common key names\n const lowerKey = key?.toLowerCase() || '';\n \n if (lowerKey.includes('follower')) return <Users className={iconClass} />;\n if (lowerKey.includes('following')) return <UserPlus className={iconClass} />;\n if (lowerKey.includes('post') || lowerKey.includes('publication')) return <Image className={iconClass} />;\n if (lowerKey.includes('verified') || lowerKey.includes('badge')) return <BadgeCheck className={iconClass} />;\n if (lowerKey.includes('bio')) return <FileText className={iconClass} />;\n \n // General fields\n if (lowerKey.includes('email')) return <Mail className={iconClass} />;\n if (lowerKey.includes('phone') || lowerKey.includes('tel')) return <Phone className={iconClass} />;\n if (lowerKey.includes('location') || lowerKey.includes('address') || lowerKey.includes('city')) return <MapPin className={iconClass} />;\n if (lowerKey.includes('company') || lowerKey.includes('org')) return <Building className={iconClass} />;\n if (lowerKey.includes('job') || lowerKey.includes('role') || lowerKey.includes('title') || lowerKey.includes('position')) return <Briefcase className={iconClass} />;\n if (lowerKey.includes('website') || lowerKey.includes('url') || lowerKey.includes('link')) return <Globe className={iconClass} />;\n if (lowerKey.includes('username') || lowerKey.includes('handle')) return <AtSign className={iconClass} />;\n if (lowerKey.includes('date') || lowerKey.includes('birthday') || lowerKey.includes('joined')) return <Calendar className={iconClass} />;\n \n return <User className={iconClass} />;\n};\n\n// Format value for display\nconst formatValue = (value: unknown, type?: string, key?: string): string => {\n if (value === null || value === undefined) return '-';\n if (typeof value === 'boolean') {\n if (key?.toLowerCase().includes('verified')) {\n return value ? 'Verified ✓' : 'Not verified';\n }\n return value ? 'Yes' : 'No';\n }\n if (type === 'date' && (typeof value === 'string' || typeof value === 'number')) {\n try {\n return new Date(value).toLocaleDateString('en-US');\n } catch {\n return String(value);\n }\n }\n return String(value);\n};\n\n// Convert Record<string, unknown> to CustomField[]\nconst normalizeCustomFields = (fields?: CustomField[] | Record<string, unknown>): CustomField[] => {\n if (!fields) return [];\n \n if (Array.isArray(fields)) {\n return fields;\n }\n \n // Convert object to array of fields\n return Object.entries(fields)\n .filter(([_, value]) => value !== null && value !== undefined && value !== '')\n .map(([key, value]) => ({\n key,\n label: key\n .replace(/([A-Z])/g, ' $1')\n .replace(/[_-]/g, ' ')\n .replace(/^\\w/, (c) => c.toUpperCase())\n .trim(),\n value: value as string | number | boolean,\n }));\n};\n\n// Get icon for memory category\nconst getMemoryCategoryIcon = (category?: MemoryItem['category']): React.ReactNode => {\n const iconClass = 'h-4 w-4 text-muted-foreground';\n switch (category) {\n case 'preference':\n return <Heart className={iconClass} />;\n case 'fact':\n return <Info className={iconClass} />;\n case 'goal':\n return <Target className={iconClass} />;\n case 'context':\n return <Lightbulb className={iconClass} />;\n default:\n return <Brain className={iconClass} />;\n }\n};\n\n// Get label for memory category\nconst getMemoryCategoryLabel = (category?: MemoryItem['category']): string => {\n switch (category) {\n case 'preference':\n return 'Preferência';\n case 'fact':\n return 'Fato';\n case 'goal':\n return 'Meta';\n case 'context':\n return 'Contexto';\n default:\n return 'Outro';\n }\n};\n\nexport const UserProfile: React.FC<UserProfileProps> = ({\n isOpen,\n onClose,\n user,\n customFields,\n memories = [],\n config,\n onEditProfile,\n onLogout,\n onAddMemory,\n onUpdateMemory,\n onDeleteMemory,\n className,\n}) => {\n const [newMemoryContent, setNewMemoryContent] = useState('');\n const [isAddingMemory, setIsAddingMemory] = useState(false);\n const [editingMemoryId, setEditingMemoryId] = useState<string | null>(null);\n const [editingMemoryContent, setEditingMemoryContent] = useState('');\n\n const handleAddMemory = () => {\n if (newMemoryContent.trim() && onAddMemory) {\n onAddMemory(newMemoryContent.trim(), 'other');\n setNewMemoryContent('');\n setIsAddingMemory(false);\n }\n };\n\n const handleStartEdit = (memory: MemoryItem) => {\n setEditingMemoryId(memory.id);\n setEditingMemoryContent(memory.content);\n };\n\n const handleSaveEdit = () => {\n if (editingMemoryId && editingMemoryContent.trim() && onUpdateMemory) {\n onUpdateMemory(editingMemoryId, editingMemoryContent.trim());\n setEditingMemoryId(null);\n setEditingMemoryContent('');\n }\n };\n\n const handleCancelEdit = () => {\n setEditingMemoryId(null);\n setEditingMemoryContent('');\n };\n\n const labels = {\n title: config?.labels?.title || 'Profile',\n basicInfo: config?.labels?.basicInfo || 'Account',\n customFields: config?.labels?.customFields || 'Details',\n memories: config?.labels?.memories || 'Memories',\n addMemory: config?.labels?.addMemory || 'Add memory',\n noMemories: config?.labels?.noMemories || 'No memories yet',\n close: config?.labels?.close || 'Close',\n noCustomFields: config?.labels?.noCustomFields || 'No additional information',\n };\n\n const displayName = user?.name || user?.email?.split('@')[0] || 'User';\n const initials = getInitials(user?.name, user?.email);\n const normalizedFields = normalizeCustomFields(customFields);\n\n return (\n <Sheet open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <SheetContent\n side=\"right\"\n className={cn('w-full sm:max-w-md p-0 flex flex-col h-full overflow-hidden', className)}\n >\n <SheetHeader className=\"px-6 py-4 border-b shrink-0\">\n <div className=\"flex items-center justify-between\">\n <SheetTitle>{labels.title}</SheetTitle>\n </div>\n </SheetHeader>\n\n <ScrollArea className=\"flex-1 min-h-0\">\n <div className=\"p-6 space-y-6\">\n {/* User header */}\n <div className=\"flex flex-col items-center text-center space-y-4\">\n <Avatar className=\"h-24 w-24 shrink-0\">\n {user?.avatar && <AvatarImage src={user.avatar} alt={displayName} />}\n <AvatarFallback className=\"text-2xl bg-primary/10 text-primary\">\n {initials}\n </AvatarFallback>\n </Avatar>\n <div className=\"w-full px-2\">\n <h2 className=\"text-xl font-semibold break-words\">{displayName}</h2>\n {user?.email && (\n <p className=\"text-sm text-muted-foreground break-words\">{user.email}</p>\n )}\n </div>\n </div>\n\n <Separator />\n\n {/* Basic info */}\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-medium text-muted-foreground uppercase tracking-wider\">\n {labels.basicInfo}\n </h3>\n <div className=\"space-y-2\">\n <div className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground\">Name</p>\n <p className=\"text-sm font-medium break-words\">{displayName}</p>\n </div>\n </div>\n {user?.email && (\n <div className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50\">\n <AtSign className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground\">Handle</p>\n <p className=\"text-sm font-medium break-words\">{user.email}</p>\n </div>\n </div>\n )}\n {user?.id && user.id !== user?.name && user.id !== user?.email && (\n <div className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground\">ID</p>\n <p className=\"text-sm font-medium break-words\">{user.id}</p>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Custom fields */}\n {normalizedFields.length > 0 && (\n <>\n <Separator />\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-medium text-muted-foreground uppercase tracking-wider\">\n {labels.customFields}\n </h3>\n <div className=\"space-y-2\">\n {normalizedFields.map((field) => {\n const isBioField = field.key.toLowerCase().includes('bio');\n return (\n <div\n key={field.key}\n className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50\"\n >\n <div className=\"mt-0.5 shrink-0\">\n {field.icon || getFieldIcon(field.type, field.key)}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-muted-foreground\">{field.label}</p>\n <p className={cn(\n \"text-sm font-medium\",\n isBioField ? \"whitespace-pre-wrap break-words\" : \"break-words\"\n )}>\n {formatValue(field.value, field.type, field.key)}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </>\n )}\n\n {/* Memories section */}\n <Separator />\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-muted-foreground uppercase tracking-wider flex items-center gap-2\">\n <Brain className=\"h-4 w-4\" />\n {labels.memories}\n </h3>\n {onAddMemory && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2\"\n onClick={() => setIsAddingMemory(true)}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n {/* Add memory input */}\n {isAddingMemory && onAddMemory && (\n <div className=\"flex gap-2\">\n <Input\n value={newMemoryContent}\n onChange={(e) => setNewMemoryContent(e.target.value)}\n placeholder=\"O que devo lembrar?\"\n className=\"flex-1 h-9\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleAddMemory();\n if (e.key === 'Escape') {\n setIsAddingMemory(false);\n setNewMemoryContent('');\n }\n }}\n autoFocus\n />\n <Button size=\"sm\" onClick={handleAddMemory} disabled={!newMemoryContent.trim()}>\n Salvar\n </Button>\n </div>\n )}\n\n {/* Memory list */}\n <div className=\"space-y-2\">\n {memories.length === 0 ? (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n {labels.noMemories}\n </p>\n ) : (\n memories.map((memory) => {\n const isEditing = editingMemoryId === memory.id;\n \n return (\n <div\n key={memory.id}\n className=\"flex items-start gap-3 p-3 rounded-lg bg-muted/50 group\"\n >\n <div className=\"mt-0.5 shrink-0\">\n {memory.source === 'agent' ? (\n <Bot className=\"h-4 w-4 text-primary\" />\n ) : (\n getMemoryCategoryIcon(memory.category)\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"text-xs text-muted-foreground\">\n {getMemoryCategoryLabel(memory.category)}\n </span>\n <span className=\"text-xs text-muted-foreground\">•</span>\n <span className=\"text-xs text-muted-foreground\">\n {memory.source === 'agent' ? 'IA' : 'Você'}\n </span>\n </div>\n {isEditing ? (\n <div className=\"space-y-2\">\n <Textarea\n value={editingMemoryContent}\n onChange={(e) => setEditingMemoryContent(e.target.value)}\n className=\"min-h-[60px] text-sm resize-none\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n handleSaveEdit();\n }\n if (e.key === 'Escape') {\n handleCancelEdit();\n }\n }}\n />\n <div className=\"flex gap-1 justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2\"\n onClick={handleCancelEdit}\n >\n <X className=\"h-3.5 w-3.5 mr-1\" />\n Cancelar\n </Button>\n <Button\n size=\"sm\"\n className=\"h-7 px-2\"\n onClick={handleSaveEdit}\n disabled={!editingMemoryContent.trim()}\n >\n <Check className=\"h-3.5 w-3.5 mr-1\" />\n Salvar\n </Button>\n </div>\n </div>\n ) : (\n <p className=\"text-sm break-words\">{memory.content}</p>\n )}\n </div>\n {!isEditing && (onUpdateMemory || onDeleteMemory) && (\n <div className=\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity shrink-0\">\n {onUpdateMemory && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => handleStartEdit(memory)}\n >\n <Pencil className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </Button>\n )}\n {onDeleteMemory && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => onDeleteMemory(memory.id)}\n >\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n </div>\n </div>\n </ScrollArea>\n\n {/* Footer actions */}\n <div className=\"p-4 border-t space-y-2 shrink-0\">\n {onEditProfile && (\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={onEditProfile}\n >\n Edit Profile\n </Button>\n )}\n {onLogout && (\n <Button\n variant=\"destructive\"\n className=\"w-full\"\n onClick={onLogout}\n >\n Log out\n </Button>\n )}\n </div>\n </SheetContent>\n </Sheet>\n );\n};\n\nexport default UserProfile;\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst ScrollArea = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof ScrollAreaPrimitive.Root> & {\n viewportClassName?: string\n }\n>(({ className, children, viewportClassName, onScroll, onScrollCapture, ...props }, ref) => {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={ref as React.Ref<HTMLDivElement>}\n data-slot=\"scroll-area-viewport\"\n className={cn(\n \"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1\",\n viewportClassName\n )}\n onScroll={onScroll as any}\n onScrollCapture={onScrollCapture as any}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n})\nScrollArea.displayName = \"ScrollArea\"\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","import React, { useState, useRef, useEffect } from 'react';\nimport { ChatThread, ChatConfig } from '../../types/chatTypes';\nimport { formatDate } from '../../lib/utils';\nimport { Button } from '../ui/button';\nimport { Input } from '../ui/input';\nimport { Card, CardContent, CardHeader, CardTitle } from '../ui/card';\nimport { Badge } from '../ui/badge';\nimport { ScrollArea } from '../ui/scroll-area';\nimport { Separator } from '../ui/separator';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '../ui/dialog';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '../ui/alert-dialog';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport { TooltipProvider } from '../ui/tooltip';\nimport {\n Plus,\n MessageSquare,\n MoreVertical,\n Edit2,\n Trash2,\n Archive,\n Search,\n Filter,\n Calendar,\n Hash,\n X,\n Check,\n} from 'lucide-react';\n\ninterface ThreadManagerProps {\n threads: ChatThread[];\n currentThreadId?: string | null;\n config?: ChatConfig;\n onCreateThread?: (title?: string) => void;\n onSelectThread?: (threadId: string) => void;\n onRenameThread?: (threadId: string, newTitle: string) => void;\n onDeleteThread?: (threadId: string) => void;\n onArchiveThread?: (threadId: string) => void;\n isOpen?: boolean;\n onClose?: () => void;\n className?: string;\n}\n\n// Individual thread item component\nconst ThreadItem: React.FC<{\n thread: ChatThread;\n isActive: boolean;\n config?: ChatConfig;\n onSelect: () => void;\n onRename: (newTitle: string) => void;\n onDelete: () => void;\n onArchive: () => void;\n}> = ({ thread, isActive, config, onSelect, onRename, onDelete, onArchive }) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editTitle, setEditTitle] = useState(thread.title);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing]);\n\n const handleSaveEdit = () => {\n const trimmedTitle = editTitle.trim();\n if (trimmedTitle && trimmedTitle !== thread.title) {\n onRename(trimmedTitle);\n }\n setIsEditing(false);\n };\n\n const handleCancelEdit = () => {\n setEditTitle(thread.title);\n setIsEditing(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleSaveEdit();\n } else if (e.key === 'Escape') {\n handleCancelEdit();\n }\n };\n\n return (\n <Card className={`cursor-pointer transition-all duration-200 hover:shadow-md py-0 ${\n isActive ? 'ring-2 ring-primary bg-primary/5' : 'hover:bg-muted/50'\n }`}>\n <CardContent className=\"p-3 max-w-sm\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\" onClick={onSelect}>\n {isEditing ? (\n <div className=\"flex items-center gap-2\">\n <Input\n ref={inputRef}\n value={editTitle}\n onChange={(e) => setEditTitle(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleSaveEdit}\n className=\"h-8 text-sm\"\n placeholder={config?.labels?.threadNamePlaceholder || \"Conversation name\"}\n />\n <Button size=\"sm\" variant=\"ghost\" onClick={handleSaveEdit}>\n <Check className=\"h-3 w-3\" />\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={handleCancelEdit}>\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n ) : (\n <>\n <h4 className=\"font-medium text-sm truncate mb-1\">\n {thread.title}\n </h4>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <div className=\"flex items-center gap-1\">\n <Hash className=\"h-3 w-3\" />\n {thread.messageCount} msgs\n </div>\n <Separator orientation=\"vertical\" className=\"h-3\" />\n <div className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatDate(thread.updatedAt, config?.labels)}\n </div>\n {thread.isArchived && (\n <>\n <Separator orientation=\"vertical\" className=\"h-3\" />\n <Badge variant=\"secondary\" className=\"text-xs\">\n <Archive className=\"h-2 w-2 mr-1\" />\n {config?.labels?.archiveThread || 'Archived'}\n </Badge>\n </>\n )}\n </div>\n </>\n )}\n </div>\n\n {!isEditing && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6 m-auto\">\n <MoreVertical className=\"h-3 w-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setIsEditing(true)}>\n <Edit2 className=\"h-4 w-4 mr-2\" />\n {config?.labels?.renameThread || 'Rename'}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onArchive}>\n <Archive className=\"h-4 w-4 mr-2\" />\n {thread.isArchived \n ? (config?.labels?.unarchiveThread || 'Unarchive')\n : (config?.labels?.archiveThread || 'Archive')}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onDelete} className=\"text-destructive\">\n <Trash2 className=\"h-4 w-4 mr-2\" />\n {config?.labels?.deleteThread || 'Delete'}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </CardContent>\n </Card>\n );\n};\n\n// Create thread dialog\nconst CreateThreadDialog: React.FC<{\n onCreateThread: (title?: string) => void;\n config?: ChatConfig;\n}> = ({ onCreateThread, config }) => {\n const [title, setTitle] = useState('');\n const [isOpen, setIsOpen] = useState(false);\n\n const handleCreate = () => {\n onCreateThread(title.trim() || undefined);\n setTitle('');\n setIsOpen(false);\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n <DialogTrigger asChild>\n <Button variant=\"outline\" className=\"w-full\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {config?.labels?.createNewThread || 'New Conversation'}\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{config?.labels?.createNewThread || 'Create New Conversation'}</DialogTitle>\n <DialogDescription>\n Give your new conversation a name or leave blank to auto-generate one.\n </DialogDescription>\n </DialogHeader>\n <Input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={config?.labels?.threadNamePlaceholder || \"Conversation name (optional)\"}\n onKeyDown={(e) => e.key === 'Enter' && handleCreate()}\n autoFocus\n />\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setIsOpen(false)}>\n {config?.labels?.cancel || 'Cancel'}\n </Button>\n <Button onClick={handleCreate}>\n {config?.labels?.create || 'Create'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport const ThreadManager: React.FC<ThreadManagerProps> = ({\n threads,\n currentThreadId,\n config,\n onCreateThread,\n onSelectThread,\n onRenameThread,\n onDeleteThread,\n onArchiveThread,\n isOpen = false,\n onClose,\n className = '',\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [showArchived, setShowArchived] = useState(false);\n const [deleteThreadId, setDeleteThreadId] = useState<string | null>(null);\n\n // Filter threads based on search and archive filter\n const filteredThreads = threads.filter(thread => {\n const title = (thread.title ?? '').toString();\n const matchesSearch = title.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesArchiveFilter = showArchived || !thread.isArchived;\n return matchesSearch && matchesArchiveFilter;\n });\n\n // Group threads by date\n const groupedThreads = filteredThreads.reduce((groups, thread) => {\n const date = new Date(thread.updatedAt);\n const today = new Date();\n const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);\n \n let groupKey: string;\n if (date.toDateString() === today.toDateString()) {\n groupKey = config?.labels?.today || 'Today';\n } else if (date.toDateString() === yesterday.toDateString()) {\n groupKey = config?.labels?.yesterday || 'Yesterday';\n } else {\n groupKey = date.toLocaleDateString('en-US', {\n weekday: 'long',\n day: '2-digit',\n month: 'long',\n });\n }\n\n if (!groups[groupKey]) {\n groups[groupKey] = [];\n }\n groups[groupKey].push(thread);\n return groups;\n }, {} as Record<string, ChatThread[]>);\n\n const handleDeleteThread = (threadId: string) => {\n onDeleteThread?.(threadId);\n setDeleteThreadId(null);\n };\n\n if (!isOpen) return null;\n\n return (\n <TooltipProvider>\n <div className={`fixed inset-0 z-50 bg-background/80 backdrop-blur-sm ${className}`}>\n <div className=\"fixed left-0 top-0 h-full w-full max-w-md border-r bg-background shadow-lg\">\n <Card className=\"h-full border-0 rounded-none\">\n <CardHeader className=\"border-b\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-5 w-5\" />\n {config?.labels?.newChat || 'Conversations'}\n </CardTitle>\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose} >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n \n {/* Search and filters */}\n <div className=\"space-y-3\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder={config?.labels?.search || \"Search conversations...\"}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n \n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowArchived(!showArchived)}\n className=\"text-xs\"\n >\n <Filter className=\"h-3 w-3 mr-1\" />\n {showArchived \n ? (config?.labels?.hideArchived || 'Hide Archived')\n : (config?.labels?.showArchived || 'Show Archived')}\n </Button>\n \n <Badge variant=\"secondary\" className=\"text-xs\">\n {filteredThreads.length} / {threads.length}\n </Badge>\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"p-0 flex-1\">\n <div className=\"p-4\">\n {onCreateThread && (\n <CreateThreadDialog onCreateThread={onCreateThread} config={config} />\n )}\n </div>\n\n <ScrollArea className=\"h-[calc(100vh-280px)]\">\n <div className=\"px-4 pb-4 space-y-4\">\n {Object.keys(groupedThreads).length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground\">\n <MessageSquare className=\"h-12 w-12 mx-auto mb-3 opacity-50\" />\n <p className=\"text-sm\">\n {searchQuery \n ? (config?.labels?.noThreadsFound || 'No conversations found')\n : (config?.labels?.noThreadsYet || 'No conversations yet')}\n </p>\n </div>\n ) : (\n Object.entries(groupedThreads).map(([group, groupThreads]: [string, ChatThread[]]) => (\n <div key={group}>\n <h3 className=\"text-sm font-medium text-muted-foreground mb-2 px-2\">\n {group}\n </h3>\n <div className=\"space-y-2\">\n {groupThreads.map((thread) => (\n <ThreadItem\n key={thread.id}\n thread={thread}\n isActive={currentThreadId === thread.id}\n config={config}\n onSelect={() => onSelectThread?.(thread.id)}\n onRename={(newTitle) => onRenameThread?.(thread.id, newTitle)}\n onDelete={() => setDeleteThreadId(thread.id)}\n onArchive={() => onArchiveThread?.(thread.id)}\n />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n </ScrollArea>\n </CardContent>\n </Card>\n </div>\n\n {/* Delete confirmation dialog - only render when needed to avoid Radix focus conflicts */}\n {deleteThreadId && (\n <AlertDialog open={!!deleteThreadId} onOpenChange={() => setDeleteThreadId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{config?.labels?.deleteConfirmTitle || 'Delete Conversation'}</AlertDialogTitle>\n <AlertDialogDescription>\n {config?.labels?.deleteConfirmDescription || 'Are you sure you want to delete this conversation? This action cannot be undone.'}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>{config?.labels?.cancel || 'Cancel'}</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => deleteThreadId && handleDeleteThread(deleteThreadId)}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {config?.labels?.deleteThread || 'Delete'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )}\n </div>\n </TooltipProvider>\n );\n};\n","import { ChatMessage, ChatThread, MediaAttachment } from '../types/chatTypes';\n\nexport const chatUtils = {\n generateId: (): string => \n (globalThis.crypto?.randomUUID?.() ?? `id-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`),\n\n generateMessageId: (): string => chatUtils.generateId(),\n generateThreadId: (): string => chatUtils.generateId(),\n \n createMessage: (\n role: 'user' | 'assistant' | 'system',\n content: string,\n attachments?: MediaAttachment[]\n ): ChatMessage => ({\n id: chatUtils.generateMessageId(),\n role,\n content,\n timestamp: Date.now(),\n attachments,\n isComplete: true,\n }),\n\n createThread: (title: string): ChatThread => ({\n id: chatUtils.generateThreadId(),\n title,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messageCount: 0,\n }),\n\n generateThreadTitle: (firstMessage: string): string => {\n const cleaned = firstMessage.replace(/[^\\w\\s]/g, '').trim();\n const words = cleaned.split(/\\s+/).slice(0, 6);\n return words.join(' ') || 'Nova Conversa';\n },\n};\n\n"],"mappings":"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","names":["Sidebar","import_react","import_jsx_runtime","import_react_slot","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","ThinkingIndicator","remarkGfm","rehypeHighlight","StreamingText","ReactMarkdown","MediaRenderer","ToolCallsDisplay","import_react","import_jsx_runtime","React","import_react_slot","import_class_variance_authority","import_lucide_react","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","open","React","import_lucide_react","import_jsx_runtime","cleanupBodyStyles","React","import_jsx_runtime","cleanupBodyStyles","import_lucide_react","import_jsx_runtime","import_lucide_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","Sidebar","import_react","import_lucide_react","import_jsx_runtime","React","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","FileUploadItem","AttachmentPreview","AudioRecorder","ChatInput","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","getInitials","import_lucide_react","import_jsx_runtime","Sidebar","import_react","import_lucide_react","import_jsx_runtime","CreateThreadDialog"]}
|