@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/ai-chat-widget.umd.js +305 -330
- package/dist/ai-chat-widget.umd.js.map +1 -1
- package/dist/components/ChatWidget.d.ts.map +1 -1
- package/dist/components/ChatWindow.d.ts +6 -0
- package/dist/components/ChatWindow.d.ts.map +1 -1
- package/dist/hooks/useChat.d.ts +11 -0
- package/dist/hooks/useChat.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +305 -329
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +305 -329
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +5 -121
- package/dist/types/index.d.ts.map +1 -1
- package/dist/umd.d.ts +0 -1
- package/dist/umd.d.ts.map +1 -1
- package/dist/utils/applyAppearanceStyles.d.ts +3 -3
- package/dist/utils/applyAppearanceStyles.d.ts.map +1 -1
- package/dist/utils/autoThemeDetector.d.ts.map +1 -1
- package/dist/utils/storage.d.ts +31 -3
- package/dist/utils/storage.d.ts.map +1 -1
- package/package.json +1 -1
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
|
-
*
|
|
273
|
+
* Get widget storage data
|
|
272
274
|
*/
|
|
273
|
-
function
|
|
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:
|
|
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
|
-
|
|
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
|
|
293
|
-
|
|
294
|
-
if (!data)
|
|
376
|
+
const storage = getWidgetStorage(widgetId);
|
|
377
|
+
if (!storage.activeConversationId)
|
|
295
378
|
return null;
|
|
296
|
-
|
|
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
|
-
*
|
|
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
|
|
310
|
-
|
|
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
|
|
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
|
-
|
|
21581
|
-
|
|
21582
|
-
const
|
|
21583
|
-
|
|
21584
|
-
|
|
21585
|
-
|
|
21586
|
-
|
|
21587
|
-
|
|
21588
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
|
21862
|
+
function applyAppearanceStyles(appearance) {
|
|
21637
21863
|
const styles = {};
|
|
21638
|
-
//
|
|
21639
|
-
if (appearance.
|
|
21640
|
-
styles
|
|
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
|
-
|
|
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',
|
|
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,
|
|
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
|
|
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,
|
|
22365
|
-
// Determine theme -
|
|
22363
|
+
}, [isOpen, onClose]);
|
|
22364
|
+
// Determine theme - always auto-detect from background
|
|
22366
22365
|
const appearanceConfig = config?.appearance;
|
|
22367
|
-
const
|
|
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
|
-
|
|
22383
|
-
|
|
22384
|
-
|
|
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
|
|
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,
|
|
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
|
|
22430
|
-
|
|
22431
|
-
|
|
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 };
|