@crestapps/ai-chat-ui 1.0.0-preview.9 → 1.0.0-preview.95

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.
Files changed (35) hide show
  1. package/dist/ai-chat-widget.js +962 -0
  2. package/dist/ai-chat-widget.js.map +1 -0
  3. package/dist/ai-chat-widget.min.js +2 -0
  4. package/dist/ai-chat-widget.min.js.map +1 -0
  5. package/dist/ai-chat.css +45 -14
  6. package/dist/ai-chat.css.map +1 -1
  7. package/dist/ai-chat.js +1076 -1019
  8. package/dist/ai-chat.js.map +1 -1
  9. package/dist/ai-chat.min.css +1 -1
  10. package/dist/ai-chat.min.js +1 -1
  11. package/dist/ai-chat.min.js.map +1 -1
  12. package/dist/chat-interaction-settings.js +297 -0
  13. package/dist/chat-interaction-settings.js.map +1 -0
  14. package/dist/chat-interaction-settings.min.js +2 -0
  15. package/dist/chat-interaction-settings.min.js.map +1 -0
  16. package/dist/chat-interaction.js +1224 -325
  17. package/dist/chat-interaction.js.map +1 -1
  18. package/dist/chat-interaction.min.js +1 -1
  19. package/dist/chat-interaction.min.js.map +1 -1
  20. package/dist/chat-widget.css +48 -26
  21. package/dist/chat-widget.css.map +1 -1
  22. package/dist/chat-widget.min.css +1 -1
  23. package/dist/document-drop-zone.css +10 -10
  24. package/dist/document-drop-zone.css.map +1 -1
  25. package/dist/document-drop-zone.js +92 -14
  26. package/dist/document-drop-zone.js.map +1 -1
  27. package/dist/document-drop-zone.min.css +1 -1
  28. package/dist/document-drop-zone.min.js +1 -1
  29. package/dist/document-drop-zone.min.js.map +1 -1
  30. package/dist/technical-name-generator.js +36 -8
  31. package/dist/technical-name-generator.js.map +1 -1
  32. package/dist/technical-name-generator.min.js +1 -1
  33. package/dist/technical-name-generator.min.js.map +1 -1
  34. package/package.json +9 -1
  35. package/README.md +0 -145
@@ -0,0 +1,962 @@
1
+ /*
2
+ ** NOTE: This file is generated by Gulp and should not be edited directly!
3
+ ** Any changes made directly to this file will be overwritten next time its asset group is processed by Gulp.
4
+ */
5
+
6
+ function clampWidgetValue(value, min, max) {
7
+ return Math.min(Math.max(value, min), max);
8
+ }
9
+ window.coreAIChatWidgetBehavior = window.coreAIChatWidgetBehavior || function () {
10
+ function parsePixelValue(value) {
11
+ if (typeof value === 'number' && Number.isFinite(value)) {
12
+ return value;
13
+ }
14
+ if (typeof value !== 'string') {
15
+ return null;
16
+ }
17
+ var parsed = parseFloat(value);
18
+ return Number.isFinite(parsed) ? parsed : null;
19
+ }
20
+ function attach(app, config) {
21
+ if (!app || app.__aiChatWidgetAttached) {
22
+ return;
23
+ }
24
+ app.__aiChatWidgetAttached = true;
25
+ app.chatWidgetStateName = null;
26
+ app.chatWidgetStateSession = null;
27
+ app.chatWidgetStateDocuments = null;
28
+ app.chatWidgetLayoutKey = null;
29
+ app.chatHistorySection = null;
30
+ app.widgetContainerElement = null;
31
+ app.widgetToggleButtonElement = null;
32
+ app.widgetResetSizeButtonElement = null;
33
+ app.widgetResizeObserver = null;
34
+ app.widgetViewportResizeHandler = null;
35
+ app.widgetDefaultWidth = null;
36
+ app.widgetDefaultHeight = null;
37
+ app.widgetIsInitialized = false;
38
+ app.getStoredWidgetLayout = function () {
39
+ if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {
40
+ return {};
41
+ }
42
+ try {
43
+ var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey);
44
+ return storedLayout ? JSON.parse(storedLayout) || {} : {};
45
+ } catch (error) {
46
+ console.warn('Failed to read widget layout state.', error);
47
+ return {};
48
+ }
49
+ };
50
+ app.saveStoredWidgetLayout = function (partialLayout) {
51
+ if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {
52
+ return;
53
+ }
54
+ var currentLayout = this.getStoredWidgetLayout();
55
+ var nextLayout = Object.assign({}, currentLayout);
56
+ if (partialLayout.panel !== undefined) {
57
+ nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {});
58
+ }
59
+ if (partialLayout.position !== undefined) {
60
+ nextLayout.position = Object.assign({}, currentLayout.position || {}, partialLayout.position || {});
61
+ }
62
+ localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout));
63
+ };
64
+ app.getElementSize = function (element, fallbackWidth, fallbackHeight) {
65
+ if (!element) {
66
+ return {
67
+ width: fallbackWidth || 0,
68
+ height: fallbackHeight || 0
69
+ };
70
+ }
71
+ var rect = element.getBoundingClientRect();
72
+ var computed = window.getComputedStyle(element);
73
+ return {
74
+ width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0),
75
+ height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0)
76
+ };
77
+ };
78
+ app.getElementPosition = function (element) {
79
+ if (!element) {
80
+ return {
81
+ left: 0,
82
+ top: 0
83
+ };
84
+ }
85
+ var rect = element.getBoundingClientRect();
86
+ var computed = window.getComputedStyle(element);
87
+ var inlineLeft = parsePixelValue(element.style.left);
88
+ var inlineTop = parsePixelValue(element.style.top);
89
+ var computedLeft = parsePixelValue(computed.left);
90
+ var computedTop = parsePixelValue(computed.top);
91
+ var isHidden = computed.display === 'none';
92
+ return {
93
+ left: Math.round(isHidden && Number.isFinite(inlineLeft) ? inlineLeft : rect.left || inlineLeft || computedLeft || 0),
94
+ top: Math.round(isHidden && Number.isFinite(inlineTop) ? inlineTop : rect.top || inlineTop || computedTop || 0)
95
+ };
96
+ };
97
+ app.getAvailableWidgetPositionRange = function (width, height) {
98
+ var viewportPadding = 8;
99
+ return {
100
+ padding: viewportPadding,
101
+ maxLeft: Math.max(viewportPadding, window.innerWidth - width - viewportPadding),
102
+ maxTop: Math.max(viewportPadding, window.innerHeight - height - viewportPadding)
103
+ };
104
+ };
105
+ app.createStoredPosition = function (left, top, width, height) {
106
+ var range = this.getAvailableWidgetPositionRange(width, height);
107
+ var leftSpan = Math.max(0, range.maxLeft - range.padding);
108
+ var topSpan = Math.max(0, range.maxTop - range.padding);
109
+ return {
110
+ left: Math.round(left),
111
+ top: Math.round(top),
112
+ leftRatio: leftSpan === 0 ? 0 : (left - range.padding) / leftSpan,
113
+ topRatio: topSpan === 0 ? 0 : (top - range.padding) / topSpan
114
+ };
115
+ };
116
+ app.resolveStoredPosition = function (storedPosition, width, height) {
117
+ if (!storedPosition) {
118
+ return null;
119
+ }
120
+ var range = this.getAvailableWidgetPositionRange(width, height);
121
+ var left = Number(storedPosition.left);
122
+ var top = Number(storedPosition.top);
123
+ var leftRatio = Number(storedPosition.leftRatio);
124
+ var topRatio = Number(storedPosition.topRatio);
125
+ if (Number.isFinite(leftRatio)) {
126
+ left = range.padding + Math.max(0, range.maxLeft - range.padding) * leftRatio;
127
+ }
128
+ if (Number.isFinite(topRatio)) {
129
+ top = range.padding + Math.max(0, range.maxTop - range.padding) * topRatio;
130
+ }
131
+ if (!Number.isFinite(left) || !Number.isFinite(top)) {
132
+ return null;
133
+ }
134
+ return this.clampWidgetPosition(left, top, width, height);
135
+ };
136
+ app.clampWidgetPosition = function (left, top, width, height) {
137
+ var range = this.getAvailableWidgetPositionRange(width, height);
138
+ return {
139
+ left: Math.round(clampWidgetValue(left, range.padding, range.maxLeft)),
140
+ top: Math.round(clampWidgetValue(top, range.padding, range.maxTop))
141
+ };
142
+ };
143
+ app.getStoredWidgetDocuments = function () {
144
+ this.clearStoredWidgetDocuments();
145
+ return [];
146
+ };
147
+ app.saveStoredWidgetDocuments = function () {
148
+ this.clearStoredWidgetDocuments();
149
+ };
150
+ app.clearStoredWidgetDocuments = function () {
151
+ if (!this.chatWidgetStateDocuments) {
152
+ return;
153
+ }
154
+ localStorage.removeItem(this.chatWidgetStateDocuments);
155
+ };
156
+ app.applyAbsolutePosition = function (element, left, top) {
157
+ if (!element) {
158
+ return;
159
+ }
160
+ element.style.left = left + 'px';
161
+ element.style.top = top + 'px';
162
+ element.style.right = 'auto';
163
+ element.style.bottom = 'auto';
164
+ };
165
+ app.getWidgetDefaultSize = function () {
166
+ return {
167
+ width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380,
168
+ height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520
169
+ };
170
+ };
171
+ app.getWidgetToggleGap = function () {
172
+ return 8;
173
+ };
174
+ app.isWidgetPanelVisible = function () {
175
+ if (!this.widgetContainerElement) {
176
+ return false;
177
+ }
178
+ var computed = window.getComputedStyle(this.widgetContainerElement);
179
+ return this.widgetContainerElement.classList.contains('open') && computed.display !== 'none';
180
+ };
181
+ app.persistWidgetPanelPosition = function () {
182
+ if (!this.widgetContainerElement || !config.widget.persistLayout) {
183
+ return;
184
+ }
185
+ var panelDefaultSize = this.getWidgetDefaultSize();
186
+ var panelPosition = this.getElementPosition(this.widgetContainerElement);
187
+ var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);
188
+ var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);
189
+ var linkedPosition = this.clampWidgetPosition(panelPosition.left + panelSize.width - toggleSize.width, panelPosition.top + panelSize.height + this.getWidgetToggleGap(), toggleSize.width, toggleSize.height);
190
+ this.saveStoredWidgetLayout({
191
+ position: this.createStoredPosition(linkedPosition.left, linkedPosition.top, toggleSize.width, toggleSize.height)
192
+ });
193
+ };
194
+ app.persistWidgetTogglePosition = function () {
195
+ if (!this.widgetToggleButtonElement || !config.widget.persistLayout) {
196
+ return;
197
+ }
198
+ var togglePosition = this.getElementPosition(this.widgetToggleButtonElement);
199
+ var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);
200
+ this.saveStoredWidgetLayout({
201
+ position: this.createStoredPosition(togglePosition.left, togglePosition.top, toggleSize.width, toggleSize.height)
202
+ });
203
+ };
204
+ app.persistWidgetPanelSize = function () {
205
+ if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) {
206
+ return;
207
+ }
208
+ var defaultSize = this.getWidgetDefaultSize();
209
+ var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);
210
+ this.saveStoredWidgetLayout({
211
+ panel: {
212
+ width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width,
213
+ height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height
214
+ }
215
+ });
216
+ };
217
+ app.syncTogglePositionToPanel = function (persistLayout) {
218
+ if (persistLayout === undefined) {
219
+ persistLayout = true;
220
+ }
221
+ if (!this.widgetContainerElement || !this.widgetToggleButtonElement) {
222
+ return;
223
+ }
224
+ var panelDefaultSize = this.getWidgetDefaultSize();
225
+ var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);
226
+ var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);
227
+ var panelPosition = this.getElementPosition(this.widgetContainerElement);
228
+ var linkedPosition = this.clampWidgetPosition(panelPosition.left + panelSize.width - toggleSize.width, panelPosition.top + panelSize.height + this.getWidgetToggleGap(), toggleSize.width, toggleSize.height);
229
+ this.applyAbsolutePosition(this.widgetToggleButtonElement, linkedPosition.left, linkedPosition.top);
230
+ if (persistLayout && config.widget.persistLayout) {
231
+ this.persistWidgetTogglePosition();
232
+ }
233
+ };
234
+ app.syncPanelPositionToToggle = function (persistLayout) {
235
+ if (persistLayout === undefined) {
236
+ persistLayout = true;
237
+ }
238
+ if (!this.widgetContainerElement || !this.widgetToggleButtonElement) {
239
+ return;
240
+ }
241
+ var panelDefaultSize = this.getWidgetDefaultSize();
242
+ var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);
243
+ var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);
244
+ var togglePosition = this.getElementPosition(this.widgetToggleButtonElement);
245
+ var linkedPosition = this.clampWidgetPosition(togglePosition.left + toggleSize.width - panelSize.width, togglePosition.top - panelSize.height - this.getWidgetToggleGap(), panelSize.width, panelSize.height);
246
+ this.applyAbsolutePosition(this.widgetContainerElement, linkedPosition.left, linkedPosition.top);
247
+ if (persistLayout && config.widget.persistLayout) {
248
+ this.persistWidgetPanelPosition();
249
+ }
250
+ };
251
+ app.updateWidgetResetSizeButtonVisibility = function () {
252
+ if (!this.widgetResetSizeButtonElement) {
253
+ return;
254
+ }
255
+ if (!config.widget.enableResizing || !this.widgetContainerElement) {
256
+ this.widgetResetSizeButtonElement.classList.add('d-none');
257
+ return;
258
+ }
259
+ var defaultSize = this.getWidgetDefaultSize();
260
+ var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);
261
+ var isResized = Math.abs(currentSize.width - defaultSize.width) > 1 || Math.abs(currentSize.height - defaultSize.height) > 1 || !!this.widgetContainerElement.style.width || !!this.widgetContainerElement.style.height;
262
+ this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized);
263
+ };
264
+ app.resetWidgetSize = function () {
265
+ if (!this.widgetContainerElement || !config.widget.enableResizing) {
266
+ return;
267
+ }
268
+ this.widgetContainerElement.style.removeProperty('width');
269
+ this.widgetContainerElement.style.removeProperty('height');
270
+ this.persistWidgetPanelSize();
271
+ this.constrainWidgetElementsToViewport();
272
+ this.updateWidgetResetSizeButtonVisibility();
273
+ };
274
+ app.restoreWidgetLayout = function () {
275
+ var storedLayout = this.getStoredWidgetLayout();
276
+ if (this.widgetContainerElement && config.widget.enableResizing) {
277
+ if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) {
278
+ this.widgetContainerElement.style.width = storedLayout.panel.width + 'px';
279
+ } else {
280
+ this.widgetContainerElement.style.removeProperty('width');
281
+ }
282
+ if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) {
283
+ this.widgetContainerElement.style.height = storedLayout.panel.height + 'px';
284
+ } else {
285
+ this.widgetContainerElement.style.removeProperty('height');
286
+ }
287
+ }
288
+ var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);
289
+ var storedTogglePosition = this.resolveStoredPosition(storedLayout.position, toggleSize.width, toggleSize.height);
290
+ if (this.widgetToggleButtonElement && config.widget.enableDragging && storedTogglePosition) {
291
+ this.applyAbsolutePosition(this.widgetToggleButtonElement, storedTogglePosition.left, storedTogglePosition.top);
292
+ this.syncPanelPositionToToggle(false);
293
+ } else if (this.widgetToggleButtonElement && config.widget.enableDragging && Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) && Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) {
294
+ this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top);
295
+ this.syncPanelPositionToToggle(false);
296
+ } else if (this.widgetContainerElement && config.widget.enableDragging && Number.isFinite(storedLayout.panel && storedLayout.panel.left) && Number.isFinite(storedLayout.panel && storedLayout.panel.top)) {
297
+ this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top);
298
+ this.syncTogglePositionToPanel(false);
299
+ }
300
+ this.constrainWidgetElementsToViewport();
301
+ this.updateWidgetResetSizeButtonVisibility();
302
+ };
303
+ app.attachDraggableWidgetElement = function (element, handle, layoutKey, suppressClickOnDrag) {
304
+ if (!element || !handle || !config.widget.enableDragging) {
305
+ return;
306
+ }
307
+ var activePointerId = null;
308
+ var startX = 0;
309
+ var startY = 0;
310
+ var startLeft = 0;
311
+ var startTop = 0;
312
+ var dragged = false;
313
+ var dragThreshold = 4;
314
+ var interactiveSelector = 'button, a, input, textarea, select, option, label';
315
+ var self = this;
316
+ function stopDragging(event) {
317
+ if (activePointerId === null) {
318
+ return;
319
+ }
320
+ if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) {
321
+ return;
322
+ }
323
+ document.removeEventListener('pointermove', onPointerMove);
324
+ document.removeEventListener('pointerup', stopDragging);
325
+ document.removeEventListener('pointercancel', stopDragging);
326
+ element.classList.remove('ai-chat-widget-dragging');
327
+ activePointerId = null;
328
+ if (!dragged) {
329
+ return;
330
+ }
331
+ if (layoutKey === 'panel') {
332
+ self.syncTogglePositionToPanel(false);
333
+ self.persistWidgetPanelPosition();
334
+ } else if (layoutKey === 'toggle') {
335
+ self.syncPanelPositionToToggle(false);
336
+ self.persistWidgetTogglePosition();
337
+ }
338
+ if (config.widget.persistLayout) {
339
+ self.persistWidgetPanelPosition();
340
+ self.persistWidgetTogglePosition();
341
+ }
342
+ if (suppressClickOnDrag) {
343
+ element.dataset.dragSuppressClick = 'true';
344
+ window.setTimeout(function () {
345
+ if (element.dataset.dragSuppressClick === 'true') {
346
+ element.dataset.dragSuppressClick = 'false';
347
+ }
348
+ }, 0);
349
+ }
350
+ }
351
+ function onPointerMove(event) {
352
+ if (activePointerId === null || event.pointerId !== activePointerId) {
353
+ return;
354
+ }
355
+ var deltaX = event.clientX - startX;
356
+ var deltaY = event.clientY - startY;
357
+ if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) {
358
+ return;
359
+ }
360
+ dragged = true;
361
+ var defaultSize = self.getWidgetDefaultSize();
362
+ var currentSize = self.getElementSize(element, layoutKey === 'panel' ? defaultSize.width : 52, layoutKey === 'panel' ? defaultSize.height : 52);
363
+ var nextPosition = self.clampWidgetPosition(startLeft + deltaX, startTop + deltaY, currentSize.width, currentSize.height);
364
+ self.applyAbsolutePosition(element, nextPosition.left, nextPosition.top);
365
+ if (layoutKey === 'panel') {
366
+ self.syncTogglePositionToPanel(false);
367
+ } else if (layoutKey === 'toggle') {
368
+ self.syncPanelPositionToToggle(false);
369
+ }
370
+ }
371
+ handle.addEventListener('pointerdown', function (event) {
372
+ if (event.button !== 0) {
373
+ return;
374
+ }
375
+ if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) {
376
+ return;
377
+ }
378
+ var rect = element.getBoundingClientRect();
379
+ startX = event.clientX;
380
+ startY = event.clientY;
381
+ startLeft = rect.left;
382
+ startTop = rect.top;
383
+ dragged = false;
384
+ activePointerId = event.pointerId;
385
+ element.classList.add('ai-chat-widget-dragging');
386
+ if (handle.setPointerCapture) {
387
+ handle.setPointerCapture(event.pointerId);
388
+ }
389
+ document.addEventListener('pointermove', onPointerMove);
390
+ document.addEventListener('pointerup', stopDragging);
391
+ document.addEventListener('pointercancel', stopDragging);
392
+ event.preventDefault();
393
+ });
394
+ };
395
+ app.constrainWidgetElementsToViewport = function () {
396
+ if (this.widgetContainerElement && this.widgetContainerElement.style.left && this.isWidgetPanelVisible()) {
397
+ var panelDefaultSize = this.getWidgetDefaultSize();
398
+ var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);
399
+ var panelPosition = this.getElementPosition(this.widgetContainerElement);
400
+ var clampedPanel = this.clampWidgetPosition(panelPosition.left, panelPosition.top, panelSize.width, panelSize.height);
401
+ this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top);
402
+ this.syncTogglePositionToPanel(false);
403
+ if (config.widget.persistLayout) {
404
+ this.persistWidgetPanelPosition();
405
+ this.persistWidgetTogglePosition();
406
+ }
407
+ } else if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) {
408
+ var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);
409
+ var togglePosition = this.getElementPosition(this.widgetToggleButtonElement);
410
+ var clampedToggle = this.clampWidgetPosition(togglePosition.left, togglePosition.top, toggleSize.width, toggleSize.height);
411
+ this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top);
412
+ this.syncPanelPositionToToggle(false);
413
+ if (config.widget.persistLayout) {
414
+ this.persistWidgetTogglePosition();
415
+ this.persistWidgetPanelPosition();
416
+ }
417
+ }
418
+ };
419
+ app.showChatScreen = function () {
420
+ if (!this.chatHistorySection) {
421
+ return;
422
+ }
423
+ this.chatHistorySection.classList.remove('show');
424
+ };
425
+ }
426
+ function initialize(app, config) {
427
+ if (!app || app.widgetIsInitialized) {
428
+ return;
429
+ }
430
+ if (!config.widget.chatWidgetContainer) {
431
+ console.error('The widget chatWidgetContainer is required.');
432
+ return;
433
+ }
434
+ if (!config.widget.chatWidgetStateName) {
435
+ console.error('The widget chatWidgetStateName is required.');
436
+ return;
437
+ }
438
+ var chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);
439
+ if (!chatWidgetContainer) {
440
+ return;
441
+ }
442
+ if (config.widget.chatHistorySection) {
443
+ app.chatHistorySection = document.querySelector(config.widget.chatHistorySection);
444
+ }
445
+ app.chatWidgetStateName = config.widget.chatWidgetStateName;
446
+ app.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';
447
+ app.chatWidgetStateDocuments = config.widget.chatWidgetStateName + 'Documents';
448
+ app.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout';
449
+ app.widgetContainerElement = chatWidgetContainer;
450
+ app.widgetToggleButtonElement = config.widget.toggleButtonSelector ? document.querySelector(config.widget.toggleButtonSelector) : null;
451
+ app.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector ? document.querySelector(config.widget.resetSizeButtonSelector) : null;
452
+ app.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) || parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) || 380;
453
+ app.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) || parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) || 520;
454
+ app.widgetIsInitialized = true;
455
+ app.clearStoredWidgetDocuments();
456
+ app.documents = [];
457
+ if (config.widget.enableResizing) {
458
+ chatWidgetContainer.classList.add('ai-chat-widget-resizable');
459
+ chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px';
460
+ chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px';
461
+ if (typeof ResizeObserver !== 'undefined') {
462
+ app.widgetResizeObserver = new ResizeObserver(function () {
463
+ app.persistWidgetPanelSize();
464
+ app.constrainWidgetElementsToViewport();
465
+ app.updateWidgetResetSizeButtonVisibility();
466
+ });
467
+ app.widgetResizeObserver.observe(chatWidgetContainer);
468
+ }
469
+ }
470
+ var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header';
471
+ var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector);
472
+ if (config.widget.enableDragging && dragHandle) {
473
+ dragHandle.classList.add('ai-chat-widget-drag-handle');
474
+ chatWidgetContainer.classList.add('ai-chat-widget-draggable');
475
+ app.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false);
476
+ }
477
+ if (config.widget.enableDragging && app.widgetToggleButtonElement) {
478
+ app.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable');
479
+ app.attachDraggableWidgetElement(app.widgetToggleButtonElement, app.widgetToggleButtonElement, 'toggle', true);
480
+ }
481
+ if (app.widgetResetSizeButtonElement) {
482
+ app.widgetResetSizeButtonElement.addEventListener('click', function (event) {
483
+ event.preventDefault();
484
+ app.resetWidgetSize();
485
+ });
486
+ }
487
+ app.restoreWidgetLayout();
488
+ if (!app.widgetViewportResizeHandler) {
489
+ app.widgetViewportResizeHandler = function () {
490
+ if (config.widget.persistLayout) {
491
+ app.restoreWidgetLayout();
492
+ } else {
493
+ app.constrainWidgetElementsToViewport();
494
+ }
495
+ app.updateWidgetResetSizeButtonVisibility();
496
+ };
497
+ window.addEventListener('resize', app.widgetViewportResizeHandler);
498
+ }
499
+ app.reloadCurrentSession();
500
+ if (config.autoCreateSession && !app.getSessionId()) {
501
+ app.startNewSession();
502
+ }
503
+ if (config.widget.showHistoryButton && app.chatHistorySection) {
504
+ var showHistoryButton = document.querySelector(config.widget.showHistoryButton);
505
+ if (showHistoryButton) {
506
+ showHistoryButton.addEventListener('click', function () {
507
+ app.chatHistorySection.classList.toggle('show');
508
+ });
509
+ }
510
+ if (config.widget.closeHistoryButton) {
511
+ var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);
512
+ if (closeHistoryButton) {
513
+ closeHistoryButton.addEventListener('click', function () {
514
+ app.showChatScreen();
515
+ });
516
+ }
517
+ }
518
+ }
519
+ if (config.widget.newChatButton) {
520
+ var newChatButton = document.querySelector(config.widget.newChatButton);
521
+ if (newChatButton) {
522
+ newChatButton.addEventListener('click', function () {
523
+ app.resetSession();
524
+ app.showChatScreen();
525
+ });
526
+ }
527
+ }
528
+ }
529
+ function resolveSessionId(app) {
530
+ if (!app || !app.widgetIsInitialized) {
531
+ return null;
532
+ }
533
+ return localStorage.getItem(app.chatWidgetStateSession);
534
+ }
535
+ function onSessionInitialized(app, sessionId) {
536
+ if (app && app.widgetIsInitialized) {
537
+ localStorage.setItem(app.chatWidgetStateSession, sessionId);
538
+ }
539
+ }
540
+ function onSessionReset(app) {
541
+ if (app && app.widgetIsInitialized) {
542
+ localStorage.removeItem(app.chatWidgetStateSession);
543
+ app.clearStoredWidgetDocuments();
544
+ }
545
+ }
546
+ function onDocumentsChanged(app, documents) {
547
+ if (app && app.widgetIsInitialized) {
548
+ app.saveStoredWidgetDocuments(documents);
549
+ }
550
+ }
551
+ function handleReceiveError(app) {
552
+ if (app && app.widgetIsInitialized && !app.isSessionStarted && !app._attemptedSessionRecovery) {
553
+ app._attemptedSessionRecovery = true;
554
+ localStorage.removeItem(app.chatWidgetStateSession);
555
+ app.clearStoredWidgetDocuments();
556
+ app.startNewSession();
557
+ }
558
+ }
559
+ function dispose(app) {
560
+ if (!app) {
561
+ return;
562
+ }
563
+ if (app.widgetResizeObserver) {
564
+ app.widgetResizeObserver.disconnect();
565
+ app.widgetResizeObserver = null;
566
+ }
567
+ if (app.widgetViewportResizeHandler) {
568
+ window.removeEventListener('resize', app.widgetViewportResizeHandler);
569
+ app.widgetViewportResizeHandler = null;
570
+ }
571
+ }
572
+ return {
573
+ attach: attach,
574
+ initialize: initialize,
575
+ onMounted: initialize,
576
+ resolveSessionId: resolveSessionId,
577
+ onSessionInitialized: onSessionInitialized,
578
+ onSessionReset: onSessionReset,
579
+ onDocumentsChanged: onDocumentsChanged,
580
+ handleReceiveError: handleReceiveError,
581
+ dispose: dispose,
582
+ onBeforeUnmount: dispose
583
+ };
584
+ }();
585
+ window.coreAIChatWidgetManager = window.coreAIChatWidgetManager || function () {
586
+ function getAttributeValue(element, attributeName) {
587
+ var value = element.getAttribute(attributeName);
588
+ return value === null || value === '' ? null : value;
589
+ }
590
+ function parseBooleanAttributeValue(value) {
591
+ if (value === null || value === undefined) {
592
+ return null;
593
+ }
594
+ if (typeof value === 'boolean') {
595
+ return value;
596
+ }
597
+ var normalized = String(value).trim().toLowerCase();
598
+ if (normalized === 'true') {
599
+ return true;
600
+ }
601
+ if (normalized === 'false') {
602
+ return false;
603
+ }
604
+ return null;
605
+ }
606
+ function parseJsonAttribute(element, attributeName, description) {
607
+ var rawValue = getAttributeValue(element, attributeName);
608
+ if (!rawValue) {
609
+ return null;
610
+ }
611
+ try {
612
+ return JSON.parse(rawValue);
613
+ } catch (error) {
614
+ console.error('Failed to parse ' + description + ' JSON.', error);
615
+ return null;
616
+ }
617
+ }
618
+ function buildOptionsFromDataAttributes(element) {
619
+ var widgetContainerSelector = getAttributeValue(element, 'data-coreai-chat-widget-container-selector');
620
+ if (!widgetContainerSelector) {
621
+ return null;
622
+ }
623
+ var chatConfig = null;
624
+ if (window.coreAIChatManager && typeof window.coreAIChatManager.buildConfigFromElement === 'function') {
625
+ chatConfig = window.coreAIChatManager.buildConfigFromElement(element, {
626
+ allowWidgetHost: true
627
+ });
628
+ }
629
+ var profileId = getAttributeValue(element, 'data-coreai-chat-widget-profile-id');
630
+ var profileName = getAttributeValue(element, 'data-coreai-chat-widget-profile-name');
631
+ var profileDisplayText = getAttributeValue(element, 'data-coreai-chat-widget-profile-display-text');
632
+ var profileWelcomeMessage = getAttributeValue(element, 'data-coreai-chat-widget-profile-welcome-message');
633
+ var profileChatMode = getAttributeValue(element, 'data-coreai-chat-widget-profile-chat-mode');
634
+ var profileTtsVoiceName = getAttributeValue(element, 'data-coreai-chat-widget-profile-tts-voice-name');
635
+ var profileMetricsEnabled = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-profile-enable-session-metrics'));
636
+ var profileSessionDocuments = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-profile-allow-session-documents'));
637
+ var profile = null;
638
+ if (profileId || profileName || profileDisplayText || profileWelcomeMessage || profileChatMode || profileTtsVoiceName || profileMetricsEnabled !== null || profileSessionDocuments !== null) {
639
+ profile = {
640
+ id: profileId,
641
+ name: profileName,
642
+ displayText: profileDisplayText,
643
+ welcomeMessage: profileWelcomeMessage,
644
+ chatMode: profileChatMode,
645
+ ttsVoiceName: profileTtsVoiceName,
646
+ enableSessionMetrics: profileMetricsEnabled === true,
647
+ allowSessionDocuments: profileSessionDocuments === true
648
+ };
649
+ }
650
+ var enableDragging = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-enable-dragging'));
651
+ var enableResizing = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-enable-resizing'));
652
+ var persistLayout = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-persist-layout'));
653
+ return {
654
+ shellSelector: getAttributeValue(element, 'data-coreai-chat-widget-shell-selector'),
655
+ widgetContainerSelector: widgetContainerSelector,
656
+ toggleButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-toggle-button-selector'),
657
+ closeButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-close-button-selector'),
658
+ inputSelector: getAttributeValue(element, 'data-coreai-chat-widget-input-selector'),
659
+ profile: profile,
660
+ widgetStateName: getAttributeValue(element, 'data-coreai-chat-widget-state-name'),
661
+ openStateValue: getAttributeValue(element, 'data-coreai-chat-widget-open-state-value'),
662
+ closedStateValue: getAttributeValue(element, 'data-coreai-chat-widget-closed-state-value'),
663
+ openIconHtml: getAttributeValue(element, 'data-coreai-chat-widget-open-icon-html'),
664
+ closedIconHtml: getAttributeValue(element, 'data-coreai-chat-widget-closed-icon-html'),
665
+ chatConfig: chatConfig ? Object.assign({}, chatConfig, {
666
+ widget: Object.assign({}, chatConfig.widget || {}, {
667
+ chatWidgetContainer: widgetContainerSelector,
668
+ chatWidgetStateName: getAttributeValue(element, 'data-coreai-chat-widget-state-name'),
669
+ newChatButton: getAttributeValue(element, 'data-coreai-chat-widget-new-chat-button-selector'),
670
+ toggleButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-toggle-button-selector'),
671
+ resetSizeButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-reset-size-button-selector'),
672
+ dragHandleSelector: getAttributeValue(element, 'data-coreai-chat-widget-drag-handle-selector'),
673
+ enableDragging: enableDragging === null ? undefined : enableDragging,
674
+ enableResizing: enableResizing === null ? undefined : enableResizing,
675
+ persistLayout: persistLayout === null ? undefined : persistLayout
676
+ })
677
+ }) : null
678
+ };
679
+ }
680
+ function initialize(options) {
681
+ if (!options) {
682
+ return null;
683
+ }
684
+ var chatConfig = options.chatConfig;
685
+ if (!chatConfig && options.configElementSelector) {
686
+ var configElement = document.querySelector(options.configElementSelector);
687
+ chatConfig = configElement ? parseJsonAttribute(configElement, 'data-config', 'AI chat widget config') : null;
688
+ }
689
+ if (!chatConfig) {
690
+ return null;
691
+ }
692
+ if (options.messageTemplateSelector) {
693
+ var messageTemplate = document.querySelector(options.messageTemplateSelector);
694
+ if (messageTemplate) {
695
+ chatConfig.messageTemplate = messageTemplate.innerHTML;
696
+ }
697
+ }
698
+ if (options.indicatorTemplateSelector) {
699
+ var indicatorTemplate = document.querySelector(options.indicatorTemplateSelector);
700
+ if (indicatorTemplate) {
701
+ chatConfig.indicatorTemplate = indicatorTemplate.innerHTML;
702
+ }
703
+ }
704
+ var shell = document.querySelector(options.shellSelector);
705
+ var widgetContainer = document.querySelector(options.widgetContainerSelector);
706
+ var toggleButton = document.querySelector(options.toggleButtonSelector);
707
+ var closeButton = document.querySelector(options.closeButtonSelector);
708
+ var profileInput = options.inputSelector ? document.querySelector(options.inputSelector) : null;
709
+ var widgetStateName = options.widgetStateName || chatConfig.widget.chatWidgetStateName;
710
+ var widgetOpenStateKey = options.widgetOpenStateKey || widgetStateName + 'Open';
711
+ var widgetLayoutKey = widgetStateName + 'Layout';
712
+ var openStateValue = options.openStateValue || 'open';
713
+ var closedStateValue = options.closedStateValue || 'closed';
714
+ if (profileInput && options.profile && options.profile.id) {
715
+ profileInput.setAttribute('data-profile-id', options.profile.id);
716
+ }
717
+ try {
718
+ var storedLayout = localStorage.getItem(widgetLayoutKey);
719
+ var layout = storedLayout ? JSON.parse(storedLayout) || {} : {};
720
+ var position = layout.position || {};
721
+ var panelLayout = layout.panel || {};
722
+ var toggleLeft = Number(position.left);
723
+ var toggleTop = Number(position.top);
724
+ var isOpen = localStorage.getItem(widgetOpenStateKey) === openStateValue;
725
+ var viewportPadding = 8;
726
+ if (shell) {
727
+ shell.dataset.deferReveal = isOpen ? 'true' : 'false';
728
+ shell.dataset.initialOpen = isOpen ? 'true' : 'false';
729
+ }
730
+ if (widgetContainer && toggleButton) {
731
+ var toggleSize = 52;
732
+ var panelWidth = Number.isFinite(Number(panelLayout.width)) ? Number(panelLayout.width) : Math.round(parseFloat(window.getComputedStyle(widgetContainer).width) || 380);
733
+ var panelHeight = Number.isFinite(Number(panelLayout.height)) ? Number(panelLayout.height) : Math.round(parseFloat(window.getComputedStyle(widgetContainer).height) || 520);
734
+ var maxLeft = Math.max(viewportPadding, window.innerWidth - toggleSize - viewportPadding);
735
+ var maxTop = Math.max(viewportPadding, window.innerHeight - toggleSize - viewportPadding);
736
+ if (Number.isFinite(Number(position.leftRatio))) {
737
+ toggleLeft = viewportPadding + Math.max(0, maxLeft - viewportPadding) * Number(position.leftRatio);
738
+ }
739
+ if (Number.isFinite(Number(position.topRatio))) {
740
+ toggleTop = viewportPadding + Math.max(0, maxTop - viewportPadding) * Number(position.topRatio);
741
+ }
742
+ if (Number.isFinite(toggleLeft) && Number.isFinite(toggleTop)) {
743
+ toggleLeft = Math.round(clampWidgetValue(toggleLeft, viewportPadding, maxLeft));
744
+ toggleTop = Math.round(clampWidgetValue(toggleTop, viewportPadding, maxTop));
745
+ }
746
+ if (Number.isFinite(toggleLeft) && Number.isFinite(toggleTop)) {
747
+ toggleButton.style.left = toggleLeft + 'px';
748
+ toggleButton.style.top = toggleTop + 'px';
749
+ toggleButton.style.right = 'auto';
750
+ toggleButton.style.bottom = 'auto';
751
+ var toggleGap = 8;
752
+ widgetContainer.style.left = toggleLeft + toggleSize - panelWidth + 'px';
753
+ widgetContainer.style.top = toggleTop - panelHeight - toggleGap + 'px';
754
+ widgetContainer.style.right = 'auto';
755
+ widgetContainer.style.bottom = 'auto';
756
+ }
757
+ }
758
+ if (widgetContainer) {
759
+ widgetContainer.classList.remove('open');
760
+ widgetContainer.style.display = 'none';
761
+ widgetContainer.setAttribute('aria-hidden', 'true');
762
+ }
763
+ if (toggleButton) {
764
+ toggleButton.innerHTML = isOpen ? options.openIconHtml : options.closedIconHtml;
765
+ }
766
+ } catch (error) {
767
+ console.warn('Failed to restore widget layout before initialization.', error);
768
+ } finally {
769
+ if (shell && shell.dataset.deferReveal !== 'true') {
770
+ shell.style.visibility = '';
771
+ }
772
+ }
773
+ var widgetApp = window.coreAIChatManager.initialize(chatConfig);
774
+ if (options.applySessionProfilePatch !== false && window.crestAppsAIChat && window.crestAppsAIChat.patchSessionProfileSync) {
775
+ window.crestAppsAIChat.patchSessionProfileSync(widgetApp);
776
+ }
777
+ function revealShell() {
778
+ if (!shell) {
779
+ return;
780
+ }
781
+ shell.style.visibility = '';
782
+ shell.dataset.deferReveal = 'false';
783
+ }
784
+ function syncOpenPanelPosition() {
785
+ if (!widgetApp || typeof widgetApp.syncPanelPositionToToggle !== 'function') {
786
+ return;
787
+ }
788
+ widgetApp.syncPanelPositionToToggle(false);
789
+ }
790
+ function updateTtsPlaybackButtons() {
791
+ if (!widgetContainer) {
792
+ return;
793
+ }
794
+ var buttons = widgetContainer.querySelectorAll('[data-tts-message-index]');
795
+ buttons.forEach(function (button) {
796
+ var buttonIndex = Number(button.getAttribute('data-tts-message-index'));
797
+ var isPlaying = buttonIndex === widgetApp.ttsPlayingMessageIndex;
798
+ button.classList.toggle('tts-playing', isPlaying);
799
+ button.setAttribute('title', isPlaying ? 'Pause audio' : 'Read aloud');
800
+ });
801
+ }
802
+ function queueTtsPlaybackButtonUpdate() {
803
+ requestAnimationFrame(updateTtsPlaybackButtons);
804
+ }
805
+ function revealShellWhenStable(initialOpen) {
806
+ if (!shell || shell.dataset.deferReveal !== 'true' || !initialOpen) {
807
+ revealShell();
808
+ return;
809
+ }
810
+ var hasRevealed = false;
811
+ var resizeObserver = null;
812
+ function finalizeReveal() {
813
+ if (hasRevealed) {
814
+ return;
815
+ }
816
+ hasRevealed = true;
817
+ if (resizeObserver) {
818
+ resizeObserver.disconnect();
819
+ }
820
+ requestAnimationFrame(function () {
821
+ syncOpenPanelPosition();
822
+ requestAnimationFrame(function () {
823
+ revealShell();
824
+ });
825
+ });
826
+ }
827
+ if (typeof ResizeObserver === 'undefined') {
828
+ window.setTimeout(finalizeReveal, 0);
829
+ return;
830
+ }
831
+ var lastWidth = 0;
832
+ var lastHeight = 0;
833
+ var stablePasses = 0;
834
+ resizeObserver = new ResizeObserver(function (entries) {
835
+ var entry = entries && entries[0];
836
+ if (!entry) {
837
+ return;
838
+ }
839
+ var width = Math.round(entry.contentRect.width);
840
+ var height = Math.round(entry.contentRect.height);
841
+ if (!width || !height) {
842
+ return;
843
+ }
844
+ syncOpenPanelPosition();
845
+ if (width === lastWidth && height === lastHeight) {
846
+ stablePasses++;
847
+ } else {
848
+ lastWidth = width;
849
+ lastHeight = height;
850
+ stablePasses = 0;
851
+ }
852
+ if (stablePasses >= 1) {
853
+ finalizeReveal();
854
+ }
855
+ });
856
+ resizeObserver.observe(widgetContainer);
857
+ window.setTimeout(finalizeReveal, 150);
858
+ }
859
+ function setWidgetOpen(isOpen) {
860
+ if (widgetApp) {
861
+ var isCurrentlyOpen = widgetContainer.classList.contains('open');
862
+ if (isOpen && !isCurrentlyOpen && typeof widgetApp.syncPanelPositionToToggle === 'function') {
863
+ widgetApp.syncPanelPositionToToggle();
864
+ } else if (!isOpen && isCurrentlyOpen && typeof widgetApp.syncTogglePositionToPanel === 'function') {
865
+ widgetApp.syncTogglePositionToPanel();
866
+ }
867
+ }
868
+ widgetContainer.classList.toggle('open', isOpen);
869
+ widgetContainer.style.display = isOpen ? 'flex' : 'none';
870
+ widgetContainer.setAttribute('aria-hidden', isOpen ? 'false' : 'true');
871
+ toggleButton.innerHTML = isOpen ? options.openIconHtml : options.closedIconHtml;
872
+ localStorage.setItem(widgetOpenStateKey, isOpen ? openStateValue : closedStateValue);
873
+ if (isOpen && typeof window.renderPendingCharts === 'function') {
874
+ setTimeout(function () {
875
+ window.renderPendingCharts();
876
+ }, 100);
877
+ }
878
+ }
879
+ var initialOpen = shell && shell.dataset.initialOpen === 'true';
880
+ setWidgetOpen(initialOpen);
881
+ revealShellWhenStable(initialOpen);
882
+ if (widgetApp && typeof widgetApp.$watch === 'function') {
883
+ widgetApp.$watch('ttsPlayingMessageIndex', function () {
884
+ queueTtsPlaybackButtonUpdate();
885
+ });
886
+ }
887
+ queueTtsPlaybackButtonUpdate();
888
+ if (toggleButton) {
889
+ toggleButton.addEventListener('click', function () {
890
+ if (toggleButton.dataset.dragSuppressClick === 'true') {
891
+ toggleButton.dataset.dragSuppressClick = 'false';
892
+ return;
893
+ }
894
+ setWidgetOpen(!widgetContainer.classList.contains('open'));
895
+ });
896
+ }
897
+ if (closeButton) {
898
+ closeButton.addEventListener('click', function () {
899
+ setWidgetOpen(false);
900
+ });
901
+ }
902
+ return widgetApp;
903
+ }
904
+ function initializeFromElement(element) {
905
+ if (!element || element.dataset.coreAiChatWidgetInitialized === 'true') {
906
+ return element ? element.__coreAIChatWidgetApp || null : null;
907
+ }
908
+ var jsonOptions = parseJsonAttribute(element, 'data-coreai-chat-widget-config', 'CoreAI chat widget config');
909
+ var attributeOptions = buildOptionsFromDataAttributes(element);
910
+ if (!jsonOptions && !attributeOptions) {
911
+ return null;
912
+ }
913
+ var options = Object.assign({}, jsonOptions || {}, attributeOptions || {});
914
+ var widgetApp = initialize(options);
915
+ if (!widgetApp) {
916
+ return null;
917
+ }
918
+ element.dataset.coreAiChatWidgetInitialized = 'true';
919
+ element.__coreAIChatWidgetApp = widgetApp;
920
+ return widgetApp;
921
+ }
922
+ function scanForAutoInitialization(root) {
923
+ if (!root || typeof root.querySelectorAll !== 'function') {
924
+ return;
925
+ }
926
+ if (typeof root.matches === 'function' && root.matches('[data-coreai-chat-widget-config],[data-coreai-chat-widget-container-selector]')) {
927
+ initializeFromElement(root);
928
+ }
929
+ root.querySelectorAll('[data-coreai-chat-widget-config],[data-coreai-chat-widget-container-selector]').forEach(initializeFromElement);
930
+ }
931
+ function startAutoInitialization() {
932
+ scanForAutoInitialization(document);
933
+ if (typeof MutationObserver === 'undefined') {
934
+ return;
935
+ }
936
+ var observer = new MutationObserver(function (mutations) {
937
+ mutations.forEach(function (mutation) {
938
+ mutation.addedNodes.forEach(function (node) {
939
+ if (node && node.nodeType === 1) {
940
+ scanForAutoInitialization(node);
941
+ }
942
+ });
943
+ });
944
+ });
945
+ observer.observe(document.body, {
946
+ childList: true,
947
+ subtree: true
948
+ });
949
+ }
950
+ if (document.readyState === 'loading') {
951
+ document.addEventListener('DOMContentLoaded', startAutoInitialization, {
952
+ once: true
953
+ });
954
+ } else {
955
+ startAutoInitialization();
956
+ }
957
+ return {
958
+ initialize: initialize,
959
+ initializeFromElement: initializeFromElement
960
+ };
961
+ }();
962
+ //# sourceMappingURL=ai-chat-widget.js.map