@crestapps/ai-chat-ui 2.0.0-preview.215 → 2.0.0-preview.223
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.js +762 -964
- package/dist/ai-chat-widget.js.map +1 -1
- package/dist/ai-chat-widget.min.js +1 -1
- package/dist/ai-chat-widget.min.js.map +1 -1
- package/dist/ai-chat.css +0 -2
- package/dist/ai-chat.js +2380 -3698
- package/dist/ai-chat.js.map +1 -1
- package/dist/ai-chat.min.css +1 -1
- package/dist/ai-chat.min.js +78 -1
- package/dist/ai-chat.min.js.map +1 -1
- package/dist/chat-image-carousel.css +0 -2
- package/dist/chat-image-carousel.js +306 -482
- package/dist/chat-image-carousel.js.map +1 -1
- package/dist/chat-image-carousel.min.css +1 -1
- package/dist/chat-image-carousel.min.js +1 -1
- package/dist/chat-image-carousel.min.js.map +1 -1
- package/dist/chat-interaction-settings.js +221 -293
- package/dist/chat-interaction-settings.js.map +1 -1
- package/dist/chat-interaction-settings.min.js +1 -1
- package/dist/chat-interaction-settings.min.js.map +1 -1
- package/dist/chat-interaction.js +2330 -3557
- package/dist/chat-interaction.js.map +1 -1
- package/dist/chat-interaction.min.js +62 -1
- package/dist/chat-interaction.min.js.map +1 -1
- package/dist/chat-markers.js +193 -485
- package/dist/chat-markers.js.map +1 -1
- package/dist/chat-markers.min.js +2 -1
- package/dist/chat-markers.min.js.map +1 -1
- package/dist/chat-widget.css +0 -2
- package/dist/chat-widget.min.css +1 -1
- package/dist/document-drop-zone.css +0 -2
- package/dist/document-drop-zone.js +127 -153
- package/dist/document-drop-zone.js.map +1 -1
- package/dist/document-drop-zone.min.css +1 -1
- package/dist/document-drop-zone.min.js +1 -1
- package/dist/document-drop-zone.min.js.map +1 -1
- package/dist/realtime-audio.js +1639 -2504
- package/dist/realtime-audio.js.map +1 -1
- package/dist/realtime-audio.min.js +3 -1
- package/dist/realtime-audio.min.js.map +1 -1
- package/dist/technical-name-generator.js +58 -80
- package/dist/technical-name-generator.js.map +1 -1
- package/dist/technical-name-generator.min.js +1 -1
- package/dist/technical-name-generator.min.js.map +1 -1
- package/package.json +1 -5
- package/dist/ai-chat.css.map +0 -1
- package/dist/chat-image-carousel.css.map +0 -1
- package/dist/chat-widget.css.map +0 -1
- package/dist/document-drop-zone.css.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ai-chat-widget.js"],"names":["clampWidgetValue","value","min","max","Math","window","coreAIChatWidgetBehavior","parsePixelValue","Number","isFinite","parsed","parseFloat","initialize","app","config","widgetIsInitialized","widget","chatWidgetContainer","chatWidgetStateName","document","querySelector","chatHistorySection","chatWidgetStateSession","chatWidgetStateDocuments","chatWidgetLayoutKey","widgetContainerElement","widgetToggleButtonElement","toggleButtonSelector","widgetResetSizeButtonElement","resetSizeButtonSelector","widgetDefaultWidth","defaultWidth","getComputedStyle","width","widgetDefaultHeight","defaultHeight","height","clearStoredWidgetDocuments","documents","enableResizing","classList","add","style","minWidth","minHeight","ResizeObserver","widgetResizeObserver","persistWidgetPanelSize","constrainWidgetElementsToViewport","updateWidgetResetSizeButtonVisibility","observe","dragHandleSelector","dragHandle","enableDragging","attachDraggableWidgetElement","addEventListener","event","preventDefault","resetWidgetSize","restoreWidgetLayout","widgetViewportResizeHandler","persistLayout","reloadCurrentSession","showHistoryButton","toggle","closeHistoryButton","showChatScreen","newChatButton","resetSession","console","error","dispose","disconnect","removeEventListener","attach","__aiChatWidgetAttached","getStoredWidgetLayout","this","storedLayout","localStorage","getItem","JSON","parse","warn","saveStoredWidgetLayout","partialLayout","currentLayout","nextLayout","Object","assign","undefined","panel","position","setItem","stringify","getElementSize","element","fallbackWidth","fallbackHeight","rect","getBoundingClientRect","computed","round","getElementPosition","left","top","inlineLeft","inlineTop","computedLeft","computedTop","isHidden","display","getAvailableWidgetPositionRange","padding","maxLeft","innerWidth","maxTop","innerHeight","createStoredPosition","range","leftSpan","topSpan","leftRatio","topRatio","resolveStoredPosition","storedPosition","clampWidgetPosition","getStoredWidgetDocuments","saveStoredWidgetDocuments","removeItem","applyAbsolutePosition","right","bottom","getWidgetDefaultSize","getWidgetToggleGap","isWidgetPanelVisible","contains","persistWidgetPanelPosition","panelDefaultSize","panelPosition","panelSize","toggleSize","linkedPosition","persistWidgetTogglePosition","togglePosition","defaultSize","currentSize","abs","syncTogglePositionToPanel","syncPanelPositionToToggle","isResized","removeProperty","storedTogglePosition","handle","layoutKey","suppressClickOnDrag","activePointerId","startX","startY","startLeft","startTop","dragged","self","button","target","closest","clientX","clientY","pointerId","setPointerCapture","onPointerMove","stopDragging","remove","dataset","dragSuppressClick","setTimeout","deltaX","deltaY","hypot","nextPosition","clampedPanel","clampedToggle","onMounted","resolveSessionId","onSessionInitialized","sessionId","onSessionReset","onDocumentsChanged","handleReceiveError","isSessionStarted","_attemptedSessionRecovery","startNewSession","onBeforeUnmount","coreAIChatWidgetManager","getAttributeValue","attributeName","getAttribute","parseBooleanAttributeValue","normalized","String","trim","toLowerCase","parseJsonAttribute","description","rawValue","options","chatConfig","configElementSelector","configElement","messageTemplateSelector","messageTemplate","innerHTML","indicatorTemplateSelector","indicatorTemplate","shell","shellSelector","widgetContainer","widgetContainerSelector","toggleButton","closeButton","closeButtonSelector","profileInput","inputSelector","widgetStateName","widgetOpenStateKey","widgetLayoutKey","openStateValue","closedStateValue","profile","id","setAttribute","layout","panelLayout","toggleLeft","toggleTop","isOpen","deferReveal","initialOpen","panelWidth","panelHeight","openIconHtml","closedIconHtml","visibility","widgetApp","coreAIChatManager","revealShell","syncOpenPanelPosition","updateTtsPlaybackButtons","querySelectorAll","forEach","isPlaying","ttsPlayingMessageIndex","queueTtsPlaybackButtonUpdate","requestAnimationFrame","setWidgetOpen","isCurrentlyOpen","renderPendingCharts","applySessionProfilePatch","crestAppsAIChat","patchSessionProfileSync","hasRevealed","resizeObserver","lastWidth","lastHeight","stablePasses","entries","entry","contentRect","finalizeReveal","revealShellWhenStable","$watch","initializeFromElement","coreAiChatWidgetInitialized","__coreAIChatWidgetApp","jsonOptions","attributeOptions","buildConfigFromElement","allowWidgetHost","profileId","profileName","profileDisplayText","profileWelcomeMessage","profileInitialPrompt","profileChatMode","profileTtsVoiceName","profileRealtimeVoiceName","profileMetricsEnabled","profileSessionDocuments","name","displayText","welcomeMessage","initialPrompt","chatMode","ttsVoiceName","realtimeVoiceName","enableSessionMetrics","allowSessionDocuments","buildOptionsFromDataAttributes","scanForAutoInitialization","root","matches","startAutoInitialization","MutationObserver","mutations","mutation","addedNodes","node","nodeType","body","childList","subtree","readyState","once"],"mappings":"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","file":"ai-chat-widget.min.js","sourcesContent":["function clampWidgetValue(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n\nwindow.coreAIChatWidgetBehavior = window.coreAIChatWidgetBehavior || function () {\n function parsePixelValue(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n return null;\n }\n\n var parsed = parseFloat(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n function attach(app, config) {\n if (!app || app.__aiChatWidgetAttached) {\n return;\n }\n\n app.__aiChatWidgetAttached = true;\n app.chatWidgetStateName = null;\n app.chatWidgetStateSession = null;\n app.chatWidgetStateDocuments = null;\n app.chatWidgetLayoutKey = null;\n app.chatHistorySection = null;\n app.widgetContainerElement = null;\n app.widgetToggleButtonElement = null;\n app.widgetResetSizeButtonElement = null;\n app.widgetResizeObserver = null;\n app.widgetViewportResizeHandler = null;\n app.widgetDefaultWidth = null;\n app.widgetDefaultHeight = null;\n app.widgetIsInitialized = false;\n\n app.getStoredWidgetLayout = function () {\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\n return {};\n }\n\n try {\n var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey);\n return storedLayout ? JSON.parse(storedLayout) || {} : {};\n }\n catch (error) {\n console.warn('Failed to read widget layout state.', error);\n return {};\n }\n };\n\n app.saveStoredWidgetLayout = function (partialLayout) {\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\n return;\n }\n\n var currentLayout = this.getStoredWidgetLayout();\n var nextLayout = Object.assign({}, currentLayout);\n\n if (partialLayout.panel !== undefined) {\n nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {});\n }\n\n if (partialLayout.position !== undefined) {\n nextLayout.position = Object.assign({}, currentLayout.position || {}, partialLayout.position || {});\n }\n\n localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout));\n };\n\n app.getElementSize = function (element, fallbackWidth, fallbackHeight) {\n if (!element) {\n return {\n width: fallbackWidth || 0,\n height: fallbackHeight || 0\n };\n }\n\n var rect = element.getBoundingClientRect();\n var computed = window.getComputedStyle(element);\n\n return {\n width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0),\n height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0)\n };\n };\n\n app.getElementPosition = function (element) {\n if (!element) {\n return {\n left: 0,\n top: 0\n };\n }\n\n var rect = element.getBoundingClientRect();\n var computed = window.getComputedStyle(element);\n var inlineLeft = parsePixelValue(element.style.left);\n var inlineTop = parsePixelValue(element.style.top);\n var computedLeft = parsePixelValue(computed.left);\n var computedTop = parsePixelValue(computed.top);\n var isHidden = computed.display === 'none';\n\n return {\n left: Math.round(isHidden && Number.isFinite(inlineLeft) ? inlineLeft : rect.left || inlineLeft || computedLeft || 0),\n top: Math.round(isHidden && Number.isFinite(inlineTop) ? inlineTop : rect.top || inlineTop || computedTop || 0)\n };\n };\n\n app.getAvailableWidgetPositionRange = function (width, height) {\n var viewportPadding = 8;\n return {\n padding: viewportPadding,\n maxLeft: Math.max(viewportPadding, window.innerWidth - width - viewportPadding),\n maxTop: Math.max(viewportPadding, window.innerHeight - height - viewportPadding)\n };\n };\n\n app.createStoredPosition = function (left, top, width, height) {\n var range = this.getAvailableWidgetPositionRange(width, height);\n var leftSpan = Math.max(0, range.maxLeft - range.padding);\n var topSpan = Math.max(0, range.maxTop - range.padding);\n\n return {\n left: Math.round(left),\n top: Math.round(top),\n leftRatio: leftSpan === 0 ? 0 : (left - range.padding) / leftSpan,\n topRatio: topSpan === 0 ? 0 : (top - range.padding) / topSpan\n };\n };\n\n app.resolveStoredPosition = function (storedPosition, width, height) {\n if (!storedPosition) {\n return null;\n }\n\n var range = this.getAvailableWidgetPositionRange(width, height);\n var left = Number(storedPosition.left);\n var top = Number(storedPosition.top);\n var leftRatio = Number(storedPosition.leftRatio);\n var topRatio = Number(storedPosition.topRatio);\n\n if (Number.isFinite(leftRatio)) {\n left = range.padding + Math.max(0, range.maxLeft - range.padding) * leftRatio;\n }\n\n if (Number.isFinite(topRatio)) {\n top = range.padding + Math.max(0, range.maxTop - range.padding) * topRatio;\n }\n\n if (!Number.isFinite(left) || !Number.isFinite(top)) {\n return null;\n }\n\n return this.clampWidgetPosition(left, top, width, height);\n };\n\n app.clampWidgetPosition = function (left, top, width, height) {\n var range = this.getAvailableWidgetPositionRange(width, height);\n\n return {\n left: Math.round(clampWidgetValue(left, range.padding, range.maxLeft)),\n top: Math.round(clampWidgetValue(top, range.padding, range.maxTop))\n };\n };\n\n app.getStoredWidgetDocuments = function () {\n this.clearStoredWidgetDocuments();\n return [];\n };\n\n app.saveStoredWidgetDocuments = function () {\n this.clearStoredWidgetDocuments();\n };\n\n app.clearStoredWidgetDocuments = function () {\n if (!this.chatWidgetStateDocuments) {\n return;\n }\n\n localStorage.removeItem(this.chatWidgetStateDocuments);\n };\n\n app.applyAbsolutePosition = function (element, left, top) {\n if (!element) {\n return;\n }\n\n element.style.left = left + 'px';\n element.style.top = top + 'px';\n element.style.right = 'auto';\n element.style.bottom = 'auto';\n };\n\n app.getWidgetDefaultSize = function () {\n return {\n width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380,\n height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520\n };\n };\n\n app.getWidgetToggleGap = function () {\n return 8;\n };\n\n app.isWidgetPanelVisible = function () {\n if (!this.widgetContainerElement) {\n return false;\n }\n\n var computed = window.getComputedStyle(this.widgetContainerElement);\n return this.widgetContainerElement.classList.contains('open') && computed.display !== 'none';\n };\n\n app.persistWidgetPanelPosition = function () {\n if (!this.widgetContainerElement || !config.widget.persistLayout) {\n return;\n }\n\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelPosition = this.getElementPosition(this.widgetContainerElement);\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var linkedPosition = this.clampWidgetPosition(\n panelPosition.left + panelSize.width - toggleSize.width,\n panelPosition.top + panelSize.height + this.getWidgetToggleGap(),\n toggleSize.width,\n toggleSize.height);\n\n this.saveStoredWidgetLayout({ position: this.createStoredPosition(linkedPosition.left, linkedPosition.top, toggleSize.width, toggleSize.height) });\n };\n\n app.persistWidgetTogglePosition = function () {\n if (!this.widgetToggleButtonElement || !config.widget.persistLayout) {\n return;\n }\n\n var togglePosition = this.getElementPosition(this.widgetToggleButtonElement);\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n this.saveStoredWidgetLayout({ position: this.createStoredPosition(togglePosition.left, togglePosition.top, toggleSize.width, toggleSize.height) });\n };\n\n app.persistWidgetPanelSize = function () {\n if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) {\n return;\n }\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\n\n this.saveStoredWidgetLayout({\n panel: {\n width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width,\n height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height\n }\n });\n };\n\n app.syncTogglePositionToPanel = function (persistLayout) {\n if (persistLayout === undefined) {\n persistLayout = true;\n }\n\n if (!this.widgetContainerElement || !this.widgetToggleButtonElement) {\n return;\n }\n\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var panelPosition = this.getElementPosition(this.widgetContainerElement);\n var linkedPosition = this.clampWidgetPosition(\n panelPosition.left + panelSize.width - toggleSize.width,\n panelPosition.top + panelSize.height + this.getWidgetToggleGap(),\n toggleSize.width,\n toggleSize.height);\n\n this.applyAbsolutePosition(this.widgetToggleButtonElement, linkedPosition.left, linkedPosition.top);\n\n if (persistLayout && config.widget.persistLayout) {\n this.persistWidgetTogglePosition();\n }\n };\n\n app.syncPanelPositionToToggle = function (persistLayout) {\n if (persistLayout === undefined) {\n persistLayout = true;\n }\n\n if (!this.widgetContainerElement || !this.widgetToggleButtonElement) {\n return;\n }\n\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var togglePosition = this.getElementPosition(this.widgetToggleButtonElement);\n var linkedPosition = this.clampWidgetPosition(\n togglePosition.left + toggleSize.width - panelSize.width,\n togglePosition.top - panelSize.height - this.getWidgetToggleGap(),\n panelSize.width,\n panelSize.height);\n\n this.applyAbsolutePosition(this.widgetContainerElement, linkedPosition.left, linkedPosition.top);\n\n if (persistLayout && config.widget.persistLayout) {\n this.persistWidgetPanelPosition();\n }\n };\n\n app.updateWidgetResetSizeButtonVisibility = function () {\n if (!this.widgetResetSizeButtonElement) {\n return;\n }\n\n if (!config.widget.enableResizing || !this.widgetContainerElement) {\n this.widgetResetSizeButtonElement.classList.add('d-none');\n return;\n }\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\n var isResized =\n Math.abs(currentSize.width - defaultSize.width) > 1 ||\n Math.abs(currentSize.height - defaultSize.height) > 1 ||\n !!this.widgetContainerElement.style.width ||\n !!this.widgetContainerElement.style.height;\n\n this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized);\n };\n\n app.resetWidgetSize = function () {\n if (!this.widgetContainerElement || !config.widget.enableResizing) {\n return;\n }\n\n this.widgetContainerElement.style.removeProperty('width');\n this.widgetContainerElement.style.removeProperty('height');\n this.persistWidgetPanelSize();\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n };\n\n app.restoreWidgetLayout = function () {\n var storedLayout = this.getStoredWidgetLayout();\n\n if (this.widgetContainerElement && config.widget.enableResizing) {\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) {\n this.widgetContainerElement.style.width = storedLayout.panel.width + 'px';\n }\n else {\n this.widgetContainerElement.style.removeProperty('width');\n }\n\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) {\n this.widgetContainerElement.style.height = storedLayout.panel.height + 'px';\n }\n else {\n this.widgetContainerElement.style.removeProperty('height');\n }\n }\n\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var storedTogglePosition = this.resolveStoredPosition(storedLayout.position, toggleSize.width, toggleSize.height);\n if (this.widgetToggleButtonElement && config.widget.enableDragging && storedTogglePosition) {\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedTogglePosition.left, storedTogglePosition.top);\n this.syncPanelPositionToToggle(false);\n }\n else if (this.widgetToggleButtonElement && config.widget.enableDragging &&\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) &&\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) {\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top);\n this.syncPanelPositionToToggle(false);\n }\n else if (this.widgetContainerElement && config.widget.enableDragging &&\n Number.isFinite(storedLayout.panel && storedLayout.panel.left) &&\n Number.isFinite(storedLayout.panel && storedLayout.panel.top)) {\n this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top);\n this.syncTogglePositionToPanel(false);\n }\n\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n };\n\n app.attachDraggableWidgetElement = function (element, handle, layoutKey, suppressClickOnDrag) {\n if (!element || !handle || !config.widget.enableDragging) {\n return;\n }\n\n var activePointerId = null;\n var startX = 0;\n var startY = 0;\n var startLeft = 0;\n var startTop = 0;\n var dragged = false;\n var dragThreshold = 4;\n var interactiveSelector = 'button, a, input, textarea, select, option, label';\n var self = this;\n\n function stopDragging(event) {\n if (activePointerId === null) {\n return;\n }\n\n if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) {\n return;\n }\n\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', stopDragging);\n document.removeEventListener('pointercancel', stopDragging);\n element.classList.remove('ai-chat-widget-dragging');\n activePointerId = null;\n\n if (!dragged) {\n return;\n }\n\n if (layoutKey === 'panel') {\n self.syncTogglePositionToPanel(false);\n self.persistWidgetPanelPosition();\n }\n else if (layoutKey === 'toggle') {\n self.syncPanelPositionToToggle(false);\n self.persistWidgetTogglePosition();\n }\n\n if (config.widget.persistLayout) {\n self.persistWidgetPanelPosition();\n self.persistWidgetTogglePosition();\n }\n\n if (suppressClickOnDrag) {\n element.dataset.dragSuppressClick = 'true';\n window.setTimeout(function () {\n if (element.dataset.dragSuppressClick === 'true') {\n element.dataset.dragSuppressClick = 'false';\n }\n }, 0);\n }\n }\n\n function onPointerMove(event) {\n if (activePointerId === null || event.pointerId !== activePointerId) {\n return;\n }\n\n var deltaX = event.clientX - startX;\n var deltaY = event.clientY - startY;\n\n if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) {\n return;\n }\n\n dragged = true;\n\n var defaultSize = self.getWidgetDefaultSize();\n var currentSize = self.getElementSize(\n element,\n layoutKey === 'panel' ? defaultSize.width : 52,\n layoutKey === 'panel' ? defaultSize.height : 52);\n var nextPosition = self.clampWidgetPosition(startLeft + deltaX, startTop + deltaY, currentSize.width, currentSize.height);\n\n self.applyAbsolutePosition(element, nextPosition.left, nextPosition.top);\n\n if (layoutKey === 'panel') {\n self.syncTogglePositionToPanel(false);\n }\n else if (layoutKey === 'toggle') {\n self.syncPanelPositionToToggle(false);\n }\n }\n\n handle.addEventListener('pointerdown', function (event) {\n if (event.button !== 0) {\n return;\n }\n\n if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) {\n return;\n }\n\n var rect = element.getBoundingClientRect();\n startX = event.clientX;\n startY = event.clientY;\n startLeft = rect.left;\n startTop = rect.top;\n dragged = false;\n activePointerId = event.pointerId;\n element.classList.add('ai-chat-widget-dragging');\n\n if (handle.setPointerCapture) {\n handle.setPointerCapture(event.pointerId);\n }\n\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', stopDragging);\n document.addEventListener('pointercancel', stopDragging);\n event.preventDefault();\n });\n };\n\n app.constrainWidgetElementsToViewport = function () {\n if (this.widgetContainerElement && this.widgetContainerElement.style.left && this.isWidgetPanelVisible()) {\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var panelPosition = this.getElementPosition(this.widgetContainerElement);\n var clampedPanel = this.clampWidgetPosition(panelPosition.left, panelPosition.top, panelSize.width, panelSize.height);\n\n this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top);\n this.syncTogglePositionToPanel(false);\n\n if (config.widget.persistLayout) {\n this.persistWidgetPanelPosition();\n this.persistWidgetTogglePosition();\n }\n }\n else if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) {\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var togglePosition = this.getElementPosition(this.widgetToggleButtonElement);\n var clampedToggle = this.clampWidgetPosition(togglePosition.left, togglePosition.top, toggleSize.width, toggleSize.height);\n\n this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top);\n this.syncPanelPositionToToggle(false);\n\n if (config.widget.persistLayout) {\n this.persistWidgetTogglePosition();\n this.persistWidgetPanelPosition();\n }\n }\n };\n\n app.showChatScreen = function () {\n if (!this.chatHistorySection) {\n return;\n }\n\n this.chatHistorySection.classList.remove('show');\n };\n }\n\n function initialize(app, config) {\n if (!app || app.widgetIsInitialized) {\n return;\n }\n\n if (!config.widget.chatWidgetContainer) {\n console.error('The widget chatWidgetContainer is required.');\n return;\n }\n\n if (!config.widget.chatWidgetStateName) {\n console.error('The widget chatWidgetStateName is required.');\n return;\n }\n\n var chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\n if (!chatWidgetContainer) {\n return;\n }\n\n if (config.widget.chatHistorySection) {\n app.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\n }\n\n app.chatWidgetStateName = config.widget.chatWidgetStateName;\n app.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\n app.chatWidgetStateDocuments = config.widget.chatWidgetStateName + 'Documents';\n app.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout';\n app.widgetContainerElement = chatWidgetContainer;\n app.widgetToggleButtonElement = config.widget.toggleButtonSelector ? document.querySelector(config.widget.toggleButtonSelector) : null;\n app.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector ? document.querySelector(config.widget.resetSizeButtonSelector) : null;\n app.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) || parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) || 380;\n app.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) || parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) || 520;\n app.widgetIsInitialized = true;\n app.clearStoredWidgetDocuments();\n app.documents = [];\n\n if (config.widget.enableResizing) {\n chatWidgetContainer.classList.add('ai-chat-widget-resizable');\n chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px';\n chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px';\n\n if (typeof ResizeObserver !== 'undefined') {\n app.widgetResizeObserver = new ResizeObserver(function () {\n app.persistWidgetPanelSize();\n app.constrainWidgetElementsToViewport();\n app.updateWidgetResetSizeButtonVisibility();\n });\n\n app.widgetResizeObserver.observe(chatWidgetContainer);\n }\n }\n\n var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header';\n var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector);\n\n if (config.widget.enableDragging && dragHandle) {\n dragHandle.classList.add('ai-chat-widget-drag-handle');\n chatWidgetContainer.classList.add('ai-chat-widget-draggable');\n app.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false);\n }\n\n if (config.widget.enableDragging && app.widgetToggleButtonElement) {\n app.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable');\n app.attachDraggableWidgetElement(app.widgetToggleButtonElement, app.widgetToggleButtonElement, 'toggle', true);\n }\n\n if (app.widgetResetSizeButtonElement) {\n app.widgetResetSizeButtonElement.addEventListener('click', function (event) {\n event.preventDefault();\n app.resetWidgetSize();\n });\n }\n\n app.restoreWidgetLayout();\n\n if (!app.widgetViewportResizeHandler) {\n app.widgetViewportResizeHandler = function () {\n if (config.widget.persistLayout) {\n app.restoreWidgetLayout();\n } else {\n app.constrainWidgetElementsToViewport();\n }\n\n app.updateWidgetResetSizeButtonVisibility();\n };\n\n window.addEventListener('resize', app.widgetViewportResizeHandler);\n }\n\n app.reloadCurrentSession();\n\n if (config.widget.showHistoryButton && app.chatHistorySection) {\n var showHistoryButton = document.querySelector(config.widget.showHistoryButton);\n if (showHistoryButton) {\n showHistoryButton.addEventListener('click', function () {\n app.chatHistorySection.classList.toggle('show');\n });\n }\n\n if (config.widget.closeHistoryButton) {\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\n if (closeHistoryButton) {\n closeHistoryButton.addEventListener('click', function () {\n app.showChatScreen();\n });\n }\n }\n }\n\n if (config.widget.newChatButton) {\n var newChatButton = document.querySelector(config.widget.newChatButton);\n if (newChatButton) {\n newChatButton.addEventListener('click', function () {\n app.resetSession();\n app.showChatScreen();\n });\n }\n }\n }\n\n function resolveSessionId(app) {\n if (!app || !app.widgetIsInitialized) {\n return null;\n }\n\n return localStorage.getItem(app.chatWidgetStateSession);\n }\n\n function onSessionInitialized(app, sessionId) {\n if (app && app.widgetIsInitialized) {\n localStorage.setItem(app.chatWidgetStateSession, sessionId);\n }\n }\n\n function onSessionReset(app) {\n if (app && app.widgetIsInitialized) {\n localStorage.removeItem(app.chatWidgetStateSession);\n app.clearStoredWidgetDocuments();\n }\n }\n\n function onDocumentsChanged(app, documents) {\n if (app && app.widgetIsInitialized) {\n app.saveStoredWidgetDocuments(documents);\n }\n }\n\n function handleReceiveError(app) {\n if (app && app.widgetIsInitialized && !app.isSessionStarted && !app._attemptedSessionRecovery) {\n app._attemptedSessionRecovery = true;\n localStorage.removeItem(app.chatWidgetStateSession);\n app.clearStoredWidgetDocuments();\n app.startNewSession();\n }\n }\n\n function dispose(app) {\n if (!app) {\n return;\n }\n\n if (app.widgetResizeObserver) {\n app.widgetResizeObserver.disconnect();\n app.widgetResizeObserver = null;\n }\n\n if (app.widgetViewportResizeHandler) {\n window.removeEventListener('resize', app.widgetViewportResizeHandler);\n app.widgetViewportResizeHandler = null;\n }\n }\n\n return {\n attach: attach,\n initialize: initialize,\n onMounted: initialize,\n resolveSessionId: resolveSessionId,\n onSessionInitialized: onSessionInitialized,\n onSessionReset: onSessionReset,\n onDocumentsChanged: onDocumentsChanged,\n handleReceiveError: handleReceiveError,\n dispose: dispose,\n onBeforeUnmount: dispose\n };\n}();\n\nwindow.coreAIChatWidgetManager = window.coreAIChatWidgetManager || function () {\n function getAttributeValue(element, attributeName) {\n var value = element.getAttribute(attributeName);\n return value === null || value === '' ? null : value;\n }\n\n function parseBooleanAttributeValue(value) {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n var normalized = String(value).trim().toLowerCase();\n if (normalized === 'true') {\n return true;\n }\n\n if (normalized === 'false') {\n return false;\n }\n\n return null;\n }\n\n function parseJsonAttribute(element, attributeName, description) {\n var rawValue = getAttributeValue(element, attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n }\n catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function buildOptionsFromDataAttributes(element) {\n var widgetContainerSelector = getAttributeValue(element, 'data-coreai-chat-widget-container-selector');\n if (!widgetContainerSelector) {\n return null;\n }\n\n var chatConfig = null;\n if (window.coreAIChatManager && typeof window.coreAIChatManager.buildConfigFromElement === 'function') {\n chatConfig = window.coreAIChatManager.buildConfigFromElement(element, { allowWidgetHost: true });\n }\n\n var profileId = getAttributeValue(element, 'data-coreai-chat-widget-profile-id');\n var profileName = getAttributeValue(element, 'data-coreai-chat-widget-profile-name');\n var profileDisplayText = getAttributeValue(element, 'data-coreai-chat-widget-profile-display-text');\n var profileWelcomeMessage = getAttributeValue(element, 'data-coreai-chat-widget-profile-welcome-message');\n var profileInitialPrompt = getAttributeValue(element, 'data-coreai-chat-widget-profile-initial-prompt');\n var profileChatMode = getAttributeValue(element, 'data-coreai-chat-widget-profile-chat-mode');\n var profileTtsVoiceName = getAttributeValue(element, 'data-coreai-chat-widget-profile-tts-voice-name');\n var profileRealtimeVoiceName = getAttributeValue(element, 'data-coreai-chat-widget-profile-realtime-voice-name');\n var profileMetricsEnabled = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-profile-enable-session-metrics'));\n var profileSessionDocuments = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-profile-allow-session-documents'));\n var profile = null;\n\n if (profileId || profileName || profileDisplayText || profileWelcomeMessage || profileChatMode || profileTtsVoiceName || profileRealtimeVoiceName || profileMetricsEnabled !== null || profileSessionDocuments !== null) {\n profile = {\n id: profileId,\n name: profileName,\n displayText: profileDisplayText,\n welcomeMessage: profileWelcomeMessage,\n initialPrompt: profileInitialPrompt,\n chatMode: profileChatMode,\n ttsVoiceName: profileTtsVoiceName,\n realtimeVoiceName: profileRealtimeVoiceName,\n enableSessionMetrics: profileMetricsEnabled === true,\n allowSessionDocuments: profileSessionDocuments === true\n };\n }\n\n var enableDragging = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-enable-dragging'));\n var enableResizing = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-enable-resizing'));\n var persistLayout = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-persist-layout'));\n\n return {\n shellSelector: getAttributeValue(element, 'data-coreai-chat-widget-shell-selector'),\n widgetContainerSelector: widgetContainerSelector,\n toggleButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-toggle-button-selector'),\n closeButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-close-button-selector'),\n inputSelector: getAttributeValue(element, 'data-coreai-chat-widget-input-selector'),\n messageTemplateSelector: getAttributeValue(element, 'data-coreai-chat-widget-message-template-selector'),\n indicatorTemplateSelector: getAttributeValue(element, 'data-coreai-chat-widget-indicator-template-selector'),\n profile: profile,\n widgetStateName: getAttributeValue(element, 'data-coreai-chat-widget-state-name'),\n openStateValue: getAttributeValue(element, 'data-coreai-chat-widget-open-state-value'),\n closedStateValue: getAttributeValue(element, 'data-coreai-chat-widget-closed-state-value'),\n openIconHtml: getAttributeValue(element, 'data-coreai-chat-widget-open-icon-html'),\n closedIconHtml: getAttributeValue(element, 'data-coreai-chat-widget-closed-icon-html'),\n chatConfig: chatConfig ? Object.assign({}, chatConfig, {\n initialPrompt: profileInitialPrompt || chatConfig.initialPrompt,\n realtimeVoiceName: profileRealtimeVoiceName || chatConfig.realtimeVoiceName,\n widget: Object.assign({}, chatConfig.widget || {}, {\n chatWidgetContainer: widgetContainerSelector,\n chatWidgetStateName: getAttributeValue(element, 'data-coreai-chat-widget-state-name'),\n newChatButton: getAttributeValue(element, 'data-coreai-chat-widget-new-chat-button-selector'),\n toggleButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-toggle-button-selector'),\n resetSizeButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-reset-size-button-selector'),\n dragHandleSelector: getAttributeValue(element, 'data-coreai-chat-widget-drag-handle-selector'),\n enableDragging: enableDragging === null ? undefined : enableDragging,\n enableResizing: enableResizing === null ? undefined : enableResizing,\n persistLayout: persistLayout === null ? undefined : persistLayout,\n })\n }) : null\n };\n }\n\n function initialize(options) {\n if (!options) {\n return null;\n }\n\n var chatConfig = options.chatConfig;\n if (!chatConfig && options.configElementSelector) {\n var configElement = document.querySelector(options.configElementSelector);\n chatConfig = configElement ? parseJsonAttribute(configElement, 'data-config', 'AI chat widget config') : null;\n }\n\n if (!chatConfig) {\n return null;\n }\n\n if (options.messageTemplateSelector) {\n var messageTemplate = document.querySelector(options.messageTemplateSelector);\n if (messageTemplate) {\n chatConfig.messageTemplate = messageTemplate.innerHTML;\n }\n }\n\n if (options.indicatorTemplateSelector) {\n var indicatorTemplate = document.querySelector(options.indicatorTemplateSelector);\n if (indicatorTemplate) {\n chatConfig.indicatorTemplate = indicatorTemplate.innerHTML;\n }\n }\n\n var shell = document.querySelector(options.shellSelector);\n var widgetContainer = document.querySelector(options.widgetContainerSelector);\n var toggleButton = document.querySelector(options.toggleButtonSelector);\n var closeButton = document.querySelector(options.closeButtonSelector);\n var profileInput = options.inputSelector ? document.querySelector(options.inputSelector) : null;\n var widgetStateName = options.widgetStateName || chatConfig.widget.chatWidgetStateName;\n var widgetOpenStateKey = options.widgetOpenStateKey || (widgetStateName + 'Open');\n var widgetLayoutKey = widgetStateName + 'Layout';\n var openStateValue = options.openStateValue || 'open';\n var closedStateValue = options.closedStateValue || 'closed';\n\n if (profileInput && options.profile && options.profile.id) {\n profileInput.setAttribute('data-profile-id', options.profile.id);\n }\n\n try {\n var storedLayout = localStorage.getItem(widgetLayoutKey);\n var layout = storedLayout ? JSON.parse(storedLayout) || {} : {};\n var position = layout.position || {};\n var panelLayout = layout.panel || {};\n var toggleLeft = Number(position.left);\n var toggleTop = Number(position.top);\n var isOpen = localStorage.getItem(widgetOpenStateKey) === openStateValue;\n var viewportPadding = 8;\n\n if (shell) {\n shell.dataset.deferReveal = isOpen ? 'true' : 'false';\n shell.dataset.initialOpen = isOpen ? 'true' : 'false';\n }\n\n if (widgetContainer && toggleButton) {\n var toggleSize = 52;\n var panelWidth = Number.isFinite(Number(panelLayout.width))\n ? Number(panelLayout.width)\n : Math.round(parseFloat(window.getComputedStyle(widgetContainer).width) || 380);\n var panelHeight = Number.isFinite(Number(panelLayout.height))\n ? Number(panelLayout.height)\n : Math.round(parseFloat(window.getComputedStyle(widgetContainer).height) || 520);\n var maxLeft = Math.max(viewportPadding, window.innerWidth - toggleSize - viewportPadding);\n var maxTop = Math.max(viewportPadding, window.innerHeight - toggleSize - viewportPadding);\n if (Number.isFinite(Number(position.leftRatio))) {\n toggleLeft = viewportPadding + Math.max(0, maxLeft - viewportPadding) * Number(position.leftRatio);\n }\n if (Number.isFinite(Number(position.topRatio))) {\n toggleTop = viewportPadding + Math.max(0, maxTop - viewportPadding) * Number(position.topRatio);\n }\n if (Number.isFinite(toggleLeft) && Number.isFinite(toggleTop)) {\n toggleLeft = Math.round(clampWidgetValue(toggleLeft, viewportPadding, maxLeft));\n toggleTop = Math.round(clampWidgetValue(toggleTop, viewportPadding, maxTop));\n }\n\n if (Number.isFinite(toggleLeft) && Number.isFinite(toggleTop)) {\n toggleButton.style.left = toggleLeft + 'px';\n toggleButton.style.top = toggleTop + 'px';\n toggleButton.style.right = 'auto';\n toggleButton.style.bottom = 'auto';\n\n var toggleGap = 8;\n widgetContainer.style.left = (toggleLeft + toggleSize - panelWidth) + 'px';\n widgetContainer.style.top = (toggleTop - panelHeight - toggleGap) + 'px';\n widgetContainer.style.right = 'auto';\n widgetContainer.style.bottom = 'auto';\n }\n }\n\n if (widgetContainer) {\n widgetContainer.classList.remove('open');\n widgetContainer.style.display = 'none';\n widgetContainer.setAttribute('aria-hidden', 'true');\n }\n\n if (toggleButton) {\n toggleButton.innerHTML = isOpen ? options.openIconHtml : options.closedIconHtml;\n }\n }\n catch (error) {\n console.warn('Failed to restore widget layout before initialization.', error);\n }\n finally {\n if (shell && shell.dataset.deferReveal !== 'true') {\n shell.style.visibility = '';\n }\n }\n\n var widgetApp = window.coreAIChatManager.initialize(chatConfig);\n if (options.applySessionProfilePatch !== false && window.crestAppsAIChat && window.crestAppsAIChat.patchSessionProfileSync) {\n window.crestAppsAIChat.patchSessionProfileSync(widgetApp);\n }\n\n function revealShell() {\n if (!shell) {\n return;\n }\n\n shell.style.visibility = '';\n shell.dataset.deferReveal = 'false';\n }\n\n function syncOpenPanelPosition() {\n if (!widgetApp || typeof widgetApp.syncPanelPositionToToggle !== 'function') {\n return;\n }\n\n widgetApp.syncPanelPositionToToggle(false);\n }\n\n function updateTtsPlaybackButtons() {\n if (!widgetContainer) {\n return;\n }\n\n var buttons = widgetContainer.querySelectorAll('[data-tts-message-index]');\n buttons.forEach(function (button) {\n var buttonIndex = Number(button.getAttribute('data-tts-message-index'));\n var isPlaying = buttonIndex === widgetApp.ttsPlayingMessageIndex;\n button.classList.toggle('tts-playing', isPlaying);\n button.setAttribute('title', isPlaying ? 'Pause audio' : 'Read aloud');\n });\n }\n\n function queueTtsPlaybackButtonUpdate() {\n requestAnimationFrame(updateTtsPlaybackButtons);\n }\n\n function revealShellWhenStable(initialOpen) {\n if (!shell || shell.dataset.deferReveal !== 'true' || !initialOpen) {\n revealShell();\n return;\n }\n\n var hasRevealed = false;\n var resizeObserver = null;\n\n function finalizeReveal() {\n if (hasRevealed) {\n return;\n }\n\n hasRevealed = true;\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n\n requestAnimationFrame(function () {\n syncOpenPanelPosition();\n requestAnimationFrame(function () {\n revealShell();\n });\n });\n }\n\n if (typeof ResizeObserver === 'undefined') {\n window.setTimeout(finalizeReveal, 0);\n return;\n }\n\n var lastWidth = 0;\n var lastHeight = 0;\n var stablePasses = 0;\n\n resizeObserver = new ResizeObserver(function (entries) {\n var entry = entries && entries[0];\n if (!entry) {\n return;\n }\n\n var width = Math.round(entry.contentRect.width);\n var height = Math.round(entry.contentRect.height);\n if (!width || !height) {\n return;\n }\n\n syncOpenPanelPosition();\n\n if (width === lastWidth && height === lastHeight) {\n stablePasses++;\n }\n else {\n lastWidth = width;\n lastHeight = height;\n stablePasses = 0;\n }\n\n if (stablePasses >= 1) {\n finalizeReveal();\n }\n });\n\n resizeObserver.observe(widgetContainer);\n window.setTimeout(finalizeReveal, 150);\n }\n\n function setWidgetOpen(isOpen) {\n if (widgetApp) {\n var isCurrentlyOpen = widgetContainer.classList.contains('open');\n if (isOpen && !isCurrentlyOpen && typeof widgetApp.syncPanelPositionToToggle === 'function') {\n widgetApp.syncPanelPositionToToggle();\n }\n else if (!isOpen && isCurrentlyOpen && typeof widgetApp.syncTogglePositionToPanel === 'function') {\n widgetApp.syncTogglePositionToPanel();\n }\n }\n\n widgetContainer.classList.toggle('open', isOpen);\n widgetContainer.style.display = isOpen ? 'flex' : 'none';\n widgetContainer.setAttribute('aria-hidden', isOpen ? 'false' : 'true');\n toggleButton.innerHTML = isOpen ? options.openIconHtml : options.closedIconHtml;\n localStorage.setItem(widgetOpenStateKey, isOpen ? openStateValue : closedStateValue);\n\n if (isOpen && typeof window.renderPendingCharts === 'function') {\n setTimeout(function () { window.renderPendingCharts(); }, 100);\n }\n }\n\n var initialOpen = shell && shell.dataset.initialOpen === 'true';\n setWidgetOpen(initialOpen);\n revealShellWhenStable(initialOpen);\n\n if (widgetApp && typeof widgetApp.$watch === 'function') {\n widgetApp.$watch('ttsPlayingMessageIndex', function () {\n queueTtsPlaybackButtonUpdate();\n });\n }\n\n queueTtsPlaybackButtonUpdate();\n\n if (toggleButton) {\n toggleButton.addEventListener('click', function () {\n if (toggleButton.dataset.dragSuppressClick === 'true') {\n toggleButton.dataset.dragSuppressClick = 'false';\n return;\n }\n\n setWidgetOpen(!widgetContainer.classList.contains('open'));\n });\n }\n\n if (closeButton) {\n closeButton.addEventListener('click', function () {\n setWidgetOpen(false);\n });\n }\n\n return widgetApp;\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.coreAiChatWidgetInitialized === 'true') {\n return element ? element.__coreAIChatWidgetApp || null : null;\n }\n\n var jsonOptions = parseJsonAttribute(element, 'data-coreai-chat-widget-config', 'CoreAI chat widget config');\n var attributeOptions = buildOptionsFromDataAttributes(element);\n if (!jsonOptions && !attributeOptions) {\n return null;\n }\n\n var options = Object.assign({}, jsonOptions || {}, attributeOptions || {});\n\n var widgetApp = initialize(options);\n if (!widgetApp) {\n return null;\n }\n\n element.dataset.coreAiChatWidgetInitialized = 'true';\n element.__coreAIChatWidgetApp = widgetApp;\n\n return widgetApp;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches('[data-coreai-chat-widget-config],[data-coreai-chat-widget-container-selector]')) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll('[data-coreai-chat-widget-config],[data-coreai-chat-widget-container-selector]').forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n var observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n mutation.addedNodes.forEach(function (node) {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n"]}
|
|
1
|
+
{"version":3,"file":"ai-chat-widget.min.js","sources":["../../Assets/js/ai-chat-widget.js"],"sourcesContent":["function clampWidgetValue(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n\nwindow.coreAIChatWidgetBehavior = window.coreAIChatWidgetBehavior || function () {\n function parsePixelValue(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n return null;\n }\n\n var parsed = parseFloat(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n function attach(app, config) {\n if (!app || app.__aiChatWidgetAttached) {\n return;\n }\n\n app.__aiChatWidgetAttached = true;\n app.chatWidgetStateName = null;\n app.chatWidgetStateSession = null;\n app.chatWidgetStateDocuments = null;\n app.chatWidgetLayoutKey = null;\n app.chatHistorySection = null;\n app.widgetContainerElement = null;\n app.widgetToggleButtonElement = null;\n app.widgetResetSizeButtonElement = null;\n app.widgetResizeObserver = null;\n app.widgetViewportResizeHandler = null;\n app.widgetDefaultWidth = null;\n app.widgetDefaultHeight = null;\n app.widgetIsInitialized = false;\n\n app.getStoredWidgetLayout = function () {\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\n return {};\n }\n\n try {\n var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey);\n return storedLayout ? JSON.parse(storedLayout) || {} : {};\n }\n catch (error) {\n console.warn('Failed to read widget layout state.', error);\n return {};\n }\n };\n\n app.saveStoredWidgetLayout = function (partialLayout) {\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\n return;\n }\n\n var currentLayout = this.getStoredWidgetLayout();\n var nextLayout = Object.assign({}, currentLayout);\n\n if (partialLayout.panel !== undefined) {\n nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {});\n }\n\n if (partialLayout.position !== undefined) {\n nextLayout.position = Object.assign({}, currentLayout.position || {}, partialLayout.position || {});\n }\n\n localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout));\n };\n\n app.getElementSize = function (element, fallbackWidth, fallbackHeight) {\n if (!element) {\n return {\n width: fallbackWidth || 0,\n height: fallbackHeight || 0\n };\n }\n\n var rect = element.getBoundingClientRect();\n var computed = window.getComputedStyle(element);\n\n return {\n width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0),\n height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0)\n };\n };\n\n app.getElementPosition = function (element) {\n if (!element) {\n return {\n left: 0,\n top: 0\n };\n }\n\n var rect = element.getBoundingClientRect();\n var computed = window.getComputedStyle(element);\n var inlineLeft = parsePixelValue(element.style.left);\n var inlineTop = parsePixelValue(element.style.top);\n var computedLeft = parsePixelValue(computed.left);\n var computedTop = parsePixelValue(computed.top);\n var isHidden = computed.display === 'none';\n\n return {\n left: Math.round(isHidden && Number.isFinite(inlineLeft) ? inlineLeft : rect.left || inlineLeft || computedLeft || 0),\n top: Math.round(isHidden && Number.isFinite(inlineTop) ? inlineTop : rect.top || inlineTop || computedTop || 0)\n };\n };\n\n app.getAvailableWidgetPositionRange = function (width, height) {\n var viewportPadding = 8;\n return {\n padding: viewportPadding,\n maxLeft: Math.max(viewportPadding, window.innerWidth - width - viewportPadding),\n maxTop: Math.max(viewportPadding, window.innerHeight - height - viewportPadding)\n };\n };\n\n app.createStoredPosition = function (left, top, width, height) {\n var range = this.getAvailableWidgetPositionRange(width, height);\n var leftSpan = Math.max(0, range.maxLeft - range.padding);\n var topSpan = Math.max(0, range.maxTop - range.padding);\n\n return {\n left: Math.round(left),\n top: Math.round(top),\n leftRatio: leftSpan === 0 ? 0 : (left - range.padding) / leftSpan,\n topRatio: topSpan === 0 ? 0 : (top - range.padding) / topSpan\n };\n };\n\n app.resolveStoredPosition = function (storedPosition, width, height) {\n if (!storedPosition) {\n return null;\n }\n\n var range = this.getAvailableWidgetPositionRange(width, height);\n var left = Number(storedPosition.left);\n var top = Number(storedPosition.top);\n var leftRatio = Number(storedPosition.leftRatio);\n var topRatio = Number(storedPosition.topRatio);\n\n if (Number.isFinite(leftRatio)) {\n left = range.padding + Math.max(0, range.maxLeft - range.padding) * leftRatio;\n }\n\n if (Number.isFinite(topRatio)) {\n top = range.padding + Math.max(0, range.maxTop - range.padding) * topRatio;\n }\n\n if (!Number.isFinite(left) || !Number.isFinite(top)) {\n return null;\n }\n\n return this.clampWidgetPosition(left, top, width, height);\n };\n\n app.clampWidgetPosition = function (left, top, width, height) {\n var range = this.getAvailableWidgetPositionRange(width, height);\n\n return {\n left: Math.round(clampWidgetValue(left, range.padding, range.maxLeft)),\n top: Math.round(clampWidgetValue(top, range.padding, range.maxTop))\n };\n };\n\n app.getStoredWidgetDocuments = function () {\n this.clearStoredWidgetDocuments();\n return [];\n };\n\n app.saveStoredWidgetDocuments = function () {\n this.clearStoredWidgetDocuments();\n };\n\n app.clearStoredWidgetDocuments = function () {\n if (!this.chatWidgetStateDocuments) {\n return;\n }\n\n localStorage.removeItem(this.chatWidgetStateDocuments);\n };\n\n app.applyAbsolutePosition = function (element, left, top) {\n if (!element) {\n return;\n }\n\n element.style.left = left + 'px';\n element.style.top = top + 'px';\n element.style.right = 'auto';\n element.style.bottom = 'auto';\n };\n\n app.getWidgetDefaultSize = function () {\n return {\n width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380,\n height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520\n };\n };\n\n app.getWidgetToggleGap = function () {\n return 8;\n };\n\n app.isWidgetPanelVisible = function () {\n if (!this.widgetContainerElement) {\n return false;\n }\n\n var computed = window.getComputedStyle(this.widgetContainerElement);\n return this.widgetContainerElement.classList.contains('open') && computed.display !== 'none';\n };\n\n app.persistWidgetPanelPosition = function () {\n if (!this.widgetContainerElement || !config.widget.persistLayout) {\n return;\n }\n\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelPosition = this.getElementPosition(this.widgetContainerElement);\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var linkedPosition = this.clampWidgetPosition(\n panelPosition.left + panelSize.width - toggleSize.width,\n panelPosition.top + panelSize.height + this.getWidgetToggleGap(),\n toggleSize.width,\n toggleSize.height);\n\n this.saveStoredWidgetLayout({ position: this.createStoredPosition(linkedPosition.left, linkedPosition.top, toggleSize.width, toggleSize.height) });\n };\n\n app.persistWidgetTogglePosition = function () {\n if (!this.widgetToggleButtonElement || !config.widget.persistLayout) {\n return;\n }\n\n var togglePosition = this.getElementPosition(this.widgetToggleButtonElement);\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n this.saveStoredWidgetLayout({ position: this.createStoredPosition(togglePosition.left, togglePosition.top, toggleSize.width, toggleSize.height) });\n };\n\n app.persistWidgetPanelSize = function () {\n if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) {\n return;\n }\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\n\n this.saveStoredWidgetLayout({\n panel: {\n width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width,\n height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height\n }\n });\n };\n\n app.syncTogglePositionToPanel = function (persistLayout) {\n if (persistLayout === undefined) {\n persistLayout = true;\n }\n\n if (!this.widgetContainerElement || !this.widgetToggleButtonElement) {\n return;\n }\n\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var panelPosition = this.getElementPosition(this.widgetContainerElement);\n var linkedPosition = this.clampWidgetPosition(\n panelPosition.left + panelSize.width - toggleSize.width,\n panelPosition.top + panelSize.height + this.getWidgetToggleGap(),\n toggleSize.width,\n toggleSize.height);\n\n this.applyAbsolutePosition(this.widgetToggleButtonElement, linkedPosition.left, linkedPosition.top);\n\n if (persistLayout && config.widget.persistLayout) {\n this.persistWidgetTogglePosition();\n }\n };\n\n app.syncPanelPositionToToggle = function (persistLayout) {\n if (persistLayout === undefined) {\n persistLayout = true;\n }\n\n if (!this.widgetContainerElement || !this.widgetToggleButtonElement) {\n return;\n }\n\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var togglePosition = this.getElementPosition(this.widgetToggleButtonElement);\n var linkedPosition = this.clampWidgetPosition(\n togglePosition.left + toggleSize.width - panelSize.width,\n togglePosition.top - panelSize.height - this.getWidgetToggleGap(),\n panelSize.width,\n panelSize.height);\n\n this.applyAbsolutePosition(this.widgetContainerElement, linkedPosition.left, linkedPosition.top);\n\n if (persistLayout && config.widget.persistLayout) {\n this.persistWidgetPanelPosition();\n }\n };\n\n app.updateWidgetResetSizeButtonVisibility = function () {\n if (!this.widgetResetSizeButtonElement) {\n return;\n }\n\n if (!config.widget.enableResizing || !this.widgetContainerElement) {\n this.widgetResetSizeButtonElement.classList.add('d-none');\n return;\n }\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\n var isResized =\n Math.abs(currentSize.width - defaultSize.width) > 1 ||\n Math.abs(currentSize.height - defaultSize.height) > 1 ||\n !!this.widgetContainerElement.style.width ||\n !!this.widgetContainerElement.style.height;\n\n this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized);\n };\n\n app.resetWidgetSize = function () {\n if (!this.widgetContainerElement || !config.widget.enableResizing) {\n return;\n }\n\n this.widgetContainerElement.style.removeProperty('width');\n this.widgetContainerElement.style.removeProperty('height');\n this.persistWidgetPanelSize();\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n };\n\n app.restoreWidgetLayout = function () {\n var storedLayout = this.getStoredWidgetLayout();\n\n if (this.widgetContainerElement && config.widget.enableResizing) {\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) {\n this.widgetContainerElement.style.width = storedLayout.panel.width + 'px';\n }\n else {\n this.widgetContainerElement.style.removeProperty('width');\n }\n\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) {\n this.widgetContainerElement.style.height = storedLayout.panel.height + 'px';\n }\n else {\n this.widgetContainerElement.style.removeProperty('height');\n }\n }\n\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var storedTogglePosition = this.resolveStoredPosition(storedLayout.position, toggleSize.width, toggleSize.height);\n if (this.widgetToggleButtonElement && config.widget.enableDragging && storedTogglePosition) {\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedTogglePosition.left, storedTogglePosition.top);\n this.syncPanelPositionToToggle(false);\n }\n else if (this.widgetToggleButtonElement && config.widget.enableDragging &&\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) &&\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) {\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top);\n this.syncPanelPositionToToggle(false);\n }\n else if (this.widgetContainerElement && config.widget.enableDragging &&\n Number.isFinite(storedLayout.panel && storedLayout.panel.left) &&\n Number.isFinite(storedLayout.panel && storedLayout.panel.top)) {\n this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top);\n this.syncTogglePositionToPanel(false);\n }\n\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n };\n\n app.attachDraggableWidgetElement = function (element, handle, layoutKey, suppressClickOnDrag) {\n if (!element || !handle || !config.widget.enableDragging) {\n return;\n }\n\n var activePointerId = null;\n var startX = 0;\n var startY = 0;\n var startLeft = 0;\n var startTop = 0;\n var dragged = false;\n var dragThreshold = 4;\n var interactiveSelector = 'button, a, input, textarea, select, option, label';\n var self = this;\n\n function stopDragging(event) {\n if (activePointerId === null) {\n return;\n }\n\n if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) {\n return;\n }\n\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', stopDragging);\n document.removeEventListener('pointercancel', stopDragging);\n element.classList.remove('ai-chat-widget-dragging');\n activePointerId = null;\n\n if (!dragged) {\n return;\n }\n\n if (layoutKey === 'panel') {\n self.syncTogglePositionToPanel(false);\n self.persistWidgetPanelPosition();\n }\n else if (layoutKey === 'toggle') {\n self.syncPanelPositionToToggle(false);\n self.persistWidgetTogglePosition();\n }\n\n if (config.widget.persistLayout) {\n self.persistWidgetPanelPosition();\n self.persistWidgetTogglePosition();\n }\n\n if (suppressClickOnDrag) {\n element.dataset.dragSuppressClick = 'true';\n window.setTimeout(function () {\n if (element.dataset.dragSuppressClick === 'true') {\n element.dataset.dragSuppressClick = 'false';\n }\n }, 0);\n }\n }\n\n function onPointerMove(event) {\n if (activePointerId === null || event.pointerId !== activePointerId) {\n return;\n }\n\n var deltaX = event.clientX - startX;\n var deltaY = event.clientY - startY;\n\n if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) {\n return;\n }\n\n dragged = true;\n\n var defaultSize = self.getWidgetDefaultSize();\n var currentSize = self.getElementSize(\n element,\n layoutKey === 'panel' ? defaultSize.width : 52,\n layoutKey === 'panel' ? defaultSize.height : 52);\n var nextPosition = self.clampWidgetPosition(startLeft + deltaX, startTop + deltaY, currentSize.width, currentSize.height);\n\n self.applyAbsolutePosition(element, nextPosition.left, nextPosition.top);\n\n if (layoutKey === 'panel') {\n self.syncTogglePositionToPanel(false);\n }\n else if (layoutKey === 'toggle') {\n self.syncPanelPositionToToggle(false);\n }\n }\n\n handle.addEventListener('pointerdown', function (event) {\n if (event.button !== 0) {\n return;\n }\n\n if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) {\n return;\n }\n\n var rect = element.getBoundingClientRect();\n startX = event.clientX;\n startY = event.clientY;\n startLeft = rect.left;\n startTop = rect.top;\n dragged = false;\n activePointerId = event.pointerId;\n element.classList.add('ai-chat-widget-dragging');\n\n if (handle.setPointerCapture) {\n handle.setPointerCapture(event.pointerId);\n }\n\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', stopDragging);\n document.addEventListener('pointercancel', stopDragging);\n event.preventDefault();\n });\n };\n\n app.constrainWidgetElementsToViewport = function () {\n if (this.widgetContainerElement && this.widgetContainerElement.style.left && this.isWidgetPanelVisible()) {\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var panelPosition = this.getElementPosition(this.widgetContainerElement);\n var clampedPanel = this.clampWidgetPosition(panelPosition.left, panelPosition.top, panelSize.width, panelSize.height);\n\n this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top);\n this.syncTogglePositionToPanel(false);\n\n if (config.widget.persistLayout) {\n this.persistWidgetPanelPosition();\n this.persistWidgetTogglePosition();\n }\n }\n else if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) {\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var togglePosition = this.getElementPosition(this.widgetToggleButtonElement);\n var clampedToggle = this.clampWidgetPosition(togglePosition.left, togglePosition.top, toggleSize.width, toggleSize.height);\n\n this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top);\n this.syncPanelPositionToToggle(false);\n\n if (config.widget.persistLayout) {\n this.persistWidgetTogglePosition();\n this.persistWidgetPanelPosition();\n }\n }\n };\n\n app.showChatScreen = function () {\n if (!this.chatHistorySection) {\n return;\n }\n\n this.chatHistorySection.classList.remove('show');\n };\n }\n\n function initialize(app, config) {\n if (!app || app.widgetIsInitialized) {\n return;\n }\n\n if (!config.widget.chatWidgetContainer) {\n console.error('The widget chatWidgetContainer is required.');\n return;\n }\n\n if (!config.widget.chatWidgetStateName) {\n console.error('The widget chatWidgetStateName is required.');\n return;\n }\n\n var chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\n if (!chatWidgetContainer) {\n return;\n }\n\n if (config.widget.chatHistorySection) {\n app.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\n }\n\n app.chatWidgetStateName = config.widget.chatWidgetStateName;\n app.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\n app.chatWidgetStateDocuments = config.widget.chatWidgetStateName + 'Documents';\n app.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout';\n app.widgetContainerElement = chatWidgetContainer;\n app.widgetToggleButtonElement = config.widget.toggleButtonSelector ? document.querySelector(config.widget.toggleButtonSelector) : null;\n app.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector ? document.querySelector(config.widget.resetSizeButtonSelector) : null;\n app.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) || parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) || 380;\n app.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) || parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) || 520;\n app.widgetIsInitialized = true;\n app.clearStoredWidgetDocuments();\n app.documents = [];\n\n if (config.widget.enableResizing) {\n chatWidgetContainer.classList.add('ai-chat-widget-resizable');\n chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px';\n chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px';\n\n if (typeof ResizeObserver !== 'undefined') {\n app.widgetResizeObserver = new ResizeObserver(function () {\n app.persistWidgetPanelSize();\n app.constrainWidgetElementsToViewport();\n app.updateWidgetResetSizeButtonVisibility();\n });\n\n app.widgetResizeObserver.observe(chatWidgetContainer);\n }\n }\n\n var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header';\n var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector);\n\n if (config.widget.enableDragging && dragHandle) {\n dragHandle.classList.add('ai-chat-widget-drag-handle');\n chatWidgetContainer.classList.add('ai-chat-widget-draggable');\n app.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false);\n }\n\n if (config.widget.enableDragging && app.widgetToggleButtonElement) {\n app.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable');\n app.attachDraggableWidgetElement(app.widgetToggleButtonElement, app.widgetToggleButtonElement, 'toggle', true);\n }\n\n if (app.widgetResetSizeButtonElement) {\n app.widgetResetSizeButtonElement.addEventListener('click', function (event) {\n event.preventDefault();\n app.resetWidgetSize();\n });\n }\n\n app.restoreWidgetLayout();\n\n if (!app.widgetViewportResizeHandler) {\n app.widgetViewportResizeHandler = function () {\n if (config.widget.persistLayout) {\n app.restoreWidgetLayout();\n } else {\n app.constrainWidgetElementsToViewport();\n }\n\n app.updateWidgetResetSizeButtonVisibility();\n };\n\n window.addEventListener('resize', app.widgetViewportResizeHandler);\n }\n\n app.reloadCurrentSession();\n\n if (config.widget.showHistoryButton && app.chatHistorySection) {\n var showHistoryButton = document.querySelector(config.widget.showHistoryButton);\n if (showHistoryButton) {\n showHistoryButton.addEventListener('click', function () {\n app.chatHistorySection.classList.toggle('show');\n });\n }\n\n if (config.widget.closeHistoryButton) {\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\n if (closeHistoryButton) {\n closeHistoryButton.addEventListener('click', function () {\n app.showChatScreen();\n });\n }\n }\n }\n\n if (config.widget.newChatButton) {\n var newChatButton = document.querySelector(config.widget.newChatButton);\n if (newChatButton) {\n newChatButton.addEventListener('click', function () {\n app.resetSession();\n app.showChatScreen();\n });\n }\n }\n }\n\n function resolveSessionId(app) {\n if (!app || !app.widgetIsInitialized) {\n return null;\n }\n\n return localStorage.getItem(app.chatWidgetStateSession);\n }\n\n function onSessionInitialized(app, sessionId) {\n if (app && app.widgetIsInitialized) {\n localStorage.setItem(app.chatWidgetStateSession, sessionId);\n }\n }\n\n function onSessionReset(app) {\n if (app && app.widgetIsInitialized) {\n localStorage.removeItem(app.chatWidgetStateSession);\n app.clearStoredWidgetDocuments();\n }\n }\n\n function onDocumentsChanged(app, documents) {\n if (app && app.widgetIsInitialized) {\n app.saveStoredWidgetDocuments(documents);\n }\n }\n\n function handleReceiveError(app) {\n if (app && app.widgetIsInitialized && !app.isSessionStarted && !app._attemptedSessionRecovery) {\n app._attemptedSessionRecovery = true;\n localStorage.removeItem(app.chatWidgetStateSession);\n app.clearStoredWidgetDocuments();\n app.startNewSession();\n }\n }\n\n function dispose(app) {\n if (!app) {\n return;\n }\n\n if (app.widgetResizeObserver) {\n app.widgetResizeObserver.disconnect();\n app.widgetResizeObserver = null;\n }\n\n if (app.widgetViewportResizeHandler) {\n window.removeEventListener('resize', app.widgetViewportResizeHandler);\n app.widgetViewportResizeHandler = null;\n }\n }\n\n return {\n attach: attach,\n initialize: initialize,\n onMounted: initialize,\n resolveSessionId: resolveSessionId,\n onSessionInitialized: onSessionInitialized,\n onSessionReset: onSessionReset,\n onDocumentsChanged: onDocumentsChanged,\n handleReceiveError: handleReceiveError,\n dispose: dispose,\n onBeforeUnmount: dispose\n };\n}();\n\nwindow.coreAIChatWidgetManager = window.coreAIChatWidgetManager || function () {\n function getAttributeValue(element, attributeName) {\n var value = element.getAttribute(attributeName);\n return value === null || value === '' ? null : value;\n }\n\n function parseBooleanAttributeValue(value) {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n var normalized = String(value).trim().toLowerCase();\n if (normalized === 'true') {\n return true;\n }\n\n if (normalized === 'false') {\n return false;\n }\n\n return null;\n }\n\n function parseJsonAttribute(element, attributeName, description) {\n var rawValue = getAttributeValue(element, attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n }\n catch (error) {\n console.error('Failed to parse ' + description + ' JSON.', error);\n return null;\n }\n }\n\n function buildOptionsFromDataAttributes(element) {\n var widgetContainerSelector = getAttributeValue(element, 'data-coreai-chat-widget-container-selector');\n if (!widgetContainerSelector) {\n return null;\n }\n\n var chatConfig = null;\n if (window.coreAIChatManager && typeof window.coreAIChatManager.buildConfigFromElement === 'function') {\n chatConfig = window.coreAIChatManager.buildConfigFromElement(element, { allowWidgetHost: true });\n }\n\n var profileId = getAttributeValue(element, 'data-coreai-chat-widget-profile-id');\n var profileName = getAttributeValue(element, 'data-coreai-chat-widget-profile-name');\n var profileDisplayText = getAttributeValue(element, 'data-coreai-chat-widget-profile-display-text');\n var profileWelcomeMessage = getAttributeValue(element, 'data-coreai-chat-widget-profile-welcome-message');\n var profileInitialPrompt = getAttributeValue(element, 'data-coreai-chat-widget-profile-initial-prompt');\n var profileChatMode = getAttributeValue(element, 'data-coreai-chat-widget-profile-chat-mode');\n var profileTtsVoiceName = getAttributeValue(element, 'data-coreai-chat-widget-profile-tts-voice-name');\n var profileRealtimeVoiceName = getAttributeValue(element, 'data-coreai-chat-widget-profile-realtime-voice-name');\n var profileMetricsEnabled = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-profile-enable-session-metrics'));\n var profileSessionDocuments = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-profile-allow-session-documents'));\n var profile = null;\n\n if (profileId || profileName || profileDisplayText || profileWelcomeMessage || profileChatMode || profileTtsVoiceName || profileRealtimeVoiceName || profileMetricsEnabled !== null || profileSessionDocuments !== null) {\n profile = {\n id: profileId,\n name: profileName,\n displayText: profileDisplayText,\n welcomeMessage: profileWelcomeMessage,\n initialPrompt: profileInitialPrompt,\n chatMode: profileChatMode,\n ttsVoiceName: profileTtsVoiceName,\n realtimeVoiceName: profileRealtimeVoiceName,\n enableSessionMetrics: profileMetricsEnabled === true,\n allowSessionDocuments: profileSessionDocuments === true\n };\n }\n\n var enableDragging = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-enable-dragging'));\n var enableResizing = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-enable-resizing'));\n var persistLayout = parseBooleanAttributeValue(getAttributeValue(element, 'data-coreai-chat-widget-persist-layout'));\n\n return {\n shellSelector: getAttributeValue(element, 'data-coreai-chat-widget-shell-selector'),\n widgetContainerSelector: widgetContainerSelector,\n toggleButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-toggle-button-selector'),\n closeButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-close-button-selector'),\n inputSelector: getAttributeValue(element, 'data-coreai-chat-widget-input-selector'),\n messageTemplateSelector: getAttributeValue(element, 'data-coreai-chat-widget-message-template-selector'),\n indicatorTemplateSelector: getAttributeValue(element, 'data-coreai-chat-widget-indicator-template-selector'),\n profile: profile,\n widgetStateName: getAttributeValue(element, 'data-coreai-chat-widget-state-name'),\n openStateValue: getAttributeValue(element, 'data-coreai-chat-widget-open-state-value'),\n closedStateValue: getAttributeValue(element, 'data-coreai-chat-widget-closed-state-value'),\n openIconHtml: getAttributeValue(element, 'data-coreai-chat-widget-open-icon-html'),\n closedIconHtml: getAttributeValue(element, 'data-coreai-chat-widget-closed-icon-html'),\n chatConfig: chatConfig ? Object.assign({}, chatConfig, {\n initialPrompt: profileInitialPrompt || chatConfig.initialPrompt,\n realtimeVoiceName: profileRealtimeVoiceName || chatConfig.realtimeVoiceName,\n widget: Object.assign({}, chatConfig.widget || {}, {\n chatWidgetContainer: widgetContainerSelector,\n chatWidgetStateName: getAttributeValue(element, 'data-coreai-chat-widget-state-name'),\n newChatButton: getAttributeValue(element, 'data-coreai-chat-widget-new-chat-button-selector'),\n toggleButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-toggle-button-selector'),\n resetSizeButtonSelector: getAttributeValue(element, 'data-coreai-chat-widget-reset-size-button-selector'),\n dragHandleSelector: getAttributeValue(element, 'data-coreai-chat-widget-drag-handle-selector'),\n enableDragging: enableDragging === null ? undefined : enableDragging,\n enableResizing: enableResizing === null ? undefined : enableResizing,\n persistLayout: persistLayout === null ? undefined : persistLayout,\n })\n }) : null\n };\n }\n\n function initialize(options) {\n if (!options) {\n return null;\n }\n\n var chatConfig = options.chatConfig;\n if (!chatConfig && options.configElementSelector) {\n var configElement = document.querySelector(options.configElementSelector);\n chatConfig = configElement ? parseJsonAttribute(configElement, 'data-config', 'AI chat widget config') : null;\n }\n\n if (!chatConfig) {\n return null;\n }\n\n if (options.messageTemplateSelector) {\n var messageTemplate = document.querySelector(options.messageTemplateSelector);\n if (messageTemplate) {\n chatConfig.messageTemplate = messageTemplate.innerHTML;\n }\n }\n\n if (options.indicatorTemplateSelector) {\n var indicatorTemplate = document.querySelector(options.indicatorTemplateSelector);\n if (indicatorTemplate) {\n chatConfig.indicatorTemplate = indicatorTemplate.innerHTML;\n }\n }\n\n var shell = document.querySelector(options.shellSelector);\n var widgetContainer = document.querySelector(options.widgetContainerSelector);\n var toggleButton = document.querySelector(options.toggleButtonSelector);\n var closeButton = document.querySelector(options.closeButtonSelector);\n var profileInput = options.inputSelector ? document.querySelector(options.inputSelector) : null;\n var widgetStateName = options.widgetStateName || chatConfig.widget.chatWidgetStateName;\n var widgetOpenStateKey = options.widgetOpenStateKey || (widgetStateName + 'Open');\n var widgetLayoutKey = widgetStateName + 'Layout';\n var openStateValue = options.openStateValue || 'open';\n var closedStateValue = options.closedStateValue || 'closed';\n\n if (profileInput && options.profile && options.profile.id) {\n profileInput.setAttribute('data-profile-id', options.profile.id);\n }\n\n try {\n var storedLayout = localStorage.getItem(widgetLayoutKey);\n var layout = storedLayout ? JSON.parse(storedLayout) || {} : {};\n var position = layout.position || {};\n var panelLayout = layout.panel || {};\n var toggleLeft = Number(position.left);\n var toggleTop = Number(position.top);\n var isOpen = localStorage.getItem(widgetOpenStateKey) === openStateValue;\n var viewportPadding = 8;\n\n if (shell) {\n shell.dataset.deferReveal = isOpen ? 'true' : 'false';\n shell.dataset.initialOpen = isOpen ? 'true' : 'false';\n }\n\n if (widgetContainer && toggleButton) {\n var toggleSize = 52;\n var panelWidth = Number.isFinite(Number(panelLayout.width))\n ? Number(panelLayout.width)\n : Math.round(parseFloat(window.getComputedStyle(widgetContainer).width) || 380);\n var panelHeight = Number.isFinite(Number(panelLayout.height))\n ? Number(panelLayout.height)\n : Math.round(parseFloat(window.getComputedStyle(widgetContainer).height) || 520);\n var maxLeft = Math.max(viewportPadding, window.innerWidth - toggleSize - viewportPadding);\n var maxTop = Math.max(viewportPadding, window.innerHeight - toggleSize - viewportPadding);\n if (Number.isFinite(Number(position.leftRatio))) {\n toggleLeft = viewportPadding + Math.max(0, maxLeft - viewportPadding) * Number(position.leftRatio);\n }\n if (Number.isFinite(Number(position.topRatio))) {\n toggleTop = viewportPadding + Math.max(0, maxTop - viewportPadding) * Number(position.topRatio);\n }\n if (Number.isFinite(toggleLeft) && Number.isFinite(toggleTop)) {\n toggleLeft = Math.round(clampWidgetValue(toggleLeft, viewportPadding, maxLeft));\n toggleTop = Math.round(clampWidgetValue(toggleTop, viewportPadding, maxTop));\n }\n\n if (Number.isFinite(toggleLeft) && Number.isFinite(toggleTop)) {\n toggleButton.style.left = toggleLeft + 'px';\n toggleButton.style.top = toggleTop + 'px';\n toggleButton.style.right = 'auto';\n toggleButton.style.bottom = 'auto';\n\n var toggleGap = 8;\n widgetContainer.style.left = (toggleLeft + toggleSize - panelWidth) + 'px';\n widgetContainer.style.top = (toggleTop - panelHeight - toggleGap) + 'px';\n widgetContainer.style.right = 'auto';\n widgetContainer.style.bottom = 'auto';\n }\n }\n\n if (widgetContainer) {\n widgetContainer.classList.remove('open');\n widgetContainer.style.display = 'none';\n widgetContainer.setAttribute('aria-hidden', 'true');\n }\n\n if (toggleButton) {\n toggleButton.innerHTML = isOpen ? options.openIconHtml : options.closedIconHtml;\n }\n }\n catch (error) {\n console.warn('Failed to restore widget layout before initialization.', error);\n }\n finally {\n if (shell && shell.dataset.deferReveal !== 'true') {\n shell.style.visibility = '';\n }\n }\n\n var widgetApp = window.coreAIChatManager.initialize(chatConfig);\n if (options.applySessionProfilePatch !== false && window.crestAppsAIChat && window.crestAppsAIChat.patchSessionProfileSync) {\n window.crestAppsAIChat.patchSessionProfileSync(widgetApp);\n }\n\n function revealShell() {\n if (!shell) {\n return;\n }\n\n shell.style.visibility = '';\n shell.dataset.deferReveal = 'false';\n }\n\n function syncOpenPanelPosition() {\n if (!widgetApp || typeof widgetApp.syncPanelPositionToToggle !== 'function') {\n return;\n }\n\n widgetApp.syncPanelPositionToToggle(false);\n }\n\n function updateTtsPlaybackButtons() {\n if (!widgetContainer) {\n return;\n }\n\n var buttons = widgetContainer.querySelectorAll('[data-tts-message-index]');\n buttons.forEach(function (button) {\n var buttonIndex = Number(button.getAttribute('data-tts-message-index'));\n var isPlaying = buttonIndex === widgetApp.ttsPlayingMessageIndex;\n button.classList.toggle('tts-playing', isPlaying);\n button.setAttribute('title', isPlaying ? 'Pause audio' : 'Read aloud');\n });\n }\n\n function queueTtsPlaybackButtonUpdate() {\n requestAnimationFrame(updateTtsPlaybackButtons);\n }\n\n function revealShellWhenStable(initialOpen) {\n if (!shell || shell.dataset.deferReveal !== 'true' || !initialOpen) {\n revealShell();\n return;\n }\n\n var hasRevealed = false;\n var resizeObserver = null;\n\n function finalizeReveal() {\n if (hasRevealed) {\n return;\n }\n\n hasRevealed = true;\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n\n requestAnimationFrame(function () {\n syncOpenPanelPosition();\n requestAnimationFrame(function () {\n revealShell();\n });\n });\n }\n\n if (typeof ResizeObserver === 'undefined') {\n window.setTimeout(finalizeReveal, 0);\n return;\n }\n\n var lastWidth = 0;\n var lastHeight = 0;\n var stablePasses = 0;\n\n resizeObserver = new ResizeObserver(function (entries) {\n var entry = entries && entries[0];\n if (!entry) {\n return;\n }\n\n var width = Math.round(entry.contentRect.width);\n var height = Math.round(entry.contentRect.height);\n if (!width || !height) {\n return;\n }\n\n syncOpenPanelPosition();\n\n if (width === lastWidth && height === lastHeight) {\n stablePasses++;\n }\n else {\n lastWidth = width;\n lastHeight = height;\n stablePasses = 0;\n }\n\n if (stablePasses >= 1) {\n finalizeReveal();\n }\n });\n\n resizeObserver.observe(widgetContainer);\n window.setTimeout(finalizeReveal, 150);\n }\n\n function setWidgetOpen(isOpen) {\n if (widgetApp) {\n var isCurrentlyOpen = widgetContainer.classList.contains('open');\n if (isOpen && !isCurrentlyOpen && typeof widgetApp.syncPanelPositionToToggle === 'function') {\n widgetApp.syncPanelPositionToToggle();\n }\n else if (!isOpen && isCurrentlyOpen && typeof widgetApp.syncTogglePositionToPanel === 'function') {\n widgetApp.syncTogglePositionToPanel();\n }\n }\n\n widgetContainer.classList.toggle('open', isOpen);\n widgetContainer.style.display = isOpen ? 'flex' : 'none';\n widgetContainer.setAttribute('aria-hidden', isOpen ? 'false' : 'true');\n toggleButton.innerHTML = isOpen ? options.openIconHtml : options.closedIconHtml;\n localStorage.setItem(widgetOpenStateKey, isOpen ? openStateValue : closedStateValue);\n\n if (isOpen && typeof window.renderPendingCharts === 'function') {\n setTimeout(function () { window.renderPendingCharts(); }, 100);\n }\n }\n\n var initialOpen = shell && shell.dataset.initialOpen === 'true';\n setWidgetOpen(initialOpen);\n revealShellWhenStable(initialOpen);\n\n if (widgetApp && typeof widgetApp.$watch === 'function') {\n widgetApp.$watch('ttsPlayingMessageIndex', function () {\n queueTtsPlaybackButtonUpdate();\n });\n }\n\n queueTtsPlaybackButtonUpdate();\n\n if (toggleButton) {\n toggleButton.addEventListener('click', function () {\n if (toggleButton.dataset.dragSuppressClick === 'true') {\n toggleButton.dataset.dragSuppressClick = 'false';\n return;\n }\n\n setWidgetOpen(!widgetContainer.classList.contains('open'));\n });\n }\n\n if (closeButton) {\n closeButton.addEventListener('click', function () {\n setWidgetOpen(false);\n });\n }\n\n return widgetApp;\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.coreAiChatWidgetInitialized === 'true') {\n return element ? element.__coreAIChatWidgetApp || null : null;\n }\n\n var jsonOptions = parseJsonAttribute(element, 'data-coreai-chat-widget-config', 'CoreAI chat widget config');\n var attributeOptions = buildOptionsFromDataAttributes(element);\n if (!jsonOptions && !attributeOptions) {\n return null;\n }\n\n var options = Object.assign({}, jsonOptions || {}, attributeOptions || {});\n\n var widgetApp = initialize(options);\n if (!widgetApp) {\n return null;\n }\n\n element.dataset.coreAiChatWidgetInitialized = 'true';\n element.__coreAIChatWidgetApp = widgetApp;\n\n return widgetApp;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches('[data-coreai-chat-widget-config],[data-coreai-chat-widget-container-selector]')) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll('[data-coreai-chat-widget-config],[data-coreai-chat-widget-container-selector]').forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n var observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n mutation.addedNodes.forEach(function (node) {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n\n return {\n initialize: initialize,\n initializeFromElement: initializeFromElement,\n };\n}();\n"],"names":["clampWidgetValue","value","min","max","parsePixelValue","parsed","attach","app","config","storedLayout","error","currentLayout","nextLayout","partialLayout","element","fallbackWidth","fallbackHeight","rect","computed","inlineLeft","inlineTop","computedLeft","computedTop","isHidden","viewportPadding","width","height","range","leftSpan","topSpan","left","top","storedPosition","leftRatio","topRatio","panelDefaultSize","panelPosition","panelSize","toggleSize","linkedPosition","togglePosition","defaultSize","currentSize","persistLayout","isResized","storedTogglePosition","handle","activePointerId","startX","startY","startLeft","startTop","dragged","dragThreshold","interactiveSelector","self","stopDragging","event","onPointerMove","layoutKey","suppressClickOnDrag","deltaX","deltaY","nextPosition","clampedPanel","clampedToggle","initialize","chatWidgetContainer","dragHandleSelector","dragHandle","showHistoryButton","closeHistoryButton","newChatButton","resolveSessionId","onSessionInitialized","sessionId","onSessionReset","onDocumentsChanged","documents","handleReceiveError","dispose","getAttributeValue","attributeName","parseBooleanAttributeValue","normalized","parseJsonAttribute","rawValue","description","buildOptionsFromDataAttributes","widgetContainerSelector","chatConfig","profileId","profileName","profileDisplayText","profileWelcomeMessage","profileInitialPrompt","profileChatMode","profileTtsVoiceName","profileRealtimeVoiceName","profileMetricsEnabled","profileSessionDocuments","profile","enableDragging","enableResizing","options","configElement","messageTemplate","indicatorTemplate","shell","widgetContainer","toggleButton","closeButton","profileInput","widgetStateName","widgetOpenStateKey","widgetLayoutKey","openStateValue","closedStateValue","layout","position","panelLayout","toggleLeft","toggleTop","isOpen","panelWidth","panelHeight","maxLeft","maxTop","toggleGap","widgetApp","revealShell","syncOpenPanelPosition","updateTtsPlaybackButtons","isPlaying","button","queueTtsPlaybackButtonUpdate","revealShellWhenStable","initialOpen","hasRevealed","resizeObserver","finalizeReveal","lastWidth","lastHeight","stablePasses","entry","entries","setWidgetOpen","isCurrentlyOpen","initializeFromElement","jsonOptions","attributeOptions","scanForAutoInitialization","root","startAutoInitialization","mutations","mutation","node"],"mappings":"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"}
|