@fusioni/client-sdk 1.1.6 → 1.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -6,6 +6,239 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var react = require('react');
7
7
  var reactDom = require('react-dom');
8
8
 
9
+ const en = {
10
+ // Chat Interface
11
+ chat: {
12
+ title: 'Fusioni AI',
13
+ subtitle: 'AI Assistant',
14
+ welcome: {
15
+ title: 'Welcome to Fusioni',
16
+ description: 'Start a new conversation to begin chatting with AI',
17
+ startButton: 'Start New Conversation',
18
+ creating: 'Creating...'
19
+ },
20
+ input: {
21
+ placeholder: 'Type your message...',
22
+ send: 'Send',
23
+ upload: 'Upload',
24
+ record: 'Record'
25
+ },
26
+ conversations: {
27
+ title: 'Conversations',
28
+ search: 'Search conversations...',
29
+ newConversation: 'New Conversation',
30
+ noConversations: 'No conversations yet',
31
+ delete: 'Delete conversation',
32
+ newIndicator: 'New conversation - will be saved when you send a message',
33
+ deleteConfirm: {
34
+ title: 'Delete Conversation',
35
+ message: 'Are you sure you want to delete this conversation? This action cannot be undone.',
36
+ confirm: 'Delete',
37
+ cancel: 'Cancel'
38
+ }
39
+ },
40
+ attachedImages: 'Images',
41
+ attachedVideos: 'Videos',
42
+ messages: {
43
+ loading: 'Working on it...',
44
+ error: 'Oops! Something went wrong. Please try again later.',
45
+ delete: 'Delete message',
46
+ deleteConfirm: {
47
+ title: 'Delete Message',
48
+ message: 'Are you sure you want to delete this message? This action cannot be undone.',
49
+ confirm: 'Delete',
50
+ cancel: 'Cancel'
51
+ }
52
+ },
53
+ connection: {
54
+ connected: 'Real-time updates connected',
55
+ disconnected: 'Real-time updates disconnected'
56
+ },
57
+ fullscreen: {
58
+ enter: 'Enter fullscreen',
59
+ exit: 'Exit fullscreen'
60
+ },
61
+ theme: {
62
+ light: 'Switch to light theme',
63
+ dark: 'Switch to dark theme'
64
+ },
65
+ emptyState: {
66
+ title: 'Start a conversation',
67
+ description: 'Send a message to begin chatting with the AI assistant'
68
+ },
69
+ errors: {
70
+ failedToCreateConversation: 'Failed to create conversation',
71
+ failedToLoadConversation: 'Failed to load conversation',
72
+ failedToDeleteConversation: 'Failed to delete conversation',
73
+ failedToSendMessage: 'Failed to send message',
74
+ failedToDeleteMessage: 'Failed to delete message',
75
+ failedToUploadFile: 'Failed to upload file',
76
+ failedToInitialize: 'Failed to initialize chat service',
77
+ retry: 'Retry'
78
+ }
79
+ },
80
+ // Language Switcher
81
+ language: {
82
+ english: 'English',
83
+ greek: 'Ελληνικά',
84
+ switchLanguage: 'Switch Language'
85
+ },
86
+ // Common
87
+ common: {
88
+ close: 'Close',
89
+ open: 'Open',
90
+ cancel: 'Cancel',
91
+ confirm: 'Confirm',
92
+ save: 'Save',
93
+ delete: 'Delete',
94
+ edit: 'Edit',
95
+ search: 'Search',
96
+ clear: 'Clear',
97
+ loading: 'Loading...',
98
+ error: 'Error',
99
+ success: 'Success',
100
+ warning: 'Warning',
101
+ info: 'Info',
102
+ yes: 'Yes',
103
+ no: 'No'
104
+ }
105
+ };
106
+
107
+ const el = {
108
+ // Chat Interface
109
+ chat: {
110
+ title: 'Fusioni AI',
111
+ subtitle: 'AI Βοηθός',
112
+ welcome: {
113
+ title: 'Καλώς ήρθατε στο Fusioni AI',
114
+ description: 'Ξεκινήστε μια νέα συνομιλία για να αρχίσετε να συνομιλείτε με AI',
115
+ startButton: 'Ξεκινήστε Νέα Συνομιλία',
116
+ creating: 'Δημιουργία...'
117
+ },
118
+ input: {
119
+ placeholder: 'Πληκτρολογήστε το μήνυμά σας...',
120
+ send: 'Αποστολή',
121
+ upload: 'Ανέβασμα',
122
+ record: 'Εγγραφή'
123
+ },
124
+ conversations: {
125
+ title: 'Συνομιλίες',
126
+ search: 'Αναζήτηση συνομιλιών...',
127
+ newConversation: 'Νέα Συνομιλία',
128
+ noConversations: 'Δεν υπάρχουν συνομιλίες ακόμα',
129
+ delete: 'Διαγραφή συνομιλίας',
130
+ newIndicator: 'Νέα συνομιλία - θα αποθηκευτεί όταν στείλετε μήνυμα',
131
+ deleteConfirm: {
132
+ title: 'Διαγραφή Συνομιλίας',
133
+ message: 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή τη συνομιλία; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.',
134
+ confirm: 'Διαγραφή',
135
+ cancel: 'Ακύρωση'
136
+ }
137
+ },
138
+ attachedImages: 'Εικόνες',
139
+ attachedVideos: 'Βίντεο',
140
+ messages: {
141
+ loading: 'Εργάζομαι...',
142
+ error: 'Ουπς! Κάτι πήγε στραβά. Παρακαλώ δοκιμάστε ξανά αργότερα.',
143
+ delete: 'Διαγραφή μηνύματος',
144
+ deleteConfirm: {
145
+ title: 'Διαγραφή Μηνύματος',
146
+ message: 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το μήνυμα; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.',
147
+ confirm: 'Διαγραφή',
148
+ cancel: 'Ακύρωση'
149
+ }
150
+ },
151
+ connection: {
152
+ connected: 'Συνδεδεμένο για ενημερώσεις σε πραγματικό χρόνο',
153
+ disconnected: 'Αποσυνδεδεμένο από ενημερώσεις σε πραγματικό χρόνο'
154
+ },
155
+ fullscreen: {
156
+ enter: 'Πλήρης οθόνη',
157
+ exit: 'Έξοδος από πλήρη οθόνη'
158
+ },
159
+ theme: {
160
+ light: 'Εναλλαγή σε φωτεινό θέμα',
161
+ dark: 'Εναλλαγή σε σκοτεινό θέμα'
162
+ },
163
+ emptyState: {
164
+ title: 'Ξεκινήστε μια συνομιλία',
165
+ description: 'Στείλτε ένα μήνυμα για να ξεκινήσετε συνομιλία με τον βοηθό AI'
166
+ },
167
+ errors: {
168
+ failedToCreateConversation: 'Αποτυχία δημιουργίας συνομιλίας',
169
+ failedToLoadConversation: 'Αποτυχία φόρτωσης συνομιλίας',
170
+ failedToDeleteConversation: 'Αποτυχία διαγραφής συνομιλίας',
171
+ failedToSendMessage: 'Αποτυχία αποστολής μηνύματος',
172
+ failedToDeleteMessage: 'Αποτυχία διαγραφής μηνύματος',
173
+ failedToUploadFile: 'Αποτυχία ανεβάσματος αρχείου',
174
+ failedToInitialize: 'Αποτυχία αρχικοποίησης υπηρεσίας συνομιλίας',
175
+ retry: 'Επανάληψη'
176
+ }
177
+ },
178
+ // Language Switcher
179
+ language: {
180
+ english: 'English',
181
+ greek: 'Ελληνικά',
182
+ switchLanguage: 'Αλλαγή Γλώσσας'
183
+ },
184
+ // Common
185
+ common: {
186
+ close: 'Κλείσιμο',
187
+ open: 'Άνοιγμα',
188
+ cancel: 'Ακύρωση',
189
+ confirm: 'Επιβεβαίωση',
190
+ save: 'Αποθήκευση',
191
+ delete: 'Διαγραφή',
192
+ edit: 'Επεξεργασία',
193
+ search: 'Αναζήτηση',
194
+ clear: 'Εκκαθάριση',
195
+ loading: 'Φόρτωση...',
196
+ error: 'Σφάλμα',
197
+ success: 'Επιτυχία',
198
+ warning: 'Προειδοποίηση',
199
+ info: 'Πληροφορία',
200
+ yes: 'Ναι',
201
+ no: 'Όχι'
202
+ }
203
+ };
204
+
205
+ const translations = {
206
+ en,
207
+ el
208
+ };
209
+ const getTranslation = (language, key) => {
210
+ const keys = key.split('.');
211
+ let value = translations[language];
212
+ for (const k of keys) {
213
+ if (value && typeof value === 'object' && k in value) {
214
+ value = value[k];
215
+ }
216
+ else {
217
+ // Fallback to English if key not found
218
+ value = translations.en;
219
+ for (const fallbackKey of keys) {
220
+ if (value && typeof value === 'object' && fallbackKey in value) {
221
+ value = value[fallbackKey];
222
+ }
223
+ else {
224
+ return key; // Return the key if not found in fallback
225
+ }
226
+ }
227
+ break;
228
+ }
229
+ }
230
+ return typeof value === 'string' ? value : key;
231
+ };
232
+ const getAvailableLanguages = () => {
233
+ return [
234
+ { code: 'en', name: 'English' },
235
+ { code: 'el', name: 'Ελληνικά' }
236
+ ];
237
+ };
238
+ const isValidLanguage = (language) => {
239
+ return language === 'en' || language === 'el';
240
+ };
241
+
9
242
  function bind(fn, thisArg) {
10
243
  return function wrap() {
11
244
  return fn.apply(thisArg, arguments);
@@ -1363,12 +1596,12 @@ const hasStandardBrowserWebWorkerEnv = (() => {
1363
1596
  const origin = hasBrowserEnv && window.location.href || 'http://localhost';
1364
1597
 
1365
1598
  var utils = /*#__PURE__*/Object.freeze({
1366
- __proto__: null,
1367
- hasBrowserEnv: hasBrowserEnv,
1368
- hasStandardBrowserEnv: hasStandardBrowserEnv,
1369
- hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
1370
- navigator: _navigator,
1371
- origin: origin
1599
+ __proto__: null,
1600
+ hasBrowserEnv: hasBrowserEnv,
1601
+ hasStandardBrowserEnv: hasStandardBrowserEnv,
1602
+ hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
1603
+ navigator: _navigator,
1604
+ origin: origin
1372
1605
  });
1373
1606
 
1374
1607
  var platform = {
@@ -4268,19 +4501,28 @@ class SDKClientService {
4268
4501
  theme: serverConfig.theme !== null && serverConfig.theme !== undefined
4269
4502
  ? serverConfig.theme
4270
4503
  : userConfig.theme,
4504
+ showThemeToggle: serverConfig.show_theme_toggle !== undefined
4505
+ ? serverConfig.show_theme_toggle
4506
+ : userConfig.showThemeToggle,
4507
+ showFullscreenToggle: serverConfig.show_fullscreen_toggle !== undefined
4508
+ ? serverConfig.show_fullscreen_toggle
4509
+ : userConfig.showFullscreenToggle,
4510
+ showLanguageSwitcher: serverConfig.show_language_switcher !== undefined
4511
+ ? serverConfig.show_language_switcher
4512
+ : userConfig.showLanguageSwitcher,
4271
4513
  position: serverConfig.position !== null && serverConfig.position !== undefined
4272
4514
  ? serverConfig.position
4273
4515
  : userConfig.position,
4274
4516
  primaryColor: serverConfig.primary_color !== null && serverConfig.primary_color !== undefined
4275
4517
  ? serverConfig.primary_color
4276
4518
  : userConfig.primaryColor,
4277
- showConversationList: serverConfig.show_conversation_list !== undefined
4519
+ showConversationList: typeof serverConfig.show_conversation_list === 'boolean'
4278
4520
  ? serverConfig.show_conversation_list
4279
4521
  : userConfig.showConversationList,
4280
- enableAudioRecording: serverConfig.enable_audio_recording !== undefined
4522
+ enableAudioRecording: typeof serverConfig.enable_audio_recording === 'boolean'
4281
4523
  ? serverConfig.enable_audio_recording
4282
4524
  : userConfig.enableAudioRecording,
4283
- enableFileUpload: serverConfig.enable_file_upload !== undefined
4525
+ enableFileUpload: typeof serverConfig.enable_file_upload === 'boolean'
4284
4526
  ? serverConfig.enable_file_upload
4285
4527
  : userConfig.enableFileUpload,
4286
4528
  maxFileSize: serverConfig.max_file_size !== null && serverConfig.max_file_size !== undefined
@@ -4307,231 +4549,6 @@ const getSDKClientService = () => {
4307
4549
  return sdkClientServiceInstance;
4308
4550
  };
4309
4551
 
4310
- const en = {
4311
- // Chat Interface
4312
- chat: {
4313
- title: 'Fusioni AI',
4314
- subtitle: 'AI Assistant',
4315
- welcome: {
4316
- title: 'Welcome to Fusioni',
4317
- description: 'Start a new conversation to begin chatting with AI',
4318
- startButton: 'Start New Conversation',
4319
- creating: 'Creating...'
4320
- },
4321
- input: {
4322
- placeholder: 'Type your message...',
4323
- send: 'Send',
4324
- upload: 'Upload',
4325
- record: 'Record'
4326
- },
4327
- conversations: {
4328
- title: 'Conversations',
4329
- search: 'Search conversations...',
4330
- newConversation: 'New Conversation',
4331
- noConversations: 'No conversations yet',
4332
- delete: 'Delete conversation',
4333
- newIndicator: 'New conversation - will be saved when you send a message',
4334
- deleteConfirm: {
4335
- title: 'Delete Conversation',
4336
- message: 'Are you sure you want to delete this conversation? This action cannot be undone.',
4337
- confirm: 'Delete',
4338
- cancel: 'Cancel'
4339
- }
4340
- },
4341
- attachedImages: 'Images',
4342
- attachedVideos: 'Videos',
4343
- messages: {
4344
- loading: 'Working on it...',
4345
- error: 'Oops! Something went wrong. Please try again later.',
4346
- delete: 'Delete message',
4347
- deleteConfirm: {
4348
- title: 'Delete Message',
4349
- message: 'Are you sure you want to delete this message? This action cannot be undone.',
4350
- confirm: 'Delete',
4351
- cancel: 'Cancel'
4352
- }
4353
- },
4354
- connection: {
4355
- connected: 'Real-time updates connected',
4356
- disconnected: 'Real-time updates disconnected'
4357
- },
4358
- fullscreen: {
4359
- enter: 'Enter fullscreen',
4360
- exit: 'Exit fullscreen'
4361
- },
4362
- theme: {
4363
- light: 'Switch to light theme',
4364
- dark: 'Switch to dark theme'
4365
- },
4366
- errors: {
4367
- failedToCreateConversation: 'Failed to create conversation',
4368
- failedToLoadConversation: 'Failed to load conversation',
4369
- failedToDeleteConversation: 'Failed to delete conversation',
4370
- failedToSendMessage: 'Failed to send message',
4371
- failedToDeleteMessage: 'Failed to delete message',
4372
- failedToUploadFile: 'Failed to upload file',
4373
- failedToInitialize: 'Failed to initialize chat service',
4374
- retry: 'Retry'
4375
- }
4376
- },
4377
- // Language Switcher
4378
- language: {
4379
- english: 'English',
4380
- greek: 'Ελληνικά',
4381
- switchLanguage: 'Switch Language'
4382
- },
4383
- // Common
4384
- common: {
4385
- close: 'Close',
4386
- open: 'Open',
4387
- cancel: 'Cancel',
4388
- confirm: 'Confirm',
4389
- save: 'Save',
4390
- delete: 'Delete',
4391
- edit: 'Edit',
4392
- search: 'Search',
4393
- clear: 'Clear',
4394
- loading: 'Loading...',
4395
- error: 'Error',
4396
- success: 'Success',
4397
- warning: 'Warning',
4398
- info: 'Info',
4399
- yes: 'Yes',
4400
- no: 'No'
4401
- }
4402
- };
4403
-
4404
- const el = {
4405
- // Chat Interface
4406
- chat: {
4407
- title: 'Fusioni AI',
4408
- subtitle: 'AI Βοηθός',
4409
- welcome: {
4410
- title: 'Καλώς ήρθατε στο Fusioni AI',
4411
- description: 'Ξεκινήστε μια νέα συνομιλία για να αρχίσετε να συνομιλείτε με AI',
4412
- startButton: 'Ξεκινήστε Νέα Συνομιλία',
4413
- creating: 'Δημιουργία...'
4414
- },
4415
- input: {
4416
- placeholder: 'Πληκτρολογήστε το μήνυμά σας...',
4417
- send: 'Αποστολή',
4418
- upload: 'Ανέβασμα',
4419
- record: 'Εγγραφή'
4420
- },
4421
- conversations: {
4422
- title: 'Συνομιλίες',
4423
- search: 'Αναζήτηση συνομιλιών...',
4424
- newConversation: 'Νέα Συνομιλία',
4425
- noConversations: 'Δεν υπάρχουν συνομιλίες ακόμα',
4426
- delete: 'Διαγραφή συνομιλίας',
4427
- newIndicator: 'Νέα συνομιλία - θα αποθηκευτεί όταν στείλετε μήνυμα',
4428
- deleteConfirm: {
4429
- title: 'Διαγραφή Συνομιλίας',
4430
- message: 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή τη συνομιλία; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.',
4431
- confirm: 'Διαγραφή',
4432
- cancel: 'Ακύρωση'
4433
- }
4434
- },
4435
- attachedImages: 'Εικόνες',
4436
- attachedVideos: 'Βίντεο',
4437
- messages: {
4438
- loading: 'Εργάζομαι...',
4439
- error: 'Ουπς! Κάτι πήγε στραβά. Παρακαλώ δοκιμάστε ξανά αργότερα.',
4440
- delete: 'Διαγραφή μηνύματος',
4441
- deleteConfirm: {
4442
- title: 'Διαγραφή Μηνύματος',
4443
- message: 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το μήνυμα; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.',
4444
- confirm: 'Διαγραφή',
4445
- cancel: 'Ακύρωση'
4446
- }
4447
- },
4448
- connection: {
4449
- connected: 'Συνδεδεμένο για ενημερώσεις σε πραγματικό χρόνο',
4450
- disconnected: 'Αποσυνδεδεμένο από ενημερώσεις σε πραγματικό χρόνο'
4451
- },
4452
- fullscreen: {
4453
- enter: 'Πλήρης οθόνη',
4454
- exit: 'Έξοδος από πλήρη οθόνη'
4455
- },
4456
- theme: {
4457
- light: 'Εναλλαγή σε φωτεινό θέμα',
4458
- dark: 'Εναλλαγή σε σκοτεινό θέμα'
4459
- },
4460
- errors: {
4461
- failedToCreateConversation: 'Αποτυχία δημιουργίας συνομιλίας',
4462
- failedToLoadConversation: 'Αποτυχία φόρτωσης συνομιλίας',
4463
- failedToDeleteConversation: 'Αποτυχία διαγραφής συνομιλίας',
4464
- failedToSendMessage: 'Αποτυχία αποστολής μηνύματος',
4465
- failedToDeleteMessage: 'Αποτυχία διαγραφής μηνύματος',
4466
- failedToUploadFile: 'Αποτυχία ανεβάσματος αρχείου',
4467
- failedToInitialize: 'Αποτυχία αρχικοποίησης υπηρεσίας συνομιλίας',
4468
- retry: 'Επανάληψη'
4469
- }
4470
- },
4471
- // Language Switcher
4472
- language: {
4473
- english: 'English',
4474
- greek: 'Ελληνικά',
4475
- switchLanguage: 'Αλλαγή Γλώσσας'
4476
- },
4477
- // Common
4478
- common: {
4479
- close: 'Κλείσιμο',
4480
- open: 'Άνοιγμα',
4481
- cancel: 'Ακύρωση',
4482
- confirm: 'Επιβεβαίωση',
4483
- save: 'Αποθήκευση',
4484
- delete: 'Διαγραφή',
4485
- edit: 'Επεξεργασία',
4486
- search: 'Αναζήτηση',
4487
- clear: 'Εκκαθάριση',
4488
- loading: 'Φόρτωση...',
4489
- error: 'Σφάλμα',
4490
- success: 'Επιτυχία',
4491
- warning: 'Προειδοποίηση',
4492
- info: 'Πληροφορία',
4493
- yes: 'Ναι',
4494
- no: 'Όχι'
4495
- }
4496
- };
4497
-
4498
- const translations = {
4499
- en,
4500
- el
4501
- };
4502
- const getTranslation = (language, key) => {
4503
- const keys = key.split('.');
4504
- let value = translations[language];
4505
- for (const k of keys) {
4506
- if (value && typeof value === 'object' && k in value) {
4507
- value = value[k];
4508
- }
4509
- else {
4510
- // Fallback to English if key not found
4511
- value = translations.en;
4512
- for (const fallbackKey of keys) {
4513
- if (value && typeof value === 'object' && fallbackKey in value) {
4514
- value = value[fallbackKey];
4515
- }
4516
- else {
4517
- return key; // Return the key if not found in fallback
4518
- }
4519
- }
4520
- break;
4521
- }
4522
- }
4523
- return typeof value === 'string' ? value : key;
4524
- };
4525
- const getAvailableLanguages = () => {
4526
- return [
4527
- { code: 'en', name: 'English' },
4528
- { code: 'el', name: 'Ελληνικά' }
4529
- ];
4530
- };
4531
- const isValidLanguage = (language) => {
4532
- return language === 'en' || language === 'el';
4533
- };
4534
-
4535
4552
  const useTranslation = (defaultLanguage = 'en') => {
4536
4553
  const [currentLanguage, setCurrentLanguage] = react.useState(defaultLanguage);
4537
4554
  // Update internal language state when defaultLanguage prop changes
@@ -5430,7 +5447,7 @@ const MessageList = ({ messages, streamMessages, showThoughts = false, onDeleteM
5430
5447
  selection.addRange(range);
5431
5448
  }
5432
5449
  }, [editingMessageId, editingContent]);
5433
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "fusioni-message-list", ref: scrollContainerRef, children: jsxRuntime.jsxs("div", { className: "fusioni-messages-container", children: [messages.length === 0 ? (jsxRuntime.jsx("div", { className: "fusioni-empty-messages", children: jsxRuntime.jsxs("div", { className: "fusioni-empty-messages-content", children: [jsxRuntime.jsx("svg", { width: "64", height: "64", viewBox: "0 0 24 24", fill: "none", className: "fusioni-empty-icon", children: jsxRuntime.jsx("path", { d: "M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), jsxRuntime.jsx("h3", { children: "Start a conversation" }), jsxRuntime.jsx("p", { children: "Send a message to begin chatting with the AI assistant" })] }) })) : (jsxRuntime.jsx("div", { className: "fusioni-messages", children: messages.map((message, index) => {
5450
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "fusioni-message-list", ref: scrollContainerRef, children: jsxRuntime.jsxs("div", { className: "fusioni-messages-container", children: [messages.length === 0 ? (jsxRuntime.jsx("div", { className: "fusioni-empty-messages", children: jsxRuntime.jsxs("div", { className: "fusioni-empty-messages-content", children: [jsxRuntime.jsx("svg", { width: "64", height: "64", viewBox: "0 0 24 24", fill: "none", className: "fusioni-empty-icon", children: jsxRuntime.jsx("path", { d: "M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), jsxRuntime.jsx("h3", { children: t('chat.emptyState.title') }), jsxRuntime.jsx("p", { children: t('chat.emptyState.description') })] }) })) : (jsxRuntime.jsx("div", { className: "fusioni-messages", children: messages.map((message, index) => {
5434
5451
  const isLastMessage = index === messages.length - 1;
5435
5452
  const messageKey = message.id ??
5436
5453
  `msg-fallback-${index}-${message.role}-${message.created instanceof Date ? message.created.getTime() : 0}`;
@@ -5957,56 +5974,90 @@ const useSSE = (agencyId, onMessage, isConnected = true, accessToken) => {
5957
5974
  };
5958
5975
 
5959
5976
  const THEME_STORAGE_KEY = 'fusioni-chat-theme';
5977
+ function resolveDisplayTheme(setting) {
5978
+ if (setting === 'auto') {
5979
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
5980
+ }
5981
+ if (setting === 'dark' || setting === 'light') {
5982
+ return setting;
5983
+ }
5984
+ return 'light';
5985
+ }
5960
5986
  const useTheme = (initialTheme) => {
5961
5987
  const [currentTheme, setCurrentTheme] = react.useState('light');
5962
5988
  const [isManualOverride, setIsManualOverride] = react.useState(false);
5963
- // Load theme from localStorage on initialization
5989
+ const [programmaticTheme, setProgrammaticTheme] = react.useState(null);
5990
+ const persistThemeSetting = react.useCallback((setting) => {
5991
+ try {
5992
+ if (setting === 'auto') {
5993
+ localStorage.removeItem(THEME_STORAGE_KEY);
5994
+ }
5995
+ else {
5996
+ localStorage.setItem(THEME_STORAGE_KEY, setting);
5997
+ }
5998
+ }
5999
+ catch (error) {
6000
+ console.warn('Failed to persist theme to localStorage:', error);
6001
+ }
6002
+ }, []);
6003
+ const setTheme = react.useCallback((theme) => {
6004
+ setProgrammaticTheme(theme);
6005
+ setCurrentTheme(resolveDisplayTheme(theme));
6006
+ setIsManualOverride(true);
6007
+ persistThemeSetting(theme);
6008
+ }, [persistThemeSetting]);
6009
+ // Load theme from localStorage on initialization (unless SDK / caller already set a theme)
5964
6010
  react.useEffect(() => {
6011
+ if (programmaticTheme != null) {
6012
+ return;
6013
+ }
5965
6014
  try {
5966
6015
  const savedTheme = localStorage.getItem(THEME_STORAGE_KEY);
5967
6016
  if (savedTheme === 'light' || savedTheme === 'dark') {
5968
6017
  setCurrentTheme(savedTheme);
5969
6018
  setIsManualOverride(true);
5970
- return;
5971
6019
  }
5972
6020
  }
5973
6021
  catch (error) {
5974
6022
  console.warn('Failed to load theme from localStorage:', error);
5975
6023
  }
6024
+ }, [programmaticTheme]);
6025
+ const toggleTheme = react.useCallback(() => {
6026
+ setCurrentTheme((prev) => {
6027
+ const next = prev === 'light' ? 'dark' : 'light';
6028
+ setProgrammaticTheme(next);
6029
+ setIsManualOverride(true);
6030
+ try {
6031
+ localStorage.setItem(THEME_STORAGE_KEY, next);
6032
+ }
6033
+ catch (error) {
6034
+ console.warn('Failed to save theme to localStorage:', error);
6035
+ }
6036
+ return next;
6037
+ });
5976
6038
  }, []);
5977
- const toggleTheme = () => {
5978
- const newTheme = currentTheme === 'light' ? 'dark' : 'light';
5979
- setCurrentTheme(newTheme);
5980
- setIsManualOverride(true);
5981
- // Save to localStorage
5982
- try {
5983
- localStorage.setItem(THEME_STORAGE_KEY, newTheme);
5984
- }
5985
- catch (error) {
5986
- console.warn('Failed to save theme to localStorage:', error);
5987
- }
5988
- };
5989
6039
  react.useEffect(() => {
5990
- // Check if we have a saved theme first
6040
+ if (programmaticTheme != null) {
6041
+ if (programmaticTheme === 'auto') {
6042
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
6043
+ const handleChange = () => {
6044
+ setCurrentTheme(resolveDisplayTheme('auto'));
6045
+ };
6046
+ handleChange();
6047
+ mediaQuery.addEventListener('change', handleChange);
6048
+ return () => mediaQuery.removeEventListener('change', handleChange);
6049
+ }
6050
+ return;
6051
+ }
5991
6052
  const savedTheme = localStorage.getItem(THEME_STORAGE_KEY);
5992
6053
  if (savedTheme === 'light' || savedTheme === 'dark') {
5993
- return; // Don't override saved theme
6054
+ return;
6055
+ }
6056
+ if (isManualOverride) {
6057
+ return;
5994
6058
  }
5995
- if (isManualOverride)
5996
- return; // Don't auto-update if user manually changed theme
5997
6059
  const updateTheme = () => {
5998
- if (initialTheme === 'auto') {
5999
- // Check system preference
6000
- const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
6001
- setCurrentTheme(prefersDark ? 'dark' : 'light');
6002
- }
6003
- else if (initialTheme === 'dark' || initialTheme === 'light') {
6004
- setCurrentTheme(initialTheme);
6005
- }
6006
- else {
6007
- // Default to light theme
6008
- setCurrentTheme('light');
6009
- }
6060
+ setCurrentTheme(resolveDisplayTheme(initialTheme));
6010
6061
  };
6011
6062
  updateTheme();
6012
6063
  if (initialTheme === 'auto') {
@@ -6015,11 +6066,12 @@ const useTheme = (initialTheme) => {
6015
6066
  mediaQuery.addEventListener('change', handleChange);
6016
6067
  return () => mediaQuery.removeEventListener('change', handleChange);
6017
6068
  }
6018
- }, [initialTheme, isManualOverride]);
6069
+ }, [initialTheme, isManualOverride, programmaticTheme]);
6019
6070
  return {
6020
6071
  theme: currentTheme,
6021
6072
  toggleTheme,
6022
- isManualOverride
6073
+ setTheme,
6074
+ isManualOverride,
6023
6075
  };
6024
6076
  };
6025
6077
 
@@ -6041,7 +6093,8 @@ function useIsMobileLayout() {
6041
6093
  return isMobile;
6042
6094
  }
6043
6095
 
6044
- const ChatWidget = ({ config, onMessageSent, onMessageReceived, onConversationCreated, onConversationDeleted, onError }) => {
6096
+ const ChatWidget = react.forwardRef(function ChatWidget({ config, onMessageSent, onMessageReceived, onConversationCreated, onConversationDeleted, onError }, ref) {
6097
+ const [languageOverride, setLanguageOverride] = react.useState(null);
6045
6098
  const [isOpen, setIsOpen] = react.useState(false);
6046
6099
  const [isLoading, setIsLoading] = react.useState(false);
6047
6100
  const [error, setError] = react.useState(null);
@@ -6056,11 +6109,26 @@ const ChatWidget = ({ config, onMessageSent, onMessageReceived, onConversationCr
6056
6109
  const [isDeleteMessageDialogOpen, setIsDeleteMessageDialogOpen] = react.useState(false);
6057
6110
  // Refs
6058
6111
  const floatingButtonRef = react.useRef(null);
6112
+ const translationDefault = languageOverride ?? mergedConfig?.language ?? config.language ?? 'en';
6059
6113
  // Translation and language management - use merged config or fallback to user config
6060
- const { t, currentLanguage, changeLanguage } = useTranslation(mergedConfig?.language || config.language || 'en');
6114
+ const { t, currentLanguage, changeLanguage } = useTranslation(translationDefault);
6061
6115
  const { conversations, currentConversation, messages, streamMessages, setCurrentConversation, setStreamMessages, addMessage, updateMessage, removeMessage, removeOptimisticUserMessages, truncateMessagesAt, addConversation, updateConversation, removeConversation, loadConversations, loadMessages, clearMessages } = useChatState(mergedConfig?.agencyId || config.agencyId);
6062
- const { theme, toggleTheme } = useTheme(mergedConfig?.theme || config.theme);
6116
+ const { theme, toggleTheme, setTheme } = useTheme(mergedConfig?.theme || config.theme);
6063
6117
  const isMobileLayout = useIsMobileLayout();
6118
+ const handleLanguageChange = react.useCallback((language) => {
6119
+ setLanguageOverride(language);
6120
+ changeLanguage(language);
6121
+ }, [changeLanguage]);
6122
+ react.useImperativeHandle(ref, () => ({
6123
+ setLanguage: (language) => {
6124
+ if (!isValidLanguage(language)) {
6125
+ return;
6126
+ }
6127
+ setLanguageOverride(language);
6128
+ changeLanguage(language);
6129
+ },
6130
+ setTheme,
6131
+ }), [changeLanguage, setTheme]);
6064
6132
  // Initialize API client and fetch server configuration
6065
6133
  react.useEffect(() => {
6066
6134
  const initializeAndFetchConfig = async () => {
@@ -6548,8 +6616,9 @@ const ChatWidget = ({ config, onMessageSent, onMessageReceived, onConversationCr
6548
6616
  // Debug: Log the primary color and button variant being applied
6549
6617
  console.log('Primary color being applied:', mergedConfig.primaryColor || '#6366f1');
6550
6618
  console.log('Button variant being applied:', mergedConfig.buttonVariant || 'glass');
6551
- return (jsxRuntime.jsxs("div", { className: `fusioni-chat-widget ${theme}`, style: { '--primary-color': mergedConfig.primaryColor || '#6366f1' }, children: [jsxRuntime.jsx(FloatingButton, { isOpen: isOpen, onClick: handleToggleChat, position: mergedConfig.position || 'bottom-right', primaryColor: mergedConfig.primaryColor, buttonRef: floatingButtonRef, variant: mergedConfig.buttonVariant || 'glass', shouldDisplay: !hasConfigError && (!isMobileLayout || !isOpen) }), isOpen && (jsxRuntime.jsx(ChatPanel, { isOpen: isOpen, onClose: () => setIsOpen(false), position: mergedConfig.position || 'bottom-right', isFullscreen: isFullscreen, floatingButtonRef: floatingButtonRef, children: jsxRuntime.jsxs("div", { className: "fusioni-chat-container", children: [mergedConfig.showConversationList !== false && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: `fusioni-conversation-backdrop ${isConversationListOpen ? 'open' : ''}`, onClick: () => setIsConversationListOpen(false) }), jsxRuntime.jsx(ConversationList, { conversations: conversations, selectedConversationId: currentConversation?.id || undefined, onSelectConversation: handleSelectConversation, onDeleteConversation: handleDeleteConversation, onCreateConversation: handleCreateConversation, isOpen: isConversationListOpen, currentLanguage: currentLanguage })] })), jsxRuntime.jsxs("div", { className: "fusioni-chat-main", children: [jsxRuntime.jsxs("div", { className: "fusioni-chat-main-header", children: [mergedConfig.showConversationList !== false ? (jsxRuntime.jsxs("button", { type: "button", onClick: handleToggleConversationList, className: `fusioni-conversation-toggle ${isConversationListOpen ? 'open' : ''}`, children: [jsxRuntime.jsx("svg", { className: "fusioni-conversation-toggle-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsxRuntime.jsx("path", { d: "M3 12h18M3 6h18M3 18h18" }) }), t('chat.conversations.title')] })) : (jsxRuntime.jsx("span", { className: "fusioni-chat-main-header-title", children: t('chat.title') })), jsxRuntime.jsxs("div", { className: "fusioni-header-actions", children: [isMobileLayout && (jsxRuntime.jsx("button", { type: "button", onClick: () => setIsOpen(false), className: "fusioni-btn fusioni-btn-icon fusioni-chat-toolbar-close-mobile", title: t('common.close'), "aria-label": t('common.close'), children: jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", "aria-hidden": "true", children: jsxRuntime.jsx("path", { d: "M18 6L6 18M6 6L18 18", strokeLinecap: "round", strokeLinejoin: "round" }) }) })), jsxRuntime.jsx("button", { type: "button", onClick: toggleTheme, className: "fusioni-btn fusioni-btn-icon", title: theme === 'dark' ? t('chat.theme.light') : t('chat.theme.dark'), children: theme === 'dark' ? (jsxRuntime.jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "5" }), jsxRuntime.jsx("line", { x1: "12", y1: "1", x2: "12", y2: "3" }), jsxRuntime.jsx("line", { x1: "12", y1: "21", x2: "12", y2: "23" }), jsxRuntime.jsx("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }), jsxRuntime.jsx("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }), jsxRuntime.jsx("line", { x1: "1", y1: "12", x2: "3", y2: "12" }), jsxRuntime.jsx("line", { x1: "21", y1: "12", x2: "23", y2: "12" }), jsxRuntime.jsx("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }), jsxRuntime.jsx("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })] })) : (jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsxRuntime.jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) })) }), jsxRuntime.jsx("button", { type: "button", onClick: handleToggleFullscreen, className: "fusioni-btn fusioni-btn-icon", title: isFullscreen ? t('chat.fullscreen.exit') : t('chat.fullscreen.enter'), children: isFullscreen ? (jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsxRuntime.jsx("path", { d: "M8 3V5M8 3H5M8 3L3 8M16 3V5M16 3H19M16 3L21 8M8 21V19M8 21H5M8 21L3 16M16 21V19M16 21H19M16 21L21 16" }) })) : (jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsxRuntime.jsx("path", { d: "M8 3H5C4.46957 3 3.96086 3.21071 3.58579 3.58579C3.21071 3.96086 3 4.46957 3 5V8M21 8V5C21 4.46957 20.7893 3.96086 20.4142 3.58579C20.0391 3.21071 19.5304 3 19 3H16M16 21H19C19.5304 21 20.0391 20.7893 20.4142 20.4142C20.7893 20.0391 21 19.5304 21 19V16M3 16V19C3 19.5304 3.21071 20.0391 3.58579 20.4142C3.96086 20.7893 4.46957 21 5 21H8" }) })) }), jsxRuntime.jsx(LanguageSwitcher, { currentLanguage: currentLanguage, onLanguageChange: changeLanguage })] })] }), currentConversation ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(MessageList, { messages: messages, streamMessages: streamMessages, showThoughts: false, onDeleteMessage: handleDeleteMessage, onEditMessage: handleEditMessage, onConfirmation: handleConfirmation, enableButtons: !isLoading, apiBaseUrl: mergedConfig.apiBaseUrl, apiKey: mergedConfig.accessToken, agencyId: mergedConfig.agencyId, currentLanguage: currentLanguage, theme: theme }), jsxRuntime.jsx(ChatInput, { onSendMessage: handleSendMessage, onFileUpload: handleFileUpload, disabled: isLoading, placeholder: t('chat.input.placeholder'), enableAudioRecording: mergedConfig.enableAudioRecording !== false, enableFileUpload: mergedConfig.enableFileUpload !== false, maxFileSize: mergedConfig.maxFileSize || 10, allowedFileTypes: mergedConfig.allowedFileTypes || ['image/*'], currentLanguage: currentLanguage })] })) : (jsxRuntime.jsx("div", { className: "fusioni-chat-welcome", children: jsxRuntime.jsxs("div", { className: "fusioni-chat-welcome-content", children: [jsxRuntime.jsx("h3", { children: t('chat.welcome.title') }), jsxRuntime.jsx("p", { children: t('chat.welcome.description') }), jsxRuntime.jsx("button", { onClick: handleCreateConversation, disabled: isLoading, className: "fusioni-btn fusioni-btn-primary", children: isLoading ? t('chat.welcome.creating') : t('chat.welcome.startButton') })] }) }))] })] }) })), jsxRuntime.jsx(ConfirmationDialog, { isOpen: isDeleteDialogOpen, title: t('chat.conversations.deleteConfirm.title'), message: t('chat.conversations.deleteConfirm.message'), confirmText: t('chat.conversations.deleteConfirm.confirm'), cancelText: t('chat.conversations.deleteConfirm.cancel'), onConfirm: confirmDeleteConversation, onCancel: cancelDeleteConversation, currentLanguage: currentLanguage, variant: "danger" }), jsxRuntime.jsx(ConfirmationDialog, { isOpen: isDeleteMessageDialogOpen, title: t('chat.messages.deleteConfirm.title'), message: t('chat.messages.deleteConfirm.message'), confirmText: t('chat.messages.deleteConfirm.confirm'), cancelText: t('chat.messages.deleteConfirm.cancel'), onConfirm: confirmDeleteMessage, onCancel: cancelDeleteMessage, currentLanguage: currentLanguage, variant: "danger" })] }));
6552
- };
6619
+ return (jsxRuntime.jsxs("div", { className: `fusioni-chat-widget ${theme}`, style: { '--primary-color': mergedConfig.primaryColor || '#6366f1' }, children: [jsxRuntime.jsx(FloatingButton, { isOpen: isOpen, onClick: handleToggleChat, position: mergedConfig.position || 'bottom-right', primaryColor: mergedConfig.primaryColor, buttonRef: floatingButtonRef, variant: mergedConfig.buttonVariant || 'glass', shouldDisplay: !hasConfigError && (!isMobileLayout || !isOpen) }), isOpen && (jsxRuntime.jsx(ChatPanel, { isOpen: isOpen, onClose: () => setIsOpen(false), position: mergedConfig.position || 'bottom-right', isFullscreen: isFullscreen, floatingButtonRef: floatingButtonRef, children: jsxRuntime.jsxs("div", { className: "fusioni-chat-container", children: [mergedConfig.showConversationList !== false && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: `fusioni-conversation-backdrop ${isConversationListOpen ? 'open' : ''}`, onClick: () => setIsConversationListOpen(false) }), jsxRuntime.jsx(ConversationList, { conversations: conversations, selectedConversationId: currentConversation?.id || undefined, onSelectConversation: handleSelectConversation, onDeleteConversation: handleDeleteConversation, onCreateConversation: handleCreateConversation, isOpen: isConversationListOpen, currentLanguage: currentLanguage })] })), jsxRuntime.jsxs("div", { className: "fusioni-chat-main", children: [jsxRuntime.jsxs("div", { className: "fusioni-chat-main-header", children: [mergedConfig.showConversationList !== false ? (jsxRuntime.jsxs("button", { type: "button", onClick: handleToggleConversationList, className: `fusioni-conversation-toggle ${isConversationListOpen ? 'open' : ''}`, children: [jsxRuntime.jsx("svg", { className: "fusioni-conversation-toggle-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsxRuntime.jsx("path", { d: "M3 12h18M3 6h18M3 18h18" }) }), t('chat.conversations.title')] })) : (jsxRuntime.jsx("span", { className: "fusioni-chat-main-header-title", children: t('chat.title') })), jsxRuntime.jsxs("div", { className: "fusioni-header-actions", children: [isMobileLayout && (jsxRuntime.jsx("button", { type: "button", onClick: () => setIsOpen(false), className: "fusioni-btn fusioni-btn-icon fusioni-chat-toolbar-close-mobile", title: t('common.close'), "aria-label": t('common.close'), children: jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", "aria-hidden": "true", children: jsxRuntime.jsx("path", { d: "M18 6L6 18M6 6L18 18", strokeLinecap: "round", strokeLinejoin: "round" }) }) })), mergedConfig.showThemeToggle !== false && (jsxRuntime.jsx("button", { type: "button", onClick: toggleTheme, className: "fusioni-btn fusioni-btn-icon", title: theme === 'dark' ? t('chat.theme.light') : t('chat.theme.dark'), children: theme === 'dark' ? (jsxRuntime.jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "5" }), jsxRuntime.jsx("line", { x1: "12", y1: "1", x2: "12", y2: "3" }), jsxRuntime.jsx("line", { x1: "12", y1: "21", x2: "12", y2: "23" }), jsxRuntime.jsx("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }), jsxRuntime.jsx("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }), jsxRuntime.jsx("line", { x1: "1", y1: "12", x2: "3", y2: "12" }), jsxRuntime.jsx("line", { x1: "21", y1: "12", x2: "23", y2: "12" }), jsxRuntime.jsx("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }), jsxRuntime.jsx("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })] })) : (jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsxRuntime.jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) })) })), mergedConfig.showFullscreenToggle !== false && (jsxRuntime.jsx("button", { type: "button", onClick: handleToggleFullscreen, className: "fusioni-btn fusioni-btn-icon", title: isFullscreen ? t('chat.fullscreen.exit') : t('chat.fullscreen.enter'), children: isFullscreen ? (jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsxRuntime.jsx("path", { d: "M8 3V5M8 3H5M8 3L3 8M16 3V5M16 3H19M16 3L21 8M8 21V19M8 21H5M8 21L3 16M16 21V19M16 21H19M16 21L21 16" }) })) : (jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsxRuntime.jsx("path", { d: "M8 3H5C4.46957 3 3.96086 3.21071 3.58579 3.58579C3.21071 3.96086 3 4.46957 3 5V8M21 8V5C21 4.46957 20.7893 3.96086 20.4142 3.58579C20.0391 3.21071 19.5304 3 19 3H16M16 21H19C19.5304 21 20.0391 20.7893 20.4142 20.4142C20.7893 20.0391 21 19.5304 21 19V16M3 16V19C3 19.5304 3.21071 20.0391 3.58579 20.4142C3.96086 20.7893 4.46957 21 5 21H8" }) })) })), mergedConfig.showLanguageSwitcher !== false && (jsxRuntime.jsx(LanguageSwitcher, { currentLanguage: currentLanguage, onLanguageChange: handleLanguageChange }))] })] }), currentConversation ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(MessageList, { messages: messages, streamMessages: streamMessages, showThoughts: false, onDeleteMessage: handleDeleteMessage, onEditMessage: handleEditMessage, onConfirmation: handleConfirmation, enableButtons: !isLoading, apiBaseUrl: mergedConfig.apiBaseUrl, apiKey: mergedConfig.accessToken, agencyId: mergedConfig.agencyId, currentLanguage: currentLanguage, theme: theme }), jsxRuntime.jsx(ChatInput, { onSendMessage: handleSendMessage, onFileUpload: handleFileUpload, disabled: isLoading, placeholder: t('chat.input.placeholder'), enableAudioRecording: mergedConfig.enableAudioRecording !== false, enableFileUpload: mergedConfig.enableFileUpload !== false, maxFileSize: mergedConfig.maxFileSize || 10, allowedFileTypes: mergedConfig.allowedFileTypes || ['image/*'], currentLanguage: currentLanguage })] })) : (jsxRuntime.jsx("div", { className: "fusioni-chat-welcome", children: jsxRuntime.jsxs("div", { className: "fusioni-chat-welcome-content", children: [jsxRuntime.jsx("h3", { children: t('chat.welcome.title') }), jsxRuntime.jsx("p", { children: t('chat.welcome.description') }), jsxRuntime.jsx("button", { onClick: handleCreateConversation, disabled: isLoading, className: "fusioni-btn fusioni-btn-primary", children: isLoading ? t('chat.welcome.creating') : t('chat.welcome.startButton') })] }) }))] })] }) })), jsxRuntime.jsx(ConfirmationDialog, { isOpen: isDeleteDialogOpen, title: t('chat.conversations.deleteConfirm.title'), message: t('chat.conversations.deleteConfirm.message'), confirmText: t('chat.conversations.deleteConfirm.confirm'), cancelText: t('chat.conversations.deleteConfirm.cancel'), onConfirm: confirmDeleteConversation, onCancel: cancelDeleteConversation, currentLanguage: currentLanguage, variant: "danger" }), jsxRuntime.jsx(ConfirmationDialog, { isOpen: isDeleteMessageDialogOpen, title: t('chat.messages.deleteConfirm.title'), message: t('chat.messages.deleteConfirm.message'), confirmText: t('chat.messages.deleteConfirm.confirm'), cancelText: t('chat.messages.deleteConfirm.cancel'), onConfirm: confirmDeleteMessage, onCancel: cancelDeleteMessage, currentLanguage: currentLanguage, variant: "danger" })] }));
6620
+ });
6621
+ ChatWidget.displayName = 'ChatWidget';
6553
6622
 
6554
6623
  const FileUpload = ({ onFileSelect, accept = 'image/*', maxSize = 10, disabled = false, className = '' }) => {
6555
6624
  const fileInputRef = react.useRef(null);