@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.
package/dist/index.esm.js CHANGED
@@ -259,8 +259,10 @@ function generateMessageId() {
259
259
  /**
260
260
  * Local Storage Utilities
261
261
  * Handles conversation persistence in browser localStorage
262
+ * Supports multiple conversations per widget with history
262
263
  */
263
264
  const STORAGE_PREFIX = 'ai-chat-widget';
265
+ const MAX_STORED_CONVERSATIONS = 20;
264
266
  /**
265
267
  * Generate a storage key for a widget
266
268
  */
@@ -268,33 +270,113 @@ function getStorageKey(widgetId) {
268
270
  return `${STORAGE_PREFIX}:${widgetId}`;
269
271
  }
270
272
  /**
271
- * Save conversation to localStorage
273
+ * Get widget storage data
272
274
  */
273
- function saveConversation(widgetId, conversationId, messages) {
275
+ function getWidgetStorage(widgetId) {
274
276
  try {
275
277
  const key = getStorageKey(widgetId);
276
- const data = {
278
+ const data = localStorage.getItem(key);
279
+ if (!data) {
280
+ return { activeConversationId: null, conversations: {}, history: [] };
281
+ }
282
+ const parsed = JSON.parse(data);
283
+ // Handle legacy format (single conversation)
284
+ if (parsed.conversationId && parsed.messages) {
285
+ const legacy = parsed;
286
+ return {
287
+ activeConversationId: legacy.conversationId,
288
+ conversations: { [legacy.conversationId]: legacy },
289
+ history: [{
290
+ id: legacy.conversationId,
291
+ preview: getConversationPreview(legacy.messages),
292
+ lastUpdated: legacy.lastUpdated,
293
+ messageCount: legacy.messages.length,
294
+ }],
295
+ };
296
+ }
297
+ return parsed;
298
+ }
299
+ catch (error) {
300
+ console.error('Failed to get widget storage:', error);
301
+ return { activeConversationId: null, conversations: {}, history: [] };
302
+ }
303
+ }
304
+ /**
305
+ * Save widget storage data
306
+ */
307
+ function setWidgetStorage(widgetId, storage) {
308
+ try {
309
+ const key = getStorageKey(widgetId);
310
+ localStorage.setItem(key, JSON.stringify(storage));
311
+ }
312
+ catch (error) {
313
+ console.error('Failed to save widget storage:', error);
314
+ }
315
+ }
316
+ /**
317
+ * Get preview text from messages
318
+ */
319
+ function getConversationPreview(messages) {
320
+ const firstUserMessage = messages.find(m => m.message.type === 'human');
321
+ if (firstUserMessage) {
322
+ return firstUserMessage.message.content.slice(0, 100);
323
+ }
324
+ return 'New conversation';
325
+ }
326
+ /**
327
+ * Save conversation to localStorage (updates both conversation and history)
328
+ */
329
+ function saveConversation(widgetId, conversationId, messages) {
330
+ try {
331
+ const storage = getWidgetStorage(widgetId);
332
+ const now = new Date().toISOString();
333
+ // Update conversation data
334
+ storage.conversations[conversationId] = {
277
335
  conversationId,
278
336
  messages,
279
- lastUpdated: new Date().toISOString(),
337
+ lastUpdated: now,
338
+ };
339
+ // Update active conversation
340
+ storage.activeConversationId = conversationId;
341
+ // Update history entry
342
+ const existingIndex = storage.history.findIndex(h => h.id === conversationId);
343
+ const historyEntry = {
344
+ id: conversationId,
345
+ preview: getConversationPreview(messages),
346
+ lastUpdated: now,
347
+ messageCount: messages.length,
280
348
  };
281
- localStorage.setItem(key, JSON.stringify(data));
349
+ if (existingIndex >= 0) {
350
+ storage.history[existingIndex] = historyEntry;
351
+ }
352
+ else {
353
+ storage.history.unshift(historyEntry);
354
+ }
355
+ // Sort by lastUpdated (most recent first)
356
+ storage.history.sort((a, b) => new Date(b.lastUpdated).getTime() - new Date(a.lastUpdated).getTime());
357
+ // Limit stored conversations
358
+ if (storage.history.length > MAX_STORED_CONVERSATIONS) {
359
+ const toRemove = storage.history.slice(MAX_STORED_CONVERSATIONS);
360
+ storage.history = storage.history.slice(0, MAX_STORED_CONVERSATIONS);
361
+ toRemove.forEach(entry => {
362
+ delete storage.conversations[entry.id];
363
+ });
364
+ }
365
+ setWidgetStorage(widgetId, storage);
282
366
  }
283
367
  catch (error) {
284
368
  console.error('Failed to save conversation:', error);
285
369
  }
286
370
  }
287
371
  /**
288
- * Load conversation from localStorage
372
+ * Load active conversation from localStorage (legacy compatibility)
289
373
  */
290
374
  function loadConversation(widgetId) {
291
375
  try {
292
- const key = getStorageKey(widgetId);
293
- const data = localStorage.getItem(key);
294
- if (!data)
376
+ const storage = getWidgetStorage(widgetId);
377
+ if (!storage.activeConversationId)
295
378
  return null;
296
- const parsed = JSON.parse(data);
297
- return parsed;
379
+ return storage.conversations[storage.activeConversationId] || null;
298
380
  }
299
381
  catch (error) {
300
382
  console.error('Failed to load conversation:', error);
@@ -302,12 +384,52 @@ function loadConversation(widgetId) {
302
384
  }
303
385
  }
304
386
  /**
305
- * Clear conversation from localStorage
387
+ * Load a specific conversation by ID
388
+ */
389
+ function loadConversationById(widgetId, conversationId) {
390
+ try {
391
+ const storage = getWidgetStorage(widgetId);
392
+ return storage.conversations[conversationId] || null;
393
+ }
394
+ catch (error) {
395
+ console.error('Failed to load conversation by ID:', error);
396
+ return null;
397
+ }
398
+ }
399
+ /**
400
+ * Get conversation history list
401
+ */
402
+ function getConversationHistory(widgetId) {
403
+ try {
404
+ const storage = getWidgetStorage(widgetId);
405
+ return storage.history;
406
+ }
407
+ catch (error) {
408
+ console.error('Failed to get conversation history:', error);
409
+ return [];
410
+ }
411
+ }
412
+ /**
413
+ * Set active conversation
414
+ */
415
+ function setActiveConversation(widgetId, conversationId) {
416
+ try {
417
+ const storage = getWidgetStorage(widgetId);
418
+ storage.activeConversationId = conversationId;
419
+ setWidgetStorage(widgetId, storage);
420
+ }
421
+ catch (error) {
422
+ console.error('Failed to set active conversation:', error);
423
+ }
424
+ }
425
+ /**
426
+ * Clear current conversation (start fresh, but keep history)
306
427
  */
307
428
  function clearConversation(widgetId) {
308
429
  try {
309
- const key = getStorageKey(widgetId);
310
- localStorage.removeItem(key);
430
+ const storage = getWidgetStorage(widgetId);
431
+ storage.activeConversationId = null;
432
+ setWidgetStorage(widgetId, storage);
311
433
  }
312
434
  catch (error) {
313
435
  console.error('Failed to clear conversation:', error);
@@ -404,6 +526,8 @@ function useChat(options) {
404
526
  conversationId: '', // Will be set after loading conversation
405
527
  config: null,
406
528
  });
529
+ // Chat history state
530
+ const [conversations, setConversations] = useState([]);
407
531
  const apiClient = useRef(new WidgetApiClient({ widgetId, apiUrl }));
408
532
  // Load configuration on mount and hydrate with existing conversation if available
409
533
  useEffect(() => {
@@ -415,8 +539,6 @@ function useChat(options) {
415
539
  const config = await apiClient.current.getConfig();
416
540
  console.log('[useChat] Config fetched successfully:', {
417
541
  hasAppearance: !!config.appearance,
418
- hasLightMode: !!config.appearance?.lightMode,
419
- hasDarkMode: !!config.appearance?.darkMode,
420
542
  });
421
543
  const persistConversation = config.behavior.persistConversation ?? true;
422
544
  let conversationId = '';
@@ -691,6 +813,78 @@ function useChat(options) {
691
813
  onError?.(err);
692
814
  }
693
815
  }, [state.conversationId, onError]);
816
+ /**
817
+ * Load conversation history list from localStorage
818
+ */
819
+ const loadConversations = useCallback(() => {
820
+ const persistConversation = state.config?.behavior.persistConversation ?? true;
821
+ if (!persistConversation || !isStorageAvailable()) {
822
+ setConversations([]);
823
+ return;
824
+ }
825
+ const history = getConversationHistory(widgetId);
826
+ setConversations(history.map(entry => ({
827
+ id: entry.id,
828
+ preview: entry.preview,
829
+ lastMessageAt: entry.lastUpdated,
830
+ messageCount: entry.messageCount,
831
+ startedAt: entry.lastUpdated,
832
+ })));
833
+ }, [widgetId, state.config?.behavior.persistConversation]);
834
+ /**
835
+ * Switch to a different conversation (from localStorage first, then fetch from server if needed)
836
+ */
837
+ const switchConversation = useCallback(async (conversationId) => {
838
+ const persistConversation = state.config?.behavior.persistConversation ?? true;
839
+ // First try to load from localStorage
840
+ if (persistConversation && isStorageAvailable()) {
841
+ const stored = loadConversationById(widgetId, conversationId);
842
+ if (stored) {
843
+ setState(prev => ({
844
+ ...prev,
845
+ conversationId: stored.conversationId,
846
+ messages: stored.messages,
847
+ }));
848
+ setActiveConversation(widgetId, conversationId);
849
+ return;
850
+ }
851
+ }
852
+ // If not in localStorage, fetch from server
853
+ setState(prev => ({ ...prev, isLoading: true, error: null }));
854
+ try {
855
+ const conversation = await apiClient.current.getOrCreateConversation(conversationId);
856
+ setState(prev => ({
857
+ ...prev,
858
+ conversationId: conversation.id,
859
+ messages: conversation.messages,
860
+ isLoading: false,
861
+ }));
862
+ // Save to local storage
863
+ if (persistConversation && isStorageAvailable()) {
864
+ saveConversation(widgetId, conversation.id, conversation.messages);
865
+ }
866
+ }
867
+ catch (error) {
868
+ const errorInfo = deriveErrorInfo(error);
869
+ setState(prev => ({ ...prev, isLoading: false, error: errorInfo.message }));
870
+ }
871
+ }, [widgetId, state.config?.behavior.persistConversation]);
872
+ /**
873
+ * Start a new conversation (keeps history)
874
+ */
875
+ const startNewConversation = useCallback(() => {
876
+ setState(prev => ({
877
+ ...prev,
878
+ messages: [],
879
+ conversationId: '',
880
+ error: null,
881
+ }));
882
+ // Clear active conversation but keep history
883
+ const persistConversation = state.config?.behavior.persistConversation ?? true;
884
+ if (persistConversation && isStorageAvailable()) {
885
+ clearConversation(widgetId);
886
+ }
887
+ }, [widgetId, state.config?.behavior.persistConversation]);
694
888
  return {
695
889
  messages: state.messages,
696
890
  isLoading: state.isLoading,
@@ -701,6 +895,11 @@ function useChat(options) {
701
895
  sendMessage,
702
896
  clearMessages,
703
897
  submitFeedback,
898
+ // Chat history features
899
+ conversations,
900
+ loadConversations,
901
+ switchConversation,
902
+ startNewConversation,
704
903
  };
705
904
  }
706
905
 
@@ -21572,26 +21771,53 @@ const SuggestedQuestions = ({ questions, onQuestionClick, }) => {
21572
21771
  };
21573
21772
 
21574
21773
  const MinimizeIcon = () => (jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsx("path", { d: "M5 12h14" }) }));
21575
- const ChatWindow = ({ messages, isLoading, isTyping, error, config, onSendMessage, onClose, onFeedback, }) => {
21774
+ const HistoryIcon = () => (jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsx("circle", { cx: "12", cy: "12", r: "10" }), jsx("polyline", { points: "12 6 12 12 16 14" })] }));
21775
+ const NewChatIcon = () => (jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsx("path", { d: "M12 5v14M5 12h14" }) }));
21776
+ const BackIcon = () => (jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsx("path", { d: "M19 12H5M12 19l-7-7 7-7" }) }));
21777
+ const ChatWindow = ({ messages, isLoading, isTyping, error, config, onSendMessage, onClose, onFeedback,
21778
+ // Chat history props (only active when persistConversation is true)
21779
+ conversations = [], onLoadConversations, onSwitchConversation, onStartNewConversation, currentConversationId, }) => {
21576
21780
  console.log('[ChatWindow] Rendering ChatWindow component');
21577
21781
  const appearance = config?.appearance;
21578
21782
  const behavior = config?.behavior;
21783
+ // Use simplified appearance fields
21579
21784
  const size = appearance?.size || 'medium';
21580
- console.log('[ChatWindow] Size:', size, 'Appearance:', !!appearance);
21581
- // Determine current theme config
21582
- const themePreference = appearance?.theme ?? 'light';
21583
- const canUseDarkMode = appearance?.darkModeEnabled !== false;
21584
- const prefersDark = typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches;
21585
- const isDarkMode = themePreference === 'auto'
21586
- ? (canUseDarkMode && prefersDark)
21587
- : themePreference === 'dark' && canUseDarkMode;
21588
- const themeConfig = (isDarkMode ? appearance?.darkMode : appearance?.lightMode) ?? (appearance?.lightMode || appearance?.darkMode);
21589
- const headerTitle = themeConfig?.header?.title ?? appearance?.header?.title ?? appearance?.companyName ?? 'AI Assistant';
21590
- const welcomeTitle = themeConfig?.chat?.welcomeTitle ?? 'Welcome!';
21591
- const welcomeMessage = themeConfig?.chat?.welcomeMessage ?? appearance?.welcomeMessage ?? '👋 Hi there! How can I assist you today?';
21592
- const inputPlaceholder = themeConfig?.footer?.inputPlaceholder ?? appearance?.placeholder ?? 'Ask me anything...';
21785
+ const headerTitle = appearance?.headerTitle || 'AI Assistant';
21786
+ const welcomeMessage = appearance?.welcomeMessage || '👋 Hi there! How can I assist you today?';
21787
+ const inputPlaceholder = appearance?.placeholder || 'Ask me anything...';
21788
+ console.log('[ChatWindow] Appearance values:', {
21789
+ size,
21790
+ headerTitle,
21791
+ welcomeMessage,
21792
+ inputPlaceholder,
21793
+ });
21593
21794
  // Track if suggested questions should be shown
21594
21795
  const [showSuggestedQuestions, setShowSuggestedQuestions] = useState(true);
21796
+ // Track if history panel is open
21797
+ const [showHistory, setShowHistory] = useState(false);
21798
+ // Check if chat history feature is enabled (only when persistConversation is true)
21799
+ const isHistoryEnabled = behavior?.persistConversation !== false && !!onLoadConversations;
21800
+ // Load conversations when history panel opens
21801
+ const handleOpenHistory = () => {
21802
+ setShowHistory(true);
21803
+ if (onLoadConversations) {
21804
+ onLoadConversations();
21805
+ }
21806
+ };
21807
+ // Handle conversation selection
21808
+ const handleSelectConversation = async (conversationId) => {
21809
+ if (onSwitchConversation) {
21810
+ await onSwitchConversation(conversationId);
21811
+ setShowHistory(false);
21812
+ }
21813
+ };
21814
+ // Handle new conversation
21815
+ const handleNewConversation = () => {
21816
+ if (onStartNewConversation) {
21817
+ onStartNewConversation();
21818
+ setShowHistory(false);
21819
+ }
21820
+ };
21595
21821
  // Hide suggested questions after first user message
21596
21822
  useEffect(() => {
21597
21823
  const userMessages = messages.filter(m => m.message.type === 'human');
@@ -21609,241 +21835,39 @@ const ChatWindow = ({ messages, isLoading, isTyping, error, config, onSendMessag
21609
21835
  onSendMessage(question);
21610
21836
  };
21611
21837
  const hasMessages = messages.length > 0;
21612
- return (jsxs("div", { className: `ai-chat-window size-${size}`, role: "dialog", "aria-label": "Chat window", children: [jsxs("div", { className: "ai-chat-header", children: [jsxs("div", { className: "ai-chat-header-content", children: [appearance?.logo && (jsx("img", { src: appearance.logo, alt: "Logo", className: "ai-chat-logo" })), jsx("div", { className: "ai-chat-title", children: headerTitle })] }), jsx("button", { className: "ai-chat-close-button", onClick: onClose, "aria-label": "Minimize chat", children: jsx(MinimizeIcon, {}) })] }), error && (jsx("div", { className: "ai-chat-error", role: "alert", children: error })), maxMessages && userMessageCount >= maxMessages - 2 && !isLimitReached && (jsxs("div", { className: "ai-chat-warning", role: "alert", children: [maxMessages - userMessageCount, " message", maxMessages - userMessageCount !== 1 ? 's' : '', " remaining"] })), isLimitReached && (jsx("div", { className: "ai-chat-error", role: "alert", children: "Message limit reached. Please start a new conversation." })), 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 && (jsx(SuggestedQuestions, { questions: behavior.suggestedQuestions, onQuestionClick: handleQuestionClick })), jsx(MessageInput, { onSend: onSendMessage, placeholder: isLimitReached ? 'Message limit reached' : inputPlaceholder, disabled: isLoading || isLimitReached, enableFileUpload: behavior?.enableFileUpload, separateFromChat: themeConfig?.footer?.separateFromChat })] }));
21838
+ // Format date for conversation list
21839
+ const formatDate = (dateString) => {
21840
+ const date = new Date(dateString);
21841
+ const now = new Date();
21842
+ const diffMs = now.getTime() - date.getTime();
21843
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
21844
+ if (diffDays === 0)
21845
+ return 'Today';
21846
+ if (diffDays === 1)
21847
+ return 'Yesterday';
21848
+ if (diffDays < 7)
21849
+ return `${diffDays} days ago`;
21850
+ return date.toLocaleDateString();
21851
+ };
21852
+ return (jsxs("div", { className: `ai-chat-window size-${size}`, role: "dialog", "aria-label": "Chat window", children: [jsx("div", { className: "ai-chat-header", children: showHistory ? (jsxs(Fragment, { children: [jsx("button", { className: "ai-chat-header-button", onClick: () => setShowHistory(false), "aria-label": "Back to chat", children: jsx(BackIcon, {}) }), jsx("div", { className: "ai-chat-title", children: "Chat History" }), jsx("button", { className: "ai-chat-header-button", onClick: handleNewConversation, "aria-label": "New conversation", children: jsx(NewChatIcon, {}) })] })) : (jsxs(Fragment, { children: [jsxs("div", { className: "ai-chat-header-content", children: [appearance?.logo && (jsx("img", { src: appearance.logo, alt: "Logo", className: "ai-chat-logo" })), jsx("div", { className: "ai-chat-title", children: headerTitle })] }), jsxs("div", { className: "ai-chat-header-actions", children: [isHistoryEnabled && (jsx("button", { className: "ai-chat-header-button", onClick: handleOpenHistory, "aria-label": "Chat history", children: jsx(HistoryIcon, {}) })), jsx("button", { className: "ai-chat-close-button", onClick: onClose, "aria-label": "Minimize chat", children: jsx(MinimizeIcon, {}) })] })] })) }), showHistory ? (jsx("div", { className: "ai-chat-history-panel", children: conversations.length === 0 ? (jsx("div", { className: "ai-chat-history-empty", children: "No previous conversations" })) : (jsx("div", { className: "ai-chat-history-list", children: conversations.map((conv) => (jsxs("button", { className: `ai-chat-history-item ${conv.id === currentConversationId ? 'active' : ''}`, onClick: () => handleSelectConversation(conv.id), children: [jsx("div", { className: "ai-chat-history-item-preview", children: conv.preview }), jsxs("div", { className: "ai-chat-history-item-meta", children: [jsx("span", { children: formatDate(conv.lastMessageAt) }), jsxs("span", { children: [conv.messageCount, " messages"] })] })] }, conv.id))) })) })) : (jsxs(Fragment, { children: [error && (jsx("div", { className: "ai-chat-error", role: "alert", children: error })), maxMessages && userMessageCount >= maxMessages - 2 && !isLimitReached && (jsxs("div", { className: "ai-chat-warning", role: "alert", children: [maxMessages - userMessageCount, " message", maxMessages - userMessageCount !== 1 ? 's' : '', " remaining"] })), isLimitReached && (jsx("div", { className: "ai-chat-error", role: "alert", children: "Message limit reached. Please start a new conversation." })), 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 && (jsx(SuggestedQuestions, { questions: behavior.suggestedQuestions, onQuestionClick: handleQuestionClick })), jsx(MessageInput, { onSend: onSendMessage, placeholder: isLimitReached ? 'Message limit reached' : inputPlaceholder, disabled: isLoading || isLimitReached, enableFileUpload: behavior?.enableFileUpload })] }))] }));
21613
21853
  };
21614
21854
 
21615
- /**
21616
- * Convert shadow size to CSS box-shadow value
21617
- */
21618
- function getShadowValue(size) {
21619
- const shadows = {
21620
- 'none': 'none',
21621
- 'sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
21622
- 'md': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
21623
- 'lg': '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
21624
- 'xl': '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
21625
- '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',
21626
- };
21627
- return shadows[size] || shadows.none;
21628
- }
21629
21855
  /**
21630
21856
  * Apply appearance configuration as CSS custom properties
21631
- * This allows the widget to be fully customizable via the appearance config
21857
+ * Simplified to only handle flat appearance schema
21632
21858
  *
21633
21859
  * @param appearance - Widget appearance configuration
21634
- * @param theme - Current theme ('light' or 'dark')
21860
+ * @param theme - Current theme ('light' or 'dark') - kept for compatibility but not used for theme selection
21635
21861
  */
21636
- function applyAppearanceStyles(appearance, theme = 'light') {
21862
+ function applyAppearanceStyles(appearance) {
21637
21863
  const styles = {};
21638
- // Global font family
21639
- if (appearance.fontFamily) {
21640
- styles.fontFamily = appearance.fontFamily;
21641
- }
21642
- // Select the correct theme configuration
21643
- const themeConfig = theme === 'dark' ? appearance.darkMode : appearance.lightMode;
21644
- // If theme config exists and has required properties, use it
21645
- if (themeConfig && themeConfig.button) {
21646
- // ========================================================================
21647
- // BUTTON APPEARANCE
21648
- // ========================================================================
21649
- const btn = themeConfig.button;
21650
- if (btn.color)
21651
- styles['--button-color'] = btn.color;
21652
- if (btn.opacity !== undefined)
21653
- styles['--button-opacity'] = btn.opacity.toString();
21654
- if (btn.size)
21655
- styles['--button-size'] = `${btn.size}px`;
21656
- if (btn.icon)
21657
- styles['--button-icon'] = btn.icon;
21658
- if (btn.iconColor)
21659
- styles['--button-icon-color'] = btn.iconColor;
21660
- if (btn.borderRadius !== undefined)
21661
- styles['--button-border-radius'] = `${btn.borderRadius}px`;
21662
- if (btn.borderWidth !== undefined)
21663
- styles['--button-border-width'] = `${btn.borderWidth}px`;
21664
- if (btn.borderColor)
21665
- styles['--button-border-color'] = btn.borderColor;
21666
- if (btn.borderOpacity !== undefined)
21667
- styles['--button-border-opacity'] = btn.borderOpacity.toString();
21668
- if (btn.backdropBlur !== undefined)
21669
- styles['--button-backdrop-blur'] = `${btn.backdropBlur}px`;
21670
- if (btn.shadow)
21671
- styles['--button-shadow'] = getShadowValue(btn.shadow);
21672
- // ========================================================================
21673
- // CARD/WINDOW APPEARANCE
21674
- // ========================================================================
21675
- const card = themeConfig.card;
21676
- if (card.backgroundColor)
21677
- styles['--card-background'] = card.backgroundColor;
21678
- if (card.opacity !== undefined)
21679
- styles['--card-opacity'] = card.opacity.toString();
21680
- if (card.borderRadius !== undefined)
21681
- styles['--card-border-radius'] = `${card.borderRadius}px`;
21682
- if (card.borderWidth !== undefined)
21683
- styles['--card-border-width'] = `${card.borderWidth}px`;
21684
- if (card.borderColor) {
21685
- styles['--card-border-color'] = card.borderColor;
21686
- // Create rgba border color with opacity for box-shadow
21687
- if (card.borderOpacity !== undefined) {
21688
- const opacity = card.borderOpacity;
21689
- // Convert hex to rgba
21690
- const hex = card.borderColor.replace('#', '');
21691
- const r = parseInt(hex.substring(0, 2), 16);
21692
- const g = parseInt(hex.substring(2, 4), 16);
21693
- const b = parseInt(hex.substring(4, 6), 16);
21694
- styles['--card-border-color-rgba'] = `rgba(${r}, ${g}, ${b}, ${opacity})`;
21695
- }
21696
- }
21697
- if (card.borderOpacity !== undefined)
21698
- styles['--card-border-opacity'] = card.borderOpacity.toString();
21699
- if (card.backdropBlur !== undefined)
21700
- styles['--card-backdrop-blur'] = `${card.backdropBlur}px`;
21701
- if (card.shadow)
21702
- styles['--card-shadow'] = getShadowValue(card.shadow);
21703
- // ========================================================================
21704
- // HEADER APPEARANCE
21705
- // ========================================================================
21706
- const header = themeConfig.header;
21707
- if (header.backgroundColor)
21708
- styles['--header-background'] = header.backgroundColor;
21709
- if (header.opacity !== undefined)
21710
- styles['--header-opacity'] = header.opacity.toString();
21711
- if (header.textColor)
21712
- styles['--header-text-color'] = header.textColor;
21713
- if (header.borderBottomWidth !== undefined)
21714
- styles['--header-border-bottom-width'] = `${header.borderBottomWidth}px`;
21715
- if (header.borderBottomColor)
21716
- styles['--header-border-bottom-color'] = header.borderBottomColor;
21717
- if (header.borderBottomOpacity !== undefined)
21718
- styles['--header-border-bottom-opacity'] = header.borderBottomOpacity.toString();
21719
- // ========================================================================
21720
- // CHAT APPEARANCE
21721
- // ========================================================================
21722
- const chat = themeConfig.chat;
21723
- if (chat.backgroundColor)
21724
- styles['--chat-background'] = chat.backgroundColor;
21725
- if (chat.opacity !== undefined)
21726
- styles['--chat-opacity'] = chat.opacity.toString();
21727
- // Welcome message
21728
- if (chat.welcomeColor)
21729
- styles['--welcome-color'] = chat.welcomeColor;
21730
- // Message bubbles
21731
- if (chat.enableBubbles) {
21732
- if (chat.bubbleUserColor)
21733
- styles['--bubble-user-color'] = chat.bubbleUserColor;
21734
- if (chat.bubbleUserOpacity !== undefined)
21735
- styles['--bubble-user-opacity'] = chat.bubbleUserOpacity.toString();
21736
- if (chat.bubbleAssistantColor)
21737
- styles['--bubble-assistant-color'] = chat.bubbleAssistantColor;
21738
- if (chat.bubbleAssistantOpacity !== undefined)
21739
- styles['--bubble-assistant-opacity'] = chat.bubbleAssistantOpacity.toString();
21740
- if (chat.bubbleBorderWidth !== undefined)
21741
- styles['--bubble-border-width'] = `${chat.bubbleBorderWidth}px`;
21742
- if (chat.bubbleBorderColor)
21743
- styles['--bubble-border-color'] = chat.bubbleBorderColor;
21744
- if (chat.bubbleBorderOpacity !== undefined)
21745
- styles['--bubble-border-opacity'] = chat.bubbleBorderOpacity.toString();
21746
- }
21747
- else {
21748
- // Plain text mode
21749
- if (chat.textColor)
21750
- styles['--message-text-color'] = chat.textColor;
21751
- }
21752
- // ========================================================================
21753
- // FOOTER APPEARANCE
21754
- // ========================================================================
21755
- const footer = themeConfig.footer;
21756
- // Only if separate from chat
21757
- if (footer.separateFromChat) {
21758
- if (footer.backgroundColor)
21759
- styles['--footer-background'] = footer.backgroundColor;
21760
- if (footer.opacity !== undefined)
21761
- styles['--footer-opacity'] = footer.opacity.toString();
21762
- if (footer.borderTopWidth !== undefined)
21763
- styles['--footer-border-top-width'] = `${footer.borderTopWidth}px`;
21764
- if (footer.borderTopColor)
21765
- styles['--footer-border-top-color'] = footer.borderTopColor;
21766
- if (footer.borderTopOpacity !== undefined)
21767
- styles['--footer-border-top-opacity'] = footer.borderTopOpacity.toString();
21768
- }
21769
- // Backdrop blur (only when floating)
21770
- if (!footer.separateFromChat && footer.backdropBlur !== undefined) {
21771
- styles['--footer-backdrop-blur'] = `${footer.backdropBlur}px`;
21772
- }
21773
- // Input field
21774
- if (footer.inputBackgroundColor)
21775
- styles['--input-background'] = footer.inputBackgroundColor;
21776
- if (footer.inputBackgroundOpacity !== undefined)
21777
- styles['--input-background-opacity'] = footer.inputBackgroundOpacity.toString();
21778
- if (footer.inputBorderRadius !== undefined)
21779
- styles['--input-border-radius'] = `${footer.inputBorderRadius}px`;
21780
- if (footer.inputBorderWidth !== undefined)
21781
- styles['--input-border-width'] = `${footer.inputBorderWidth}px`;
21782
- if (footer.inputBorderColor)
21783
- styles['--input-border-color'] = footer.inputBorderColor;
21784
- if (footer.inputBorderOpacity !== undefined)
21785
- styles['--input-border-opacity'] = footer.inputBorderOpacity.toString();
21786
- if (footer.inputShadow)
21787
- styles['--input-shadow'] = getShadowValue(footer.inputShadow);
21788
- // Send button
21789
- if (footer.buttonBackgroundColor)
21790
- styles['--send-button-background'] = footer.buttonBackgroundColor;
21791
- if (footer.buttonOpacity !== undefined)
21792
- styles['--send-button-opacity'] = footer.buttonOpacity.toString();
21793
- if (footer.buttonBorderRadius !== undefined)
21794
- styles['--send-button-border-radius'] = `${footer.buttonBorderRadius}px`;
21795
- if (footer.buttonBorderWidth !== undefined)
21796
- styles['--send-button-border-width'] = `${footer.buttonBorderWidth}px`;
21797
- if (footer.buttonBorderColor)
21798
- styles['--send-button-border-color'] = footer.buttonBorderColor;
21799
- if (footer.buttonBorderOpacity !== undefined)
21800
- styles['--send-button-border-opacity'] = footer.buttonBorderOpacity.toString();
21801
- // ========================================================================
21802
- // HOVER STATES
21803
- // ========================================================================
21804
- const hover = themeConfig.hover;
21805
- if (hover.buttonScale !== undefined)
21806
- styles['--hover-button-scale'] = hover.buttonScale.toString();
21807
- if (hover.buttonOpacity !== undefined)
21808
- styles['--hover-button-opacity'] = hover.buttonOpacity.toString();
21809
- if (hover.inputBorderColor)
21810
- styles['--hover-input-border-color'] = hover.inputBorderColor;
21811
- if (hover.sendButtonOpacity !== undefined)
21812
- styles['--hover-send-button-opacity'] = hover.sendButtonOpacity.toString();
21813
- if (hover.closeButtonOpacity !== undefined)
21814
- styles['--hover-close-button-opacity'] = hover.closeButtonOpacity.toString();
21815
- // ========================================================================
21816
- // ACTIVE STATES
21817
- // ========================================================================
21818
- const active = themeConfig.active;
21819
- if (active.inputBorderColor)
21820
- styles['--active-input-border-color'] = active.inputBorderColor;
21821
- if (active.inputShadow)
21822
- styles['--active-input-shadow'] = active.inputShadow;
21823
- }
21824
- else {
21825
- // Fallback to legacy fields if no theme config
21826
- if (appearance.primaryColor)
21827
- styles['--primary-color'] = appearance.primaryColor;
21828
- if (appearance.borderRadius !== undefined)
21829
- styles['--border-radius'] = `${appearance.borderRadius}px`;
21830
- // Legacy button
21831
- if (appearance.button) {
21832
- const btn = appearance.button;
21833
- if (btn.color)
21834
- styles['--button-color'] = btn.color;
21835
- if (btn.size)
21836
- styles['--button-size'] = `${btn.size}px`;
21837
- if (btn.borderRadius !== undefined)
21838
- styles['--button-border-radius'] = `${btn.borderRadius}px`;
21839
- if (btn.borderWidth !== undefined)
21840
- styles['--button-border-width'] = `${btn.borderWidth}px`;
21841
- if (btn.borderColor)
21842
- styles['--button-border-color'] = btn.borderColor;
21843
- if (btn.opacity !== undefined)
21844
- styles['--button-opacity'] = btn.opacity.toString();
21845
- }
21864
+ // Apply primary color
21865
+ if (appearance.primaryColor) {
21866
+ styles['--primary-color'] = appearance.primaryColor;
21846
21867
  }
21868
+ // Note: All legacy theme system code (lightMode, darkMode, ThemeAppearanceConfig)
21869
+ // has been removed. The widget now uses a simplified flat appearance schema.
21870
+ // Theme-specific styling is handled by generateThemeStyles() using auto-detected theme.
21847
21871
  return styles;
21848
21872
  }
21849
21873
 
@@ -22205,19 +22229,23 @@ function detectTheme(element) {
22205
22229
  * Create a MutationObserver to watch for theme changes
22206
22230
  */
22207
22231
  function createThemeObserver(element, callback) {
22232
+ let lastTheme = detectTheme(element);
22208
22233
  const observer = new MutationObserver(() => {
22209
22234
  const theme = detectTheme(element);
22210
- callback(theme);
22235
+ if (theme !== lastTheme) {
22236
+ lastTheme = theme;
22237
+ callback(theme);
22238
+ }
22211
22239
  });
22212
22240
  // Observe body for class/style changes (common for theme switching)
22213
22241
  observer.observe(document.body, {
22214
22242
  attributes: true,
22215
- attributeFilter: ['class', 'style', 'data-theme'],
22243
+ attributeFilter: ['class', 'style', 'data-theme', 'data-bs-theme'],
22216
22244
  });
22217
22245
  // Also observe html element
22218
22246
  observer.observe(document.documentElement, {
22219
22247
  attributes: true,
22220
- attributeFilter: ['class', 'style', 'data-theme'],
22248
+ attributeFilter: ['class', 'style', 'data-theme', 'data-bs-theme'],
22221
22249
  });
22222
22250
  return observer;
22223
22251
  }
@@ -22249,7 +22277,7 @@ function styleInject(css, ref) {
22249
22277
  }
22250
22278
  }
22251
22279
 
22252
- 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)}}";
22280
+ 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)}";
22253
22281
  styleInject(css_248z$1);
22254
22282
 
22255
22283
  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))}}";
@@ -22258,24 +22286,16 @@ styleInject(css_248z);
22258
22286
  // Icon components mapping
22259
22287
  const iconComponents = {
22260
22288
  FiMessageCircle: () => (jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: 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" }) })),
22261
- FiMessageSquare: () => (jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: 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" }) })),
22262
- FiMail: () => (jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [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" }), jsx("polyline", { points: "22,6 12,13 2,6" })] })),
22263
- FiPhone: () => (jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: 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" }) })),
22264
- FiHelpCircle: () => (jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsx("circle", { cx: "12", cy: "12", r: "10" }), jsx("path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }), jsx("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })] })),
22265
- FiZap: () => (jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsx("polygon", { points: "13 2 3 14 12 14 11 22 21 10 12 10 13 2" }) })),
22266
- FiSend: () => (jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsx("line", { x1: "22", y1: "2", x2: "11", y2: "13" }), jsx("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })] })),
22267
- FiUser: () => (jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsx("path", { d: "M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" }), jsx("circle", { cx: "12", cy: "7", r: "4" })] })),
22268
- FiUsers: () => (jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsx("path", { d: "M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" }), jsx("circle", { cx: "9", cy: "7", r: "4" }), jsx("path", { d: "M23 21v-2a4 4 0 0 0-3-3.87" }), jsx("path", { d: "M16 3.13a4 4 0 0 1 0 7.75" })] })),
22269
- FiHeadphones: () => (jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsx("path", { d: "M3 18v-6a9 9 0 0 1 18 0v6" }), 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" })] })),
22270
- FiCpu: () => (jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsx("rect", { x: "4", y: "4", width: "16", height: "16", rx: "2", ry: "2" }), jsx("rect", { x: "9", y: "9", width: "6", height: "6" }), jsx("line", { x1: "9", y1: "1", x2: "9", y2: "4" }), jsx("line", { x1: "15", y1: "1", x2: "15", y2: "4" }), jsx("line", { x1: "9", y1: "20", x2: "9", y2: "23" }), jsx("line", { x1: "15", y1: "20", x2: "15", y2: "23" }), jsx("line", { x1: "20", y1: "9", x2: "23", y2: "9" }), jsx("line", { x1: "20", y1: "14", x2: "23", y2: "14" }), jsx("line", { x1: "1", y1: "9", x2: "4", y2: "9" }), jsx("line", { x1: "1", y1: "14", x2: "4", y2: "14" })] })),
22271
22289
  FiChevronDown: () => (jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: jsx("polyline", { points: "6 9 12 15 18 9" }) })),
22272
22290
  };
22273
- const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bottom-right', theme: themeOverride, primaryColor, onOpen, onClose, onMessage, onError, }) => {
22291
+ const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bottom-right', primaryColor, onOpen, onClose, onMessage, onError, }) => {
22274
22292
  const [isOpen, setIsOpen] = useState(false);
22275
22293
  const [autoDetectedTheme, setAutoDetectedTheme] = useState('light');
22276
22294
  const widgetRef = useRef(null);
22277
22295
  const containerRef = useRef(null);
22278
- const { messages, isLoading, isTyping, error, config, sendMessage, submitFeedback, } = useChat({
22296
+ const { messages, isLoading, isTyping, error, config, sendMessage, submitFeedback,
22297
+ // Chat history (only active when persistConversation is true)
22298
+ conversations, loadConversations, switchConversation, startNewConversation, conversationId, } = useChat({
22279
22299
  widgetId,
22280
22300
  apiUrl,
22281
22301
  onMessage,
@@ -22311,7 +22331,6 @@ const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bot
22311
22331
  console.log('[ChatWidget] Config loaded:', config ? 'YES' : 'NO');
22312
22332
  if (config) {
22313
22333
  console.log('[ChatWidget] Config details:', {
22314
- theme: config.appearance?.theme,
22315
22334
  accentColor: config.appearance?.primaryColor,
22316
22335
  autoDetectedTheme,
22317
22336
  });
@@ -22329,29 +22348,9 @@ const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bot
22329
22348
  }
22330
22349
  return undefined;
22331
22350
  }, [config, onOpen]);
22332
- // Handle close on outside click - always enabled for better UX
22333
- useEffect(() => {
22334
- if (!isOpen)
22335
- return;
22336
- const handleClickOutside = (event) => {
22337
- // Check if click is outside the widget container
22338
- if (widgetRef.current && !widgetRef.current.contains(event.target)) {
22339
- setIsOpen(false);
22340
- onClose?.();
22341
- }
22342
- };
22343
- // Small delay to prevent immediate close on open
22344
- const timer = setTimeout(() => {
22345
- document.addEventListener('mousedown', handleClickOutside);
22346
- }, 150);
22347
- return () => {
22348
- clearTimeout(timer);
22349
- document.removeEventListener('mousedown', handleClickOutside);
22350
- };
22351
- }, [isOpen, onClose]);
22352
22351
  // Handle close on Escape key
22353
22352
  useEffect(() => {
22354
- if (!isOpen || !config?.appearance.closeOnEscape)
22353
+ if (!isOpen)
22355
22354
  return;
22356
22355
  const handleEscapeKey = (event) => {
22357
22356
  if (event.key === 'Escape') {
@@ -22361,16 +22360,10 @@ const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bot
22361
22360
  };
22362
22361
  document.addEventListener('keydown', handleEscapeKey);
22363
22362
  return () => document.removeEventListener('keydown', handleEscapeKey);
22364
- }, [isOpen, config, onClose]);
22365
- // Determine theme - simplified: always auto-detect unless explicitly overridden
22363
+ }, [isOpen, onClose]);
22364
+ // Determine theme - always auto-detect from background
22366
22365
  const appearanceConfig = config?.appearance;
22367
- const themeSetting = themeOverride || appearanceConfig?.theme || 'auto';
22368
- // Use auto-detected theme, or explicit override
22369
- const effectiveTheme = themeSetting === 'auto'
22370
- ? autoDetectedTheme
22371
- : themeSetting === 'dark'
22372
- ? 'dark'
22373
- : 'light';
22366
+ const effectiveTheme = autoDetectedTheme;
22374
22367
  // Determine position (config takes priority over prop)
22375
22368
  const effectivePosition = config?.appearance.position || position;
22376
22369
  // Get accent color from config or prop
@@ -22379,17 +22372,15 @@ const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bot
22379
22372
  const simpleAppearance = {
22380
22373
  accentColor,
22381
22374
  size: appearanceConfig?.size || 'small',
22382
- welcomeTitle: appearanceConfig?.lightMode?.chat?.welcomeTitle,
22383
- welcomeMessage: appearanceConfig?.welcomeMessage || appearanceConfig?.lightMode?.chat?.welcomeMessage,
22384
- placeholder: appearanceConfig?.placeholder || appearanceConfig?.lightMode?.footer?.inputPlaceholder,
22385
- headerTitle: appearanceConfig?.lightMode?.header?.title,
22386
- buttonIcon: appearanceConfig?.buttonIcon || appearanceConfig?.lightMode?.button?.icon,
22375
+ welcomeMessage: appearanceConfig?.welcomeMessage || '',
22376
+ placeholder: appearanceConfig?.placeholder || '',
22377
+ headerTitle: appearanceConfig?.headerTitle || '',
22387
22378
  };
22388
22379
  // Generate theme styles from accent color
22389
22380
  const generatedStyles = generateThemeStyles(simpleAppearance, effectiveTheme);
22390
22381
  // Also apply legacy styles for backward compatibility
22391
22382
  const legacyStyles = appearanceConfig
22392
- ? applyAppearanceStyles(appearanceConfig, effectiveTheme)
22383
+ ? applyAppearanceStyles(appearanceConfig)
22393
22384
  : {};
22394
22385
  // Merge styles (generated takes priority for new simplified system)
22395
22386
  const customStyles = {
@@ -22401,10 +22392,9 @@ const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bot
22401
22392
  console.log('[ChatWidget] Theme info:', {
22402
22393
  effectiveTheme,
22403
22394
  autoDetectedTheme,
22404
- themeSetting,
22405
22395
  accentColor,
22406
22396
  });
22407
- }, [effectiveTheme, autoDetectedTheme, themeSetting, accentColor]);
22397
+ }, [effectiveTheme, autoDetectedTheme, accentColor]);
22408
22398
  const handleToggle = () => {
22409
22399
  const newState = !isOpen;
22410
22400
  console.log('[ChatWidget] handleToggle called, setting isOpen to:', newState);
@@ -22426,24 +22416,10 @@ const ChatWidget = ({ widgetId, apiUrl = window.location.origin, position = 'bot
22426
22416
  }
22427
22417
  console.log('[ChatWidget] Rendering widget', { isOpen, hasConfig: !!config });
22428
22418
  // Get button icon based on state
22429
- const getButtonIcon = () => {
22430
- if (isOpen) {
22431
- return iconComponents.FiChevronDown;
22432
- }
22433
- const themeConfig = effectiveTheme === 'dark'
22434
- ? appearanceConfig?.darkMode
22435
- : appearanceConfig?.lightMode;
22436
- const buttonIcon = themeConfig?.button?.icon || 'FiMessageCircle';
22437
- return iconComponents[buttonIcon] || iconComponents.FiMessageCircle;
22438
- };
22439
- const buttonIconColor = (() => {
22440
- const themeConfig = effectiveTheme === 'dark'
22441
- ? appearanceConfig?.darkMode
22442
- : appearanceConfig?.lightMode;
22443
- return themeConfig?.button?.iconColor || customStyles['--button-icon-color'] || '#ffffff';
22444
- })();
22445
- const IconComponent = getButtonIcon();
22446
- return (jsx("div", { ref: containerRef, className: `ai-chat-widget ${effectiveTheme}`, style: customStyles, children: jsxs("div", { ref: widgetRef, className: `ai-chat-widget-container ${effectivePosition}`, children: [isOpen && (jsx(ChatWindow, { messages: messages, isLoading: isLoading, isTyping: isTyping, error: error, config: config, onSendMessage: sendMessage, onClose: handleToggle, onFeedback: handleFeedback })), jsx("button", { className: `ai-chat-button ${isOpen ? 'is-open' : ''}`, onClick: handleToggle, "aria-label": isOpen ? "Minimize chat" : "Open chat", style: { color: buttonIconColor }, children: jsx("div", { className: "ai-chat-button-svg", children: jsx(IconComponent, {}) }) })] }) }));
22419
+ const IconComponent = isOpen ? iconComponents.FiChevronDown : iconComponents.FiMessageCircle;
22420
+ return (jsx("div", { ref: containerRef, className: `ai-chat-widget ${effectiveTheme}`, style: customStyles, children: jsxs("div", { ref: widgetRef, className: `ai-chat-widget-container ${effectivePosition}`, children: [isOpen && (jsx(ChatWindow, { messages: messages, isLoading: isLoading, isTyping: isTyping, error: error, config: config, onSendMessage: sendMessage, onClose: handleToggle, onFeedback: handleFeedback,
22421
+ // Chat history props (only active when persistConversation is true)
22422
+ conversations: conversations, onLoadConversations: loadConversations, onSwitchConversation: switchConversation, onStartNewConversation: startNewConversation, currentConversationId: conversationId })), jsx("button", { className: `ai-chat-button ${isOpen ? 'is-open' : ''}`, onClick: handleToggle, "aria-label": isOpen ? "Minimize chat" : "Open chat", children: jsx("div", { className: "ai-chat-button-svg", children: jsx(IconComponent, {}) }) })] }) }));
22447
22423
  };
22448
22424
 
22449
22425
  export { ApiError, ChatWidget, useChat };