@chatwidgetai/chat-widget 0.1.6 → 0.1.8

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.
@@ -17599,8 +17599,10 @@
17599
17599
  /**
17600
17600
  * Local Storage Utilities
17601
17601
  * Handles conversation persistence in browser localStorage
17602
+ * Supports multiple conversations per widget with history
17602
17603
  */
17603
17604
  const STORAGE_PREFIX = 'ai-chat-widget';
17605
+ const MAX_STORED_CONVERSATIONS = 20;
17604
17606
  /**
17605
17607
  * Generate a storage key for a widget
17606
17608
  */
@@ -17608,33 +17610,113 @@
17608
17610
  return `${STORAGE_PREFIX}:${widgetId}`;
17609
17611
  }
17610
17612
  /**
17611
- * Save conversation to localStorage
17613
+ * Get widget storage data
17612
17614
  */
17613
- function saveConversation(widgetId, conversationId, messages) {
17615
+ function getWidgetStorage(widgetId) {
17614
17616
  try {
17615
17617
  const key = getStorageKey(widgetId);
17616
- const data = {
17618
+ const data = localStorage.getItem(key);
17619
+ if (!data) {
17620
+ return { activeConversationId: null, conversations: {}, history: [] };
17621
+ }
17622
+ const parsed = JSON.parse(data);
17623
+ // Handle legacy format (single conversation)
17624
+ if (parsed.conversationId && parsed.messages) {
17625
+ const legacy = parsed;
17626
+ return {
17627
+ activeConversationId: legacy.conversationId,
17628
+ conversations: { [legacy.conversationId]: legacy },
17629
+ history: [{
17630
+ id: legacy.conversationId,
17631
+ preview: getConversationPreview(legacy.messages),
17632
+ lastUpdated: legacy.lastUpdated,
17633
+ messageCount: legacy.messages.length,
17634
+ }],
17635
+ };
17636
+ }
17637
+ return parsed;
17638
+ }
17639
+ catch (error) {
17640
+ console.error('Failed to get widget storage:', error);
17641
+ return { activeConversationId: null, conversations: {}, history: [] };
17642
+ }
17643
+ }
17644
+ /**
17645
+ * Save widget storage data
17646
+ */
17647
+ function setWidgetStorage(widgetId, storage) {
17648
+ try {
17649
+ const key = getStorageKey(widgetId);
17650
+ localStorage.setItem(key, JSON.stringify(storage));
17651
+ }
17652
+ catch (error) {
17653
+ console.error('Failed to save widget storage:', error);
17654
+ }
17655
+ }
17656
+ /**
17657
+ * Get preview text from messages
17658
+ */
17659
+ function getConversationPreview(messages) {
17660
+ const firstUserMessage = messages.find(m => m.message.type === 'human');
17661
+ if (firstUserMessage) {
17662
+ return firstUserMessage.message.content.slice(0, 100);
17663
+ }
17664
+ return 'New conversation';
17665
+ }
17666
+ /**
17667
+ * Save conversation to localStorage (updates both conversation and history)
17668
+ */
17669
+ function saveConversation(widgetId, conversationId, messages) {
17670
+ try {
17671
+ const storage = getWidgetStorage(widgetId);
17672
+ const now = new Date().toISOString();
17673
+ // Update conversation data
17674
+ storage.conversations[conversationId] = {
17617
17675
  conversationId,
17618
17676
  messages,
17619
- lastUpdated: new Date().toISOString(),
17677
+ lastUpdated: now,
17678
+ };
17679
+ // Update active conversation
17680
+ storage.activeConversationId = conversationId;
17681
+ // Update history entry
17682
+ const existingIndex = storage.history.findIndex(h => h.id === conversationId);
17683
+ const historyEntry = {
17684
+ id: conversationId,
17685
+ preview: getConversationPreview(messages),
17686
+ lastUpdated: now,
17687
+ messageCount: messages.length,
17620
17688
  };
17621
- localStorage.setItem(key, JSON.stringify(data));
17689
+ if (existingIndex >= 0) {
17690
+ storage.history[existingIndex] = historyEntry;
17691
+ }
17692
+ else {
17693
+ storage.history.unshift(historyEntry);
17694
+ }
17695
+ // Sort by lastUpdated (most recent first)
17696
+ storage.history.sort((a, b) => new Date(b.lastUpdated).getTime() - new Date(a.lastUpdated).getTime());
17697
+ // Limit stored conversations
17698
+ if (storage.history.length > MAX_STORED_CONVERSATIONS) {
17699
+ const toRemove = storage.history.slice(MAX_STORED_CONVERSATIONS);
17700
+ storage.history = storage.history.slice(0, MAX_STORED_CONVERSATIONS);
17701
+ toRemove.forEach(entry => {
17702
+ delete storage.conversations[entry.id];
17703
+ });
17704
+ }
17705
+ setWidgetStorage(widgetId, storage);
17622
17706
  }
17623
17707
  catch (error) {
17624
17708
  console.error('Failed to save conversation:', error);
17625
17709
  }
17626
17710
  }
17627
17711
  /**
17628
- * Load conversation from localStorage
17712
+ * Load active conversation from localStorage (legacy compatibility)
17629
17713
  */
17630
17714
  function loadConversation(widgetId) {
17631
17715
  try {
17632
- const key = getStorageKey(widgetId);
17633
- const data = localStorage.getItem(key);
17634
- if (!data)
17716
+ const storage = getWidgetStorage(widgetId);
17717
+ if (!storage.activeConversationId)
17635
17718
  return null;
17636
- const parsed = JSON.parse(data);
17637
- return parsed;
17719
+ return storage.conversations[storage.activeConversationId] || null;
17638
17720
  }
17639
17721
  catch (error) {
17640
17722
  console.error('Failed to load conversation:', error);
@@ -17642,12 +17724,52 @@
17642
17724
  }
17643
17725
  }
17644
17726
  /**
17645
- * Clear conversation from localStorage
17727
+ * Load a specific conversation by ID
17728
+ */
17729
+ function loadConversationById(widgetId, conversationId) {
17730
+ try {
17731
+ const storage = getWidgetStorage(widgetId);
17732
+ return storage.conversations[conversationId] || null;
17733
+ }
17734
+ catch (error) {
17735
+ console.error('Failed to load conversation by ID:', error);
17736
+ return null;
17737
+ }
17738
+ }
17739
+ /**
17740
+ * Get conversation history list
17741
+ */
17742
+ function getConversationHistory(widgetId) {
17743
+ try {
17744
+ const storage = getWidgetStorage(widgetId);
17745
+ return storage.history;
17746
+ }
17747
+ catch (error) {
17748
+ console.error('Failed to get conversation history:', error);
17749
+ return [];
17750
+ }
17751
+ }
17752
+ /**
17753
+ * Set active conversation
17754
+ */
17755
+ function setActiveConversation(widgetId, conversationId) {
17756
+ try {
17757
+ const storage = getWidgetStorage(widgetId);
17758
+ storage.activeConversationId = conversationId;
17759
+ setWidgetStorage(widgetId, storage);
17760
+ }
17761
+ catch (error) {
17762
+ console.error('Failed to set active conversation:', error);
17763
+ }
17764
+ }
17765
+ /**
17766
+ * Clear current conversation (start fresh, but keep history)
17646
17767
  */
17647
17768
  function clearConversation(widgetId) {
17648
17769
  try {
17649
- const key = getStorageKey(widgetId);
17650
- localStorage.removeItem(key);
17770
+ const storage = getWidgetStorage(widgetId);
17771
+ storage.activeConversationId = null;
17772
+ setWidgetStorage(widgetId, storage);
17651
17773
  }
17652
17774
  catch (error) {
17653
17775
  console.error('Failed to clear conversation:', error);
@@ -17744,6 +17866,8 @@
17744
17866
  conversationId: '', // Will be set after loading conversation
17745
17867
  config: null,
17746
17868
  });
17869
+ // Chat history state
17870
+ const [conversations, setConversations] = reactExports.useState([]);
17747
17871
  const apiClient = reactExports.useRef(new WidgetApiClient({ widgetId, apiUrl }));
17748
17872
  // Load configuration on mount and hydrate with existing conversation if available
17749
17873
  reactExports.useEffect(() => {
@@ -17755,8 +17879,6 @@
17755
17879
  const config = await apiClient.current.getConfig();
17756
17880
  console.log('[useChat] Config fetched successfully:', {
17757
17881
  hasAppearance: !!config.appearance,
17758
- hasLightMode: !!config.appearance?.lightMode,
17759
- hasDarkMode: !!config.appearance?.darkMode,
17760
17882
  });
17761
17883
  const persistConversation = config.behavior.persistConversation ?? true;
17762
17884
  let conversationId = '';
@@ -18031,6 +18153,78 @@
18031
18153
  onError?.(err);
18032
18154
  }
18033
18155
  }, [state.conversationId, onError]);
18156
+ /**
18157
+ * Load conversation history list from localStorage
18158
+ */
18159
+ const loadConversations = reactExports.useCallback(() => {
18160
+ const persistConversation = state.config?.behavior.persistConversation ?? true;
18161
+ if (!persistConversation || !isStorageAvailable()) {
18162
+ setConversations([]);
18163
+ return;
18164
+ }
18165
+ const history = getConversationHistory(widgetId);
18166
+ setConversations(history.map(entry => ({
18167
+ id: entry.id,
18168
+ preview: entry.preview,
18169
+ lastMessageAt: entry.lastUpdated,
18170
+ messageCount: entry.messageCount,
18171
+ startedAt: entry.lastUpdated,
18172
+ })));
18173
+ }, [widgetId, state.config?.behavior.persistConversation]);
18174
+ /**
18175
+ * Switch to a different conversation (from localStorage first, then fetch from server if needed)
18176
+ */
18177
+ const switchConversation = reactExports.useCallback(async (conversationId) => {
18178
+ const persistConversation = state.config?.behavior.persistConversation ?? true;
18179
+ // First try to load from localStorage
18180
+ if (persistConversation && isStorageAvailable()) {
18181
+ const stored = loadConversationById(widgetId, conversationId);
18182
+ if (stored) {
18183
+ setState(prev => ({
18184
+ ...prev,
18185
+ conversationId: stored.conversationId,
18186
+ messages: stored.messages,
18187
+ }));
18188
+ setActiveConversation(widgetId, conversationId);
18189
+ return;
18190
+ }
18191
+ }
18192
+ // If not in localStorage, fetch from server
18193
+ setState(prev => ({ ...prev, isLoading: true, error: null }));
18194
+ try {
18195
+ const conversation = await apiClient.current.getOrCreateConversation(conversationId);
18196
+ setState(prev => ({
18197
+ ...prev,
18198
+ conversationId: conversation.id,
18199
+ messages: conversation.messages,
18200
+ isLoading: false,
18201
+ }));
18202
+ // Save to local storage
18203
+ if (persistConversation && isStorageAvailable()) {
18204
+ saveConversation(widgetId, conversation.id, conversation.messages);
18205
+ }
18206
+ }
18207
+ catch (error) {
18208
+ const errorInfo = deriveErrorInfo(error);
18209
+ setState(prev => ({ ...prev, isLoading: false, error: errorInfo.message }));
18210
+ }
18211
+ }, [widgetId, state.config?.behavior.persistConversation]);
18212
+ /**
18213
+ * Start a new conversation (keeps history)
18214
+ */
18215
+ const startNewConversation = reactExports.useCallback(() => {
18216
+ setState(prev => ({
18217
+ ...prev,
18218
+ messages: [],
18219
+ conversationId: '',
18220
+ error: null,
18221
+ }));
18222
+ // Clear active conversation but keep history
18223
+ const persistConversation = state.config?.behavior.persistConversation ?? true;
18224
+ if (persistConversation && isStorageAvailable()) {
18225
+ clearConversation(widgetId);
18226
+ }
18227
+ }, [widgetId, state.config?.behavior.persistConversation]);
18034
18228
  return {
18035
18229
  messages: state.messages,
18036
18230
  isLoading: state.isLoading,
@@ -18041,6 +18235,11 @@
18041
18235
  sendMessage,
18042
18236
  clearMessages,
18043
18237
  submitFeedback,
18238
+ // Chat history features
18239
+ conversations,
18240
+ loadConversations,
18241
+ switchConversation,
18242
+ startNewConversation,
18044
18243
  };
18045
18244
  }
18046
18245
 
@@ -38908,26 +39107,53 @@
38908
39107
  };
38909
39108
 
38910
39109
  const MinimizeIcon = () => (jsxRuntimeExports.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntimeExports.jsx("path", { d: "M5 12h14" }) }));
38911
- const ChatWindow = ({ messages, isLoading, isTyping, error, config, onSendMessage, onClose, onFeedback, }) => {
39110
+ const HistoryIcon = () => (jsxRuntimeExports.jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("circle", { cx: "12", cy: "12", r: "10" }), jsxRuntimeExports.jsx("polyline", { points: "12 6 12 12 16 14" })] }));
39111
+ const NewChatIcon = () => (jsxRuntimeExports.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntimeExports.jsx("path", { d: "M12 5v14M5 12h14" }) }));
39112
+ const BackIcon = () => (jsxRuntimeExports.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntimeExports.jsx("path", { d: "M19 12H5M12 19l-7-7 7-7" }) }));
39113
+ const ChatWindow = ({ messages, isLoading, isTyping, error, config, onSendMessage, onClose, onFeedback,
39114
+ // Chat history props (only active when persistConversation is true)
39115
+ conversations = [], onLoadConversations, onSwitchConversation, onStartNewConversation, currentConversationId, }) => {
38912
39116
  console.log('[ChatWindow] Rendering ChatWindow component');
38913
39117
  const appearance = config?.appearance;
38914
39118
  const behavior = config?.behavior;
39119
+ // Use simplified appearance fields
38915
39120
  const size = appearance?.size || 'medium';
38916
- console.log('[ChatWindow] Size:', size, 'Appearance:', !!appearance);
38917
- // Determine current theme config
38918
- const themePreference = appearance?.theme ?? 'light';
38919
- const canUseDarkMode = appearance?.darkModeEnabled !== false;
38920
- const prefersDark = typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches;
38921
- const isDarkMode = themePreference === 'auto'
38922
- ? (canUseDarkMode && prefersDark)
38923
- : themePreference === 'dark' && canUseDarkMode;
38924
- const themeConfig = (isDarkMode ? appearance?.darkMode : appearance?.lightMode) ?? (appearance?.lightMode || appearance?.darkMode);
38925
- const headerTitle = themeConfig?.header?.title ?? appearance?.header?.title ?? appearance?.companyName ?? 'AI Assistant';
38926
- const welcomeTitle = themeConfig?.chat?.welcomeTitle ?? 'Welcome!';
38927
- const welcomeMessage = themeConfig?.chat?.welcomeMessage ?? appearance?.welcomeMessage ?? '👋 Hi there! How can I assist you today?';
38928
- const inputPlaceholder = themeConfig?.footer?.inputPlaceholder ?? appearance?.placeholder ?? 'Ask me anything...';
39121
+ const headerTitle = appearance?.headerTitle || 'AI Assistant';
39122
+ const welcomeMessage = appearance?.welcomeMessage || '👋 Hi there! How can I assist you today?';
39123
+ const inputPlaceholder = appearance?.placeholder || 'Ask me anything...';
39124
+ console.log('[ChatWindow] Appearance values:', {
39125
+ size,
39126
+ headerTitle,
39127
+ welcomeMessage,
39128
+ inputPlaceholder,
39129
+ });
38929
39130
  // Track if suggested questions should be shown
38930
39131
  const [showSuggestedQuestions, setShowSuggestedQuestions] = reactExports.useState(true);
39132
+ // Track if history panel is open
39133
+ const [showHistory, setShowHistory] = reactExports.useState(false);
39134
+ // Check if chat history feature is enabled (only when persistConversation is true)
39135
+ const isHistoryEnabled = behavior?.persistConversation !== false && !!onLoadConversations;
39136
+ // Load conversations when history panel opens
39137
+ const handleOpenHistory = () => {
39138
+ setShowHistory(true);
39139
+ if (onLoadConversations) {
39140
+ onLoadConversations();
39141
+ }
39142
+ };
39143
+ // Handle conversation selection
39144
+ const handleSelectConversation = async (conversationId) => {
39145
+ if (onSwitchConversation) {
39146
+ await onSwitchConversation(conversationId);
39147
+ setShowHistory(false);
39148
+ }
39149
+ };
39150
+ // Handle new conversation
39151
+ const handleNewConversation = () => {
39152
+ if (onStartNewConversation) {
39153
+ onStartNewConversation();
39154
+ setShowHistory(false);
39155
+ }
39156
+ };
38931
39157
  // Hide suggested questions after first user message
38932
39158
  reactExports.useEffect(() => {
38933
39159
  const userMessages = messages.filter(m => m.message.type === 'human');
@@ -38945,241 +39171,39 @@
38945
39171
  onSendMessage(question);
38946
39172
  };
38947
39173
  const hasMessages = messages.length > 0;
38948
- return (jsxRuntimeExports.jsxs("div", { className: `ai-chat-window size-${size}`, role: "dialog", "aria-label": "Chat window", children: [jsxRuntimeExports.jsxs("div", { className: "ai-chat-header", children: [jsxRuntimeExports.jsxs("div", { className: "ai-chat-header-content", children: [appearance?.logo && (jsxRuntimeExports.jsx("img", { src: appearance.logo, alt: "Logo", className: "ai-chat-logo" })), jsxRuntimeExports.jsx("div", { className: "ai-chat-title", children: headerTitle })] }), jsxRuntimeExports.jsx("button", { className: "ai-chat-close-button", onClick: onClose, "aria-label": "Minimize chat", children: jsxRuntimeExports.jsx(MinimizeIcon, {}) })] }), error && (jsxRuntimeExports.jsx("div", { className: "ai-chat-error", role: "alert", children: error })), maxMessages && userMessageCount >= maxMessages - 2 && !isLimitReached && (jsxRuntimeExports.jsxs("div", { className: "ai-chat-warning", role: "alert", children: [maxMessages - userMessageCount, " message", maxMessages - userMessageCount !== 1 ? 's' : '', " remaining"] })), isLimitReached && (jsxRuntimeExports.jsx("div", { className: "ai-chat-error", role: "alert", children: "Message limit reached. Please start a new conversation." })), jsxRuntimeExports.jsx(MessageList, { messages: messages, isTyping: isTyping, showTypingIndicator: behavior?.showTypingIndicator, showTimestamps: behavior?.showTimestamps, enableFeedback: behavior?.enableFeedback, showSources: behavior?.showSources, sourceDisplayMode: behavior?.sourceDisplayMode, welcomeTitle: welcomeTitle, welcomeMessage: welcomeMessage, onFeedback: onFeedback }), showSuggestedQuestions && !hasMessages && behavior?.suggestedQuestions && behavior.suggestedQuestions.length > 0 && (jsxRuntimeExports.jsx(SuggestedQuestions, { questions: behavior.suggestedQuestions, onQuestionClick: handleQuestionClick })), jsxRuntimeExports.jsx(MessageInput, { onSend: onSendMessage, placeholder: isLimitReached ? 'Message limit reached' : inputPlaceholder, disabled: isLoading || isLimitReached, enableFileUpload: behavior?.enableFileUpload, separateFromChat: themeConfig?.footer?.separateFromChat })] }));
39174
+ // Format date for conversation list
39175
+ const formatDate = (dateString) => {
39176
+ const date = new Date(dateString);
39177
+ const now = new Date();
39178
+ const diffMs = now.getTime() - date.getTime();
39179
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
39180
+ if (diffDays === 0)
39181
+ return 'Today';
39182
+ if (diffDays === 1)
39183
+ return 'Yesterday';
39184
+ if (diffDays < 7)
39185
+ return `${diffDays} days ago`;
39186
+ return date.toLocaleDateString();
39187
+ };
39188
+ return (jsxRuntimeExports.jsxs("div", { className: `ai-chat-window size-${size}`, role: "dialog", "aria-label": "Chat window", children: [jsxRuntimeExports.jsx("div", { className: "ai-chat-header", children: showHistory ? (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("button", { className: "ai-chat-header-button", onClick: () => setShowHistory(false), "aria-label": "Back to chat", children: jsxRuntimeExports.jsx(BackIcon, {}) }), jsxRuntimeExports.jsx("div", { className: "ai-chat-title", children: "Chat History" }), jsxRuntimeExports.jsx("button", { className: "ai-chat-header-button", onClick: handleNewConversation, "aria-label": "New conversation", children: jsxRuntimeExports.jsx(NewChatIcon, {}) })] })) : (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsxs("div", { className: "ai-chat-header-content", children: [appearance?.logo && (jsxRuntimeExports.jsx("img", { src: appearance.logo, alt: "Logo", className: "ai-chat-logo" })), jsxRuntimeExports.jsx("div", { className: "ai-chat-title", children: headerTitle })] }), jsxRuntimeExports.jsxs("div", { className: "ai-chat-header-actions", children: [isHistoryEnabled && (jsxRuntimeExports.jsx("button", { className: "ai-chat-header-button", onClick: handleOpenHistory, "aria-label": "Chat history", children: jsxRuntimeExports.jsx(HistoryIcon, {}) })), jsxRuntimeExports.jsx("button", { className: "ai-chat-close-button", onClick: onClose, "aria-label": "Minimize chat", children: jsxRuntimeExports.jsx(MinimizeIcon, {}) })] })] })) }), showHistory ? (jsxRuntimeExports.jsx("div", { className: "ai-chat-history-panel", children: conversations.length === 0 ? (jsxRuntimeExports.jsx("div", { className: "ai-chat-history-empty", children: "No previous conversations" })) : (jsxRuntimeExports.jsx("div", { className: "ai-chat-history-list", children: conversations.map((conv) => (jsxRuntimeExports.jsxs("button", { className: `ai-chat-history-item ${conv.id === currentConversationId ? 'active' : ''}`, onClick: () => handleSelectConversation(conv.id), children: [jsxRuntimeExports.jsx("div", { className: "ai-chat-history-item-preview", children: conv.preview }), jsxRuntimeExports.jsxs("div", { className: "ai-chat-history-item-meta", children: [jsxRuntimeExports.jsx("span", { children: formatDate(conv.lastMessageAt) }), jsxRuntimeExports.jsxs("span", { children: [conv.messageCount, " messages"] })] })] }, conv.id))) })) })) : (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [error && (jsxRuntimeExports.jsx("div", { className: "ai-chat-error", role: "alert", children: error })), maxMessages && userMessageCount >= maxMessages - 2 && !isLimitReached && (jsxRuntimeExports.jsxs("div", { className: "ai-chat-warning", role: "alert", children: [maxMessages - userMessageCount, " message", maxMessages - userMessageCount !== 1 ? 's' : '', " remaining"] })), isLimitReached && (jsxRuntimeExports.jsx("div", { className: "ai-chat-error", role: "alert", children: "Message limit reached. Please start a new conversation." })), jsxRuntimeExports.jsx(MessageList, { messages: messages, isTyping: isTyping, showTypingIndicator: behavior?.showTypingIndicator, showTimestamps: behavior?.showTimestamps, enableFeedback: behavior?.enableFeedback, showSources: behavior?.showSources, sourceDisplayMode: behavior?.sourceDisplayMode, welcomeMessage: welcomeMessage, onFeedback: onFeedback }), showSuggestedQuestions && !hasMessages && behavior?.suggestedQuestions && behavior.suggestedQuestions.length > 0 && (jsxRuntimeExports.jsx(SuggestedQuestions, { questions: behavior.suggestedQuestions, onQuestionClick: handleQuestionClick })), jsxRuntimeExports.jsx(MessageInput, { onSend: onSendMessage, placeholder: isLimitReached ? 'Message limit reached' : inputPlaceholder, disabled: isLoading || isLimitReached, enableFileUpload: behavior?.enableFileUpload })] }))] }));
38949
39189
  };
38950
39190
 
38951
- /**
38952
- * Convert shadow size to CSS box-shadow value
38953
- */
38954
- function getShadowValue(size) {
38955
- const shadows = {
38956
- 'none': 'none',
38957
- 'sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
38958
- 'md': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
38959
- 'lg': '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
38960
- 'xl': '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
38961
- '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',
38962
- };
38963
- return shadows[size] || shadows.none;
38964
- }
38965
39191
  /**
38966
39192
  * Apply appearance configuration as CSS custom properties
38967
- * This allows the widget to be fully customizable via the appearance config
39193
+ * Simplified to only handle flat appearance schema
38968
39194
  *
38969
39195
  * @param appearance - Widget appearance configuration
38970
- * @param theme - Current theme ('light' or 'dark')
39196
+ * @param theme - Current theme ('light' or 'dark') - kept for compatibility but not used for theme selection
38971
39197
  */
38972
- function applyAppearanceStyles(appearance, theme = 'light') {
39198
+ function applyAppearanceStyles(appearance) {
38973
39199
  const styles = {};
38974
- // Global font family
38975
- if (appearance.fontFamily) {
38976
- styles.fontFamily = appearance.fontFamily;
38977
- }
38978
- // Select the correct theme configuration
38979
- const themeConfig = theme === 'dark' ? appearance.darkMode : appearance.lightMode;
38980
- // If theme config exists and has required properties, use it
38981
- if (themeConfig && themeConfig.button) {
38982
- // ========================================================================
38983
- // BUTTON APPEARANCE
38984
- // ========================================================================
38985
- const btn = themeConfig.button;
38986
- if (btn.color)
38987
- styles['--button-color'] = btn.color;
38988
- if (btn.opacity !== undefined)
38989
- styles['--button-opacity'] = btn.opacity.toString();
38990
- if (btn.size)
38991
- styles['--button-size'] = `${btn.size}px`;
38992
- if (btn.icon)
38993
- styles['--button-icon'] = btn.icon;
38994
- if (btn.iconColor)
38995
- styles['--button-icon-color'] = btn.iconColor;
38996
- if (btn.borderRadius !== undefined)
38997
- styles['--button-border-radius'] = `${btn.borderRadius}px`;
38998
- if (btn.borderWidth !== undefined)
38999
- styles['--button-border-width'] = `${btn.borderWidth}px`;
39000
- if (btn.borderColor)
39001
- styles['--button-border-color'] = btn.borderColor;
39002
- if (btn.borderOpacity !== undefined)
39003
- styles['--button-border-opacity'] = btn.borderOpacity.toString();
39004
- if (btn.backdropBlur !== undefined)
39005
- styles['--button-backdrop-blur'] = `${btn.backdropBlur}px`;
39006
- if (btn.shadow)
39007
- styles['--button-shadow'] = getShadowValue(btn.shadow);
39008
- // ========================================================================
39009
- // CARD/WINDOW APPEARANCE
39010
- // ========================================================================
39011
- const card = themeConfig.card;
39012
- if (card.backgroundColor)
39013
- styles['--card-background'] = card.backgroundColor;
39014
- if (card.opacity !== undefined)
39015
- styles['--card-opacity'] = card.opacity.toString();
39016
- if (card.borderRadius !== undefined)
39017
- styles['--card-border-radius'] = `${card.borderRadius}px`;
39018
- if (card.borderWidth !== undefined)
39019
- styles['--card-border-width'] = `${card.borderWidth}px`;
39020
- if (card.borderColor) {
39021
- styles['--card-border-color'] = card.borderColor;
39022
- // Create rgba border color with opacity for box-shadow
39023
- if (card.borderOpacity !== undefined) {
39024
- const opacity = card.borderOpacity;
39025
- // Convert hex to rgba
39026
- const hex = card.borderColor.replace('#', '');
39027
- const r = parseInt(hex.substring(0, 2), 16);
39028
- const g = parseInt(hex.substring(2, 4), 16);
39029
- const b = parseInt(hex.substring(4, 6), 16);
39030
- styles['--card-border-color-rgba'] = `rgba(${r}, ${g}, ${b}, ${opacity})`;
39031
- }
39032
- }
39033
- if (card.borderOpacity !== undefined)
39034
- styles['--card-border-opacity'] = card.borderOpacity.toString();
39035
- if (card.backdropBlur !== undefined)
39036
- styles['--card-backdrop-blur'] = `${card.backdropBlur}px`;
39037
- if (card.shadow)
39038
- styles['--card-shadow'] = getShadowValue(card.shadow);
39039
- // ========================================================================
39040
- // HEADER APPEARANCE
39041
- // ========================================================================
39042
- const header = themeConfig.header;
39043
- if (header.backgroundColor)
39044
- styles['--header-background'] = header.backgroundColor;
39045
- if (header.opacity !== undefined)
39046
- styles['--header-opacity'] = header.opacity.toString();
39047
- if (header.textColor)
39048
- styles['--header-text-color'] = header.textColor;
39049
- if (header.borderBottomWidth !== undefined)
39050
- styles['--header-border-bottom-width'] = `${header.borderBottomWidth}px`;
39051
- if (header.borderBottomColor)
39052
- styles['--header-border-bottom-color'] = header.borderBottomColor;
39053
- if (header.borderBottomOpacity !== undefined)
39054
- styles['--header-border-bottom-opacity'] = header.borderBottomOpacity.toString();
39055
- // ========================================================================
39056
- // CHAT APPEARANCE
39057
- // ========================================================================
39058
- const chat = themeConfig.chat;
39059
- if (chat.backgroundColor)
39060
- styles['--chat-background'] = chat.backgroundColor;
39061
- if (chat.opacity !== undefined)
39062
- styles['--chat-opacity'] = chat.opacity.toString();
39063
- // Welcome message
39064
- if (chat.welcomeColor)
39065
- styles['--welcome-color'] = chat.welcomeColor;
39066
- // Message bubbles
39067
- if (chat.enableBubbles) {
39068
- if (chat.bubbleUserColor)
39069
- styles['--bubble-user-color'] = chat.bubbleUserColor;
39070
- if (chat.bubbleUserOpacity !== undefined)
39071
- styles['--bubble-user-opacity'] = chat.bubbleUserOpacity.toString();
39072
- if (chat.bubbleAssistantColor)
39073
- styles['--bubble-assistant-color'] = chat.bubbleAssistantColor;
39074
- if (chat.bubbleAssistantOpacity !== undefined)
39075
- styles['--bubble-assistant-opacity'] = chat.bubbleAssistantOpacity.toString();
39076
- if (chat.bubbleBorderWidth !== undefined)
39077
- styles['--bubble-border-width'] = `${chat.bubbleBorderWidth}px`;
39078
- if (chat.bubbleBorderColor)
39079
- styles['--bubble-border-color'] = chat.bubbleBorderColor;
39080
- if (chat.bubbleBorderOpacity !== undefined)
39081
- styles['--bubble-border-opacity'] = chat.bubbleBorderOpacity.toString();
39082
- }
39083
- else {
39084
- // Plain text mode
39085
- if (chat.textColor)
39086
- styles['--message-text-color'] = chat.textColor;
39087
- }
39088
- // ========================================================================
39089
- // FOOTER APPEARANCE
39090
- // ========================================================================
39091
- const footer = themeConfig.footer;
39092
- // Only if separate from chat
39093
- if (footer.separateFromChat) {
39094
- if (footer.backgroundColor)
39095
- styles['--footer-background'] = footer.backgroundColor;
39096
- if (footer.opacity !== undefined)
39097
- styles['--footer-opacity'] = footer.opacity.toString();
39098
- if (footer.borderTopWidth !== undefined)
39099
- styles['--footer-border-top-width'] = `${footer.borderTopWidth}px`;
39100
- if (footer.borderTopColor)
39101
- styles['--footer-border-top-color'] = footer.borderTopColor;
39102
- if (footer.borderTopOpacity !== undefined)
39103
- styles['--footer-border-top-opacity'] = footer.borderTopOpacity.toString();
39104
- }
39105
- // Backdrop blur (only when floating)
39106
- if (!footer.separateFromChat && footer.backdropBlur !== undefined) {
39107
- styles['--footer-backdrop-blur'] = `${footer.backdropBlur}px`;
39108
- }
39109
- // Input field
39110
- if (footer.inputBackgroundColor)
39111
- styles['--input-background'] = footer.inputBackgroundColor;
39112
- if (footer.inputBackgroundOpacity !== undefined)
39113
- styles['--input-background-opacity'] = footer.inputBackgroundOpacity.toString();
39114
- if (footer.inputBorderRadius !== undefined)
39115
- styles['--input-border-radius'] = `${footer.inputBorderRadius}px`;
39116
- if (footer.inputBorderWidth !== undefined)
39117
- styles['--input-border-width'] = `${footer.inputBorderWidth}px`;
39118
- if (footer.inputBorderColor)
39119
- styles['--input-border-color'] = footer.inputBorderColor;
39120
- if (footer.inputBorderOpacity !== undefined)
39121
- styles['--input-border-opacity'] = footer.inputBorderOpacity.toString();
39122
- if (footer.inputShadow)
39123
- styles['--input-shadow'] = getShadowValue(footer.inputShadow);
39124
- // Send button
39125
- if (footer.buttonBackgroundColor)
39126
- styles['--send-button-background'] = footer.buttonBackgroundColor;
39127
- if (footer.buttonOpacity !== undefined)
39128
- styles['--send-button-opacity'] = footer.buttonOpacity.toString();
39129
- if (footer.buttonBorderRadius !== undefined)
39130
- styles['--send-button-border-radius'] = `${footer.buttonBorderRadius}px`;
39131
- if (footer.buttonBorderWidth !== undefined)
39132
- styles['--send-button-border-width'] = `${footer.buttonBorderWidth}px`;
39133
- if (footer.buttonBorderColor)
39134
- styles['--send-button-border-color'] = footer.buttonBorderColor;
39135
- if (footer.buttonBorderOpacity !== undefined)
39136
- styles['--send-button-border-opacity'] = footer.buttonBorderOpacity.toString();
39137
- // ========================================================================
39138
- // HOVER STATES
39139
- // ========================================================================
39140
- const hover = themeConfig.hover;
39141
- if (hover.buttonScale !== undefined)
39142
- styles['--hover-button-scale'] = hover.buttonScale.toString();
39143
- if (hover.buttonOpacity !== undefined)
39144
- styles['--hover-button-opacity'] = hover.buttonOpacity.toString();
39145
- if (hover.inputBorderColor)
39146
- styles['--hover-input-border-color'] = hover.inputBorderColor;
39147
- if (hover.sendButtonOpacity !== undefined)
39148
- styles['--hover-send-button-opacity'] = hover.sendButtonOpacity.toString();
39149
- if (hover.closeButtonOpacity !== undefined)
39150
- styles['--hover-close-button-opacity'] = hover.closeButtonOpacity.toString();
39151
- // ========================================================================
39152
- // ACTIVE STATES
39153
- // ========================================================================
39154
- const active = themeConfig.active;
39155
- if (active.inputBorderColor)
39156
- styles['--active-input-border-color'] = active.inputBorderColor;
39157
- if (active.inputShadow)
39158
- styles['--active-input-shadow'] = active.inputShadow;
39159
- }
39160
- else {
39161
- // Fallback to legacy fields if no theme config
39162
- if (appearance.primaryColor)
39163
- styles['--primary-color'] = appearance.primaryColor;
39164
- if (appearance.borderRadius !== undefined)
39165
- styles['--border-radius'] = `${appearance.borderRadius}px`;
39166
- // Legacy button
39167
- if (appearance.button) {
39168
- const btn = appearance.button;
39169
- if (btn.color)
39170
- styles['--button-color'] = btn.color;
39171
- if (btn.size)
39172
- styles['--button-size'] = `${btn.size}px`;
39173
- if (btn.borderRadius !== undefined)
39174
- styles['--button-border-radius'] = `${btn.borderRadius}px`;
39175
- if (btn.borderWidth !== undefined)
39176
- styles['--button-border-width'] = `${btn.borderWidth}px`;
39177
- if (btn.borderColor)
39178
- styles['--button-border-color'] = btn.borderColor;
39179
- if (btn.opacity !== undefined)
39180
- styles['--button-opacity'] = btn.opacity.toString();
39181
- }
39200
+ // Apply primary color
39201
+ if (appearance.primaryColor) {
39202
+ styles['--primary-color'] = appearance.primaryColor;
39182
39203
  }
39204
+ // Note: All legacy theme system code (lightMode, darkMode, ThemeAppearanceConfig)
39205
+ // has been removed. The widget now uses a simplified flat appearance schema.
39206
+ // Theme-specific styling is handled by generateThemeStyles() using auto-detected theme.
39183
39207
  return styles;
39184
39208
  }
39185
39209
 
@@ -39541,19 +39565,23 @@
39541
39565
  * Create a MutationObserver to watch for theme changes
39542
39566
  */
39543
39567
  function createThemeObserver(element, callback) {
39568
+ let lastTheme = detectTheme(element);
39544
39569
  const observer = new MutationObserver(() => {
39545
39570
  const theme = detectTheme(element);
39546
- callback(theme);
39571
+ if (theme !== lastTheme) {
39572
+ lastTheme = theme;
39573
+ callback(theme);
39574
+ }
39547
39575
  });
39548
39576
  // Observe body for class/style changes (common for theme switching)
39549
39577
  observer.observe(document.body, {
39550
39578
  attributes: true,
39551
- attributeFilter: ['class', 'style', 'data-theme'],
39579
+ attributeFilter: ['class', 'style', 'data-theme', 'data-bs-theme'],
39552
39580
  });
39553
39581
  // Also observe html element
39554
39582
  observer.observe(document.documentElement, {
39555
39583
  attributes: true,
39556
- attributeFilter: ['class', 'style', 'data-theme'],
39584
+ attributeFilter: ['class', 'style', 'data-theme', 'data-bs-theme'],
39557
39585
  });
39558
39586
  return observer;
39559
39587
  }
@@ -39585,7 +39613,7 @@
39585
39613
  }
39586
39614
  }
39587
39615
 
39588
- var css_248z$1 = ".ai-chat-widget{--primary-color:#07f;--background-color:#fff;--text-color:#1f2937;--border-color:#e5e7eb;--user-message-bg:var(--primary-color);--user-message-text:#fff;--assistant-message-bg:#f3f4f6;--assistant-message-text:#374151;--input-bg:#fff;--input-border:#d1d5db;--shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);--shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--button-color:#07f;--button-size:56px;--button-border-radius:28px;--button-border-width:0px;--button-border-color:#07f;--button-opacity:1;--button-backdrop-blur:0px;--button-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--card-background:#fff;--card-border-radius:16px;--card-border-width:0px;--card-border-color:#e5e7eb;--card-opacity:1;--card-backdrop-blur:0px;--card-shadow:0 25px 50px -12px rgba(0,0,0,.25);--header-background:#07f;--header-text-color:#fff;--header-font-size:18px;--header-border-bottom-width:0px;--header-border-bottom-color:#e5e7eb;--header-opacity:1;--header-backdrop-blur:0px;--chat-background:#fff;--chat-opacity:1;--chat-backdrop-blur:0px;--welcome-font-size:16px;--welcome-color:#1f2937;--welcome-opacity:1;--bubble-user-color:#07f;--bubble-assistant-color:#f3f4f6;--bubble-border-radius:16px;--bubble-border-width:0px;--bubble-border-color:#e5e7eb;--bubble-opacity:1;--typing-animation-color:#f3f4f6;--typing-animation-opacity:1;--typing-animation-border-width:0px;--typing-animation-border-color:#e5e7eb;--typing-animation-border-radius:16px;--footer-background:#fff;--footer-border-top-width:1px;--footer-border-top-color:#e5e7eb;--footer-opacity:1;--footer-backdrop-blur:0px;--input-background:#fff;--input-border-radius:24px;--input-border-width:1.5px;--input-border-color:#d1d5db;--input-opacity:1;--input-shadow:0 1px 2px 0 rgba(0,0,0,.05);--send-button-background:#07f;--send-button-border-radius:20px;--send-button-border-width:0px;--send-button-border-color:#07f;--send-button-opacity:1;--hover-button-scale:1.05;--hover-button-opacity:0.9;--hover-input-border-color:#9ca3af;--hover-send-button-opacity:0.85;--hover-close-button-opacity:1;--active-input-border-color:#07f;--active-input-shadow:0 0 0 3px rgba(0,119,255,.1);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.ai-chat-widget.dark{--background-color:#001d3d;--text-color:#f9fafb;--border-color:#374151;--assistant-message-bg:#036;--assistant-message-text:#e5e7eb;--input-bg:#002855;--input-border:#374151}.ai-chat-widget.dark .ai-chat-message.system .ai-chat-message-content{background-color:#78350f;color:#fef3c7}.ai-chat-widget.dark .ai-chat-message.tool .ai-chat-message-content{background-color:#1e3a8a;color:#dbeafe}.ai-chat-widget-container{font-size:14px;line-height:1.5;position:fixed;z-index:9999}.ai-chat-widget-container.bottom-right{bottom:20px;right:20px}.ai-chat-widget-container.bottom-left{bottom:20px;left:20px}.ai-chat-widget-container.top-right{right:20px;top:20px}.ai-chat-widget-container.top-left{left:20px;top:20px}.ai-chat-button{align-items:center;backdrop-filter:blur(var(--button-backdrop-blur));-webkit-backdrop-filter:blur(var(--button-backdrop-blur));background-color:var(--button-color);border:var(--button-border-width) solid var(--button-border-color);border-radius:var(--button-border-radius);box-shadow:var(--button-shadow);color:#fff;cursor:pointer;display:flex;height:var(--button-size);justify-content:center;opacity:var(--button-opacity);transition:all .3s cubic-bezier(.4,0,.2,1);width:var(--button-size)}.ai-chat-button:hover{opacity:.9}.ai-chat-button:active{opacity:.8}.ai-chat-button-svg{height:50%;min-height:24px;min-width:24px;width:50%}.ai-chat-button-icon{font-size:1.5em;line-height:1}.ai-chat-window{border-radius:var(--card-border-radius);box-shadow:0 0 0 var(--card-border-width) var(--card-border-color-rgba,var(--card-border-color)),var(--card-shadow);display:flex;flex-direction:column;overflow:hidden;position:absolute}.ai-chat-window>*{position:relative;z-index:1}.ai-chat-window:before{backdrop-filter:blur(var(--card-backdrop-blur));-webkit-backdrop-filter:blur(var(--card-backdrop-blur));background-color:var(--card-background);border-radius:var(--card-border-radius);content:\"\";inset:0;opacity:var(--card-opacity);pointer-events:none;position:absolute;z-index:0}.ai-chat-widget-container.bottom-right .ai-chat-window{bottom:calc(var(--button-size, 60px) + 16px);right:0}.ai-chat-widget-container.bottom-left .ai-chat-window{bottom:calc(var(--button-size, 60px) + 16px);left:0}.ai-chat-widget-container.top-right .ai-chat-window{right:0;top:calc(var(--button-size, 60px) + 16px)}.ai-chat-widget-container.top-left .ai-chat-window{left:0;top:calc(var(--button-size, 60px) + 16px)}.ai-chat-button{z-index:1}.ai-chat-window{z-index:2}.ai-chat-window.size-small{height:500px;width:380px}.ai-chat-window.size-medium{height:650px;width:440px}.ai-chat-window.size-large{height:750px;width:520px}.ai-chat-logo{border-radius:50%;height:32px;object-fit:cover;width:32px}.ai-chat-messages::-webkit-scrollbar{width:6px}.ai-chat-messages::-webkit-scrollbar-track{background:transparent}.ai-chat-messages::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:3px}.ai-chat-messages::-webkit-scrollbar-thumb:hover{background:var(--input-border)}.ai-chat-message{display:flex;flex-direction:column;gap:4px}.ai-chat-message.user{align-items:flex-end}.ai-chat-message.assistant{align-items:flex-start}.ai-chat-message.system{align-items:center}.ai-chat-message.tool{align-items:flex-start}.ai-chat-message-content{word-wrap:break-word;border:var(--bubble-border-width) solid var(--bubble-border-color);border-radius:var(--bubble-border-radius);font-size:15px;line-height:1.6;max-width:80%;opacity:var(--bubble-opacity);padding:12px 16px}.ai-chat-message.user .ai-chat-message-content{background-color:var(--bubble-user-color);border-bottom-right-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.1);color:var(--user-message-text)}.ai-chat-message.assistant .ai-chat-message-content{background-color:var(--bubble-assistant-color,#f3f4f6);border:1px solid var(--bubble-border-color,rgba(0,0,0,.08));border-radius:var(--bubble-border-radius,16px);border-bottom-left-radius:4px;box-shadow:none;color:var(--assistant-message-text);max-width:85%;padding:12px 16px}.ai-chat-message.assistant .ai-chat-message-content p{margin:0 0 12px}.ai-chat-message.assistant .ai-chat-message-content p:last-child{margin-bottom:0}.ai-chat-message.assistant .ai-chat-message-content ol,.ai-chat-message.assistant .ai-chat-message-content ul{margin:8px 0 12px;padding-left:24px}.ai-chat-message.assistant .ai-chat-message-content li{line-height:1.5;margin:6px 0}.ai-chat-message.assistant .ai-chat-message-content li::marker{color:var(--primary-color,#07f)}.ai-chat-message.assistant .ai-chat-message-content ol li::marker{font-weight:600}.ai-chat-message.assistant .ai-chat-message-content strong{font-weight:600}.ai-chat-message.assistant .ai-chat-message-content em{font-style:italic}.ai-chat-message.assistant .ai-chat-message-content code{background-color:rgba(0,0,0,.06);border-radius:4px;font-family:SF Mono,Consolas,Monaco,monospace;font-size:.9em;padding:2px 6px}.ai-chat-widget.dark .ai-chat-message.assistant .ai-chat-message-content code{background-color:hsla(0,0%,100%,.1)}.ai-chat-message.assistant .ai-chat-message-content pre{background-color:rgba(0,0,0,.06);border-radius:8px;margin:8px 0 12px;overflow-x:auto;padding:12px}.ai-chat-widget.dark .ai-chat-message.assistant .ai-chat-message-content pre{background-color:hsla(0,0%,100%,.08)}.ai-chat-message.assistant .ai-chat-message-content pre code{background-color:transparent;border-radius:0;padding:0}.ai-chat-message.assistant .ai-chat-message-content blockquote{border-left:3px solid var(--primary-color,#07f);color:var(--text-muted,#6b7280);margin:8px 0 12px;padding:4px 0 4px 12px}.ai-chat-message.assistant .ai-chat-message-content a{color:var(--primary-color,#07f);text-decoration:underline}.ai-chat-message.assistant .ai-chat-message-content a:hover{opacity:.8}.ai-chat-message.assistant .ai-chat-message-content h1,.ai-chat-message.assistant .ai-chat-message-content h2,.ai-chat-message.assistant .ai-chat-message-content h3,.ai-chat-message.assistant .ai-chat-message-content h4,.ai-chat-message.assistant .ai-chat-message-content h5,.ai-chat-message.assistant .ai-chat-message-content h6{font-weight:600;line-height:1.3;margin:16px 0 8px}.ai-chat-message.assistant .ai-chat-message-content h1:first-child,.ai-chat-message.assistant .ai-chat-message-content h2:first-child,.ai-chat-message.assistant .ai-chat-message-content h3:first-child{margin-top:0}.ai-chat-message.assistant .ai-chat-message-content hr{border:none;border-top:1px solid var(--border-color,#e5e7eb);margin:12px 0}.ai-chat-message.system .ai-chat-message-content{background-color:#fef3c7;border-radius:8px;color:#92400e;font-size:12px;font-style:italic;max-width:90%;text-align:center}.ai-chat-message.tool .ai-chat-message-content{background-color:#dbeafe;border-bottom-left-radius:4px;color:#1e40af;font-family:Courier New,monospace;font-size:13px}.ai-chat-tool-indicators{display:flex;gap:6px;margin-top:6px}.tool-indicator{align-items:center;background:#dbeafe;border-radius:50%;color:#1e40af;display:inline-flex;height:18px;justify-content:center;overflow:hidden;position:relative;width:18px}.tool-indicator .icon{font-size:12px;line-height:1;z-index:1}.tool-indicator.started:after{animation:ai-spin 1s linear infinite;border:2px solid rgba(30,64,175,.25);border-radius:50%;border-top-color:#1e40af;content:\"\";inset:0;position:absolute}@keyframes ai-spin{to{transform:rotate(1turn)}}.ai-chat-tool-message{align-items:center;background:rgba(16,185,129,.1);border:1px solid rgba(16,185,129,.2);border-radius:20px;color:#059669;display:inline-flex;gap:8px;padding:8px 14px}.ai-chat-widget.dark .ai-chat-tool-message{background:rgba(16,185,129,.15);border-color:rgba(16,185,129,.25);color:#34d399}.tool-finished{align-items:center;display:inline-flex;font-size:14px;justify-content:center}.tool-finished .tool-icon{display:none}.tool-finished .tool-check{font-size:14px;font-weight:700}.tool-name{font-size:13px;font-weight:500}.ai-chat-message-timestamp{color:rgba(0,0,0,.6);filter:invert(1) grayscale(1) contrast(1.2);mix-blend-mode:difference;padding:0 4px}.ai-chat-welcome{align-items:center;color:var(--welcome-color);display:flex;flex-direction:column;justify-content:center;min-height:200px;opacity:var(--welcome-opacity);padding:60px 32px 40px;text-align:center}.ai-chat-welcome-title{color:var(--primary-color);font-size:28px;font-weight:700;letter-spacing:-.03em;margin-bottom:12px}.ai-chat-welcome-text{color:var(--assistant-message-text);font-size:16px;line-height:1.6;max-width:280px;opacity:.7}.ai-chat-typing{align-items:center;background-color:var(--assistant-message-bg);border-radius:12px;border-bottom-left-radius:4px;display:flex;gap:4px;max-width:80px;padding:10px 14px}.ai-chat-typing-dot{animation:typingBounce 1.4s infinite;background-color:#9ca3af;border-radius:50%;height:8px;width:8px}.ai-chat-typing-dot:nth-child(2){animation-delay:.2s}.ai-chat-typing-dot:nth-child(3){animation-delay:.4s}@keyframes typingBounce{0%,60%,to{transform:translateY(0)}30%{transform:translateY(-8px)}}.ai-chat-file-button{align-items:center;background:none;border:none;border-radius:6px;color:var(--text-color);cursor:pointer;display:flex;justify-content:center;padding:8px;transition:background-color .2s}.ai-chat-file-button:hover:not(:disabled){background-color:rgba(0,0,0,.05)}.ai-chat-file-button:disabled{cursor:not-allowed;opacity:.5}.ai-chat-file-list{display:flex;flex-wrap:wrap;gap:8px;padding:8px 12px}.ai-chat-file-item{align-items:center;background-color:rgba(0,0,0,.05);border-radius:6px;display:flex;font-size:12px;gap:8px;padding:6px 10px}.ai-chat-file-extension{background-color:var(--primary-color);border-radius:3px;color:#fff;display:inline-block;font-size:10px;font-weight:600;min-width:40px;padding:2px 6px;text-align:center;text-transform:uppercase}.ai-chat-file-info{display:flex;flex:1;flex-direction:column;gap:2px;min-width:0}.ai-chat-file-name{font-weight:500;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-chat-file-size{color:var(--text-muted);font-size:10px;opacity:.7}.ai-chat-file-remove{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:flex;justify-content:center;opacity:.5;padding:4px;transition:opacity .15s ease}.ai-chat-file-remove:hover{opacity:1}.ai-chat-message-attachments{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}.ai-chat-message-attachment{align-items:center;background-color:rgba(0,0,0,.08);border-radius:4px;display:inline-flex;font-size:11px;gap:4px;padding:3px 8px}.ai-chat-attachment-icon{font-size:12px}.ai-chat-attachment-ext{background-color:var(--primary-color);border-radius:2px;color:#fff;display:inline-block;font-size:9px;font-weight:600;padding:1px 4px;text-transform:uppercase}.ai-chat-attachment-name{max-width:120px;opacity:.8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-chat-sources{background-color:rgba(0,0,0,.02);border-radius:6px;font-size:12px;margin-top:8px;overflow:hidden}.ai-chat-sources-toggle{align-items:center;background:none;border:none;cursor:pointer;display:flex;gap:6px;padding:8px 10px;text-align:left;transition:background-color .2s;width:100%}.ai-chat-sources-toggle:hover{background-color:rgba(0,0,0,.03)}.ai-chat-sources-icon{color:var(--text-muted);font-size:10px;transition:transform .2s}.ai-chat-sources-title{color:var(--text-color);flex:1;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase}.ai-chat-source-item{border-top:1px solid rgba(0,0,0,.05);color:#6b7280;display:flex;gap:8px;padding:8px 10px}.ai-chat-source-item:last-child{border-bottom:none}.ai-chat-source-number{color:var(--primary-color);flex-shrink:0;font-weight:600}.ai-chat-source-details{display:flex;flex:1;flex-direction:column;gap:4px}.ai-chat-source-score{color:#9ca3af;font-size:11px}.ai-chat-source-content{color:#6b7280;font-size:11px;font-style:italic;line-height:1.4}.ai-chat-source-metadata{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px}.ai-chat-source-meta-item{background-color:rgba(0,0,0,.05);border-radius:3px;color:#6b7280;font-size:10px;padding:2px 6px}.ai-chat-message-meta{align-items:center;display:inline-flex;gap:6px;height:20px}.ai-chat-message-timestamp{color:#71717a;font-size:11px;line-height:1}.ai-chat-feedback{gap:0}.ai-chat-feedback,.ai-chat-feedback-button{align-items:center;display:inline-flex;height:20px}.ai-chat-feedback-button{background:none!important;border:none;border-radius:0;color:#71717a;cursor:pointer;justify-content:center;padding:0 4px;transition:color .15s ease}.ai-chat-feedback-button:hover:not(:disabled){background:none!important;color:#52525b}.ai-chat-feedback-button:active:not(:disabled){opacity:.7}.ai-chat-feedback-button:disabled{cursor:not-allowed;opacity:.4}.ai-chat-feedback-button.active{background:none!important;color:var(--primary-color,#07f)}.ai-chat-feedback-submitted{align-items:center;animation:feedbackMorph .3s cubic-bezier(.34,1.56,.64,1);display:flex;gap:6px}.ai-chat-feedback-checkmark{animation:checkmarkPop .3s cubic-bezier(.34,1.56,.64,1);color:#10b981;font-size:16px;font-weight:700}.ai-chat-feedback-text{animation:textSlideIn .3s ease;color:#10b981;font-size:13px;font-weight:500}@keyframes feedbackMorph{0%{opacity:.5;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes checkmarkPop{0%{opacity:0;transform:scale(0) rotate(-45deg)}50%{transform:scale(1.3) rotate(0deg)}to{opacity:1;transform:scale(1) rotate(0deg)}}@keyframes textSlideIn{0%{opacity:0;transform:translateX(-10px)}to{opacity:1;transform:translateX(0)}}.ai-chat-error{align-items:flex-start;background-color:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.2);border-radius:12px;color:#ef4444;display:flex;font-size:14px;font-weight:500;gap:10px;line-height:1.5;margin:8px 16px;padding:12px 16px}.ai-chat-widget.dark .ai-chat-error{background-color:rgba(239,68,68,.15);border-color:rgba(239,68,68,.25);color:#fca5a5}.ai-chat-error:before{align-items:center;background:rgba(239,68,68,.2);border-radius:50%;content:\"⚠\";display:flex;flex-shrink:0;font-size:14px;font-weight:700;height:20px;justify-content:center;width:20px}.ai-chat-widget.dark .ai-chat-error:before{background:rgba(239,68,68,.25)}.ai-chat-warning{background-color:rgba(245,158,11,.1);border:1px solid rgba(245,158,11,.2);border-radius:12px;color:#d97706;font-size:13px;margin:8px 16px;padding:12px 16px}.ai-chat-widget.dark .ai-chat-warning{background-color:rgba(245,158,11,.15);border-color:rgba(245,158,11,.25);color:#fbbf24}.ai-chat-suggested-questions{bottom:80px;left:0;padding:0 20px 16px;position:absolute;right:0;z-index:5}.ai-chat-suggested-questions-list{display:flex;flex-direction:column;gap:8px}.ai-chat-suggested-question{align-items:center;background:#fff;border:1px solid rgba(0,0,0,.08);border-radius:14px;box-shadow:0 1px 3px rgba(0,0,0,.04);color:#374151;cursor:pointer;display:flex;font-size:14px;font-weight:500;gap:12px;justify-content:space-between;padding:14px 16px;text-align:left;transition:all .15s ease;width:100%}.ai-chat-suggested-question:hover{background:#f9fafb;border-color:rgba(0,0,0,.12);box-shadow:0 2px 8px rgba(0,0,0,.06)}.ai-chat-suggested-question:active{transform:scale(.98)}.ai-chat-suggested-question-text{flex:1;line-height:1.4}.ai-chat-suggested-question-icon{color:var(--primary-color,#07f);flex-shrink:0;opacity:.7;transition:transform .15s ease,opacity .15s ease}.ai-chat-suggested-question:hover .ai-chat-suggested-question-icon{opacity:1;transform:translateX(3px)}@media (max-width:480px){.ai-chat-window{border-radius:0!important;bottom:0!important;height:100%!important;left:0!important;position:fixed!important;right:0!important;top:0!important;width:100%!important}.ai-chat-widget-container{bottom:20px!important;right:20px!important}.ai-chat-suggested-question{font-size:13px;padding:9px 10px}}.ai-chat-action-approval{background:linear-gradient(135deg,#07f,#001d3d);border-radius:16px;box-shadow:0 4px 12px rgba(0,119,255,.3);color:#fff;margin:16px;padding:16px}.ai-chat-action-approval-content{align-items:flex-start;display:flex;gap:12px;margin-bottom:16px}.ai-chat-action-approval-icon{align-items:center;background:hsla(0,0%,100%,.2);border-radius:8px;display:flex;flex-shrink:0;height:40px;justify-content:center;width:40px}.ai-chat-action-approval-text{flex:1}.ai-chat-action-approval-title{font-size:15px;font-weight:600;margin-bottom:4px}.ai-chat-action-approval-description{font-size:13px;line-height:1.4;opacity:.95}.ai-chat-action-approval-buttons{display:flex;gap:8px;justify-content:flex-end}.ai-chat-action-button{align-items:center;border:none;border-radius:8px;cursor:pointer;display:flex;font-family:inherit;font-size:14px;font-weight:500;gap:6px;padding:8px 16px;transition:all .2s ease}.ai-chat-action-button:disabled{cursor:not-allowed;opacity:.6}.ai-chat-action-button-reject{background:hsla(0,0%,100%,.2);color:#fff}.ai-chat-action-button-reject:hover:not(:disabled){background:hsla(0,0%,100%,.3)}.ai-chat-action-button-approve{background:#fff;color:#07f}.ai-chat-action-button-approve:hover:not(:disabled){background:#f0f0f0;box-shadow:0 2px 8px rgba(0,0,0,.15);transform:translateY(-1px)}.ai-chat-action-spinner{animation:ai-chat-spin .6s linear infinite;border:2px solid rgba(0,119,255,.3);border-radius:50%;border-top-color:#07f;display:inline-block;height:14px;width:14px}@keyframes ai-chat-spin{to{transform:rotate(1turn)}}";
39616
+ var css_248z$1 = ".ai-chat-widget{--primary-color:#07f;--background-color:#fff;--text-color:#1f2937;--border-color:#e5e7eb;--user-message-bg:var(--primary-color);--user-message-text:#fff;--assistant-message-bg:#f3f4f6;--assistant-message-text:#374151;--input-bg:#fff;--input-border:#d1d5db;--shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);--shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--button-color:#07f;--button-size:56px;--button-border-radius:28px;--button-border-width:0px;--button-border-color:#07f;--button-opacity:1;--button-backdrop-blur:0px;--button-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--card-background:#fff;--card-border-radius:16px;--card-border-width:0px;--card-border-color:#e5e7eb;--card-opacity:1;--card-backdrop-blur:0px;--card-shadow:0 25px 50px -12px rgba(0,0,0,.25);--header-background:#07f;--header-text-color:#fff;--header-font-size:18px;--header-border-bottom-width:0px;--header-border-bottom-color:#e5e7eb;--header-opacity:1;--header-backdrop-blur:0px;--chat-background:#fff;--chat-opacity:1;--chat-backdrop-blur:0px;--welcome-font-size:16px;--welcome-color:#1f2937;--welcome-opacity:1;--bubble-user-color:#07f;--bubble-assistant-color:#f3f4f6;--bubble-border-radius:16px;--bubble-border-width:0px;--bubble-border-color:#e5e7eb;--bubble-opacity:1;--typing-animation-color:#f3f4f6;--typing-animation-opacity:1;--typing-animation-border-width:0px;--typing-animation-border-color:#e5e7eb;--typing-animation-border-radius:16px;--footer-background:#fff;--footer-border-top-width:1px;--footer-border-top-color:#e5e7eb;--footer-opacity:1;--footer-backdrop-blur:0px;--input-background:#fff;--input-border-radius:24px;--input-border-width:1.5px;--input-border-color:#d1d5db;--input-opacity:1;--input-shadow:0 1px 2px 0 rgba(0,0,0,.05);--send-button-background:#07f;--send-button-border-radius:20px;--send-button-border-width:0px;--send-button-border-color:#07f;--send-button-opacity:1;--hover-button-scale:1.05;--hover-button-opacity:0.9;--hover-input-border-color:#9ca3af;--hover-send-button-opacity:0.85;--hover-close-button-opacity:1;--active-input-border-color:#07f;--active-input-shadow:0 0 0 3px rgba(0,119,255,.1);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.ai-chat-widget.dark{--background-color:#001d3d;--text-color:#f9fafb;--border-color:#374151;--assistant-message-bg:#036;--assistant-message-text:#e5e7eb;--input-bg:#002855;--input-border:#374151}.ai-chat-widget.dark .ai-chat-message.system .ai-chat-message-content{background-color:#78350f;color:#fef3c7}.ai-chat-widget.dark .ai-chat-message.tool .ai-chat-message-content{background-color:#1e3a8a;color:#dbeafe}.ai-chat-widget-container{font-size:14px;line-height:1.5;position:fixed;z-index:9999}.ai-chat-widget-container.bottom-right{bottom:20px;right:20px}.ai-chat-widget-container.bottom-left{bottom:20px;left:20px}.ai-chat-widget-container.top-right{right:20px;top:20px}.ai-chat-widget-container.top-left{left:20px;top:20px}.ai-chat-button{align-items:center;backdrop-filter:blur(var(--button-backdrop-blur));-webkit-backdrop-filter:blur(var(--button-backdrop-blur));background-color:var(--button-color);border:var(--button-border-width) solid var(--button-border-color);border-radius:var(--button-border-radius);box-shadow:var(--button-shadow);color:#fff;cursor:pointer;display:flex;height:var(--button-size);justify-content:center;opacity:var(--button-opacity);transition:all .3s cubic-bezier(.4,0,.2,1);width:var(--button-size)}.ai-chat-button:hover{opacity:.9}.ai-chat-button:active{opacity:.8}.ai-chat-button-svg{height:50%;min-height:24px;min-width:24px;width:50%}.ai-chat-button-icon{font-size:1.5em;line-height:1}.ai-chat-window{border-radius:var(--card-border-radius);box-shadow:0 0 0 var(--card-border-width) var(--card-border-color-rgba,var(--card-border-color)),var(--card-shadow);display:flex;flex-direction:column;overflow:hidden;position:absolute}.ai-chat-window>*{position:relative;z-index:1}.ai-chat-window:before{backdrop-filter:blur(var(--card-backdrop-blur));-webkit-backdrop-filter:blur(var(--card-backdrop-blur));background-color:var(--card-background);border-radius:var(--card-border-radius);content:\"\";inset:0;opacity:var(--card-opacity);pointer-events:none;position:absolute;z-index:0}.ai-chat-widget-container.bottom-right .ai-chat-window{bottom:calc(var(--button-size, 60px) + 16px);right:0}.ai-chat-widget-container.bottom-left .ai-chat-window{bottom:calc(var(--button-size, 60px) + 16px);left:0}.ai-chat-widget-container.top-right .ai-chat-window{right:0;top:calc(var(--button-size, 60px) + 16px)}.ai-chat-widget-container.top-left .ai-chat-window{left:0;top:calc(var(--button-size, 60px) + 16px)}.ai-chat-button{z-index:1}.ai-chat-window{z-index:2}.ai-chat-window.size-small{height:500px;width:380px}.ai-chat-window.size-medium{height:650px;width:440px}.ai-chat-window.size-large{height:750px;width:520px}.ai-chat-logo{border-radius:50%;height:32px;object-fit:cover;width:32px}.ai-chat-messages::-webkit-scrollbar{width:6px}.ai-chat-messages::-webkit-scrollbar-track{background:transparent}.ai-chat-messages::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:3px}.ai-chat-messages::-webkit-scrollbar-thumb:hover{background:var(--input-border)}.ai-chat-message{display:flex;flex-direction:column;gap:4px}.ai-chat-message.user{align-items:flex-end}.ai-chat-message.assistant{align-items:flex-start}.ai-chat-message.system{align-items:center}.ai-chat-message.tool{align-items:flex-start}.ai-chat-message-content{word-wrap:break-word;border:var(--bubble-border-width) solid var(--bubble-border-color);border-radius:var(--bubble-border-radius);font-size:15px;line-height:1.6;max-width:80%;opacity:var(--bubble-opacity);padding:12px 16px}.ai-chat-message.user .ai-chat-message-content{background-color:var(--bubble-user-color);border-bottom-right-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.1);color:var(--user-message-text)}.ai-chat-message.assistant .ai-chat-message-content{background-color:var(--bubble-assistant-color,#f3f4f6);border:1px solid var(--bubble-border-color,rgba(0,0,0,.08));border-radius:var(--bubble-border-radius,16px);border-bottom-left-radius:4px;box-shadow:none;color:var(--assistant-message-text);max-width:85%;padding:12px 16px}.ai-chat-message.assistant .ai-chat-message-content p{margin:0 0 12px}.ai-chat-message.assistant .ai-chat-message-content p:last-child{margin-bottom:0}.ai-chat-message.assistant .ai-chat-message-content ol,.ai-chat-message.assistant .ai-chat-message-content ul{margin:8px 0 12px;padding-left:24px}.ai-chat-message.assistant .ai-chat-message-content li{line-height:1.5;margin:6px 0}.ai-chat-message.assistant .ai-chat-message-content li::marker{color:var(--primary-color,#07f)}.ai-chat-message.assistant .ai-chat-message-content ol li::marker{font-weight:600}.ai-chat-message.assistant .ai-chat-message-content strong{font-weight:600}.ai-chat-message.assistant .ai-chat-message-content em{font-style:italic}.ai-chat-message.assistant .ai-chat-message-content code{background-color:rgba(0,0,0,.06);border-radius:4px;font-family:SF Mono,Consolas,Monaco,monospace;font-size:.9em;padding:2px 6px}.ai-chat-widget.dark .ai-chat-message.assistant .ai-chat-message-content code{background-color:hsla(0,0%,100%,.1)}.ai-chat-message.assistant .ai-chat-message-content pre{background-color:rgba(0,0,0,.06);border-radius:8px;margin:8px 0 12px;overflow-x:auto;padding:12px}.ai-chat-widget.dark .ai-chat-message.assistant .ai-chat-message-content pre{background-color:hsla(0,0%,100%,.08)}.ai-chat-message.assistant .ai-chat-message-content pre code{background-color:transparent;border-radius:0;padding:0}.ai-chat-message.assistant .ai-chat-message-content blockquote{border-left:3px solid var(--primary-color,#07f);color:var(--text-muted,#6b7280);margin:8px 0 12px;padding:4px 0 4px 12px}.ai-chat-message.assistant .ai-chat-message-content a{color:var(--primary-color,#07f);text-decoration:underline}.ai-chat-message.assistant .ai-chat-message-content a:hover{opacity:.8}.ai-chat-message.assistant .ai-chat-message-content h1,.ai-chat-message.assistant .ai-chat-message-content h2,.ai-chat-message.assistant .ai-chat-message-content h3,.ai-chat-message.assistant .ai-chat-message-content h4,.ai-chat-message.assistant .ai-chat-message-content h5,.ai-chat-message.assistant .ai-chat-message-content h6{font-weight:600;line-height:1.3;margin:16px 0 8px}.ai-chat-message.assistant .ai-chat-message-content h1:first-child,.ai-chat-message.assistant .ai-chat-message-content h2:first-child,.ai-chat-message.assistant .ai-chat-message-content h3:first-child{margin-top:0}.ai-chat-message.assistant .ai-chat-message-content hr{border:none;border-top:1px solid var(--border-color,#e5e7eb);margin:12px 0}.ai-chat-message.system .ai-chat-message-content{background-color:#fef3c7;border-radius:8px;color:#92400e;font-size:12px;font-style:italic;max-width:90%;text-align:center}.ai-chat-message.tool .ai-chat-message-content{background-color:#dbeafe;border-bottom-left-radius:4px;color:#1e40af;font-family:Courier New,monospace;font-size:13px}.ai-chat-tool-indicators{display:flex;gap:6px;margin-top:6px}.tool-indicator{align-items:center;background:#dbeafe;border-radius:50%;color:#1e40af;display:inline-flex;height:18px;justify-content:center;overflow:hidden;position:relative;width:18px}.tool-indicator .icon{font-size:12px;line-height:1;z-index:1}.tool-indicator.started:after{animation:ai-spin 1s linear infinite;border:2px solid rgba(30,64,175,.25);border-radius:50%;border-top-color:#1e40af;content:\"\";inset:0;position:absolute}@keyframes ai-spin{to{transform:rotate(1turn)}}.ai-chat-tool-message{align-items:center;background:rgba(16,185,129,.1);border:1px solid rgba(16,185,129,.2);border-radius:20px;color:#059669;display:inline-flex;gap:8px;padding:8px 14px}.ai-chat-widget.dark .ai-chat-tool-message{background:rgba(16,185,129,.15);border-color:rgba(16,185,129,.25);color:#34d399}.tool-finished{align-items:center;display:inline-flex;font-size:14px;justify-content:center}.tool-finished .tool-icon{display:none}.tool-finished .tool-check{font-size:14px;font-weight:700}.tool-name{font-size:13px;font-weight:500}.ai-chat-message-timestamp{color:rgba(0,0,0,.6);filter:invert(1) grayscale(1) contrast(1.2);mix-blend-mode:difference;padding:0 4px}.ai-chat-welcome{align-items:center;color:var(--welcome-color);display:flex;flex-direction:column;justify-content:center;min-height:200px;opacity:var(--welcome-opacity);padding:60px 32px 40px;text-align:center}.ai-chat-welcome-title{color:var(--primary-color);font-size:28px;font-weight:700;letter-spacing:-.03em;margin-bottom:12px}.ai-chat-welcome-text{color:var(--assistant-message-text);font-size:16px;line-height:1.6;max-width:280px;opacity:.7}.ai-chat-typing{align-items:center;background-color:var(--assistant-message-bg);border-radius:12px;border-bottom-left-radius:4px;display:flex;gap:4px;max-width:80px;padding:10px 14px}.ai-chat-typing-dot{animation:typingBounce 1.4s infinite;background-color:#9ca3af;border-radius:50%;height:8px;width:8px}.ai-chat-typing-dot:nth-child(2){animation-delay:.2s}.ai-chat-typing-dot:nth-child(3){animation-delay:.4s}@keyframes typingBounce{0%,60%,to{transform:translateY(0)}30%{transform:translateY(-8px)}}.ai-chat-file-button{align-items:center;background:none;border:none;border-radius:6px;color:var(--text-color);cursor:pointer;display:flex;justify-content:center;padding:8px;transition:background-color .2s}.ai-chat-file-button:hover:not(:disabled){background-color:rgba(0,0,0,.05)}.ai-chat-file-button:disabled{cursor:not-allowed;opacity:.5}.ai-chat-file-list{display:flex;flex-wrap:wrap;gap:8px;padding:8px 12px}.ai-chat-file-item{align-items:center;background-color:rgba(0,0,0,.05);border-radius:6px;display:flex;font-size:12px;gap:8px;padding:6px 10px}.ai-chat-file-extension{background-color:var(--primary-color);border-radius:3px;color:#fff;display:inline-block;font-size:10px;font-weight:600;min-width:40px;padding:2px 6px;text-align:center;text-transform:uppercase}.ai-chat-file-info{display:flex;flex:1;flex-direction:column;gap:2px;min-width:0}.ai-chat-file-name{font-weight:500;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-chat-file-size{color:var(--text-muted);font-size:10px;opacity:.7}.ai-chat-file-remove{align-items:center;background:none;border:none;color:inherit;cursor:pointer;display:flex;justify-content:center;opacity:.5;padding:4px;transition:opacity .15s ease}.ai-chat-file-remove:hover{opacity:1}.ai-chat-message-attachments{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}.ai-chat-message-attachment{align-items:center;background-color:rgba(0,0,0,.08);border-radius:4px;display:inline-flex;font-size:11px;gap:4px;padding:3px 8px}.ai-chat-attachment-icon{font-size:12px}.ai-chat-attachment-ext{background-color:var(--primary-color);border-radius:2px;color:#fff;display:inline-block;font-size:9px;font-weight:600;padding:1px 4px;text-transform:uppercase}.ai-chat-attachment-name{max-width:120px;opacity:.8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-chat-sources{background-color:rgba(0,0,0,.02);border-radius:6px;font-size:12px;margin-top:8px;overflow:hidden}.ai-chat-sources-toggle{align-items:center;background:none;border:none;cursor:pointer;display:flex;gap:6px;padding:8px 10px;text-align:left;transition:background-color .2s;width:100%}.ai-chat-sources-toggle:hover{background-color:rgba(0,0,0,.03)}.ai-chat-sources-icon{color:var(--text-muted);font-size:10px;transition:transform .2s}.ai-chat-sources-title{color:var(--text-color);flex:1;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase}.ai-chat-source-item{border-top:1px solid rgba(0,0,0,.05);color:#6b7280;display:flex;gap:8px;padding:8px 10px}.ai-chat-source-item:last-child{border-bottom:none}.ai-chat-source-number{color:var(--primary-color);flex-shrink:0;font-weight:600}.ai-chat-source-details{display:flex;flex:1;flex-direction:column;gap:4px}.ai-chat-source-score{color:#9ca3af;font-size:11px}.ai-chat-source-content{color:#6b7280;font-size:11px;font-style:italic;line-height:1.4}.ai-chat-source-metadata{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px}.ai-chat-source-meta-item{background-color:rgba(0,0,0,.05);border-radius:3px;color:#6b7280;font-size:10px;padding:2px 6px}.ai-chat-message-meta{align-items:center;display:inline-flex;gap:6px;height:20px}.ai-chat-message-timestamp{color:#71717a;font-size:11px;line-height:1}.ai-chat-feedback{gap:0}.ai-chat-feedback,.ai-chat-feedback-button{align-items:center;display:inline-flex;height:20px}.ai-chat-feedback-button{background:none!important;border:none;border-radius:0;color:#71717a;cursor:pointer;justify-content:center;padding:0 4px;transition:color .15s ease}.ai-chat-feedback-button:hover:not(:disabled){background:none!important;color:#52525b}.ai-chat-feedback-button:active:not(:disabled){opacity:.7}.ai-chat-feedback-button:disabled{cursor:not-allowed;opacity:.4}.ai-chat-feedback-button.active{background:none!important;color:var(--primary-color,#07f)}.ai-chat-feedback-submitted{align-items:center;animation:feedbackMorph .3s cubic-bezier(.34,1.56,.64,1);display:flex;gap:6px}.ai-chat-feedback-checkmark{animation:checkmarkPop .3s cubic-bezier(.34,1.56,.64,1);color:#10b981;font-size:16px;font-weight:700}.ai-chat-feedback-text{animation:textSlideIn .3s ease;color:#10b981;font-size:13px;font-weight:500}@keyframes feedbackMorph{0%{opacity:.5;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes checkmarkPop{0%{opacity:0;transform:scale(0) rotate(-45deg)}50%{transform:scale(1.3) rotate(0deg)}to{opacity:1;transform:scale(1) rotate(0deg)}}@keyframes textSlideIn{0%{opacity:0;transform:translateX(-10px)}to{opacity:1;transform:translateX(0)}}.ai-chat-error{align-items:flex-start;background-color:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.2);border-radius:12px;color:#ef4444;display:flex;font-size:14px;font-weight:500;gap:10px;line-height:1.5;margin:8px 16px;padding:12px 16px}.ai-chat-widget.dark .ai-chat-error{background-color:rgba(239,68,68,.15);border-color:rgba(239,68,68,.25);color:#fca5a5}.ai-chat-error:before{align-items:center;background:rgba(239,68,68,.2);border-radius:50%;content:\"⚠\";display:flex;flex-shrink:0;font-size:14px;font-weight:700;height:20px;justify-content:center;width:20px}.ai-chat-widget.dark .ai-chat-error:before{background:rgba(239,68,68,.25)}.ai-chat-warning{background-color:rgba(245,158,11,.1);border:1px solid rgba(245,158,11,.2);border-radius:12px;color:#d97706;font-size:13px;margin:8px 16px;padding:12px 16px}.ai-chat-widget.dark .ai-chat-warning{background-color:rgba(245,158,11,.15);border-color:rgba(245,158,11,.25);color:#fbbf24}.ai-chat-suggested-questions{bottom:80px;left:0;padding:0 20px 16px;position:absolute;right:0;z-index:5}.ai-chat-suggested-questions-list{display:flex;flex-direction:column;gap:8px}.ai-chat-suggested-question{align-items:center;background:#fff;border:1px solid rgba(0,0,0,.08);border-radius:14px;box-shadow:0 1px 3px rgba(0,0,0,.04);color:#374151;cursor:pointer;display:flex;font-size:14px;font-weight:500;gap:12px;justify-content:space-between;padding:14px 16px;text-align:left;transition:all .15s ease;width:100%}.ai-chat-suggested-question:hover{background:#f9fafb;border-color:rgba(0,0,0,.12);box-shadow:0 2px 8px rgba(0,0,0,.06)}.ai-chat-suggested-question:active{transform:scale(.98)}.ai-chat-suggested-question-text{flex:1;line-height:1.4}.ai-chat-suggested-question-icon{color:var(--primary-color,#07f);flex-shrink:0;opacity:.7;transition:transform .15s ease,opacity .15s ease}.ai-chat-suggested-question:hover .ai-chat-suggested-question-icon{opacity:1;transform:translateX(3px)}@media (max-width:480px){.ai-chat-window{border-radius:0!important;bottom:0!important;height:100%!important;left:0!important;position:fixed!important;right:0!important;top:0!important;width:100%!important}.ai-chat-widget-container{bottom:20px!important;right:20px!important}.ai-chat-suggested-question{font-size:13px;padding:9px 10px}}.ai-chat-action-approval{background:linear-gradient(135deg,#07f,#001d3d);border-radius:16px;box-shadow:0 4px 12px rgba(0,119,255,.3);color:#fff;margin:16px;padding:16px}.ai-chat-action-approval-content{align-items:flex-start;display:flex;gap:12px;margin-bottom:16px}.ai-chat-action-approval-icon{align-items:center;background:hsla(0,0%,100%,.2);border-radius:8px;display:flex;flex-shrink:0;height:40px;justify-content:center;width:40px}.ai-chat-action-approval-text{flex:1}.ai-chat-action-approval-title{font-size:15px;font-weight:600;margin-bottom:4px}.ai-chat-action-approval-description{font-size:13px;line-height:1.4;opacity:.95}.ai-chat-action-approval-buttons{display:flex;gap:8px;justify-content:flex-end}.ai-chat-action-button{align-items:center;border:none;border-radius:8px;cursor:pointer;display:flex;font-family:inherit;font-size:14px;font-weight:500;gap:6px;padding:8px 16px;transition:all .2s ease}.ai-chat-action-button:disabled{cursor:not-allowed;opacity:.6}.ai-chat-action-button-reject{background:hsla(0,0%,100%,.2);color:#fff}.ai-chat-action-button-reject:hover:not(:disabled){background:hsla(0,0%,100%,.3)}.ai-chat-action-button-approve{background:#fff;color:#07f}.ai-chat-action-button-approve:hover:not(:disabled){background:#f0f0f0;box-shadow:0 2px 8px rgba(0,0,0,.15);transform:translateY(-1px)}.ai-chat-action-spinner{animation:ai-chat-spin .6s linear infinite;border:2px solid rgba(0,119,255,.3);border-radius:50%;border-top-color:#07f;display:inline-block;height:14px;width:14px}@keyframes ai-chat-spin{to{transform:rotate(1turn)}}.ai-chat-header-actions{align-items:center;display:flex;gap:4px}.ai-chat-header-button{align-items:center;background:transparent;border:none;border-radius:8px;color:var(--header-text-color,#fff);cursor:pointer;display:flex;height:32px;justify-content:center;opacity:.8;transition:background-color .15s ease;width:32px}.ai-chat-header-button:hover{background:hsla(0,0%,100%,.15);opacity:1}.ai-chat-header-button svg{height:18px;width:18px}.ai-chat-history-panel{background:var(--chat-background,#fff);display:flex;flex:1;flex-direction:column;overflow:hidden}.ai-chat-history-empty,.ai-chat-history-loading{align-items:center;color:var(--text-color,#6b7280);display:flex;flex:1;font-size:14px;justify-content:center;padding:24px;text-align:center}.ai-chat-history-list{flex:1;overflow-y:auto;padding:8px}.ai-chat-history-item{align-items:stretch;background:transparent;border:none;border-bottom:1px solid var(--border-color,rgba(0,0,0,.06));border-radius:0;cursor:pointer;display:flex;flex-direction:column;padding:12px 16px;text-align:left;transition:background-color .12s ease;width:100%}.ai-chat-history-item:last-child{border-bottom:none}.ai-chat-history-item:hover{background:rgba(0,0,0,.03)}.ai-chat-widget.dark .ai-chat-history-item:hover{background:hsla(0,0%,100%,.05)}.ai-chat-history-item.active{background:rgba(0,0,0,.05)}.ai-chat-widget.dark .ai-chat-history-item.active{background:hsla(0,0%,100%,.08)}.ai-chat-history-item.active .ai-chat-history-item-meta{opacity:.8}.ai-chat-history-item-preview{color:var(--text-color,#1f2937);font-size:14px;font-weight:400;line-height:1.4;margin-bottom:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-chat-history-item.active .ai-chat-history-item-preview{font-weight:500}.ai-chat-history-item-meta{color:var(--text-color,#9ca3af);display:flex;font-size:11px;gap:8px;opacity:.8}.ai-chat-history-list::-webkit-scrollbar{width:6px}.ai-chat-history-list::-webkit-scrollbar-track{background:transparent}.ai-chat-history-list::-webkit-scrollbar-thumb{background:var(--border-color,#e5e7eb);border-radius:3px}.ai-chat-history-list::-webkit-scrollbar-thumb:hover{background:var(--input-border,#d1d5db)}";
39589
39617
  styleInject(css_248z$1);
39590
39618
 
39591
39619
  var css_248z = ".ai-chat-widget{--spring-bounce:cubic-bezier(0.34,1.56,0.64,1);--spring-smooth:cubic-bezier(0.4,0,0.2,1);--spring-snappy:cubic-bezier(0.2,0,0,1);--duration-fast:0.2s;--duration-normal:0.35s;--duration-slow:0.5s}.ai-chat-button{align-items:center;background:var(--button-color,var(--primary-color,#07f));border:none;border-radius:50%;box-shadow:0 2px 8px rgba(0,0,0,.15);cursor:pointer;display:flex;height:48px;justify-content:center;overflow:hidden;position:relative;transition:opacity .15s ease;width:48px}.ai-chat-button:hover{opacity:.9}.ai-chat-button:active{opacity:.8}.ai-chat-button-svg{height:20px;transition:transform .15s ease;width:20px}.ai-chat-button.is-open .ai-chat-button-svg{transform:rotate(0deg)}.ai-chat-window{animation:windowOpen var(--duration-slow) var(--spring-bounce);background:#fff;border:1px solid #e5e7eb;border-radius:16px;box-shadow:0 4px 24px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.08);display:flex;flex-direction:column;overflow:hidden;position:absolute;transform-origin:bottom right}.ai-chat-widget.dark .ai-chat-window{background:#18181b;border-color:#27272a}@keyframes windowOpen{0%{opacity:0;transform:scale(.9) translateY(20px)}to{opacity:1;transform:scale(1) translateY(0)}}.ai-chat-window.closing{animation:windowClose var(--duration-normal) var(--spring-smooth) forwards}@keyframes windowClose{0%{opacity:1;transform:scale(1) translateY(0)}to{opacity:0;transform:scale(.9) translateY(20px)}}.ai-chat-header{align-items:center;background:#fff;border-bottom:1px solid #e5e7eb;display:flex;justify-content:space-between;padding:16px 20px;position:relative;z-index:10}.ai-chat-widget.dark .ai-chat-header{background:#18181b;border-bottom-color:#27272a}.ai-chat-header-content{align-items:center;display:flex;flex:1;gap:12px}.ai-chat-logo{border-radius:10px;height:36px;object-fit:cover;width:36px}.ai-chat-title{color:#18181b;font-size:15px;font-weight:600;letter-spacing:-.01em}.ai-chat-widget.dark .ai-chat-title{color:#fafafa}.ai-chat-close-button{align-items:center;background:transparent;border:none;border-radius:8px;color:#a1a1aa;cursor:pointer;display:flex;height:32px;justify-content:center;padding:0;transition:all .15s ease;width:32px}.ai-chat-widget.dark .ai-chat-close-button{color:#71717a}.ai-chat-close-button:hover{background:#f4f4f5;color:#52525b}.ai-chat-widget.dark .ai-chat-close-button:hover{background:#27272a;color:#a1a1aa}.ai-chat-close-button:active{transform:scale(.95)}.ai-chat-messages{-webkit-overflow-scrolling:touch;background:#f4f4f5;display:flex;flex:1;flex-direction:column;gap:12px;overflow-x:hidden;overflow-y:auto;padding:16px 16px 90px;position:relative;scroll-behavior:smooth}.ai-chat-widget.dark .ai-chat-messages{background:#18181b}.ai-chat-messages::-webkit-scrollbar{width:4px}.ai-chat-messages::-webkit-scrollbar-track{background:transparent}.ai-chat-messages::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:4px}.ai-chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.25)}.ai-chat-message{animation:messageSlideIn var(--duration-normal) var(--spring-bounce);display:flex;flex-direction:column;gap:6px}@keyframes messageSlideIn{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.ai-chat-message-content{word-wrap:break-word;border-radius:12px;font-size:14px;line-height:1.5;max-width:85%;padding:8px 14px}.ai-chat-message.user .ai-chat-message-content{background:var(--bubble-user-color,var(--primary-color,#07f));border-bottom-right-radius:4px;color:#fff;margin-left:auto}.ai-chat-message.assistant .ai-chat-message-content{background:#fff;border:1px solid #e5e7eb;border-bottom-left-radius:4px;color:#374151}.ai-chat-widget.dark .ai-chat-message.assistant .ai-chat-message-content{background:#18181b;border-color:#27272a;color:#e4e4e7}.ai-chat-typing{align-items:center;animation:messageSlideIn var(--duration-normal) var(--spring-bounce);background:#fff;border:1px solid #e5e7eb;border-radius:12px;border-bottom-left-radius:4px;display:flex;gap:4px;max-width:64px;padding:12px 16px}.ai-chat-widget.dark .ai-chat-typing{background:#18181b;border-color:#27272a}.ai-chat-typing-dot{animation:typingPulse 1.4s ease-in-out infinite;background:linear-gradient(135deg,var(--primary-color) 0,color-mix(in srgb,var(--primary-color) 70%,#000) 100%);border-radius:50%;height:8px;width:8px}.ai-chat-typing-dot:nth-child(2){animation-delay:.15s}.ai-chat-typing-dot:nth-child(3){animation-delay:.3s}@keyframes typingPulse{0%,60%,to{opacity:.4;transform:translateY(0) scale(1)}30%{opacity:1;transform:translateY(-6px) scale(1.1)}}.ai-chat-input-container{background:transparent;bottom:0;left:0;padding:0 16px 16px;position:absolute;right:0;z-index:10}.ai-chat-input-container:before{background:linear-gradient(0deg,#f4f4f5 80%,transparent);bottom:0;content:\"\";height:48px;left:0;pointer-events:none;position:absolute;right:0;z-index:-1}.ai-chat-widget.dark .ai-chat-input-container:before{background:linear-gradient(0deg,#18181b 80%,transparent)}.ai-chat-input-wrapper{align-items:center;background:#f4f4f5;border:1px solid #e5e7eb;border-radius:9999px;display:flex;gap:0;padding:4px 4px 4px 16px;position:relative;transition:all .15s ease;z-index:5}.ai-chat-widget.dark .ai-chat-input-wrapper{background:#27272a;border-color:#3f3f46}.ai-chat-input-wrapper:focus-within{border-color:var(--primary-color);box-shadow:0 0 0 2px rgba(var(--primary-color-rgb,0,119,255),.15)}.ai-chat-input{background:transparent;border:none;color:var(--text-color);flex:1;font-family:inherit;font-size:14px;line-height:1.4;max-height:100px;min-height:20px;outline:none;padding:8px 0;resize:none}.ai-chat-input::placeholder{color:rgba(0,0,0,.35)}.ai-chat-widget.dark .ai-chat-input::placeholder{color:hsla(0,0%,100%,.35)}.ai-chat-send-button{align-items:center;background:transparent;border:none;border-radius:8px;color:#a1a1aa;cursor:pointer;display:flex;flex-shrink:0;height:36px;justify-content:center;padding:0;transition:all .15s ease;width:36px}.ai-chat-widget.dark .ai-chat-send-button{color:#71717a}.ai-chat-send-button.active{background:var(--primary-color,#07f);color:#fff}.ai-chat-send-button.active:hover:not(:disabled){opacity:.9}.ai-chat-send-button:active:not(:disabled){transform:scale(.95)}.ai-chat-send-button:disabled{cursor:not-allowed;opacity:.4}.ai-chat-tool-message{align-items:center;animation:toolPulse 2s ease-in-out infinite;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);background:linear-gradient(135deg,rgba(16,185,129,.15),rgba(16,185,129,.08));border:1px solid rgba(16,185,129,.2);border-radius:16px;display:inline-flex;gap:10px;padding:10px 16px}@keyframes toolPulse{0%,to{box-shadow:0 0 0 0 rgba(16,185,129,.2)}50%{box-shadow:0 0 0 8px rgba(16,185,129,0)}}.tool-finished{align-items:center;animation:toolComplete .5s var(--spring-bounce);background:linear-gradient(135deg,#10b981,#059669);border-radius:50%;color:#fff;display:inline-flex;height:28px;justify-content:center;position:relative;width:28px}@keyframes toolComplete{0%{transform:scale(0) rotate(-180deg)}to{transform:scale(1) rotate(0deg)}}.tool-indicator{align-items:center;background:linear-gradient(135deg,rgba(59,130,246,.2),rgba(59,130,246,.1));border-radius:50%;color:#3b82f6;display:inline-flex;height:24px;justify-content:center;position:relative;width:24px}.tool-indicator.started:after{animation:toolSpin .8s linear infinite;border:2px solid transparent;border-radius:50%;border-top-color:#3b82f6;content:\"\";inset:-2px;position:absolute}@keyframes toolSpin{to{transform:rotate(1turn)}}.ai-chat-welcome{align-items:center;animation:welcomeFadeIn var(--duration-slow) var(--spring-smooth);display:flex;flex-direction:column;justify-content:center;min-height:200px;padding:60px 32px 40px;text-align:center}@keyframes welcomeFadeIn{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}.ai-chat-welcome-title{color:var(--primary-color);font-size:28px;font-weight:700;letter-spacing:-.03em;margin-bottom:12px}.ai-chat-welcome-text{color:var(--text-color);font-size:16px;line-height:1.6;max-width:280px;opacity:.6}.ai-chat-suggested-questions{bottom:76px;left:0;padding:0 16px 12px;position:absolute;right:0;z-index:5}.ai-chat-suggested-questions-list{display:flex;flex-direction:column;gap:6px}.ai-chat-suggested-question{align-items:center;background:#fff;border:1px solid #e5e7eb;border-radius:10px;color:#374151;cursor:pointer;display:flex;font-size:13px;font-weight:500;gap:10px;justify-content:space-between;padding:10px 14px;text-align:left;transition:all .15s ease;width:100%}.ai-chat-widget.dark .ai-chat-suggested-question{background:#18181b;border-color:#27272a;color:#e4e4e7}.ai-chat-suggested-question:hover{background:#f4f4f5;border-color:#d4d4d8}.ai-chat-widget.dark .ai-chat-suggested-question:hover{background:#27272a;border-color:#3f3f46}.ai-chat-suggested-question:active{transform:scale(.98)}.ai-chat-suggested-question-text{flex:1;line-height:1.4}.ai-chat-suggested-question-icon{color:var(--primary-color,#07f);flex-shrink:0;opacity:.7;transition:transform .15s ease,opacity .15s ease}.ai-chat-suggested-question:hover .ai-chat-suggested-question-icon{opacity:1;transform:translateX(3px)}.ai-chat-feedback-button{align-items:center;background:rgba(0,0,0,.04);border:none;border-radius:8px;cursor:pointer;display:flex;font-size:16px;gap:4px;padding:6px 10px;transition:all var(--duration-fast) var(--spring-bounce)}.ai-chat-feedback-button:hover:not(:disabled){background:rgba(0,0,0,.08);transform:scale(1.15)}.ai-chat-feedback-button:active:not(:disabled){transform:scale(.9)}.ai-chat-feedback-button.active{background:rgba(var(--primary-color-rgb,0,119,255),.15)}@media (max-width:480px){.ai-chat-window{animation:mobileSlideUp var(--duration-normal) var(--spring-smooth);border-radius:0!important;bottom:0!important;height:100%!important;left:0!important;position:fixed!important;right:0!important;top:0!important;width:100%!important}@keyframes mobileSlideUp{0%{transform:translateY(100%)}to{transform:translateY(0)}}.ai-chat-header{padding-top:max(16px,env(safe-area-inset-top))}.ai-chat-input-container{padding-bottom:max(20px,env(safe-area-inset-bottom))}}";
@@ -39594,24 +39622,16 @@
39594
39622
  // Icon components mapping
39595
39623
  const iconComponents = {
39596
39624
  FiMessageCircle: () => (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntimeExports.jsx("path", { d: "M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z" }) })),
39597
- FiMessageSquare: () => (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntimeExports.jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) })),
39598
- FiMail: () => (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("path", { d: "M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z" }), jsxRuntimeExports.jsx("polyline", { points: "22,6 12,13 2,6" })] })),
39599
- FiPhone: () => (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntimeExports.jsx("path", { d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z" }) })),
39600
- FiHelpCircle: () => (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("circle", { cx: "12", cy: "12", r: "10" }), jsxRuntimeExports.jsx("path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }), jsxRuntimeExports.jsx("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })] })),
39601
- FiZap: () => (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntimeExports.jsx("polygon", { points: "13 2 3 14 12 14 11 22 21 10 12 10 13 2" }) })),
39602
- FiSend: () => (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("line", { x1: "22", y1: "2", x2: "11", y2: "13" }), jsxRuntimeExports.jsx("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })] })),
39603
- FiUser: () => (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("path", { d: "M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" }), jsxRuntimeExports.jsx("circle", { cx: "12", cy: "7", r: "4" })] })),
39604
- FiUsers: () => (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("path", { d: "M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" }), jsxRuntimeExports.jsx("circle", { cx: "9", cy: "7", r: "4" }), jsxRuntimeExports.jsx("path", { d: "M23 21v-2a4 4 0 0 0-3-3.87" }), jsxRuntimeExports.jsx("path", { d: "M16 3.13a4 4 0 0 1 0 7.75" })] })),
39605
- FiHeadphones: () => (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("path", { d: "M3 18v-6a9 9 0 0 1 18 0v6" }), jsxRuntimeExports.jsx("path", { d: "M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z" })] })),
39606
- FiCpu: () => (jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("rect", { x: "4", y: "4", width: "16", height: "16", rx: "2", ry: "2" }), jsxRuntimeExports.jsx("rect", { x: "9", y: "9", width: "6", height: "6" }), jsxRuntimeExports.jsx("line", { x1: "9", y1: "1", x2: "9", y2: "4" }), jsxRuntimeExports.jsx("line", { x1: "15", y1: "1", x2: "15", y2: "4" }), jsxRuntimeExports.jsx("line", { x1: "9", y1: "20", x2: "9", y2: "23" }), jsxRuntimeExports.jsx("line", { x1: "15", y1: "20", x2: "15", y2: "23" }), jsxRuntimeExports.jsx("line", { x1: "20", y1: "9", x2: "23", y2: "9" }), jsxRuntimeExports.jsx("line", { x1: "20", y1: "14", x2: "23", y2: "14" }), jsxRuntimeExports.jsx("line", { x1: "1", y1: "9", x2: "4", y2: "9" }), jsxRuntimeExports.jsx("line", { x1: "1", y1: "14", x2: "4", y2: "14" })] })),
39607
39625
  FiChevronDown: () => (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntimeExports.jsx("polyline", { points: "6 9 12 15 18 9" }) })),
39608
39626
  };
39609
- const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bottom-right', theme: themeOverride, primaryColor, onOpen, onClose, onMessage, onError, }) => {
39627
+ const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bottom-right', primaryColor, onOpen, onClose, onMessage, onError, }) => {
39610
39628
  const [isOpen, setIsOpen] = reactExports.useState(false);
39611
39629
  const [autoDetectedTheme, setAutoDetectedTheme] = reactExports.useState('light');
39612
39630
  const widgetRef = reactExports.useRef(null);
39613
39631
  const containerRef = reactExports.useRef(null);
39614
- const { messages, isLoading, isTyping, error, config, sendMessage, submitFeedback, } = useChat({
39632
+ const { messages, isLoading, isTyping, error, config, sendMessage, submitFeedback,
39633
+ // Chat history (only active when persistConversation is true)
39634
+ conversations, loadConversations, switchConversation, startNewConversation, conversationId, } = useChat({
39615
39635
  widgetId,
39616
39636
  apiUrl,
39617
39637
  onMessage,
@@ -39647,7 +39667,6 @@
39647
39667
  console.log('[ChatWidget] Config loaded:', config ? 'YES' : 'NO');
39648
39668
  if (config) {
39649
39669
  console.log('[ChatWidget] Config details:', {
39650
- theme: config.appearance?.theme,
39651
39670
  accentColor: config.appearance?.primaryColor,
39652
39671
  autoDetectedTheme,
39653
39672
  });
@@ -39665,29 +39684,9 @@
39665
39684
  }
39666
39685
  return undefined;
39667
39686
  }, [config, onOpen]);
39668
- // Handle close on outside click - always enabled for better UX
39669
- reactExports.useEffect(() => {
39670
- if (!isOpen)
39671
- return;
39672
- const handleClickOutside = (event) => {
39673
- // Check if click is outside the widget container
39674
- if (widgetRef.current && !widgetRef.current.contains(event.target)) {
39675
- setIsOpen(false);
39676
- onClose?.();
39677
- }
39678
- };
39679
- // Small delay to prevent immediate close on open
39680
- const timer = setTimeout(() => {
39681
- document.addEventListener('mousedown', handleClickOutside);
39682
- }, 150);
39683
- return () => {
39684
- clearTimeout(timer);
39685
- document.removeEventListener('mousedown', handleClickOutside);
39686
- };
39687
- }, [isOpen, onClose]);
39688
39687
  // Handle close on Escape key
39689
39688
  reactExports.useEffect(() => {
39690
- if (!isOpen || !config?.appearance.closeOnEscape)
39689
+ if (!isOpen)
39691
39690
  return;
39692
39691
  const handleEscapeKey = (event) => {
39693
39692
  if (event.key === 'Escape') {
@@ -39697,16 +39696,10 @@
39697
39696
  };
39698
39697
  document.addEventListener('keydown', handleEscapeKey);
39699
39698
  return () => document.removeEventListener('keydown', handleEscapeKey);
39700
- }, [isOpen, config, onClose]);
39701
- // Determine theme - simplified: always auto-detect unless explicitly overridden
39699
+ }, [isOpen, onClose]);
39700
+ // Determine theme - always auto-detect from background
39702
39701
  const appearanceConfig = config?.appearance;
39703
- const themeSetting = themeOverride || appearanceConfig?.theme || 'auto';
39704
- // Use auto-detected theme, or explicit override
39705
- const effectiveTheme = themeSetting === 'auto'
39706
- ? autoDetectedTheme
39707
- : themeSetting === 'dark'
39708
- ? 'dark'
39709
- : 'light';
39702
+ const effectiveTheme = autoDetectedTheme;
39710
39703
  // Determine position (config takes priority over prop)
39711
39704
  const effectivePosition = config?.appearance.position || position;
39712
39705
  // Get accent color from config or prop
@@ -39715,17 +39708,15 @@
39715
39708
  const simpleAppearance = {
39716
39709
  accentColor,
39717
39710
  size: appearanceConfig?.size || 'small',
39718
- welcomeTitle: appearanceConfig?.lightMode?.chat?.welcomeTitle,
39719
- welcomeMessage: appearanceConfig?.welcomeMessage || appearanceConfig?.lightMode?.chat?.welcomeMessage,
39720
- placeholder: appearanceConfig?.placeholder || appearanceConfig?.lightMode?.footer?.inputPlaceholder,
39721
- headerTitle: appearanceConfig?.lightMode?.header?.title,
39722
- buttonIcon: appearanceConfig?.buttonIcon || appearanceConfig?.lightMode?.button?.icon,
39711
+ welcomeMessage: appearanceConfig?.welcomeMessage || '',
39712
+ placeholder: appearanceConfig?.placeholder || '',
39713
+ headerTitle: appearanceConfig?.headerTitle || '',
39723
39714
  };
39724
39715
  // Generate theme styles from accent color
39725
39716
  const generatedStyles = generateThemeStyles(simpleAppearance, effectiveTheme);
39726
39717
  // Also apply legacy styles for backward compatibility
39727
39718
  const legacyStyles = appearanceConfig
39728
- ? applyAppearanceStyles(appearanceConfig, effectiveTheme)
39719
+ ? applyAppearanceStyles(appearanceConfig)
39729
39720
  : {};
39730
39721
  // Merge styles (generated takes priority for new simplified system)
39731
39722
  const customStyles = {
@@ -39737,10 +39728,9 @@
39737
39728
  console.log('[ChatWidget] Theme info:', {
39738
39729
  effectiveTheme,
39739
39730
  autoDetectedTheme,
39740
- themeSetting,
39741
39731
  accentColor,
39742
39732
  });
39743
- }, [effectiveTheme, autoDetectedTheme, themeSetting, accentColor]);
39733
+ }, [effectiveTheme, autoDetectedTheme, accentColor]);
39744
39734
  const handleToggle = () => {
39745
39735
  const newState = !isOpen;
39746
39736
  console.log('[ChatWidget] handleToggle called, setting isOpen to:', newState);
@@ -39762,24 +39752,10 @@
39762
39752
  }
39763
39753
  console.log('[ChatWidget] Rendering widget', { isOpen, hasConfig: !!config });
39764
39754
  // Get button icon based on state
39765
- const getButtonIcon = () => {
39766
- if (isOpen) {
39767
- return iconComponents.FiChevronDown;
39768
- }
39769
- const themeConfig = effectiveTheme === 'dark'
39770
- ? appearanceConfig?.darkMode
39771
- : appearanceConfig?.lightMode;
39772
- const buttonIcon = themeConfig?.button?.icon || 'FiMessageCircle';
39773
- return iconComponents[buttonIcon] || iconComponents.FiMessageCircle;
39774
- };
39775
- const buttonIconColor = (() => {
39776
- const themeConfig = effectiveTheme === 'dark'
39777
- ? appearanceConfig?.darkMode
39778
- : appearanceConfig?.lightMode;
39779
- return themeConfig?.button?.iconColor || customStyles['--button-icon-color'] || '#ffffff';
39780
- })();
39781
- const IconComponent = getButtonIcon();
39782
- return (jsxRuntimeExports.jsx("div", { ref: containerRef, className: `ai-chat-widget ${effectiveTheme}`, style: customStyles, children: jsxRuntimeExports.jsxs("div", { ref: widgetRef, className: `ai-chat-widget-container ${effectivePosition}`, children: [isOpen && (jsxRuntimeExports.jsx(ChatWindow, { messages: messages, isLoading: isLoading, isTyping: isTyping, error: error, config: config, onSendMessage: sendMessage, onClose: handleToggle, onFeedback: handleFeedback })), jsxRuntimeExports.jsx("button", { className: `ai-chat-button ${isOpen ? 'is-open' : ''}`, onClick: handleToggle, "aria-label": isOpen ? "Minimize chat" : "Open chat", style: { color: buttonIconColor }, children: jsxRuntimeExports.jsx("div", { className: "ai-chat-button-svg", children: jsxRuntimeExports.jsx(IconComponent, {}) }) })] }) }));
39755
+ const IconComponent = isOpen ? iconComponents.FiChevronDown : iconComponents.FiMessageCircle;
39756
+ return (jsxRuntimeExports.jsx("div", { ref: containerRef, className: `ai-chat-widget ${effectiveTheme}`, style: customStyles, children: jsxRuntimeExports.jsxs("div", { ref: widgetRef, className: `ai-chat-widget-container ${effectivePosition}`, children: [isOpen && (jsxRuntimeExports.jsx(ChatWindow, { messages: messages, isLoading: isLoading, isTyping: isTyping, error: error, config: config, onSendMessage: sendMessage, onClose: handleToggle, onFeedback: handleFeedback,
39757
+ // Chat history props (only active when persistConversation is true)
39758
+ conversations: conversations, onLoadConversations: loadConversations, onSwitchConversation: switchConversation, onStartNewConversation: startNewConversation, currentConversationId: conversationId })), jsxRuntimeExports.jsx("button", { className: `ai-chat-button ${isOpen ? 'is-open' : ''}`, onClick: handleToggle, "aria-label": isOpen ? "Minimize chat" : "Open chat", children: jsxRuntimeExports.jsx("div", { className: "ai-chat-button-svg", children: jsxRuntimeExports.jsx(IconComponent, {}) }) })] }) }));
39783
39759
  };
39784
39760
 
39785
39761
  /**
@@ -39807,7 +39783,6 @@
39807
39783
  widgetId: options.widgetId,
39808
39784
  apiUrl: options.apiUrl,
39809
39785
  position: options.position,
39810
- theme: options.theme,
39811
39786
  primaryColor: options.primaryColor,
39812
39787
  onOpen: options.onOpen,
39813
39788
  onClose: options.onClose,