@buni.ai/chatbot-core 1.0.20 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -20,6 +20,31 @@ class BuniChatWidget {
20
20
  this.chatTargetOrigin = null;
21
21
  this.handshakeComplete = false;
22
22
  this.outboundMessageQueue = [];
23
+ this.displayMode = "hidden";
24
+ this.serverBehavior = {};
25
+ }
26
+ isMinimalModeEnabled() {
27
+ var _a, _b;
28
+ if (typeof ((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.enableMinimalMode) === "boolean") {
29
+ return this.options.config.enableMinimalMode;
30
+ }
31
+ return Boolean(this.serverBehavior.enableMinimalMode);
32
+ }
33
+ syncServerBehaviorFromData(data) {
34
+ if (!data || typeof data !== "object") {
35
+ return;
36
+ }
37
+ const behaviorCandidate = data.behavior && typeof data.behavior === "object"
38
+ ? data.behavior
39
+ : data;
40
+ if (typeof behaviorCandidate.enableMinimalMode === "boolean") {
41
+ this.serverBehavior.enableMinimalMode = behaviorCandidate.enableMinimalMode;
42
+ }
43
+ if (behaviorCandidate.defaultMode === "full" ||
44
+ behaviorCandidate.defaultMode === "minimal" ||
45
+ behaviorCandidate.defaultMode === "hidden") {
46
+ this.serverBehavior.defaultMode = behaviorCandidate.defaultMode;
47
+ }
23
48
  }
24
49
  async initialize(options) {
25
50
  this.options = options;
@@ -183,6 +208,15 @@ class BuniChatWidget {
183
208
  params.set("startButtonText", config.startButtonText);
184
209
  if (config.preChatFormFields)
185
210
  params.set("preChatFormFields", JSON.stringify(config.preChatFormFields));
211
+ if (config.enableMinimalMode !== undefined) {
212
+ params.set("enableMinimalMode", String(config.enableMinimalMode));
213
+ }
214
+ if (config.defaultMode) {
215
+ params.set("defaultMode", config.defaultMode);
216
+ }
217
+ if (config.autoMessages && Array.isArray(config.autoMessages)) {
218
+ params.set("autoMessages", JSON.stringify(config.autoMessages));
219
+ }
186
220
  chatIframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;
187
221
  // Chat iframe styling - initially hidden
188
222
  chatIframe.style.cssText = `
@@ -223,13 +257,15 @@ class BuniChatWidget {
223
257
  this.triggerIframe = triggerIframe;
224
258
  this.chatIframe = chatIframe;
225
259
  this.state.isMinimized = true;
260
+ this.state.displayMode = "hidden";
261
+ this.displayMode = "hidden";
226
262
  this.state.isLoaded = true;
227
263
  resolve();
228
264
  };
229
265
  };
230
266
  // Listen for trigger and connection events
231
267
  window.addEventListener("message", (event) => {
232
- var _a, _b;
268
+ var _a, _b, _c, _d, _e, _f;
233
269
  const payload = event.data;
234
270
  if (!payload || typeof payload !== "object")
235
271
  return;
@@ -240,20 +276,53 @@ class BuniChatWidget {
240
276
  // Check if message is from chat iframe
241
277
  if (event.source === ((_a = this.chatIframe) === null || _a === void 0 ? void 0 : _a.contentWindow) &&
242
278
  event.origin === this.getBaseUrl()) {
279
+ this.syncServerBehaviorFromData(payload.data);
243
280
  // Connection is ready, show the trigger button
244
281
  if (container && !config.hideDefaultTrigger) {
245
282
  container.style.display = "block";
246
283
  }
247
284
  // Emit connection_ready event for consumers
248
- this.emit("connection_ready", { timestamp: Date.now() });
285
+ this.emit("connection_ready", {
286
+ timestamp: Date.now(),
287
+ behavior: (_b = payload.data) === null || _b === void 0 ? void 0 : _b.behavior,
288
+ });
249
289
  if (this.options.onConnectionReady &&
250
290
  typeof this.options.onConnectionReady === "function") {
251
- this.options.onConnectionReady({ timestamp: Date.now() });
291
+ this.options.onConnectionReady({
292
+ timestamp: Date.now(),
293
+ behavior: (_c = payload.data) === null || _c === void 0 ? void 0 : _c.behavior,
294
+ });
295
+ }
296
+ }
297
+ break;
298
+ case "chatbot:close":
299
+ if (event.source === ((_d = this.chatIframe) === null || _d === void 0 ? void 0 : _d.contentWindow) &&
300
+ event.origin === this.getBaseUrl()) {
301
+ this.closeChat();
302
+ this.displayMode = "hidden";
303
+ this.state.displayMode = "hidden";
304
+ }
305
+ break;
306
+ case "chatbot:minimize":
307
+ if (event.source === ((_e = this.chatIframe) === null || _e === void 0 ? void 0 : _e.contentWindow) &&
308
+ event.origin === this.getBaseUrl()) {
309
+ if (this.isMinimalModeEnabled()) {
310
+ if (!this.state.isOpen) {
311
+ void this.openChat();
312
+ }
313
+ this.postMessageToWidget("minimize");
314
+ this.displayMode = "minimal";
315
+ this.state.displayMode = "minimal";
316
+ }
317
+ else {
318
+ this.closeChat();
319
+ this.displayMode = "hidden";
320
+ this.state.displayMode = "hidden";
252
321
  }
253
322
  }
254
323
  break;
255
324
  case "trigger_clicked":
256
- if (event.source === ((_b = this.triggerIframe) === null || _b === void 0 ? void 0 : _b.contentWindow) &&
325
+ if (event.source === ((_f = this.triggerIframe) === null || _f === void 0 ? void 0 : _f.contentWindow) &&
257
326
  event.origin === window.location.origin) {
258
327
  this.openChat();
259
328
  }
@@ -263,13 +332,11 @@ class BuniChatWidget {
263
332
  // Trigger the load event
264
333
  // if by 10 seconds the ready message is not received, we want to manually, set the container to visible
265
334
  setTimeout(() => {
266
- if (!this.state.isLoaded) {
267
- if (container &&
268
- !config.hideDefaultTrigger &&
269
- container.style.display === "none" &&
270
- this.state.isOpen === false) {
271
- container.style.display = "block";
272
- }
335
+ if (container &&
336
+ !config.hideDefaultTrigger &&
337
+ container.style.display === "none" &&
338
+ this.state.isOpen === false) {
339
+ container.style.display = "block";
273
340
  }
274
341
  }, 10000);
275
342
  triggerIframe.src = "about:blank";
@@ -446,6 +513,8 @@ class BuniChatWidget {
446
513
  this.chatIframe.style.visibility = "visible";
447
514
  this.state.isMinimized = false;
448
515
  this.state.isOpen = true;
516
+ this.displayMode = "full";
517
+ this.state.displayMode = "full";
449
518
  this.emit("maximized", { timestamp: Date.now() });
450
519
  }
451
520
  closeChat() {
@@ -478,6 +547,8 @@ class BuniChatWidget {
478
547
  this.triggerIframe.style.display = "block";
479
548
  this.state.isMinimized = true;
480
549
  this.state.isOpen = false;
550
+ this.displayMode = "hidden";
551
+ this.state.displayMode = "hidden";
481
552
  this.emit("minimized", { timestamp: Date.now() });
482
553
  }
483
554
  getPositionStyles(position, isMinimized = false) {
@@ -569,8 +640,18 @@ class BuniChatWidget {
569
640
  }
570
641
  break;
571
642
  case "minimized":
572
- // User clicked minimize in chat - close chat and show trigger
573
- this.closeChat();
643
+ this.syncServerBehaviorFromData(data);
644
+ if (this.isMinimalModeEnabled()) {
645
+ if (!this.state.isOpen) {
646
+ void this.openChat();
647
+ }
648
+ this.displayMode = "minimal";
649
+ this.state.displayMode = "minimal";
650
+ }
651
+ else {
652
+ // Backward-compatible behavior.
653
+ this.closeChat();
654
+ }
574
655
  break;
575
656
  case "new_unread_message":
576
657
  // Update unread count in trigger
@@ -705,10 +786,21 @@ class BuniChatWidget {
705
786
  }
706
787
  }
707
788
  minimize() {
789
+ if (this.isMinimalModeEnabled()) {
790
+ if (!this.state.isOpen) {
791
+ void this.openChat();
792
+ }
793
+ this.postMessageToWidget("minimize");
794
+ this.displayMode = "minimal";
795
+ this.state.displayMode = "minimal";
796
+ return;
797
+ }
708
798
  this.closeChat();
709
799
  }
710
800
  maximize() {
711
- this.openChat();
801
+ void this.openChat();
802
+ this.displayMode = "full";
803
+ this.state.displayMode = "full";
712
804
  }
713
805
  setCustomerData(data) {
714
806
  this.customerData = { ...this.customerData, ...data };
@@ -749,6 +841,8 @@ class BuniChatWidget {
749
841
  }
750
842
  close() {
751
843
  this.closeChat();
844
+ this.displayMode = "hidden";
845
+ this.state.displayMode = "hidden";
752
846
  }
753
847
  on(event, callback) {
754
848
  if (!this.eventListeners.has(event)) {
@@ -784,7 +878,10 @@ class BuniChatWidget {
784
878
  }
785
879
  }
786
880
  getState() {
787
- return { ...this.state };
881
+ return {
882
+ ...this.state,
883
+ displayMode: this.displayMode,
884
+ };
788
885
  }
789
886
  isReady() {
790
887
  return this.state.isLoaded;
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import {\n BuniChatAPI,\n BuniChatOptions,\n BuniChatState,\n CustomerData,\n SessionVariables,\n} from \"./types\";\n\n// Default BuniAI platform URL\nconst BUNI_PLATFORM_URL = \"https://www.buni.ai\";\n\nconst PARENT_HANDSHAKE_TYPE = \"buni:parent_handshake\";\nconst IFRAME_HANDSHAKE_ACK_TYPE = \"buni:iframe_handshake_ack\";\n\n// Core widget loader class\nexport class BuniChatWidget implements BuniChatAPI {\n private options!: BuniChatOptions;\n private readonly state: BuniChatState;\n private readonly eventListeners: Map<string, Function[]>;\n private widgetElement: HTMLElement | null;\n private triggerIframe: HTMLIFrameElement | null;\n private chatIframe: HTMLIFrameElement | null;\n private customerData: CustomerData | null;\n private sessionVariables: SessionVariables | null;\n private chatTargetOrigin: string | null;\n private handshakeComplete: boolean;\n private outboundMessageQueue: Array<{ type: string; data?: any }>;\n\n constructor() {\n this.state = {\n isOpen: false,\n isLoaded: false,\n isMinimized: false,\n unreadCount: 0,\n };\n this.eventListeners = new Map();\n this.widgetElement = null;\n this.triggerIframe = null;\n this.chatIframe = null;\n this.customerData = null;\n this.sessionVariables = null;\n this.chatTargetOrigin = null;\n this.handshakeComplete = false;\n this.outboundMessageQueue = [];\n }\n\n async initialize(options: BuniChatOptions): Promise<void> {\n this.options = options;\n\n try {\n await this.loadWidget();\n this.state.isLoaded = true;\n this.emit(\"ready\", { timestamp: Date.now() });\n\n if (options.onReady) {\n options.onReady({ timestamp: Date.now() });\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", { error: errorObj, context: \"initialization\" });\n\n if (options.onError) {\n options.onError(errorObj);\n }\n throw errorObj;\n }\n }\n\n private async loadWidget(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if container already exists and remove it\n const existingContainer = document.getElementById(\n \"buni-chat-widget-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n // Create container div for proper positioning\n const container = document.createElement(\"div\");\n container.id = \"buni-chat-widget-container\";\n const config = this.options.config || {};\n\n const ensureUnits = (\n value: string | number | undefined,\n defaultValue: string,\n ): string => {\n if (!value) return defaultValue;\n const str = String(value);\n if (str.match(/^[\\d.]+\\s*(px|em|rem|%|vh|vw)$/)) return str;\n if (str.match(/^[\\d.]+$/)) return `${str}px`;\n return str;\n };\n\n const widthValue = ensureUnits(config.width, \"350px\");\n const heightValue = ensureUnits(config.height, \"650px\");\n\n // Configuration\n const showTriggerText = config.showTriggerText !== false;\n const hasTriggerText = !!config.triggerText;\n const primaryColor = config.primaryColor || \"#795548\";\n const triggerText = config.triggerText || \"\";\n const companyName = config.companyName || \"Chat Support\";\n\n // Responsive breakpoints\n const isMobile = window.innerWidth <= 768;\n const isTablet = window.innerWidth > 768 && window.innerWidth <= 1024;\n\n // Calculate trigger dimensions\n const triggerWidth = showTriggerText && hasTriggerText ? \"auto\" : \"52px\";\n const triggerHeight = \"52px\";\n const triggerMinWidth = showTriggerText && hasTriggerText ? \"auto\" : \"\";\n\n // Container starts as trigger size, initially hidden until connection is ready\n container.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${triggerWidth};\n height: ${triggerHeight};\n ${triggerMinWidth ? `min-width: ${triggerMinWidth};` : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", true)}\n display: none;\n overflow: hidden;\n box-sizing: border-box;\n `;\n\n // Create inline trigger iframe (no src)\n const triggerIframe = document.createElement(\"iframe\");\n triggerIframe.id = \"buni-trigger-iframe\";\n triggerIframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n border: none;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border-radius: ${showTriggerText && hasTriggerText ? \"26px\" : \"50%\"};\n transition: border-radius 0.3s ease, box-shadow 0.3s ease;\n pointer-events: auto;\n `;\n triggerIframe.setAttribute(\"title\", \"BuniAI Chat Trigger\");\n\n // Inject trigger HTML content directly (no src)\n container.appendChild(triggerIframe);\n document.body.appendChild(container);\n\n triggerIframe.onload = () => {\n const triggerDoc =\n triggerIframe.contentDocument ||\n triggerIframe.contentWindow?.document;\n if (!triggerDoc) {\n reject(new Error(\"Failed to access trigger iframe document\"));\n return;\n }\n\n // Build inline HTML for trigger\n const triggerHTML = this.buildTriggerHTML(\n primaryColor,\n triggerText || companyName,\n showTriggerText && hasTriggerText,\n config.customAvatar,\n config.avatarType,\n config.avatarText,\n );\n\n triggerDoc.open();\n triggerDoc.write(triggerHTML);\n triggerDoc.close();\n\n // Create chat iframe (initially hidden)\n const chatIframe = document.createElement(\"iframe\");\n chatIframe.id = \"buni-chat-iframe\";\n\n // Build URL with configuration parameters\n const params = new URLSearchParams({\n token: this.options.token,\n embedded: \"true\",\n source: \"package\",\n framework: this.options.framework || \"vanilla\",\n });\n\n // Add all configuration parameters\n if (config.theme) params.set(\"theme\", config.theme);\n if (config.primaryColor)\n params.set(\"primaryColor\", config.primaryColor);\n if (config.secondaryColor)\n params.set(\"secondaryColor\", config.secondaryColor);\n if (config.position) params.set(\"position\", config.position);\n if (widthValue && config.width !== undefined)\n params.set(\"width\", widthValue);\n if (heightValue && config.height !== undefined)\n params.set(\"height\", heightValue);\n if (config.customAvatar)\n params.set(\"customAvatar\", config.customAvatar);\n if (config.companyName) params.set(\"companyName\", config.companyName);\n if (config.welcomeMessage)\n params.set(\"welcomeMessage\", config.welcomeMessage);\n if (config.triggerText) params.set(\"triggerText\", config.triggerText);\n if (config.borderRadius)\n params.set(\"borderRadius\", config.borderRadius);\n if (config.avatarType) params.set(\"avatarType\", config.avatarType);\n if (config.avatarText) params.set(\"avatarText\", config.avatarText);\n\n // Boolean options\n if (config.showBranding !== undefined)\n params.set(\"showBranding\", String(config.showBranding));\n if (config.autoOpen !== undefined)\n params.set(\"autoOpen\", String(config.autoOpen));\n if (config.allowMinimize !== undefined)\n params.set(\"allowMinimize\", String(config.allowMinimize));\n if (config.showMinimize !== undefined)\n params.set(\"showMinimize\", String(config.showMinimize));\n if (config.allowClose !== undefined)\n params.set(\"allowClose\", String(config.allowClose));\n if (config.enableFileUpload !== undefined)\n params.set(\"enableFileUpload\", String(config.enableFileUpload));\n if (config.showTimestamps !== undefined)\n params.set(\"showTimestamps\", String(config.showTimestamps));\n if (config.enableMobile !== undefined)\n params.set(\"enableMobile\", String(config.enableMobile));\n if (config.showPreChatForm !== undefined)\n params.set(\"showPreChatForm\", String(config.showPreChatForm));\n if (config.showStartButton !== undefined)\n params.set(\"showStartButton\", String(config.showStartButton));\n if (config.startButtonText)\n params.set(\"startButtonText\", config.startButtonText);\n if (config.preChatFormFields)\n params.set(\n \"preChatFormFields\",\n JSON.stringify(config.preChatFormFields),\n );\n\n chatIframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;\n\n // Chat iframe styling - initially hidden\n chatIframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n border: none;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border-radius: ${isMobile ? \"0\" : \"16px\"};\n transition: border-radius 0.3s ease, box-shadow 0.3s ease;\n pointer-events: auto;\n box-shadow: ${isMobile ? \"none\" : \"0 8px 32px rgba(0,0,0,0.15)\"};\n display: none;\n `;\n chatIframe.setAttribute(\"allow\", \"clipboard-write\");\n chatIframe.setAttribute(\"title\", \"BuniAI Chat Widget\");\n\n container.appendChild(chatIframe);\n\n // Wait for chat iframe to load before resolving\n chatIframe.onload = () => {\n // Set visibility hidden after iframe loads to allow content initialization\n chatIframe.style.visibility = \"hidden\";\n\n // Compute the iframe origin once we know the final src.\n try {\n this.chatTargetOrigin = new URL(chatIframe.src).origin;\n } catch {\n this.chatTargetOrigin = this.getBaseUrl();\n }\n\n // Reset handshake state for this iframe instance.\n this.handshakeComplete = false;\n this.outboundMessageQueue = [];\n\n this.setupPostMessageAPI(chatIframe);\n this.sendParentHandshake();\n \n // Now that both iframes are loaded, resolve the promise\n this.widgetElement = container;\n this.triggerIframe = triggerIframe;\n this.chatIframe = chatIframe;\n this.state.isMinimized = true;\n this.state.isLoaded = true;\n resolve();\n };\n };\n\n // Listen for trigger and connection events\n window.addEventListener(\"message\", (event) => {\n const payload = event.data;\n if (!payload || typeof payload !== \"object\") return;\n if (typeof payload.type !== \"string\") return;\n\n switch (payload.type) {\n case \"connection_ready\":\n // Check if message is from chat iframe\n if (\n event.source === this.chatIframe?.contentWindow &&\n event.origin === this.getBaseUrl()\n ) {\n // Connection is ready, show the trigger button\n if (container && !config.hideDefaultTrigger) {\n container.style.display = \"block\";\n }\n\n // Emit connection_ready event for consumers\n this.emit(\"connection_ready\", { timestamp: Date.now() });\n if (\n this.options.onConnectionReady &&\n typeof this.options.onConnectionReady === \"function\"\n ) {\n this.options.onConnectionReady({ timestamp: Date.now() });\n }\n }\n break;\n\n case \"trigger_clicked\":\n if (\n event.source === this.triggerIframe?.contentWindow &&\n event.origin === window.location.origin\n ) {\n this.openChat();\n }\n break;\n }\n });\n // Trigger the load event\n // if by 10 seconds the ready message is not received, we want to manually, set the container to visible\n setTimeout(() => {\n if (!this.state.isLoaded) {\n if (\n container &&\n !config.hideDefaultTrigger &&\n container.style.display === \"none\" &&\n this.state.isOpen === false\n ) {\n container.style.display = \"block\";\n }\n }\n }, 10000);\n triggerIframe.src = \"about:blank\";\n });\n }\n\n private buildTriggerHTML(\n primaryColor: string,\n text: string,\n showText: boolean,\n customAvatar?: string,\n avatarType?: string,\n avatarText?: string,\n ): string {\n const avatarContent = customAvatar\n ? `<img src=\"${customAvatar}\" alt=\"Avatar\" style=\"width: 32px; height: 32px; border-radius: 50%;\" />`\n : avatarType === \"text\" && avatarText\n ? `<div style=\"width: 32px; height: 32px; border-radius: 50%; background: rgba(255,255,255,0.3); display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; color: white;\">${avatarText.substring(0, 2).toUpperCase()}</div>`\n : `<svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1 0-.9-2-2zm0 14H6l-2 2V4h16v12z\"/></svg>`;\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n overflow: hidden;\n }\n .trigger {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: ${showText ? \"12px\" : \"0\"};\n padding: ${showText ? \"10px 20px\" : \"10px\"};\n background: ${primaryColor};\n color: white;\n border-radius: ${showText ? \"26px\" : \"50%\"};\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 4px 16px rgba(0,0,0,0.15);\n animation: pulse 2s infinite;\n ${showText ? \"\" : \"width: 52px; height: 52px;\"}\n }\n .trigger:hover {\n transform: translateY(-2px);\n filter: brightness(1.1);\n box-shadow: 0 6px 24px ${primaryColor}99;\n }\n .trigger:active {\n transform: translateY(0);\n }\n .avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .text {\n font-size: 14px;\n font-weight: 600;\n white-space: nowrap;\n }\n .badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n display: none;\n animation: pulse 2s infinite;\n }\n .badge.show {\n display: block;\n }\n @keyframes pulse {\n 0%, 100% {\n transform: scale(1);\n box-shadow: 0 4px 16px rgba(0,0,0,0.15);\n }\n 50% {\n transform: scale(1.02);\n box-shadow: 0 6px 24px ${primaryColor}99;\n }\n }\n </style>\n</head>\n<body>\n <div style=\"position: relative;\">\n <div class=\"trigger\" onclick=\"handleClick()\">\n <div class=\"avatar\">${avatarContent}</div>\n ${showText ? `<span class=\"text\">${text}</span>` : \"\"}\n </div>\n <div class=\"badge\" id=\"badge\">0</div>\n </div>\n <script>\n function handleClick() {\n // Trigger iframe is same-origin with parent (about:blank + document.write),\n // so we can safely target the parent's origin.\n window.parent.postMessage({ type: 'trigger_clicked' }, window.location.origin);\n }\n \n // Listen for unread count updates\n window.addEventListener('message', function(event) {\n if (event.source !== window.parent) return;\n if (event.origin !== window.location.origin) return;\n if (event.data.type === 'updateUnreadCount') {\n const badge = document.getElementById('badge');\n const count = event.data.count || 0;\n badge.textContent = count;\n if (count > 0) {\n badge.classList.add('show');\n } else {\n badge.classList.remove('show');\n }\n }\n });\n </script>\n</body>\n</html>`;\n }\n\n private async openChat(): Promise<void> {\n if (!this.chatIframe || !this.widgetElement || !this.triggerIframe) return;\n if (this.state.isOpen) return; // Already open\n\n const config = this.options.config || {};\n const isMobile = window.innerWidth <= 768;\n const isTablet = window.innerWidth > 768 && window.innerWidth <= 1024;\n\n const ensureUnits = (\n value: string | number | undefined,\n defaultValue: string,\n ): string => {\n if (!value) return defaultValue;\n const str = String(value);\n if (str.match(/^[\\d.]+\\s*(px|em|rem|%|vh|vw)$/)) return str;\n if (str.match(/^[\\d.]+$/)) return `${str}px`;\n return str;\n };\n\n const widthValue = ensureUnits(config.width, \"350px\");\n const heightValue = ensureUnits(config.height, \"650px\");\n\n // Calculate chat dimensions\n const chatWidth = isMobile\n ? \"100vw\"\n : isTablet\n ? \"min(calc(100vw - 3rem), 370px)\"\n : widthValue;\n\n const chatHeight = isMobile\n ? \"100vh\"\n : isTablet\n ? \"min(calc(100vh - 3rem), 620px)\"\n : heightValue;\n\n // Resize container for chat\n this.widgetElement.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${chatWidth};\n height: ${chatHeight};\n ${isMobile ? \"max-width: 100vw; max-height: 100vh;\" : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", false)}\n display: block;\n overflow: visible;\n box-sizing: border-box;\n `;\n\n // Hide trigger, show chat\n this.triggerIframe.style.display = \"none\";\n this.chatIframe.style.display = \"block\";\n this.chatIframe.style.visibility = \"visible\";\n\n this.state.isMinimized = false;\n this.state.isOpen = true;\n this.emit(\"maximized\", { timestamp: Date.now() });\n }\n\n private closeChat(): void {\n if (!this.chatIframe || !this.widgetElement || !this.triggerIframe) return;\n\n const config = this.options.config || {};\n const showTriggerText = config.showTriggerText !== false;\n const hasTriggerText = !!config.triggerText;\n\n // Hide chat iframe\n this.chatIframe.style.display = \"none\";\n this.chatIframe.style.visibility = \"hidden\";\n\n // Resize container back to trigger size\n const triggerWidth = showTriggerText && hasTriggerText ? \"auto\" : \"52px\";\n const triggerHeight = \"52px\";\n const triggerMinWidth = showTriggerText && hasTriggerText ? \"auto\" : \"\";\n\n this.widgetElement.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${triggerWidth};\n height: ${triggerHeight};\n ${triggerMinWidth ? `min-width: ${triggerMinWidth};` : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", true)}\n display: block;\n overflow: hidden;\n box-sizing: border-box;\n `;\n\n // Show trigger again\n this.triggerIframe.style.display = \"block\";\n\n this.state.isMinimized = true;\n this.state.isOpen = false;\n this.emit(\"minimized\", { timestamp: Date.now() });\n }\n\n private getPositionStyles(\n position: string,\n isMinimized: boolean = false,\n ): string {\n // Responsive positioning following mobile-first best practices\n const viewportWidth = window.innerWidth;\n const isExtraSmall = viewportWidth <= 375;\n const isMobile = viewportWidth <= 768;\n const isTablet = viewportWidth > 768 && viewportWidth <= 1024;\n\n // For extra small devices (Galaxy S8+, iPhone SE, etc.), use minimal or no margins\n // For mobile, use small margins for breathing room\n // For tablet/desktop, use larger margins for floating appearance\n let margin: string;\n\n if (isMinimized) {\n // Minimized button always needs some space from edges\n margin = isMobile ? \"12px\" : \"20px\";\n } else if (isMobile) {\n // Full screen on all mobile devices (no margins)\n margin = \"0\";\n } else if (isTablet) {\n // Medium margins on tablets\n margin = \"16px\";\n } else {\n // Larger margins on desktop for floating effect\n margin = \"24px\";\n }\n\n // On mobile screens when not minimized, position at edges for full coverage\n if (isMobile && !isMinimized) {\n return `top: 0; left: 0; right: 0; bottom: 0;`;\n }\n\n // Standard positioning for larger screens or minimized state\n switch (position) {\n case \"bottom-right\":\n return `bottom: ${margin}; right: ${margin};`;\n case \"bottom-left\":\n return `bottom: ${margin}; left: ${margin};`;\n case \"top-right\":\n return `top: ${margin}; right: ${margin};`;\n case \"top-left\":\n return `top: ${margin}; left: ${margin};`;\n default:\n return `bottom: ${margin}; right: ${margin};`;\n }\n }\n\n private setupPostMessageAPI(iframe: HTMLIFrameElement): void {\n // Listen for messages from the iframe\n window.addEventListener(\"message\", (event) => {\n if (event.source !== iframe.contentWindow) {\n return;\n }\n\n // Verify origin for security\n if (event.origin !== this.getBaseUrl()) {\n return;\n }\n\n const payload = event.data;\n if (!payload || typeof payload !== \"object\") return;\n const { type, data } = payload;\n if (typeof type !== \"string\") return;\n\n switch (type) {\n case IFRAME_HANDSHAKE_ACK_TYPE:\n this.handshakeComplete = true;\n this.flushOutboundMessageQueue();\n break;\n\n case \"ready\":\n this.state.isLoaded = true;\n this.emit(\"ready\", data);\n if (this.options.onReady) {\n this.options.onReady(data);\n }\n break;\n\n case \"visibility_changed\":\n this.state.isOpen = data.visibility === \"visible\";\n this.emit(\"visibility_changed\", data);\n if (this.options.onVisibilityChanged) {\n this.options.onVisibilityChanged(data);\n }\n break;\n\n case \"new_message\":\n if (data.isFromBot) {\n this.state.unreadCount++;\n }\n this.emit(\"new_message\", data);\n if (this.options.onNewMessage) {\n this.options.onNewMessage(data);\n }\n break;\n\n case \"minimized\":\n // User clicked minimize in chat - close chat and show trigger\n this.closeChat();\n break;\n\n case \"new_unread_message\":\n // Update unread count in trigger\n this.state.unreadCount++;\n if (this.triggerIframe?.contentWindow) {\n this.triggerIframe.contentWindow.postMessage(\n { type: \"updateUnreadCount\", count: this.state.unreadCount },\n window.location.origin,\n );\n }\n break;\n\n case \"customer_data_updated\":\n this.customerData = data;\n this.emit(\"customer_data_updated\", data);\n break;\n\n case \"session_updated\":\n this.sessionVariables = data.variables;\n this.emit(\"session_updated\", data);\n break;\n\n case \"error\":\n this.emit(\"error\", data);\n if (this.options.onError) {\n this.options.onError(data.error);\n }\n break;\n }\n });\n }\n\n private sendParentHandshake(): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n try {\n iframeWindow.postMessage(\n {\n type: PARENT_HANDSHAKE_TYPE,\n data: { origin: window.location.origin },\n },\n targetOrigin,\n );\n } catch {\n // Best-effort; iframe may fall back to document.referrer for origin discovery.\n }\n }\n\n private flushOutboundMessageQueue(): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n const queued = this.outboundMessageQueue;\n if (queued.length === 0) return;\n\n this.outboundMessageQueue = [];\n for (const msg of queued) {\n iframeWindow.postMessage({ type: msg.type, data: msg.data }, targetOrigin);\n }\n }\n\n private postMessageToWidget(type: string, data?: any): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n\n // Ensure handshake is sent before any other commands; queue until ack.\n if (!this.handshakeComplete && type !== PARENT_HANDSHAKE_TYPE) {\n const queue = this.outboundMessageQueue;\n if (queue.length < 50) {\n queue.push({ type, data });\n } else {\n this.outboundMessageQueue = [...queue.slice(-49), { type, data }];\n }\n this.sendParentHandshake();\n return;\n }\n\n iframeWindow.postMessage({ type, data }, targetOrigin);\n }\n\n private getBaseUrl(): string {\n // Return the base URL for the BuniAI platform\n // Priority: 1. config.baseUrl, 2. global BUNI_API_URL, 3. default platform URL\n const configUrl = (this.options?.config as any)?.baseUrl;\n const globalUrl = (globalThis as any).BUNI_API_URL;\n const rawUrl = configUrl || globalUrl || BUNI_PLATFORM_URL;\n\n try {\n return new URL(rawUrl).origin;\n } catch {\n return rawUrl;\n }\n }\n\n destroy(): void {\n this.postMessageToWidget(\"destroy\");\n\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n\n this.triggerIframe = null;\n this.chatIframe = null;\n this.eventListeners.clear();\n this.state.isLoaded = false;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n show(): void {\n // Show the widget container if it was hidden (hideDefaultTrigger mode)\n if (this.widgetElement) {\n this.widgetElement.style.display = \"block\";\n }\n // Open chat if not already open\n if (!this.chatIframe && !this.state.isOpen) {\n this.openChat();\n }\n }\n\n hide(): void {\n // Close chat if open\n if (this.chatIframe) {\n this.closeChat();\n }\n // If hideDefaultTrigger is enabled, completely hide the container\n if (this.options.config?.hideDefaultTrigger && this.widgetElement) {\n this.widgetElement.style.display = \"none\";\n }\n this.state.isOpen = false;\n this.emit(\"visibility_changed\", { visibility: \"hidden\" });\n }\n\n toggle(): void {\n if (this.chatIframe || this.state.isOpen) {\n this.closeChat();\n } else {\n this.openChat();\n }\n }\n\n minimize(): void {\n this.closeChat();\n }\n\n maximize(): void {\n this.openChat();\n }\n\n setCustomerData(data: CustomerData): void {\n this.customerData = { ...this.customerData, ...data };\n this.postMessageToWidget(\"setCustomerData\", this.customerData);\n this.emit(\"customer_data_updated\", { data: this.customerData });\n }\n\n getCustomerData(): CustomerData | null {\n return this.customerData ? { ...this.customerData } : null;\n }\n\n setSessionVariables(variables: SessionVariables): void {\n this.sessionVariables = { ...this.sessionVariables, ...variables };\n this.postMessageToWidget(\"setSessionVariables\", this.sessionVariables);\n this.emit(\"session_updated\", { variables: this.sessionVariables });\n }\n\n getSessionVariables(): SessionVariables | null {\n return this.sessionVariables ? { ...this.sessionVariables } : null;\n }\n\n sendMessage(message: string): void {\n this.postMessageToWidget(\"sendMessage\", { message });\n\n const messageData = {\n message,\n isFromBot: false,\n timestamp: Date.now(),\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n };\n\n this.emit(\"new_message\", messageData);\n }\n\n clearChat(): void {\n this.postMessageToWidget(\"clearChat\");\n this.state.unreadCount = 0;\n }\n\n setTheme(theme: \"light\" | \"dark\" | \"system\"): void {\n this.postMessageToWidget(\"theme-change\", { theme });\n this.emit(\"theme_changed\", { theme, timestamp: Date.now() });\n }\n\n open(): void {\n this.openChat();\n }\n\n close(): void {\n this.closeChat();\n }\n\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(callback);\n }\n\n off(event: string, callback?: Function): void {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n\n if (callback) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n } else {\n this.eventListeners.set(event, []);\n }\n }\n\n emit(event: string, data?: any): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n }\n\n getState(): BuniChatState {\n return { ...this.state };\n }\n\n isReady(): boolean {\n return this.state.isLoaded;\n }\n}\n\n// Utility function - named export\nexport function createBuniChatWidget(options: BuniChatOptions): BuniChatWidget {\n const widget = new BuniChatWidget();\n widget.initialize(options);\n return widget;\n}\n\n// Default export - the main widget class\nexport default BuniChatWidget;\n\n// Global type declaration for the widget API\ndeclare global {\n interface Window {\n BuniChat?: {\n configure: (config: any) => void;\n show: () => void;\n hide: () => void;\n minimize: () => void;\n maximize: () => void;\n destroy: () => void;\n setCustomerData: (data: CustomerData) => void;\n setSessionVariables: (variables: SessionVariables) => void;\n sendMessage: (message: string) => void;\n clearChat: () => void;\n setTheme: (theme: \"light\" | \"dark\" | \"system\") => void;\n open: () => void;\n close: () => void;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback?: Function) => void;\n };\n }\n}\n","// Main exports for @buni.ai/chatbot-core\n\n// Export all types\nexport * from \"./types\";\n\n// Export everything from widget\nexport * from \"./widget\";\n\n// Make BuniChatWidget the default export as well\nimport { BuniChatWidget } from \"./widget\";\nexport default BuniChatWidget;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import {\n BuniChatAPI,\n BuniChatOptions,\n BuniChatState,\n CustomerData,\n SessionVariables,\n} from \"./types\";\n\n// Default BuniAI platform URL\nconst BUNI_PLATFORM_URL = \"https://www.buni.ai\";\n\nconst PARENT_HANDSHAKE_TYPE = \"buni:parent_handshake\";\nconst IFRAME_HANDSHAKE_ACK_TYPE = \"buni:iframe_handshake_ack\";\n\n// Core widget loader class\nexport class BuniChatWidget implements BuniChatAPI {\n private options!: BuniChatOptions;\n private readonly state: BuniChatState;\n private readonly eventListeners: Map<string, Function[]>;\n private widgetElement: HTMLElement | null;\n private triggerIframe: HTMLIFrameElement | null;\n private chatIframe: HTMLIFrameElement | null;\n private customerData: CustomerData | null;\n private sessionVariables: SessionVariables | null;\n private chatTargetOrigin: string | null;\n private handshakeComplete: boolean;\n private outboundMessageQueue: Array<{ type: string; data?: any }>;\n private displayMode: \"full\" | \"minimal\" | \"hidden\";\n private readonly serverBehavior: {\n enableMinimalMode?: boolean;\n defaultMode?: \"full\" | \"minimal\" | \"hidden\";\n };\n\n constructor() {\n this.state = {\n isOpen: false,\n isLoaded: false,\n isMinimized: false,\n unreadCount: 0,\n };\n this.eventListeners = new Map();\n this.widgetElement = null;\n this.triggerIframe = null;\n this.chatIframe = null;\n this.customerData = null;\n this.sessionVariables = null;\n this.chatTargetOrigin = null;\n this.handshakeComplete = false;\n this.outboundMessageQueue = [];\n this.displayMode = \"hidden\";\n this.serverBehavior = {};\n }\n\n private isMinimalModeEnabled(): boolean {\n if (typeof this.options?.config?.enableMinimalMode === \"boolean\") {\n return this.options.config.enableMinimalMode;\n }\n\n return Boolean(this.serverBehavior.enableMinimalMode);\n }\n\n private syncServerBehaviorFromData(data: any): void {\n if (!data || typeof data !== \"object\") {\n return;\n }\n\n const behaviorCandidate =\n data.behavior && typeof data.behavior === \"object\"\n ? data.behavior\n : data;\n\n if (typeof behaviorCandidate.enableMinimalMode === \"boolean\") {\n this.serverBehavior.enableMinimalMode = behaviorCandidate.enableMinimalMode;\n }\n\n if (\n behaviorCandidate.defaultMode === \"full\" ||\n behaviorCandidate.defaultMode === \"minimal\" ||\n behaviorCandidate.defaultMode === \"hidden\"\n ) {\n this.serverBehavior.defaultMode = behaviorCandidate.defaultMode;\n }\n }\n\n async initialize(options: BuniChatOptions): Promise<void> {\n this.options = options;\n\n try {\n await this.loadWidget();\n this.state.isLoaded = true;\n this.emit(\"ready\", { timestamp: Date.now() });\n\n if (options.onReady) {\n options.onReady({ timestamp: Date.now() });\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", { error: errorObj, context: \"initialization\" });\n\n if (options.onError) {\n options.onError(errorObj);\n }\n throw errorObj;\n }\n }\n\n private async loadWidget(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if container already exists and remove it\n const existingContainer = document.getElementById(\n \"buni-chat-widget-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n // Create container div for proper positioning\n const container = document.createElement(\"div\");\n container.id = \"buni-chat-widget-container\";\n const config = this.options.config || {};\n\n const ensureUnits = (\n value: string | number | undefined,\n defaultValue: string,\n ): string => {\n if (!value) return defaultValue;\n const str = String(value);\n if (str.match(/^[\\d.]+\\s*(px|em|rem|%|vh|vw)$/)) return str;\n if (str.match(/^[\\d.]+$/)) return `${str}px`;\n return str;\n };\n\n const widthValue = ensureUnits(config.width, \"350px\");\n const heightValue = ensureUnits(config.height, \"650px\");\n\n // Configuration\n const showTriggerText = config.showTriggerText !== false;\n const hasTriggerText = !!config.triggerText;\n const primaryColor = config.primaryColor || \"#795548\";\n const triggerText = config.triggerText || \"\";\n const companyName = config.companyName || \"Chat Support\";\n\n // Responsive breakpoints\n const isMobile = window.innerWidth <= 768;\n const isTablet = window.innerWidth > 768 && window.innerWidth <= 1024;\n\n // Calculate trigger dimensions\n const triggerWidth = showTriggerText && hasTriggerText ? \"auto\" : \"52px\";\n const triggerHeight = \"52px\";\n const triggerMinWidth = showTriggerText && hasTriggerText ? \"auto\" : \"\";\n\n // Container starts as trigger size, initially hidden until connection is ready\n container.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${triggerWidth};\n height: ${triggerHeight};\n ${triggerMinWidth ? `min-width: ${triggerMinWidth};` : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", true)}\n display: none;\n overflow: hidden;\n box-sizing: border-box;\n `;\n\n // Create inline trigger iframe (no src)\n const triggerIframe = document.createElement(\"iframe\");\n triggerIframe.id = \"buni-trigger-iframe\";\n triggerIframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n border: none;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border-radius: ${showTriggerText && hasTriggerText ? \"26px\" : \"50%\"};\n transition: border-radius 0.3s ease, box-shadow 0.3s ease;\n pointer-events: auto;\n `;\n triggerIframe.setAttribute(\"title\", \"BuniAI Chat Trigger\");\n\n // Inject trigger HTML content directly (no src)\n container.appendChild(triggerIframe);\n document.body.appendChild(container);\n\n triggerIframe.onload = () => {\n const triggerDoc =\n triggerIframe.contentDocument ||\n triggerIframe.contentWindow?.document;\n if (!triggerDoc) {\n reject(new Error(\"Failed to access trigger iframe document\"));\n return;\n }\n\n // Build inline HTML for trigger\n const triggerHTML = this.buildTriggerHTML(\n primaryColor,\n triggerText || companyName,\n showTriggerText && hasTriggerText,\n config.customAvatar,\n config.avatarType,\n config.avatarText,\n );\n\n triggerDoc.open();\n triggerDoc.write(triggerHTML);\n triggerDoc.close();\n\n // Create chat iframe (initially hidden)\n const chatIframe = document.createElement(\"iframe\");\n chatIframe.id = \"buni-chat-iframe\";\n\n // Build URL with configuration parameters\n const params = new URLSearchParams({\n token: this.options.token,\n embedded: \"true\",\n source: \"package\",\n framework: this.options.framework || \"vanilla\",\n });\n\n // Add all configuration parameters\n if (config.theme) params.set(\"theme\", config.theme);\n if (config.primaryColor)\n params.set(\"primaryColor\", config.primaryColor);\n if (config.secondaryColor)\n params.set(\"secondaryColor\", config.secondaryColor);\n if (config.position) params.set(\"position\", config.position);\n if (widthValue && config.width !== undefined)\n params.set(\"width\", widthValue);\n if (heightValue && config.height !== undefined)\n params.set(\"height\", heightValue);\n if (config.customAvatar)\n params.set(\"customAvatar\", config.customAvatar);\n if (config.companyName) params.set(\"companyName\", config.companyName);\n if (config.welcomeMessage)\n params.set(\"welcomeMessage\", config.welcomeMessage);\n if (config.triggerText) params.set(\"triggerText\", config.triggerText);\n if (config.borderRadius)\n params.set(\"borderRadius\", config.borderRadius);\n if (config.avatarType) params.set(\"avatarType\", config.avatarType);\n if (config.avatarText) params.set(\"avatarText\", config.avatarText);\n\n // Boolean options\n if (config.showBranding !== undefined)\n params.set(\"showBranding\", String(config.showBranding));\n if (config.autoOpen !== undefined)\n params.set(\"autoOpen\", String(config.autoOpen));\n if (config.allowMinimize !== undefined)\n params.set(\"allowMinimize\", String(config.allowMinimize));\n if (config.showMinimize !== undefined)\n params.set(\"showMinimize\", String(config.showMinimize));\n if (config.allowClose !== undefined)\n params.set(\"allowClose\", String(config.allowClose));\n if (config.enableFileUpload !== undefined)\n params.set(\"enableFileUpload\", String(config.enableFileUpload));\n if (config.showTimestamps !== undefined)\n params.set(\"showTimestamps\", String(config.showTimestamps));\n if (config.enableMobile !== undefined)\n params.set(\"enableMobile\", String(config.enableMobile));\n if (config.showPreChatForm !== undefined)\n params.set(\"showPreChatForm\", String(config.showPreChatForm));\n if (config.showStartButton !== undefined)\n params.set(\"showStartButton\", String(config.showStartButton));\n if (config.startButtonText)\n params.set(\"startButtonText\", config.startButtonText);\n if (config.preChatFormFields)\n params.set(\n \"preChatFormFields\",\n JSON.stringify(config.preChatFormFields),\n );\n if (config.enableMinimalMode !== undefined) {\n params.set(\"enableMinimalMode\", String(config.enableMinimalMode));\n }\n if (config.defaultMode) {\n params.set(\"defaultMode\", config.defaultMode);\n }\n if (config.autoMessages && Array.isArray(config.autoMessages)) {\n params.set(\"autoMessages\", JSON.stringify(config.autoMessages));\n }\n\n chatIframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;\n\n // Chat iframe styling - initially hidden\n chatIframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n border: none;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border-radius: ${isMobile ? \"0\" : \"16px\"};\n transition: border-radius 0.3s ease, box-shadow 0.3s ease;\n pointer-events: auto;\n box-shadow: ${isMobile ? \"none\" : \"0 8px 32px rgba(0,0,0,0.15)\"};\n display: none;\n `;\n chatIframe.setAttribute(\"allow\", \"clipboard-write\");\n chatIframe.setAttribute(\"title\", \"BuniAI Chat Widget\");\n\n container.appendChild(chatIframe);\n\n // Wait for chat iframe to load before resolving\n chatIframe.onload = () => {\n // Set visibility hidden after iframe loads to allow content initialization\n chatIframe.style.visibility = \"hidden\";\n\n // Compute the iframe origin once we know the final src.\n try {\n this.chatTargetOrigin = new URL(chatIframe.src).origin;\n } catch {\n this.chatTargetOrigin = this.getBaseUrl();\n }\n\n // Reset handshake state for this iframe instance.\n this.handshakeComplete = false;\n this.outboundMessageQueue = [];\n\n this.setupPostMessageAPI(chatIframe);\n this.sendParentHandshake();\n \n // Now that both iframes are loaded, resolve the promise\n this.widgetElement = container;\n this.triggerIframe = triggerIframe;\n this.chatIframe = chatIframe;\n this.state.isMinimized = true;\n this.state.displayMode = \"hidden\";\n this.displayMode = \"hidden\";\n this.state.isLoaded = true;\n resolve();\n };\n };\n\n // Listen for trigger and connection events\n window.addEventListener(\"message\", (event) => {\n const payload = event.data;\n if (!payload || typeof payload !== \"object\") return;\n if (typeof payload.type !== \"string\") return;\n\n switch (payload.type) {\n case \"connection_ready\":\n // Check if message is from chat iframe\n if (\n event.source === this.chatIframe?.contentWindow &&\n event.origin === this.getBaseUrl()\n ) {\n this.syncServerBehaviorFromData(payload.data);\n\n // Connection is ready, show the trigger button\n if (container && !config.hideDefaultTrigger) {\n container.style.display = \"block\";\n }\n\n // Emit connection_ready event for consumers\n this.emit(\"connection_ready\", {\n timestamp: Date.now(),\n behavior: payload.data?.behavior,\n });\n if (\n this.options.onConnectionReady &&\n typeof this.options.onConnectionReady === \"function\"\n ) {\n this.options.onConnectionReady({\n timestamp: Date.now(),\n behavior: payload.data?.behavior,\n });\n }\n }\n break;\n\n case \"chatbot:close\":\n if (\n event.source === this.chatIframe?.contentWindow &&\n event.origin === this.getBaseUrl()\n ) {\n this.closeChat();\n this.displayMode = \"hidden\";\n this.state.displayMode = \"hidden\";\n }\n break;\n\n case \"chatbot:minimize\":\n if (\n event.source === this.chatIframe?.contentWindow &&\n event.origin === this.getBaseUrl()\n ) {\n if (this.isMinimalModeEnabled()) {\n if (!this.state.isOpen) {\n void this.openChat();\n }\n this.postMessageToWidget(\"minimize\");\n this.displayMode = \"minimal\";\n this.state.displayMode = \"minimal\";\n } else {\n this.closeChat();\n this.displayMode = \"hidden\";\n this.state.displayMode = \"hidden\";\n }\n }\n break;\n\n case \"trigger_clicked\":\n if (\n event.source === this.triggerIframe?.contentWindow &&\n event.origin === window.location.origin\n ) {\n this.openChat();\n }\n break;\n }\n });\n // Trigger the load event\n // if by 10 seconds the ready message is not received, we want to manually, set the container to visible\n setTimeout(() => {\n if (\n container &&\n !config.hideDefaultTrigger &&\n container.style.display === \"none\" &&\n this.state.isOpen === false\n ) {\n container.style.display = \"block\";\n }\n }, 10000);\n triggerIframe.src = \"about:blank\";\n });\n }\n\n private buildTriggerHTML(\n primaryColor: string,\n text: string,\n showText: boolean,\n customAvatar?: string,\n avatarType?: string,\n avatarText?: string,\n ): string {\n const avatarContent = customAvatar\n ? `<img src=\"${customAvatar}\" alt=\"Avatar\" style=\"width: 32px; height: 32px; border-radius: 50%;\" />`\n : avatarType === \"text\" && avatarText\n ? `<div style=\"width: 32px; height: 32px; border-radius: 50%; background: rgba(255,255,255,0.3); display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; color: white;\">${avatarText.substring(0, 2).toUpperCase()}</div>`\n : `<svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1 0-.9-2-2zm0 14H6l-2 2V4h16v12z\"/></svg>`;\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n overflow: hidden;\n }\n .trigger {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: ${showText ? \"12px\" : \"0\"};\n padding: ${showText ? \"10px 20px\" : \"10px\"};\n background: ${primaryColor};\n color: white;\n border-radius: ${showText ? \"26px\" : \"50%\"};\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 4px 16px rgba(0,0,0,0.15);\n animation: pulse 2s infinite;\n ${showText ? \"\" : \"width: 52px; height: 52px;\"}\n }\n .trigger:hover {\n transform: translateY(-2px);\n filter: brightness(1.1);\n box-shadow: 0 6px 24px ${primaryColor}99;\n }\n .trigger:active {\n transform: translateY(0);\n }\n .avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .text {\n font-size: 14px;\n font-weight: 600;\n white-space: nowrap;\n }\n .badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n display: none;\n animation: pulse 2s infinite;\n }\n .badge.show {\n display: block;\n }\n @keyframes pulse {\n 0%, 100% {\n transform: scale(1);\n box-shadow: 0 4px 16px rgba(0,0,0,0.15);\n }\n 50% {\n transform: scale(1.02);\n box-shadow: 0 6px 24px ${primaryColor}99;\n }\n }\n </style>\n</head>\n<body>\n <div style=\"position: relative;\">\n <div class=\"trigger\" onclick=\"handleClick()\">\n <div class=\"avatar\">${avatarContent}</div>\n ${showText ? `<span class=\"text\">${text}</span>` : \"\"}\n </div>\n <div class=\"badge\" id=\"badge\">0</div>\n </div>\n <script>\n function handleClick() {\n // Trigger iframe is same-origin with parent (about:blank + document.write),\n // so we can safely target the parent's origin.\n window.parent.postMessage({ type: 'trigger_clicked' }, window.location.origin);\n }\n \n // Listen for unread count updates\n window.addEventListener('message', function(event) {\n if (event.source !== window.parent) return;\n if (event.origin !== window.location.origin) return;\n if (event.data.type === 'updateUnreadCount') {\n const badge = document.getElementById('badge');\n const count = event.data.count || 0;\n badge.textContent = count;\n if (count > 0) {\n badge.classList.add('show');\n } else {\n badge.classList.remove('show');\n }\n }\n });\n </script>\n</body>\n</html>`;\n }\n\n private async openChat(): Promise<void> {\n if (!this.chatIframe || !this.widgetElement || !this.triggerIframe) return;\n if (this.state.isOpen) return; // Already open\n\n const config = this.options.config || {};\n const isMobile = window.innerWidth <= 768;\n const isTablet = window.innerWidth > 768 && window.innerWidth <= 1024;\n\n const ensureUnits = (\n value: string | number | undefined,\n defaultValue: string,\n ): string => {\n if (!value) return defaultValue;\n const str = String(value);\n if (str.match(/^[\\d.]+\\s*(px|em|rem|%|vh|vw)$/)) return str;\n if (str.match(/^[\\d.]+$/)) return `${str}px`;\n return str;\n };\n\n const widthValue = ensureUnits(config.width, \"350px\");\n const heightValue = ensureUnits(config.height, \"650px\");\n\n // Calculate chat dimensions\n const chatWidth = isMobile\n ? \"100vw\"\n : isTablet\n ? \"min(calc(100vw - 3rem), 370px)\"\n : widthValue;\n\n const chatHeight = isMobile\n ? \"100vh\"\n : isTablet\n ? \"min(calc(100vh - 3rem), 620px)\"\n : heightValue;\n\n // Resize container for chat\n this.widgetElement.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${chatWidth};\n height: ${chatHeight};\n ${isMobile ? \"max-width: 100vw; max-height: 100vh;\" : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", false)}\n display: block;\n overflow: visible;\n box-sizing: border-box;\n `;\n\n // Hide trigger, show chat\n this.triggerIframe.style.display = \"none\";\n this.chatIframe.style.display = \"block\";\n this.chatIframe.style.visibility = \"visible\";\n\n this.state.isMinimized = false;\n this.state.isOpen = true;\n this.displayMode = \"full\";\n this.state.displayMode = \"full\";\n this.emit(\"maximized\", { timestamp: Date.now() });\n }\n\n private closeChat(): void {\n if (!this.chatIframe || !this.widgetElement || !this.triggerIframe) return;\n\n const config = this.options.config || {};\n const showTriggerText = config.showTriggerText !== false;\n const hasTriggerText = !!config.triggerText;\n\n // Hide chat iframe\n this.chatIframe.style.display = \"none\";\n this.chatIframe.style.visibility = \"hidden\";\n\n // Resize container back to trigger size\n const triggerWidth = showTriggerText && hasTriggerText ? \"auto\" : \"52px\";\n const triggerHeight = \"52px\";\n const triggerMinWidth = showTriggerText && hasTriggerText ? \"auto\" : \"\";\n\n this.widgetElement.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${triggerWidth};\n height: ${triggerHeight};\n ${triggerMinWidth ? `min-width: ${triggerMinWidth};` : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", true)}\n display: block;\n overflow: hidden;\n box-sizing: border-box;\n `;\n\n // Show trigger again\n this.triggerIframe.style.display = \"block\";\n\n this.state.isMinimized = true;\n this.state.isOpen = false;\n this.displayMode = \"hidden\";\n this.state.displayMode = \"hidden\";\n this.emit(\"minimized\", { timestamp: Date.now() });\n }\n\n private getPositionStyles(\n position: string,\n isMinimized: boolean = false,\n ): string {\n // Responsive positioning following mobile-first best practices\n const viewportWidth = window.innerWidth;\n const isExtraSmall = viewportWidth <= 375;\n const isMobile = viewportWidth <= 768;\n const isTablet = viewportWidth > 768 && viewportWidth <= 1024;\n\n // For extra small devices (Galaxy S8+, iPhone SE, etc.), use minimal or no margins\n // For mobile, use small margins for breathing room\n // For tablet/desktop, use larger margins for floating appearance\n let margin: string;\n\n if (isMinimized) {\n // Minimized button always needs some space from edges\n margin = isMobile ? \"12px\" : \"20px\";\n } else if (isMobile) {\n // Full screen on all mobile devices (no margins)\n margin = \"0\";\n } else if (isTablet) {\n // Medium margins on tablets\n margin = \"16px\";\n } else {\n // Larger margins on desktop for floating effect\n margin = \"24px\";\n }\n\n // On mobile screens when not minimized, position at edges for full coverage\n if (isMobile && !isMinimized) {\n return `top: 0; left: 0; right: 0; bottom: 0;`;\n }\n\n // Standard positioning for larger screens or minimized state\n switch (position) {\n case \"bottom-right\":\n return `bottom: ${margin}; right: ${margin};`;\n case \"bottom-left\":\n return `bottom: ${margin}; left: ${margin};`;\n case \"top-right\":\n return `top: ${margin}; right: ${margin};`;\n case \"top-left\":\n return `top: ${margin}; left: ${margin};`;\n default:\n return `bottom: ${margin}; right: ${margin};`;\n }\n }\n\n private setupPostMessageAPI(iframe: HTMLIFrameElement): void {\n // Listen for messages from the iframe\n window.addEventListener(\"message\", (event) => {\n if (event.source !== iframe.contentWindow) {\n return;\n }\n\n // Verify origin for security\n if (event.origin !== this.getBaseUrl()) {\n return;\n }\n\n const payload = event.data;\n if (!payload || typeof payload !== \"object\") return;\n const { type, data } = payload;\n if (typeof type !== \"string\") return;\n\n switch (type) {\n case IFRAME_HANDSHAKE_ACK_TYPE:\n this.handshakeComplete = true;\n this.flushOutboundMessageQueue();\n break;\n\n case \"ready\":\n this.state.isLoaded = true;\n this.emit(\"ready\", data);\n if (this.options.onReady) {\n this.options.onReady(data);\n }\n break;\n\n case \"visibility_changed\":\n this.state.isOpen = data.visibility === \"visible\";\n this.emit(\"visibility_changed\", data);\n if (this.options.onVisibilityChanged) {\n this.options.onVisibilityChanged(data);\n }\n break;\n\n case \"new_message\":\n if (data.isFromBot) {\n this.state.unreadCount++;\n }\n this.emit(\"new_message\", data);\n if (this.options.onNewMessage) {\n this.options.onNewMessage(data);\n }\n break;\n\n case \"minimized\":\n this.syncServerBehaviorFromData(data);\n if (this.isMinimalModeEnabled()) {\n if (!this.state.isOpen) {\n void this.openChat();\n }\n this.displayMode = \"minimal\";\n this.state.displayMode = \"minimal\";\n } else {\n // Backward-compatible behavior.\n this.closeChat();\n }\n break;\n\n case \"new_unread_message\":\n // Update unread count in trigger\n this.state.unreadCount++;\n if (this.triggerIframe?.contentWindow) {\n this.triggerIframe.contentWindow.postMessage(\n { type: \"updateUnreadCount\", count: this.state.unreadCount },\n window.location.origin,\n );\n }\n break;\n\n case \"customer_data_updated\":\n this.customerData = data;\n this.emit(\"customer_data_updated\", data);\n break;\n\n case \"session_updated\":\n this.sessionVariables = data.variables;\n this.emit(\"session_updated\", data);\n break;\n\n case \"error\":\n this.emit(\"error\", data);\n if (this.options.onError) {\n this.options.onError(data.error);\n }\n break;\n }\n });\n }\n\n private sendParentHandshake(): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n try {\n iframeWindow.postMessage(\n {\n type: PARENT_HANDSHAKE_TYPE,\n data: { origin: window.location.origin },\n },\n targetOrigin,\n );\n } catch {\n // Best-effort; iframe may fall back to document.referrer for origin discovery.\n }\n }\n\n private flushOutboundMessageQueue(): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n const queued = this.outboundMessageQueue;\n if (queued.length === 0) return;\n\n this.outboundMessageQueue = [];\n for (const msg of queued) {\n iframeWindow.postMessage({ type: msg.type, data: msg.data }, targetOrigin);\n }\n }\n\n private postMessageToWidget(type: string, data?: any): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n\n // Ensure handshake is sent before any other commands; queue until ack.\n if (!this.handshakeComplete && type !== PARENT_HANDSHAKE_TYPE) {\n const queue = this.outboundMessageQueue;\n if (queue.length < 50) {\n queue.push({ type, data });\n } else {\n this.outboundMessageQueue = [...queue.slice(-49), { type, data }];\n }\n this.sendParentHandshake();\n return;\n }\n\n iframeWindow.postMessage({ type, data }, targetOrigin);\n }\n\n private getBaseUrl(): string {\n // Return the base URL for the BuniAI platform\n // Priority: 1. config.baseUrl, 2. global BUNI_API_URL, 3. default platform URL\n const configUrl = (this.options?.config as any)?.baseUrl;\n const globalUrl = (globalThis as any).BUNI_API_URL;\n const rawUrl = configUrl || globalUrl || BUNI_PLATFORM_URL;\n\n try {\n return new URL(rawUrl).origin;\n } catch {\n return rawUrl;\n }\n }\n\n destroy(): void {\n this.postMessageToWidget(\"destroy\");\n\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n\n this.triggerIframe = null;\n this.chatIframe = null;\n this.eventListeners.clear();\n this.state.isLoaded = false;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n show(): void {\n // Show the widget container if it was hidden (hideDefaultTrigger mode)\n if (this.widgetElement) {\n this.widgetElement.style.display = \"block\";\n }\n // Open chat if not already open\n if (!this.chatIframe && !this.state.isOpen) {\n this.openChat();\n }\n }\n\n hide(): void {\n // Close chat if open\n if (this.chatIframe) {\n this.closeChat();\n }\n // If hideDefaultTrigger is enabled, completely hide the container\n if (this.options.config?.hideDefaultTrigger && this.widgetElement) {\n this.widgetElement.style.display = \"none\";\n }\n this.state.isOpen = false;\n this.emit(\"visibility_changed\", { visibility: \"hidden\" });\n }\n\n toggle(): void {\n if (this.chatIframe || this.state.isOpen) {\n this.closeChat();\n } else {\n this.openChat();\n }\n }\n\n minimize(): void {\n if (this.isMinimalModeEnabled()) {\n if (!this.state.isOpen) {\n void this.openChat();\n }\n this.postMessageToWidget(\"minimize\");\n this.displayMode = \"minimal\";\n this.state.displayMode = \"minimal\";\n return;\n }\n\n this.closeChat();\n }\n\n maximize(): void {\n void this.openChat();\n this.displayMode = \"full\";\n this.state.displayMode = \"full\";\n }\n\n setCustomerData(data: CustomerData): void {\n this.customerData = { ...this.customerData, ...data };\n this.postMessageToWidget(\"setCustomerData\", this.customerData);\n this.emit(\"customer_data_updated\", { data: this.customerData });\n }\n\n getCustomerData(): CustomerData | null {\n return this.customerData ? { ...this.customerData } : null;\n }\n\n setSessionVariables(variables: SessionVariables): void {\n this.sessionVariables = { ...this.sessionVariables, ...variables };\n this.postMessageToWidget(\"setSessionVariables\", this.sessionVariables);\n this.emit(\"session_updated\", { variables: this.sessionVariables });\n }\n\n getSessionVariables(): SessionVariables | null {\n return this.sessionVariables ? { ...this.sessionVariables } : null;\n }\n\n sendMessage(message: string): void {\n this.postMessageToWidget(\"sendMessage\", { message });\n\n const messageData = {\n message,\n isFromBot: false,\n timestamp: Date.now(),\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n };\n\n this.emit(\"new_message\", messageData);\n }\n\n clearChat(): void {\n this.postMessageToWidget(\"clearChat\");\n this.state.unreadCount = 0;\n }\n\n setTheme(theme: \"light\" | \"dark\" | \"system\"): void {\n this.postMessageToWidget(\"theme-change\", { theme });\n this.emit(\"theme_changed\", { theme, timestamp: Date.now() });\n }\n\n open(): void {\n this.openChat();\n }\n\n close(): void {\n this.closeChat();\n this.displayMode = \"hidden\";\n this.state.displayMode = \"hidden\";\n }\n\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(callback);\n }\n\n off(event: string, callback?: Function): void {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n\n if (callback) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n } else {\n this.eventListeners.set(event, []);\n }\n }\n\n emit(event: string, data?: any): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n }\n\n getState(): BuniChatState {\n return {\n ...this.state,\n displayMode: this.displayMode,\n };\n }\n\n isReady(): boolean {\n return this.state.isLoaded;\n }\n}\n\n// Utility function - named export\nexport function createBuniChatWidget(options: BuniChatOptions): BuniChatWidget {\n const widget = new BuniChatWidget();\n widget.initialize(options);\n return widget;\n}\n\n// Default export - the main widget class\nexport default BuniChatWidget;\n\n// Global type declaration for the widget API\ndeclare global {\n interface Window {\n BuniChat?: {\n configure: (config: any) => void;\n show: () => void;\n hide: () => void;\n minimize: () => void;\n maximize: () => void;\n destroy: () => void;\n setCustomerData: (data: CustomerData) => void;\n setSessionVariables: (variables: SessionVariables) => void;\n sendMessage: (message: string) => void;\n clearChat: () => void;\n setTheme: (theme: \"light\" | \"dark\" | \"system\") => void;\n open: () => void;\n close: () => void;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback?: Function) => void;\n };\n }\n}\n","// Main exports for @buni.ai/chatbot-core\n\n// Export all types\nexport * from \"./types\";\n\n// Export everything from widget\nexport * from \"./widget\";\n\n// Make BuniChatWidget the default export as well\nimport { BuniChatWidget } from \"./widget\";\nexport default BuniChatWidget;\n"],"names":[],"mappings":"AAQA;AACA,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAEhD,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AACtD,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAE9D;MACa,cAAc,CAAA;AAkBzB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,KAAK,GAAG;AACX,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,WAAW,EAAE,CAAC;SACf,CAAC;AACF,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;AAC5B,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;KAC1B;IAEO,oBAAoB,GAAA;;AAC1B,QAAA,IAAI,QAAO,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,0CAAE,iBAAiB,CAAA,KAAK,SAAS,EAAE;AAChE,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;SAC9C;QAED,OAAO,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;KACvD;AAEO,IAAA,0BAA0B,CAAC,IAAS,EAAA;QAC1C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YACrC,OAAO;SACR;QAED,MAAM,iBAAiB,GACrB,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;cAC9C,IAAI,CAAC,QAAQ;cACb,IAAI,CAAC;AAEX,QAAA,IAAI,OAAO,iBAAiB,CAAC,iBAAiB,KAAK,SAAS,EAAE;YAC5D,IAAI,CAAC,cAAc,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,iBAAiB,CAAC;SAC7E;AAED,QAAA,IACE,iBAAiB,CAAC,WAAW,KAAK,MAAM;YACxC,iBAAiB,CAAC,WAAW,KAAK,SAAS;AAC3C,YAAA,iBAAiB,CAAC,WAAW,KAAK,QAAQ,EAC1C;YACA,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC;SACjE;KACF;IAED,MAAM,UAAU,CAAC,OAAwB,EAAA;AACvC,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAEvB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;AACxB,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAE9C,YAAA,IAAI,OAAO,CAAC,OAAO,EAAE;AACnB,gBAAA,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;aAC5C;SACF;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,QAAQ,GACZ,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5D,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAEnE,YAAA,IAAI,OAAO,CAAC,OAAO,EAAE;AACnB,gBAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;aAC3B;AACD,YAAA,MAAM,QAAQ,CAAC;SAChB;KACF;AAEO,IAAA,MAAM,UAAU,GAAA;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;;YAErC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAC/C,4BAA4B,CAC7B,CAAC;YACF,IAAI,iBAAiB,EAAE;gBACrB,iBAAiB,CAAC,MAAM,EAAE,CAAC;aAC5B;;YAGD,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAChD,YAAA,SAAS,CAAC,EAAE,GAAG,4BAA4B,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;AAEzC,YAAA,MAAM,WAAW,GAAG,CAClB,KAAkC,EAClC,YAAoB,KACV;AACV,gBAAA,IAAI,CAAC,KAAK;AAAE,oBAAA,OAAO,YAAY,CAAC;AAChC,gBAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,gBAAA,IAAI,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC;AAAE,oBAAA,OAAO,GAAG,CAAC;AAC5D,gBAAA,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;oBAAE,OAAO,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI,CAAC;AAC7C,gBAAA,OAAO,GAAG,CAAC;AACb,aAAC,CAAC;YAEF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;AAGxD,YAAA,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC;AACzD,YAAA,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;AAC5C,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;AACtD,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;AAC7C,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,cAAc,CAAC;;AAGzD,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC;;AAI1C,YAAA,MAAM,YAAY,GAAG,eAAe,IAAI,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;YACzE,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,YAAA,MAAM,eAAe,GAAG,eAAe,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC;;AAGxE,YAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA;;;;iBAIf,YAAY,CAAA;kBACX,aAAa,CAAA;UACrB,eAAe,GAAG,CAAA,WAAA,EAAc,eAAe,CAAG,CAAA,CAAA,GAAG,EAAE,CAAA;;UAEvD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC,CAAA;;;;OAIlE,CAAC;;YAGF,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACvD,YAAA,aAAa,CAAC,EAAE,GAAG,qBAAqB,CAAC;AACzC,YAAA,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA;;;;;;;;yBAQX,eAAe,IAAI,cAAc,GAAG,MAAM,GAAG,KAAK,CAAA;;;OAGpE,CAAC;AACF,YAAA,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;;AAG3D,YAAA,SAAS,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;AACrC,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAErC,YAAA,aAAa,CAAC,MAAM,GAAG,MAAK;;AAC1B,gBAAA,MAAM,UAAU,GACd,aAAa,CAAC,eAAe;AAC7B,qBAAA,CAAA,EAAA,GAAA,aAAa,CAAC,aAAa,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAQ,CAAA,CAAC;gBACxC,IAAI,CAAC,UAAU,EAAE;AACf,oBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;oBAC9D,OAAO;iBACR;;AAGD,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CACvC,YAAY,EACZ,WAAW,IAAI,WAAW,EAC1B,eAAe,IAAI,cAAc,EACjC,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,CAClB,CAAC;gBAEF,UAAU,CAAC,IAAI,EAAE,CAAC;AAClB,gBAAA,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;;gBAGnB,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACpD,gBAAA,UAAU,CAAC,EAAE,GAAG,kBAAkB,CAAC;;AAGnC,gBAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;AACjC,oBAAA,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;AACzB,oBAAA,QAAQ,EAAE,MAAM;AAChB,oBAAA,MAAM,EAAE,SAAS;AACjB,oBAAA,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,SAAS;AAC/C,iBAAA,CAAC,CAAC;;gBAGH,IAAI,MAAM,CAAC,KAAK;oBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACpD,IAAI,MAAM,CAAC,YAAY;oBACrB,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBAClD,IAAI,MAAM,CAAC,cAAc;oBACvB,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;gBACtD,IAAI,MAAM,CAAC,QAAQ;oBAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC7D,gBAAA,IAAI,UAAU,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;AAC1C,oBAAA,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAClC,gBAAA,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;AAC5C,oBAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACpC,IAAI,MAAM,CAAC,YAAY;oBACrB,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBAClD,IAAI,MAAM,CAAC,WAAW;oBAAE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;gBACtE,IAAI,MAAM,CAAC,cAAc;oBACvB,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;gBACtD,IAAI,MAAM,CAAC,WAAW;oBAAE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;gBACtE,IAAI,MAAM,CAAC,YAAY;oBACrB,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBAClD,IAAI,MAAM,CAAC,UAAU;oBAAE,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;gBACnE,IAAI,MAAM,CAAC,UAAU;oBAAE,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;;AAGnE,gBAAA,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;AACnC,oBAAA,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;AAC1D,gBAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;AAC/B,oBAAA,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClD,gBAAA,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS;AACpC,oBAAA,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;AAC5D,gBAAA,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;AACnC,oBAAA,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;AAC1D,gBAAA,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;AACjC,oBAAA,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AACtD,gBAAA,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS;AACvC,oBAAA,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAClE,gBAAA,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS;AACrC,oBAAA,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AAC9D,gBAAA,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;AACnC,oBAAA,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;AAC1D,gBAAA,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS;AACtC,oBAAA,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;AAChE,gBAAA,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS;AACtC,oBAAA,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;gBAChE,IAAI,MAAM,CAAC,eAAe;oBACxB,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;gBACxD,IAAI,MAAM,CAAC,iBAAiB;AAC1B,oBAAA,MAAM,CAAC,GAAG,CACR,mBAAmB,EACnB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CACzC,CAAC;AACJ,gBAAA,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,EAAE;AAC1C,oBAAA,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;iBACnE;AACD,gBAAA,IAAI,MAAM,CAAC,WAAW,EAAE;oBACtB,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;iBAC/C;AACD,gBAAA,IAAI,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;AAC7D,oBAAA,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;iBACjE;AAED,gBAAA,UAAU,CAAC,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,CAAA,YAAA,EAAe,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;;AAGxE,gBAAA,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA;;;;;;;;AAQR,yBAAA,EAAA,QAAQ,GAAG,GAAG,GAAG,MAAM,CAAA;;;AAG1B,sBAAA,EAAA,QAAQ,GAAG,MAAM,GAAG,6BAA6B,CAAA;;SAEhE,CAAC;AACF,gBAAA,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AACpD,gBAAA,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;AAEvD,gBAAA,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;;AAGlC,gBAAA,UAAU,CAAC,MAAM,GAAG,MAAK;;AAEvB,oBAAA,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;;AAGvC,oBAAA,IAAI;AACF,wBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;qBACxD;AAAC,oBAAA,OAAA,EAAA,EAAM;AACN,wBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;qBAC3C;;AAGD,oBAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;AAC/B,oBAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;AAE/B,oBAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;oBACrC,IAAI,CAAC,mBAAmB,EAAE,CAAC;;AAG3B,oBAAA,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;AAC/B,oBAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AACnC,oBAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,oBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;AAC9B,oBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;AAClC,oBAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;AAC5B,oBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC3B,oBAAA,OAAO,EAAE,CAAC;AACZ,iBAAC,CAAC;AACJ,aAAC,CAAC;;YAGF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,KAAI;;AAC3C,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;AAC3B,gBAAA,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;oBAAE,OAAO;AACpD,gBAAA,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO;AAE7C,gBAAA,QAAQ,OAAO,CAAC,IAAI;AAClB,oBAAA,KAAK,kBAAkB;;wBAErB,IACE,KAAK,CAAC,MAAM,MAAK,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAa,CAAA;4BAC/C,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,EAAE,EAClC;AACA,4BAAA,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;AAG9C,4BAAA,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;AAC3C,gCAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;6BACnC;;AAGD,4BAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC5B,gCAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACrB,gCAAA,QAAQ,EAAE,CAAA,EAAA,GAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ;AACjC,6BAAA,CAAC,CAAC;AACH,4BAAA,IACE,IAAI,CAAC,OAAO,CAAC,iBAAiB;gCAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,UAAU,EACpD;AACA,gCAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;AAC7B,oCAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACrB,oCAAA,QAAQ,EAAE,CAAA,EAAA,GAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ;AACjC,iCAAA,CAAC,CAAC;6BACJ;yBACF;wBACD,MAAM;AAER,oBAAA,KAAK,eAAe;wBAClB,IACE,KAAK,CAAC,MAAM,MAAK,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAa,CAAA;4BAC/C,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,EAAE,EAClC;4BACA,IAAI,CAAC,SAAS,EAAE,CAAC;AACjB,4BAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;AAC5B,4BAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;yBACnC;wBACD,MAAM;AAER,oBAAA,KAAK,kBAAkB;wBACrB,IACE,KAAK,CAAC,MAAM,MAAK,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAa,CAAA;4BAC/C,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,EAAE,EAClC;AACA,4BAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,gCAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACtB,oCAAA,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;iCACtB;AACD,gCAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AACrC,gCAAA,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;AAC7B,gCAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;6BACpC;iCAAM;gCACL,IAAI,CAAC,SAAS,EAAE,CAAC;AACjB,gCAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;AAC5B,gCAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;6BACnC;yBACF;wBACD,MAAM;AAER,oBAAA,KAAK,iBAAiB;wBACpB,IACE,KAAK,CAAC,MAAM,MAAK,CAAA,EAAA,GAAA,IAAI,CAAC,aAAa,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAa,CAAA;4BAClD,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,EACvC;4BACA,IAAI,CAAC,QAAQ,EAAE,CAAC;yBACjB;wBACD,MAAM;iBACT;AACH,aAAC,CAAC,CAAC;;;YAGH,UAAU,CAAC,MAAK;AACd,gBAAA,IACE,SAAS;oBACT,CAAC,MAAM,CAAC,kBAAkB;AAC1B,oBAAA,SAAS,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM;AAClC,oBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,EAC3B;AACA,oBAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;iBACnC;aACF,EAAE,KAAK,CAAC,CAAC;AACV,YAAA,aAAa,CAAC,GAAG,GAAG,aAAa,CAAC;AACpC,SAAC,CAAC,CAAC;KACJ;IAEO,gBAAgB,CACtB,YAAoB,EACpB,IAAY,EACZ,QAAiB,EACjB,YAAqB,EACrB,UAAmB,EACnB,UAAmB,EAAA;QAEnB,MAAM,aAAa,GAAG,YAAY;cAC9B,CAAa,UAAA,EAAA,YAAY,CAA0E,wEAAA,CAAA;AACrG,cAAE,UAAU,KAAK,MAAM,IAAI,UAAU;AACnC,kBAAE,CAAA,6MAAA,EAAgN,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAQ,MAAA,CAAA;kBAChQ,wKAAwK,CAAC;QAE/K,OAAO,CAAA;;;;;;;;;;;;;;;;;;;;AAoBE,WAAA,EAAA,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAA;AACnB,eAAA,EAAA,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAA;oBAC5B,YAAY,CAAA;;AAET,qBAAA,EAAA,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAA;;;;;AAKxC,MAAA,EAAA,QAAQ,GAAG,EAAE,GAAG,4BAA4B,CAAA;;;;;+BAKrB,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAyCV,YAAY,CAAA;;;;;;;;4BAQjB,aAAa,CAAA;QACjC,QAAQ,GAAG,CAAA,mBAAA,EAAsB,IAAI,CAAS,OAAA,CAAA,GAAG,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4BnD,CAAC;KACN;AAEO,IAAA,MAAM,QAAQ,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;AAC3E,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;AACzC,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC;AAC1C,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,GAAG,GAAG,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;AAEtE,QAAA,MAAM,WAAW,GAAG,CAClB,KAAkC,EAClC,YAAoB,KACV;AACV,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,YAAY,CAAC;AAChC,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,YAAA,IAAI,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC;AAAE,gBAAA,OAAO,GAAG,CAAC;AAC5D,YAAA,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;gBAAE,OAAO,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI,CAAC;AAC7C,YAAA,OAAO,GAAG,CAAC;AACb,SAAC,CAAC;QAEF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;QAGxD,MAAM,SAAS,GAAG,QAAQ;AACxB,cAAE,OAAO;AACT,cAAE,QAAQ;AACR,kBAAE,gCAAgC;kBAChC,UAAU,CAAC;QAEjB,MAAM,UAAU,GAAG,QAAQ;AACzB,cAAE,OAAO;AACT,cAAE,QAAQ;AACR,kBAAE,gCAAgC;kBAChC,WAAW,CAAC;;AAGlB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA;;;;eAIxB,SAAS,CAAA;gBACR,UAAU,CAAA;AAClB,MAAA,EAAA,QAAQ,GAAG,sCAAsC,GAAG,EAAE,CAAA;;QAEtD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,IAAI,cAAc,EAAE,KAAK,CAAC,CAAA;;;;KAInE,CAAC;;QAGF,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;AAE7C,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;KACnD;IAEO,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;AACzC,QAAA,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC;AACzD,QAAA,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;;QAG5C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;;AAG5C,QAAA,MAAM,YAAY,GAAG,eAAe,IAAI,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;QACzE,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,QAAA,MAAM,eAAe,GAAG,eAAe,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC;AAExE,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA;;;;eAIxB,YAAY,CAAA;gBACX,aAAa,CAAA;QACrB,eAAe,GAAG,CAAA,WAAA,EAAc,eAAe,CAAG,CAAA,CAAA,GAAG,EAAE,CAAA;;QAEvD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC,CAAA;;;;KAIlE,CAAC;;QAGF,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAE3C,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;KACnD;AAEO,IAAA,iBAAiB,CACvB,QAAgB,EAChB,WAAA,GAAuB,KAAK,EAAA;;AAG5B,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC;AAExC,QAAA,MAAM,QAAQ,GAAG,aAAa,IAAI,GAAG,CAAC;QACtC,MAAM,QAAQ,GAAG,aAAa,GAAG,GAAG,IAAI,aAAa,IAAI,IAAI,CAAC;;;;AAK9D,QAAA,IAAI,MAAc,CAAC;QAEnB,IAAI,WAAW,EAAE;;YAEf,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;SACrC;aAAM,IAAI,QAAQ,EAAE;;YAEnB,MAAM,GAAG,GAAG,CAAC;SACd;aAAM,IAAI,QAAQ,EAAE;;YAEnB,MAAM,GAAG,MAAM,CAAC;SACjB;aAAM;;YAEL,MAAM,GAAG,MAAM,CAAC;SACjB;;AAGD,QAAA,IAAI,QAAQ,IAAI,CAAC,WAAW,EAAE;AAC5B,YAAA,OAAO,uCAAuC,CAAC;SAChD;;QAGD,QAAQ,QAAQ;AACd,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,CAAW,QAAA,EAAA,MAAM,CAAY,SAAA,EAAA,MAAM,GAAG,CAAC;AAChD,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,CAAW,QAAA,EAAA,MAAM,CAAW,QAAA,EAAA,MAAM,GAAG,CAAC;AAC/C,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,CAAQ,KAAA,EAAA,MAAM,CAAY,SAAA,EAAA,MAAM,GAAG,CAAC;AAC7C,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,CAAQ,KAAA,EAAA,MAAM,CAAW,QAAA,EAAA,MAAM,GAAG,CAAC;AAC5C,YAAA;AACE,gBAAA,OAAO,CAAW,QAAA,EAAA,MAAM,CAAY,SAAA,EAAA,MAAM,GAAG,CAAC;SACjD;KACF;AAEO,IAAA,mBAAmB,CAAC,MAAyB,EAAA;;QAEnD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,KAAI;;YAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,aAAa,EAAE;gBACzC,OAAO;aACR;;YAGD,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,EAAE,EAAE;gBACtC,OAAO;aACR;AAED,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,OAAO;AACpD,YAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO;YAErC,QAAQ,IAAI;AACV,gBAAA,KAAK,yBAAyB;AAC5B,oBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBAC9B,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBACjC,MAAM;AAER,gBAAA,KAAK,OAAO;AACV,oBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC3B,oBAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACzB,oBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACxB,wBAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;qBAC5B;oBACD,MAAM;AAER,gBAAA,KAAK,oBAAoB;oBACvB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC;AAClD,oBAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;AACtC,oBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;AACpC,wBAAA,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;qBACxC;oBACD,MAAM;AAER,gBAAA,KAAK,aAAa;AAChB,oBAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,wBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;qBAC1B;AACD,oBAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAC/B,oBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AAC7B,wBAAA,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;qBACjC;oBACD,MAAM;AAER,gBAAA,KAAK,WAAW;AACd,oBAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;AACtC,oBAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,wBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACtB,4BAAA,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;yBACtB;AACD,wBAAA,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;AAC7B,wBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;qBACpC;yBAAM;;wBAEL,IAAI,CAAC,SAAS,EAAE,CAAC;qBAClB;oBACD,MAAM;AAER,gBAAA,KAAK,oBAAoB;;AAEvB,oBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AACzB,oBAAA,IAAI,MAAA,IAAI,CAAC,aAAa,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAa,EAAE;wBACrC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,WAAW,CAC1C,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAC5D,MAAM,CAAC,QAAQ,CAAC,MAAM,CACvB,CAAC;qBACH;oBACD,MAAM;AAER,gBAAA,KAAK,uBAAuB;AAC1B,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,oBAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;oBACzC,MAAM;AAER,gBAAA,KAAK,iBAAiB;AACpB,oBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC;AACvC,oBAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;oBACnC,MAAM;AAER,gBAAA,KAAK,OAAO;AACV,oBAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACzB,oBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;wBACxB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;qBAClC;oBACD,MAAM;aACT;AACH,SAAC,CAAC,CAAC;KACJ;IAEO,mBAAmB,GAAA;;QACzB,MAAM,YAAY,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,aAAa,CAAC;AACpD,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,YAAY,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,IAAI,CAAC,UAAU,EAAE,CAAC;AAChE,QAAA,IAAI;YACF,YAAY,CAAC,WAAW,CACtB;AACE,gBAAA,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;aACzC,EACD,YAAY,CACb,CAAC;SACH;AAAC,QAAA,OAAA,EAAA,EAAM;;SAEP;KACF;IAEO,yBAAyB,GAAA;;QAC/B,MAAM,YAAY,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,aAAa,CAAC;AACpD,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,YAAY,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,IAAI,CAAC,UAAU,EAAE,CAAC;AAChE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;AACzC,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;AAEhC,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;AAC/B,QAAA,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;AACxB,YAAA,YAAY,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;SAC5E;KACF;IAEO,mBAAmB,CAAC,IAAY,EAAE,IAAU,EAAA;;QAClD,MAAM,YAAY,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,aAAa,CAAC;AACpD,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,YAAY,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,IAAI,CAAC,UAAU,EAAE,CAAC;;QAGhE,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,KAAK,qBAAqB,EAAE;AAC7D,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC;AACxC,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE;gBACrB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aAC5B;iBAAM;AACL,gBAAA,IAAI,CAAC,oBAAoB,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACnE;YACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,OAAO;SACR;QAED,YAAY,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;KACxD;IAEO,UAAU,GAAA;;;;QAGhB,MAAM,SAAS,GAAG,CAAA,EAAA,GAAC,CAAA,EAAA,GAAA,IAAI,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAc,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,CAAC;AACzD,QAAA,MAAM,SAAS,GAAI,UAAkB,CAAC,YAAY,CAAC;AACnD,QAAA,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,IAAI,iBAAiB,CAAC;AAE3D,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;SAC/B;AAAC,QAAA,OAAA,EAAA,EAAM;AACN,YAAA,OAAO,MAAM,CAAC;SACf;KACF;IAED,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAEpC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;AAC5B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC3B;AAED,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;KAC9B;IAED,IAAI,GAAA;;AAEF,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;SAC5C;;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;KACF;IAED,IAAI,GAAA;;;AAEF,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,SAAS,EAAE,CAAC;SAClB;;AAED,QAAA,IAAI,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,OAAO,CAAC,MAAM,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,kBAAkB,KAAI,IAAI,CAAC,aAAa,EAAE;YACjE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SAC3C;AACD,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;KAC3D;IAED,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACxC,IAAI,CAAC,SAAS,EAAE,CAAC;SAClB;aAAM;YACL,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;KACF;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACtB,gBAAA,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;aACtB;AACD,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;YACnC,OAAO;SACR;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;KAClB;IAED,QAAQ,GAAA;AACN,QAAA,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC;KACjC;AAED,IAAA,eAAe,CAAC,IAAkB,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;AAC/D,QAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;KACjE;IAED,eAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC;KAC5D;AAED,IAAA,mBAAmB,CAAC,SAA2B,EAAA;AAC7C,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,SAAS,EAAE,CAAC;QACnE,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;KACpE;IAED,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC;KACpE;AAED,IAAA,WAAW,CAAC,OAAe,EAAA;QACzB,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAErD,QAAA,MAAM,WAAW,GAAG;YAClB,OAAO;AACP,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA;SAC1E,CAAC;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;KACvC;IAED,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;KAC5B;AAED,IAAA,QAAQ,CAAC,KAAkC,EAAA;QACzC,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;KAC9D;IAED,IAAI,GAAA;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;KACjB;IAED,KAAK,GAAA;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;AACjB,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;KACnC;IAED,EAAE,CAAC,KAAa,EAAE,QAAkB,EAAA;QAClC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACnC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;SACpC;AACD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KAChD;IAED,GAAG,CAAC,KAAa,EAAE,QAAmB,EAAA;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,QAAQ,EAAE;YACZ,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC1C,YAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;AACd,gBAAA,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aAC5B;SACF;aAAM;YACL,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;SACpC;KACF;IAED,IAAI,CAAC,KAAa,EAAE,IAAU,EAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE;AACb,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AAC7B,gBAAA,IAAI;oBACF,QAAQ,CAAC,IAAI,CAAC,CAAC;iBAChB;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,KAAK,CAAC,CAAA,4BAAA,EAA+B,KAAK,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;iBAC/D;AACH,aAAC,CAAC,CAAC;SACJ;KACF;IAED,QAAQ,GAAA;QACN,OAAO;YACL,GAAG,IAAI,CAAC,KAAK;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;KACH;IAED,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;KAC5B;AACF,CAAA;AAED;AACM,SAAU,oBAAoB,CAAC,OAAwB,EAAA;AAC3D,IAAA,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;AACpC,IAAA,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC3B,IAAA,OAAO,MAAM,CAAC;AAChB;;ACnhCA;AAEA;;;;"}
package/dist/index.js CHANGED
@@ -24,6 +24,31 @@ class BuniChatWidget {
24
24
  this.chatTargetOrigin = null;
25
25
  this.handshakeComplete = false;
26
26
  this.outboundMessageQueue = [];
27
+ this.displayMode = "hidden";
28
+ this.serverBehavior = {};
29
+ }
30
+ isMinimalModeEnabled() {
31
+ var _a, _b;
32
+ if (typeof ((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.enableMinimalMode) === "boolean") {
33
+ return this.options.config.enableMinimalMode;
34
+ }
35
+ return Boolean(this.serverBehavior.enableMinimalMode);
36
+ }
37
+ syncServerBehaviorFromData(data) {
38
+ if (!data || typeof data !== "object") {
39
+ return;
40
+ }
41
+ const behaviorCandidate = data.behavior && typeof data.behavior === "object"
42
+ ? data.behavior
43
+ : data;
44
+ if (typeof behaviorCandidate.enableMinimalMode === "boolean") {
45
+ this.serverBehavior.enableMinimalMode = behaviorCandidate.enableMinimalMode;
46
+ }
47
+ if (behaviorCandidate.defaultMode === "full" ||
48
+ behaviorCandidate.defaultMode === "minimal" ||
49
+ behaviorCandidate.defaultMode === "hidden") {
50
+ this.serverBehavior.defaultMode = behaviorCandidate.defaultMode;
51
+ }
27
52
  }
28
53
  async initialize(options) {
29
54
  this.options = options;
@@ -187,6 +212,15 @@ class BuniChatWidget {
187
212
  params.set("startButtonText", config.startButtonText);
188
213
  if (config.preChatFormFields)
189
214
  params.set("preChatFormFields", JSON.stringify(config.preChatFormFields));
215
+ if (config.enableMinimalMode !== undefined) {
216
+ params.set("enableMinimalMode", String(config.enableMinimalMode));
217
+ }
218
+ if (config.defaultMode) {
219
+ params.set("defaultMode", config.defaultMode);
220
+ }
221
+ if (config.autoMessages && Array.isArray(config.autoMessages)) {
222
+ params.set("autoMessages", JSON.stringify(config.autoMessages));
223
+ }
190
224
  chatIframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;
191
225
  // Chat iframe styling - initially hidden
192
226
  chatIframe.style.cssText = `
@@ -227,13 +261,15 @@ class BuniChatWidget {
227
261
  this.triggerIframe = triggerIframe;
228
262
  this.chatIframe = chatIframe;
229
263
  this.state.isMinimized = true;
264
+ this.state.displayMode = "hidden";
265
+ this.displayMode = "hidden";
230
266
  this.state.isLoaded = true;
231
267
  resolve();
232
268
  };
233
269
  };
234
270
  // Listen for trigger and connection events
235
271
  window.addEventListener("message", (event) => {
236
- var _a, _b;
272
+ var _a, _b, _c, _d, _e, _f;
237
273
  const payload = event.data;
238
274
  if (!payload || typeof payload !== "object")
239
275
  return;
@@ -244,20 +280,53 @@ class BuniChatWidget {
244
280
  // Check if message is from chat iframe
245
281
  if (event.source === ((_a = this.chatIframe) === null || _a === void 0 ? void 0 : _a.contentWindow) &&
246
282
  event.origin === this.getBaseUrl()) {
283
+ this.syncServerBehaviorFromData(payload.data);
247
284
  // Connection is ready, show the trigger button
248
285
  if (container && !config.hideDefaultTrigger) {
249
286
  container.style.display = "block";
250
287
  }
251
288
  // Emit connection_ready event for consumers
252
- this.emit("connection_ready", { timestamp: Date.now() });
289
+ this.emit("connection_ready", {
290
+ timestamp: Date.now(),
291
+ behavior: (_b = payload.data) === null || _b === void 0 ? void 0 : _b.behavior,
292
+ });
253
293
  if (this.options.onConnectionReady &&
254
294
  typeof this.options.onConnectionReady === "function") {
255
- this.options.onConnectionReady({ timestamp: Date.now() });
295
+ this.options.onConnectionReady({
296
+ timestamp: Date.now(),
297
+ behavior: (_c = payload.data) === null || _c === void 0 ? void 0 : _c.behavior,
298
+ });
299
+ }
300
+ }
301
+ break;
302
+ case "chatbot:close":
303
+ if (event.source === ((_d = this.chatIframe) === null || _d === void 0 ? void 0 : _d.contentWindow) &&
304
+ event.origin === this.getBaseUrl()) {
305
+ this.closeChat();
306
+ this.displayMode = "hidden";
307
+ this.state.displayMode = "hidden";
308
+ }
309
+ break;
310
+ case "chatbot:minimize":
311
+ if (event.source === ((_e = this.chatIframe) === null || _e === void 0 ? void 0 : _e.contentWindow) &&
312
+ event.origin === this.getBaseUrl()) {
313
+ if (this.isMinimalModeEnabled()) {
314
+ if (!this.state.isOpen) {
315
+ void this.openChat();
316
+ }
317
+ this.postMessageToWidget("minimize");
318
+ this.displayMode = "minimal";
319
+ this.state.displayMode = "minimal";
320
+ }
321
+ else {
322
+ this.closeChat();
323
+ this.displayMode = "hidden";
324
+ this.state.displayMode = "hidden";
256
325
  }
257
326
  }
258
327
  break;
259
328
  case "trigger_clicked":
260
- if (event.source === ((_b = this.triggerIframe) === null || _b === void 0 ? void 0 : _b.contentWindow) &&
329
+ if (event.source === ((_f = this.triggerIframe) === null || _f === void 0 ? void 0 : _f.contentWindow) &&
261
330
  event.origin === window.location.origin) {
262
331
  this.openChat();
263
332
  }
@@ -267,13 +336,11 @@ class BuniChatWidget {
267
336
  // Trigger the load event
268
337
  // if by 10 seconds the ready message is not received, we want to manually, set the container to visible
269
338
  setTimeout(() => {
270
- if (!this.state.isLoaded) {
271
- if (container &&
272
- !config.hideDefaultTrigger &&
273
- container.style.display === "none" &&
274
- this.state.isOpen === false) {
275
- container.style.display = "block";
276
- }
339
+ if (container &&
340
+ !config.hideDefaultTrigger &&
341
+ container.style.display === "none" &&
342
+ this.state.isOpen === false) {
343
+ container.style.display = "block";
277
344
  }
278
345
  }, 10000);
279
346
  triggerIframe.src = "about:blank";
@@ -450,6 +517,8 @@ class BuniChatWidget {
450
517
  this.chatIframe.style.visibility = "visible";
451
518
  this.state.isMinimized = false;
452
519
  this.state.isOpen = true;
520
+ this.displayMode = "full";
521
+ this.state.displayMode = "full";
453
522
  this.emit("maximized", { timestamp: Date.now() });
454
523
  }
455
524
  closeChat() {
@@ -482,6 +551,8 @@ class BuniChatWidget {
482
551
  this.triggerIframe.style.display = "block";
483
552
  this.state.isMinimized = true;
484
553
  this.state.isOpen = false;
554
+ this.displayMode = "hidden";
555
+ this.state.displayMode = "hidden";
485
556
  this.emit("minimized", { timestamp: Date.now() });
486
557
  }
487
558
  getPositionStyles(position, isMinimized = false) {
@@ -573,8 +644,18 @@ class BuniChatWidget {
573
644
  }
574
645
  break;
575
646
  case "minimized":
576
- // User clicked minimize in chat - close chat and show trigger
577
- this.closeChat();
647
+ this.syncServerBehaviorFromData(data);
648
+ if (this.isMinimalModeEnabled()) {
649
+ if (!this.state.isOpen) {
650
+ void this.openChat();
651
+ }
652
+ this.displayMode = "minimal";
653
+ this.state.displayMode = "minimal";
654
+ }
655
+ else {
656
+ // Backward-compatible behavior.
657
+ this.closeChat();
658
+ }
578
659
  break;
579
660
  case "new_unread_message":
580
661
  // Update unread count in trigger
@@ -709,10 +790,21 @@ class BuniChatWidget {
709
790
  }
710
791
  }
711
792
  minimize() {
793
+ if (this.isMinimalModeEnabled()) {
794
+ if (!this.state.isOpen) {
795
+ void this.openChat();
796
+ }
797
+ this.postMessageToWidget("minimize");
798
+ this.displayMode = "minimal";
799
+ this.state.displayMode = "minimal";
800
+ return;
801
+ }
712
802
  this.closeChat();
713
803
  }
714
804
  maximize() {
715
- this.openChat();
805
+ void this.openChat();
806
+ this.displayMode = "full";
807
+ this.state.displayMode = "full";
716
808
  }
717
809
  setCustomerData(data) {
718
810
  this.customerData = { ...this.customerData, ...data };
@@ -753,6 +845,8 @@ class BuniChatWidget {
753
845
  }
754
846
  close() {
755
847
  this.closeChat();
848
+ this.displayMode = "hidden";
849
+ this.state.displayMode = "hidden";
756
850
  }
757
851
  on(event, callback) {
758
852
  if (!this.eventListeners.has(event)) {
@@ -788,7 +882,10 @@ class BuniChatWidget {
788
882
  }
789
883
  }
790
884
  getState() {
791
- return { ...this.state };
885
+ return {
886
+ ...this.state,
887
+ displayMode: this.displayMode,
888
+ };
792
889
  }
793
890
  isReady() {
794
891
  return this.state.isLoaded;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import {\n BuniChatAPI,\n BuniChatOptions,\n BuniChatState,\n CustomerData,\n SessionVariables,\n} from \"./types\";\n\n// Default BuniAI platform URL\nconst BUNI_PLATFORM_URL = \"https://www.buni.ai\";\n\nconst PARENT_HANDSHAKE_TYPE = \"buni:parent_handshake\";\nconst IFRAME_HANDSHAKE_ACK_TYPE = \"buni:iframe_handshake_ack\";\n\n// Core widget loader class\nexport class BuniChatWidget implements BuniChatAPI {\n private options!: BuniChatOptions;\n private readonly state: BuniChatState;\n private readonly eventListeners: Map<string, Function[]>;\n private widgetElement: HTMLElement | null;\n private triggerIframe: HTMLIFrameElement | null;\n private chatIframe: HTMLIFrameElement | null;\n private customerData: CustomerData | null;\n private sessionVariables: SessionVariables | null;\n private chatTargetOrigin: string | null;\n private handshakeComplete: boolean;\n private outboundMessageQueue: Array<{ type: string; data?: any }>;\n\n constructor() {\n this.state = {\n isOpen: false,\n isLoaded: false,\n isMinimized: false,\n unreadCount: 0,\n };\n this.eventListeners = new Map();\n this.widgetElement = null;\n this.triggerIframe = null;\n this.chatIframe = null;\n this.customerData = null;\n this.sessionVariables = null;\n this.chatTargetOrigin = null;\n this.handshakeComplete = false;\n this.outboundMessageQueue = [];\n }\n\n async initialize(options: BuniChatOptions): Promise<void> {\n this.options = options;\n\n try {\n await this.loadWidget();\n this.state.isLoaded = true;\n this.emit(\"ready\", { timestamp: Date.now() });\n\n if (options.onReady) {\n options.onReady({ timestamp: Date.now() });\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", { error: errorObj, context: \"initialization\" });\n\n if (options.onError) {\n options.onError(errorObj);\n }\n throw errorObj;\n }\n }\n\n private async loadWidget(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if container already exists and remove it\n const existingContainer = document.getElementById(\n \"buni-chat-widget-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n // Create container div for proper positioning\n const container = document.createElement(\"div\");\n container.id = \"buni-chat-widget-container\";\n const config = this.options.config || {};\n\n const ensureUnits = (\n value: string | number | undefined,\n defaultValue: string,\n ): string => {\n if (!value) return defaultValue;\n const str = String(value);\n if (str.match(/^[\\d.]+\\s*(px|em|rem|%|vh|vw)$/)) return str;\n if (str.match(/^[\\d.]+$/)) return `${str}px`;\n return str;\n };\n\n const widthValue = ensureUnits(config.width, \"350px\");\n const heightValue = ensureUnits(config.height, \"650px\");\n\n // Configuration\n const showTriggerText = config.showTriggerText !== false;\n const hasTriggerText = !!config.triggerText;\n const primaryColor = config.primaryColor || \"#795548\";\n const triggerText = config.triggerText || \"\";\n const companyName = config.companyName || \"Chat Support\";\n\n // Responsive breakpoints\n const isMobile = window.innerWidth <= 768;\n const isTablet = window.innerWidth > 768 && window.innerWidth <= 1024;\n\n // Calculate trigger dimensions\n const triggerWidth = showTriggerText && hasTriggerText ? \"auto\" : \"52px\";\n const triggerHeight = \"52px\";\n const triggerMinWidth = showTriggerText && hasTriggerText ? \"auto\" : \"\";\n\n // Container starts as trigger size, initially hidden until connection is ready\n container.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${triggerWidth};\n height: ${triggerHeight};\n ${triggerMinWidth ? `min-width: ${triggerMinWidth};` : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", true)}\n display: none;\n overflow: hidden;\n box-sizing: border-box;\n `;\n\n // Create inline trigger iframe (no src)\n const triggerIframe = document.createElement(\"iframe\");\n triggerIframe.id = \"buni-trigger-iframe\";\n triggerIframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n border: none;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border-radius: ${showTriggerText && hasTriggerText ? \"26px\" : \"50%\"};\n transition: border-radius 0.3s ease, box-shadow 0.3s ease;\n pointer-events: auto;\n `;\n triggerIframe.setAttribute(\"title\", \"BuniAI Chat Trigger\");\n\n // Inject trigger HTML content directly (no src)\n container.appendChild(triggerIframe);\n document.body.appendChild(container);\n\n triggerIframe.onload = () => {\n const triggerDoc =\n triggerIframe.contentDocument ||\n triggerIframe.contentWindow?.document;\n if (!triggerDoc) {\n reject(new Error(\"Failed to access trigger iframe document\"));\n return;\n }\n\n // Build inline HTML for trigger\n const triggerHTML = this.buildTriggerHTML(\n primaryColor,\n triggerText || companyName,\n showTriggerText && hasTriggerText,\n config.customAvatar,\n config.avatarType,\n config.avatarText,\n );\n\n triggerDoc.open();\n triggerDoc.write(triggerHTML);\n triggerDoc.close();\n\n // Create chat iframe (initially hidden)\n const chatIframe = document.createElement(\"iframe\");\n chatIframe.id = \"buni-chat-iframe\";\n\n // Build URL with configuration parameters\n const params = new URLSearchParams({\n token: this.options.token,\n embedded: \"true\",\n source: \"package\",\n framework: this.options.framework || \"vanilla\",\n });\n\n // Add all configuration parameters\n if (config.theme) params.set(\"theme\", config.theme);\n if (config.primaryColor)\n params.set(\"primaryColor\", config.primaryColor);\n if (config.secondaryColor)\n params.set(\"secondaryColor\", config.secondaryColor);\n if (config.position) params.set(\"position\", config.position);\n if (widthValue && config.width !== undefined)\n params.set(\"width\", widthValue);\n if (heightValue && config.height !== undefined)\n params.set(\"height\", heightValue);\n if (config.customAvatar)\n params.set(\"customAvatar\", config.customAvatar);\n if (config.companyName) params.set(\"companyName\", config.companyName);\n if (config.welcomeMessage)\n params.set(\"welcomeMessage\", config.welcomeMessage);\n if (config.triggerText) params.set(\"triggerText\", config.triggerText);\n if (config.borderRadius)\n params.set(\"borderRadius\", config.borderRadius);\n if (config.avatarType) params.set(\"avatarType\", config.avatarType);\n if (config.avatarText) params.set(\"avatarText\", config.avatarText);\n\n // Boolean options\n if (config.showBranding !== undefined)\n params.set(\"showBranding\", String(config.showBranding));\n if (config.autoOpen !== undefined)\n params.set(\"autoOpen\", String(config.autoOpen));\n if (config.allowMinimize !== undefined)\n params.set(\"allowMinimize\", String(config.allowMinimize));\n if (config.showMinimize !== undefined)\n params.set(\"showMinimize\", String(config.showMinimize));\n if (config.allowClose !== undefined)\n params.set(\"allowClose\", String(config.allowClose));\n if (config.enableFileUpload !== undefined)\n params.set(\"enableFileUpload\", String(config.enableFileUpload));\n if (config.showTimestamps !== undefined)\n params.set(\"showTimestamps\", String(config.showTimestamps));\n if (config.enableMobile !== undefined)\n params.set(\"enableMobile\", String(config.enableMobile));\n if (config.showPreChatForm !== undefined)\n params.set(\"showPreChatForm\", String(config.showPreChatForm));\n if (config.showStartButton !== undefined)\n params.set(\"showStartButton\", String(config.showStartButton));\n if (config.startButtonText)\n params.set(\"startButtonText\", config.startButtonText);\n if (config.preChatFormFields)\n params.set(\n \"preChatFormFields\",\n JSON.stringify(config.preChatFormFields),\n );\n\n chatIframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;\n\n // Chat iframe styling - initially hidden\n chatIframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n border: none;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border-radius: ${isMobile ? \"0\" : \"16px\"};\n transition: border-radius 0.3s ease, box-shadow 0.3s ease;\n pointer-events: auto;\n box-shadow: ${isMobile ? \"none\" : \"0 8px 32px rgba(0,0,0,0.15)\"};\n display: none;\n `;\n chatIframe.setAttribute(\"allow\", \"clipboard-write\");\n chatIframe.setAttribute(\"title\", \"BuniAI Chat Widget\");\n\n container.appendChild(chatIframe);\n\n // Wait for chat iframe to load before resolving\n chatIframe.onload = () => {\n // Set visibility hidden after iframe loads to allow content initialization\n chatIframe.style.visibility = \"hidden\";\n\n // Compute the iframe origin once we know the final src.\n try {\n this.chatTargetOrigin = new URL(chatIframe.src).origin;\n } catch {\n this.chatTargetOrigin = this.getBaseUrl();\n }\n\n // Reset handshake state for this iframe instance.\n this.handshakeComplete = false;\n this.outboundMessageQueue = [];\n\n this.setupPostMessageAPI(chatIframe);\n this.sendParentHandshake();\n \n // Now that both iframes are loaded, resolve the promise\n this.widgetElement = container;\n this.triggerIframe = triggerIframe;\n this.chatIframe = chatIframe;\n this.state.isMinimized = true;\n this.state.isLoaded = true;\n resolve();\n };\n };\n\n // Listen for trigger and connection events\n window.addEventListener(\"message\", (event) => {\n const payload = event.data;\n if (!payload || typeof payload !== \"object\") return;\n if (typeof payload.type !== \"string\") return;\n\n switch (payload.type) {\n case \"connection_ready\":\n // Check if message is from chat iframe\n if (\n event.source === this.chatIframe?.contentWindow &&\n event.origin === this.getBaseUrl()\n ) {\n // Connection is ready, show the trigger button\n if (container && !config.hideDefaultTrigger) {\n container.style.display = \"block\";\n }\n\n // Emit connection_ready event for consumers\n this.emit(\"connection_ready\", { timestamp: Date.now() });\n if (\n this.options.onConnectionReady &&\n typeof this.options.onConnectionReady === \"function\"\n ) {\n this.options.onConnectionReady({ timestamp: Date.now() });\n }\n }\n break;\n\n case \"trigger_clicked\":\n if (\n event.source === this.triggerIframe?.contentWindow &&\n event.origin === window.location.origin\n ) {\n this.openChat();\n }\n break;\n }\n });\n // Trigger the load event\n // if by 10 seconds the ready message is not received, we want to manually, set the container to visible\n setTimeout(() => {\n if (!this.state.isLoaded) {\n if (\n container &&\n !config.hideDefaultTrigger &&\n container.style.display === \"none\" &&\n this.state.isOpen === false\n ) {\n container.style.display = \"block\";\n }\n }\n }, 10000);\n triggerIframe.src = \"about:blank\";\n });\n }\n\n private buildTriggerHTML(\n primaryColor: string,\n text: string,\n showText: boolean,\n customAvatar?: string,\n avatarType?: string,\n avatarText?: string,\n ): string {\n const avatarContent = customAvatar\n ? `<img src=\"${customAvatar}\" alt=\"Avatar\" style=\"width: 32px; height: 32px; border-radius: 50%;\" />`\n : avatarType === \"text\" && avatarText\n ? `<div style=\"width: 32px; height: 32px; border-radius: 50%; background: rgba(255,255,255,0.3); display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; color: white;\">${avatarText.substring(0, 2).toUpperCase()}</div>`\n : `<svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1 0-.9-2-2zm0 14H6l-2 2V4h16v12z\"/></svg>`;\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n overflow: hidden;\n }\n .trigger {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: ${showText ? \"12px\" : \"0\"};\n padding: ${showText ? \"10px 20px\" : \"10px\"};\n background: ${primaryColor};\n color: white;\n border-radius: ${showText ? \"26px\" : \"50%\"};\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 4px 16px rgba(0,0,0,0.15);\n animation: pulse 2s infinite;\n ${showText ? \"\" : \"width: 52px; height: 52px;\"}\n }\n .trigger:hover {\n transform: translateY(-2px);\n filter: brightness(1.1);\n box-shadow: 0 6px 24px ${primaryColor}99;\n }\n .trigger:active {\n transform: translateY(0);\n }\n .avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .text {\n font-size: 14px;\n font-weight: 600;\n white-space: nowrap;\n }\n .badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n display: none;\n animation: pulse 2s infinite;\n }\n .badge.show {\n display: block;\n }\n @keyframes pulse {\n 0%, 100% {\n transform: scale(1);\n box-shadow: 0 4px 16px rgba(0,0,0,0.15);\n }\n 50% {\n transform: scale(1.02);\n box-shadow: 0 6px 24px ${primaryColor}99;\n }\n }\n </style>\n</head>\n<body>\n <div style=\"position: relative;\">\n <div class=\"trigger\" onclick=\"handleClick()\">\n <div class=\"avatar\">${avatarContent}</div>\n ${showText ? `<span class=\"text\">${text}</span>` : \"\"}\n </div>\n <div class=\"badge\" id=\"badge\">0</div>\n </div>\n <script>\n function handleClick() {\n // Trigger iframe is same-origin with parent (about:blank + document.write),\n // so we can safely target the parent's origin.\n window.parent.postMessage({ type: 'trigger_clicked' }, window.location.origin);\n }\n \n // Listen for unread count updates\n window.addEventListener('message', function(event) {\n if (event.source !== window.parent) return;\n if (event.origin !== window.location.origin) return;\n if (event.data.type === 'updateUnreadCount') {\n const badge = document.getElementById('badge');\n const count = event.data.count || 0;\n badge.textContent = count;\n if (count > 0) {\n badge.classList.add('show');\n } else {\n badge.classList.remove('show');\n }\n }\n });\n </script>\n</body>\n</html>`;\n }\n\n private async openChat(): Promise<void> {\n if (!this.chatIframe || !this.widgetElement || !this.triggerIframe) return;\n if (this.state.isOpen) return; // Already open\n\n const config = this.options.config || {};\n const isMobile = window.innerWidth <= 768;\n const isTablet = window.innerWidth > 768 && window.innerWidth <= 1024;\n\n const ensureUnits = (\n value: string | number | undefined,\n defaultValue: string,\n ): string => {\n if (!value) return defaultValue;\n const str = String(value);\n if (str.match(/^[\\d.]+\\s*(px|em|rem|%|vh|vw)$/)) return str;\n if (str.match(/^[\\d.]+$/)) return `${str}px`;\n return str;\n };\n\n const widthValue = ensureUnits(config.width, \"350px\");\n const heightValue = ensureUnits(config.height, \"650px\");\n\n // Calculate chat dimensions\n const chatWidth = isMobile\n ? \"100vw\"\n : isTablet\n ? \"min(calc(100vw - 3rem), 370px)\"\n : widthValue;\n\n const chatHeight = isMobile\n ? \"100vh\"\n : isTablet\n ? \"min(calc(100vh - 3rem), 620px)\"\n : heightValue;\n\n // Resize container for chat\n this.widgetElement.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${chatWidth};\n height: ${chatHeight};\n ${isMobile ? \"max-width: 100vw; max-height: 100vh;\" : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", false)}\n display: block;\n overflow: visible;\n box-sizing: border-box;\n `;\n\n // Hide trigger, show chat\n this.triggerIframe.style.display = \"none\";\n this.chatIframe.style.display = \"block\";\n this.chatIframe.style.visibility = \"visible\";\n\n this.state.isMinimized = false;\n this.state.isOpen = true;\n this.emit(\"maximized\", { timestamp: Date.now() });\n }\n\n private closeChat(): void {\n if (!this.chatIframe || !this.widgetElement || !this.triggerIframe) return;\n\n const config = this.options.config || {};\n const showTriggerText = config.showTriggerText !== false;\n const hasTriggerText = !!config.triggerText;\n\n // Hide chat iframe\n this.chatIframe.style.display = \"none\";\n this.chatIframe.style.visibility = \"hidden\";\n\n // Resize container back to trigger size\n const triggerWidth = showTriggerText && hasTriggerText ? \"auto\" : \"52px\";\n const triggerHeight = \"52px\";\n const triggerMinWidth = showTriggerText && hasTriggerText ? \"auto\" : \"\";\n\n this.widgetElement.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${triggerWidth};\n height: ${triggerHeight};\n ${triggerMinWidth ? `min-width: ${triggerMinWidth};` : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", true)}\n display: block;\n overflow: hidden;\n box-sizing: border-box;\n `;\n\n // Show trigger again\n this.triggerIframe.style.display = \"block\";\n\n this.state.isMinimized = true;\n this.state.isOpen = false;\n this.emit(\"minimized\", { timestamp: Date.now() });\n }\n\n private getPositionStyles(\n position: string,\n isMinimized: boolean = false,\n ): string {\n // Responsive positioning following mobile-first best practices\n const viewportWidth = window.innerWidth;\n const isExtraSmall = viewportWidth <= 375;\n const isMobile = viewportWidth <= 768;\n const isTablet = viewportWidth > 768 && viewportWidth <= 1024;\n\n // For extra small devices (Galaxy S8+, iPhone SE, etc.), use minimal or no margins\n // For mobile, use small margins for breathing room\n // For tablet/desktop, use larger margins for floating appearance\n let margin: string;\n\n if (isMinimized) {\n // Minimized button always needs some space from edges\n margin = isMobile ? \"12px\" : \"20px\";\n } else if (isMobile) {\n // Full screen on all mobile devices (no margins)\n margin = \"0\";\n } else if (isTablet) {\n // Medium margins on tablets\n margin = \"16px\";\n } else {\n // Larger margins on desktop for floating effect\n margin = \"24px\";\n }\n\n // On mobile screens when not minimized, position at edges for full coverage\n if (isMobile && !isMinimized) {\n return `top: 0; left: 0; right: 0; bottom: 0;`;\n }\n\n // Standard positioning for larger screens or minimized state\n switch (position) {\n case \"bottom-right\":\n return `bottom: ${margin}; right: ${margin};`;\n case \"bottom-left\":\n return `bottom: ${margin}; left: ${margin};`;\n case \"top-right\":\n return `top: ${margin}; right: ${margin};`;\n case \"top-left\":\n return `top: ${margin}; left: ${margin};`;\n default:\n return `bottom: ${margin}; right: ${margin};`;\n }\n }\n\n private setupPostMessageAPI(iframe: HTMLIFrameElement): void {\n // Listen for messages from the iframe\n window.addEventListener(\"message\", (event) => {\n if (event.source !== iframe.contentWindow) {\n return;\n }\n\n // Verify origin for security\n if (event.origin !== this.getBaseUrl()) {\n return;\n }\n\n const payload = event.data;\n if (!payload || typeof payload !== \"object\") return;\n const { type, data } = payload;\n if (typeof type !== \"string\") return;\n\n switch (type) {\n case IFRAME_HANDSHAKE_ACK_TYPE:\n this.handshakeComplete = true;\n this.flushOutboundMessageQueue();\n break;\n\n case \"ready\":\n this.state.isLoaded = true;\n this.emit(\"ready\", data);\n if (this.options.onReady) {\n this.options.onReady(data);\n }\n break;\n\n case \"visibility_changed\":\n this.state.isOpen = data.visibility === \"visible\";\n this.emit(\"visibility_changed\", data);\n if (this.options.onVisibilityChanged) {\n this.options.onVisibilityChanged(data);\n }\n break;\n\n case \"new_message\":\n if (data.isFromBot) {\n this.state.unreadCount++;\n }\n this.emit(\"new_message\", data);\n if (this.options.onNewMessage) {\n this.options.onNewMessage(data);\n }\n break;\n\n case \"minimized\":\n // User clicked minimize in chat - close chat and show trigger\n this.closeChat();\n break;\n\n case \"new_unread_message\":\n // Update unread count in trigger\n this.state.unreadCount++;\n if (this.triggerIframe?.contentWindow) {\n this.triggerIframe.contentWindow.postMessage(\n { type: \"updateUnreadCount\", count: this.state.unreadCount },\n window.location.origin,\n );\n }\n break;\n\n case \"customer_data_updated\":\n this.customerData = data;\n this.emit(\"customer_data_updated\", data);\n break;\n\n case \"session_updated\":\n this.sessionVariables = data.variables;\n this.emit(\"session_updated\", data);\n break;\n\n case \"error\":\n this.emit(\"error\", data);\n if (this.options.onError) {\n this.options.onError(data.error);\n }\n break;\n }\n });\n }\n\n private sendParentHandshake(): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n try {\n iframeWindow.postMessage(\n {\n type: PARENT_HANDSHAKE_TYPE,\n data: { origin: window.location.origin },\n },\n targetOrigin,\n );\n } catch {\n // Best-effort; iframe may fall back to document.referrer for origin discovery.\n }\n }\n\n private flushOutboundMessageQueue(): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n const queued = this.outboundMessageQueue;\n if (queued.length === 0) return;\n\n this.outboundMessageQueue = [];\n for (const msg of queued) {\n iframeWindow.postMessage({ type: msg.type, data: msg.data }, targetOrigin);\n }\n }\n\n private postMessageToWidget(type: string, data?: any): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n\n // Ensure handshake is sent before any other commands; queue until ack.\n if (!this.handshakeComplete && type !== PARENT_HANDSHAKE_TYPE) {\n const queue = this.outboundMessageQueue;\n if (queue.length < 50) {\n queue.push({ type, data });\n } else {\n this.outboundMessageQueue = [...queue.slice(-49), { type, data }];\n }\n this.sendParentHandshake();\n return;\n }\n\n iframeWindow.postMessage({ type, data }, targetOrigin);\n }\n\n private getBaseUrl(): string {\n // Return the base URL for the BuniAI platform\n // Priority: 1. config.baseUrl, 2. global BUNI_API_URL, 3. default platform URL\n const configUrl = (this.options?.config as any)?.baseUrl;\n const globalUrl = (globalThis as any).BUNI_API_URL;\n const rawUrl = configUrl || globalUrl || BUNI_PLATFORM_URL;\n\n try {\n return new URL(rawUrl).origin;\n } catch {\n return rawUrl;\n }\n }\n\n destroy(): void {\n this.postMessageToWidget(\"destroy\");\n\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n\n this.triggerIframe = null;\n this.chatIframe = null;\n this.eventListeners.clear();\n this.state.isLoaded = false;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n show(): void {\n // Show the widget container if it was hidden (hideDefaultTrigger mode)\n if (this.widgetElement) {\n this.widgetElement.style.display = \"block\";\n }\n // Open chat if not already open\n if (!this.chatIframe && !this.state.isOpen) {\n this.openChat();\n }\n }\n\n hide(): void {\n // Close chat if open\n if (this.chatIframe) {\n this.closeChat();\n }\n // If hideDefaultTrigger is enabled, completely hide the container\n if (this.options.config?.hideDefaultTrigger && this.widgetElement) {\n this.widgetElement.style.display = \"none\";\n }\n this.state.isOpen = false;\n this.emit(\"visibility_changed\", { visibility: \"hidden\" });\n }\n\n toggle(): void {\n if (this.chatIframe || this.state.isOpen) {\n this.closeChat();\n } else {\n this.openChat();\n }\n }\n\n minimize(): void {\n this.closeChat();\n }\n\n maximize(): void {\n this.openChat();\n }\n\n setCustomerData(data: CustomerData): void {\n this.customerData = { ...this.customerData, ...data };\n this.postMessageToWidget(\"setCustomerData\", this.customerData);\n this.emit(\"customer_data_updated\", { data: this.customerData });\n }\n\n getCustomerData(): CustomerData | null {\n return this.customerData ? { ...this.customerData } : null;\n }\n\n setSessionVariables(variables: SessionVariables): void {\n this.sessionVariables = { ...this.sessionVariables, ...variables };\n this.postMessageToWidget(\"setSessionVariables\", this.sessionVariables);\n this.emit(\"session_updated\", { variables: this.sessionVariables });\n }\n\n getSessionVariables(): SessionVariables | null {\n return this.sessionVariables ? { ...this.sessionVariables } : null;\n }\n\n sendMessage(message: string): void {\n this.postMessageToWidget(\"sendMessage\", { message });\n\n const messageData = {\n message,\n isFromBot: false,\n timestamp: Date.now(),\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n };\n\n this.emit(\"new_message\", messageData);\n }\n\n clearChat(): void {\n this.postMessageToWidget(\"clearChat\");\n this.state.unreadCount = 0;\n }\n\n setTheme(theme: \"light\" | \"dark\" | \"system\"): void {\n this.postMessageToWidget(\"theme-change\", { theme });\n this.emit(\"theme_changed\", { theme, timestamp: Date.now() });\n }\n\n open(): void {\n this.openChat();\n }\n\n close(): void {\n this.closeChat();\n }\n\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(callback);\n }\n\n off(event: string, callback?: Function): void {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n\n if (callback) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n } else {\n this.eventListeners.set(event, []);\n }\n }\n\n emit(event: string, data?: any): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n }\n\n getState(): BuniChatState {\n return { ...this.state };\n }\n\n isReady(): boolean {\n return this.state.isLoaded;\n }\n}\n\n// Utility function - named export\nexport function createBuniChatWidget(options: BuniChatOptions): BuniChatWidget {\n const widget = new BuniChatWidget();\n widget.initialize(options);\n return widget;\n}\n\n// Default export - the main widget class\nexport default BuniChatWidget;\n\n// Global type declaration for the widget API\ndeclare global {\n interface Window {\n BuniChat?: {\n configure: (config: any) => void;\n show: () => void;\n hide: () => void;\n minimize: () => void;\n maximize: () => void;\n destroy: () => void;\n setCustomerData: (data: CustomerData) => void;\n setSessionVariables: (variables: SessionVariables) => void;\n sendMessage: (message: string) => void;\n clearChat: () => void;\n setTheme: (theme: \"light\" | \"dark\" | \"system\") => void;\n open: () => void;\n close: () => void;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback?: Function) => void;\n };\n }\n}\n","// Main exports for @buni.ai/chatbot-core\n\n// Export all types\nexport * from \"./types\";\n\n// Export everything from widget\nexport * from \"./widget\";\n\n// Make BuniChatWidget the default export as well\nimport { BuniChatWidget } from \"./widget\";\nexport default BuniChatWidget;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import {\n BuniChatAPI,\n BuniChatOptions,\n BuniChatState,\n CustomerData,\n SessionVariables,\n} from \"./types\";\n\n// Default BuniAI platform URL\nconst BUNI_PLATFORM_URL = \"https://www.buni.ai\";\n\nconst PARENT_HANDSHAKE_TYPE = \"buni:parent_handshake\";\nconst IFRAME_HANDSHAKE_ACK_TYPE = \"buni:iframe_handshake_ack\";\n\n// Core widget loader class\nexport class BuniChatWidget implements BuniChatAPI {\n private options!: BuniChatOptions;\n private readonly state: BuniChatState;\n private readonly eventListeners: Map<string, Function[]>;\n private widgetElement: HTMLElement | null;\n private triggerIframe: HTMLIFrameElement | null;\n private chatIframe: HTMLIFrameElement | null;\n private customerData: CustomerData | null;\n private sessionVariables: SessionVariables | null;\n private chatTargetOrigin: string | null;\n private handshakeComplete: boolean;\n private outboundMessageQueue: Array<{ type: string; data?: any }>;\n private displayMode: \"full\" | \"minimal\" | \"hidden\";\n private readonly serverBehavior: {\n enableMinimalMode?: boolean;\n defaultMode?: \"full\" | \"minimal\" | \"hidden\";\n };\n\n constructor() {\n this.state = {\n isOpen: false,\n isLoaded: false,\n isMinimized: false,\n unreadCount: 0,\n };\n this.eventListeners = new Map();\n this.widgetElement = null;\n this.triggerIframe = null;\n this.chatIframe = null;\n this.customerData = null;\n this.sessionVariables = null;\n this.chatTargetOrigin = null;\n this.handshakeComplete = false;\n this.outboundMessageQueue = [];\n this.displayMode = \"hidden\";\n this.serverBehavior = {};\n }\n\n private isMinimalModeEnabled(): boolean {\n if (typeof this.options?.config?.enableMinimalMode === \"boolean\") {\n return this.options.config.enableMinimalMode;\n }\n\n return Boolean(this.serverBehavior.enableMinimalMode);\n }\n\n private syncServerBehaviorFromData(data: any): void {\n if (!data || typeof data !== \"object\") {\n return;\n }\n\n const behaviorCandidate =\n data.behavior && typeof data.behavior === \"object\"\n ? data.behavior\n : data;\n\n if (typeof behaviorCandidate.enableMinimalMode === \"boolean\") {\n this.serverBehavior.enableMinimalMode = behaviorCandidate.enableMinimalMode;\n }\n\n if (\n behaviorCandidate.defaultMode === \"full\" ||\n behaviorCandidate.defaultMode === \"minimal\" ||\n behaviorCandidate.defaultMode === \"hidden\"\n ) {\n this.serverBehavior.defaultMode = behaviorCandidate.defaultMode;\n }\n }\n\n async initialize(options: BuniChatOptions): Promise<void> {\n this.options = options;\n\n try {\n await this.loadWidget();\n this.state.isLoaded = true;\n this.emit(\"ready\", { timestamp: Date.now() });\n\n if (options.onReady) {\n options.onReady({ timestamp: Date.now() });\n }\n } catch (error) {\n const errorObj =\n error instanceof Error ? error : new Error(String(error));\n this.emit(\"error\", { error: errorObj, context: \"initialization\" });\n\n if (options.onError) {\n options.onError(errorObj);\n }\n throw errorObj;\n }\n }\n\n private async loadWidget(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if container already exists and remove it\n const existingContainer = document.getElementById(\n \"buni-chat-widget-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n // Create container div for proper positioning\n const container = document.createElement(\"div\");\n container.id = \"buni-chat-widget-container\";\n const config = this.options.config || {};\n\n const ensureUnits = (\n value: string | number | undefined,\n defaultValue: string,\n ): string => {\n if (!value) return defaultValue;\n const str = String(value);\n if (str.match(/^[\\d.]+\\s*(px|em|rem|%|vh|vw)$/)) return str;\n if (str.match(/^[\\d.]+$/)) return `${str}px`;\n return str;\n };\n\n const widthValue = ensureUnits(config.width, \"350px\");\n const heightValue = ensureUnits(config.height, \"650px\");\n\n // Configuration\n const showTriggerText = config.showTriggerText !== false;\n const hasTriggerText = !!config.triggerText;\n const primaryColor = config.primaryColor || \"#795548\";\n const triggerText = config.triggerText || \"\";\n const companyName = config.companyName || \"Chat Support\";\n\n // Responsive breakpoints\n const isMobile = window.innerWidth <= 768;\n const isTablet = window.innerWidth > 768 && window.innerWidth <= 1024;\n\n // Calculate trigger dimensions\n const triggerWidth = showTriggerText && hasTriggerText ? \"auto\" : \"52px\";\n const triggerHeight = \"52px\";\n const triggerMinWidth = showTriggerText && hasTriggerText ? \"auto\" : \"\";\n\n // Container starts as trigger size, initially hidden until connection is ready\n container.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${triggerWidth};\n height: ${triggerHeight};\n ${triggerMinWidth ? `min-width: ${triggerMinWidth};` : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", true)}\n display: none;\n overflow: hidden;\n box-sizing: border-box;\n `;\n\n // Create inline trigger iframe (no src)\n const triggerIframe = document.createElement(\"iframe\");\n triggerIframe.id = \"buni-trigger-iframe\";\n triggerIframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n border: none;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border-radius: ${showTriggerText && hasTriggerText ? \"26px\" : \"50%\"};\n transition: border-radius 0.3s ease, box-shadow 0.3s ease;\n pointer-events: auto;\n `;\n triggerIframe.setAttribute(\"title\", \"BuniAI Chat Trigger\");\n\n // Inject trigger HTML content directly (no src)\n container.appendChild(triggerIframe);\n document.body.appendChild(container);\n\n triggerIframe.onload = () => {\n const triggerDoc =\n triggerIframe.contentDocument ||\n triggerIframe.contentWindow?.document;\n if (!triggerDoc) {\n reject(new Error(\"Failed to access trigger iframe document\"));\n return;\n }\n\n // Build inline HTML for trigger\n const triggerHTML = this.buildTriggerHTML(\n primaryColor,\n triggerText || companyName,\n showTriggerText && hasTriggerText,\n config.customAvatar,\n config.avatarType,\n config.avatarText,\n );\n\n triggerDoc.open();\n triggerDoc.write(triggerHTML);\n triggerDoc.close();\n\n // Create chat iframe (initially hidden)\n const chatIframe = document.createElement(\"iframe\");\n chatIframe.id = \"buni-chat-iframe\";\n\n // Build URL with configuration parameters\n const params = new URLSearchParams({\n token: this.options.token,\n embedded: \"true\",\n source: \"package\",\n framework: this.options.framework || \"vanilla\",\n });\n\n // Add all configuration parameters\n if (config.theme) params.set(\"theme\", config.theme);\n if (config.primaryColor)\n params.set(\"primaryColor\", config.primaryColor);\n if (config.secondaryColor)\n params.set(\"secondaryColor\", config.secondaryColor);\n if (config.position) params.set(\"position\", config.position);\n if (widthValue && config.width !== undefined)\n params.set(\"width\", widthValue);\n if (heightValue && config.height !== undefined)\n params.set(\"height\", heightValue);\n if (config.customAvatar)\n params.set(\"customAvatar\", config.customAvatar);\n if (config.companyName) params.set(\"companyName\", config.companyName);\n if (config.welcomeMessage)\n params.set(\"welcomeMessage\", config.welcomeMessage);\n if (config.triggerText) params.set(\"triggerText\", config.triggerText);\n if (config.borderRadius)\n params.set(\"borderRadius\", config.borderRadius);\n if (config.avatarType) params.set(\"avatarType\", config.avatarType);\n if (config.avatarText) params.set(\"avatarText\", config.avatarText);\n\n // Boolean options\n if (config.showBranding !== undefined)\n params.set(\"showBranding\", String(config.showBranding));\n if (config.autoOpen !== undefined)\n params.set(\"autoOpen\", String(config.autoOpen));\n if (config.allowMinimize !== undefined)\n params.set(\"allowMinimize\", String(config.allowMinimize));\n if (config.showMinimize !== undefined)\n params.set(\"showMinimize\", String(config.showMinimize));\n if (config.allowClose !== undefined)\n params.set(\"allowClose\", String(config.allowClose));\n if (config.enableFileUpload !== undefined)\n params.set(\"enableFileUpload\", String(config.enableFileUpload));\n if (config.showTimestamps !== undefined)\n params.set(\"showTimestamps\", String(config.showTimestamps));\n if (config.enableMobile !== undefined)\n params.set(\"enableMobile\", String(config.enableMobile));\n if (config.showPreChatForm !== undefined)\n params.set(\"showPreChatForm\", String(config.showPreChatForm));\n if (config.showStartButton !== undefined)\n params.set(\"showStartButton\", String(config.showStartButton));\n if (config.startButtonText)\n params.set(\"startButtonText\", config.startButtonText);\n if (config.preChatFormFields)\n params.set(\n \"preChatFormFields\",\n JSON.stringify(config.preChatFormFields),\n );\n if (config.enableMinimalMode !== undefined) {\n params.set(\"enableMinimalMode\", String(config.enableMinimalMode));\n }\n if (config.defaultMode) {\n params.set(\"defaultMode\", config.defaultMode);\n }\n if (config.autoMessages && Array.isArray(config.autoMessages)) {\n params.set(\"autoMessages\", JSON.stringify(config.autoMessages));\n }\n\n chatIframe.src = `${this.getBaseUrl()}/embed/chat?${params.toString()}`;\n\n // Chat iframe styling - initially hidden\n chatIframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n border: none;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border-radius: ${isMobile ? \"0\" : \"16px\"};\n transition: border-radius 0.3s ease, box-shadow 0.3s ease;\n pointer-events: auto;\n box-shadow: ${isMobile ? \"none\" : \"0 8px 32px rgba(0,0,0,0.15)\"};\n display: none;\n `;\n chatIframe.setAttribute(\"allow\", \"clipboard-write\");\n chatIframe.setAttribute(\"title\", \"BuniAI Chat Widget\");\n\n container.appendChild(chatIframe);\n\n // Wait for chat iframe to load before resolving\n chatIframe.onload = () => {\n // Set visibility hidden after iframe loads to allow content initialization\n chatIframe.style.visibility = \"hidden\";\n\n // Compute the iframe origin once we know the final src.\n try {\n this.chatTargetOrigin = new URL(chatIframe.src).origin;\n } catch {\n this.chatTargetOrigin = this.getBaseUrl();\n }\n\n // Reset handshake state for this iframe instance.\n this.handshakeComplete = false;\n this.outboundMessageQueue = [];\n\n this.setupPostMessageAPI(chatIframe);\n this.sendParentHandshake();\n \n // Now that both iframes are loaded, resolve the promise\n this.widgetElement = container;\n this.triggerIframe = triggerIframe;\n this.chatIframe = chatIframe;\n this.state.isMinimized = true;\n this.state.displayMode = \"hidden\";\n this.displayMode = \"hidden\";\n this.state.isLoaded = true;\n resolve();\n };\n };\n\n // Listen for trigger and connection events\n window.addEventListener(\"message\", (event) => {\n const payload = event.data;\n if (!payload || typeof payload !== \"object\") return;\n if (typeof payload.type !== \"string\") return;\n\n switch (payload.type) {\n case \"connection_ready\":\n // Check if message is from chat iframe\n if (\n event.source === this.chatIframe?.contentWindow &&\n event.origin === this.getBaseUrl()\n ) {\n this.syncServerBehaviorFromData(payload.data);\n\n // Connection is ready, show the trigger button\n if (container && !config.hideDefaultTrigger) {\n container.style.display = \"block\";\n }\n\n // Emit connection_ready event for consumers\n this.emit(\"connection_ready\", {\n timestamp: Date.now(),\n behavior: payload.data?.behavior,\n });\n if (\n this.options.onConnectionReady &&\n typeof this.options.onConnectionReady === \"function\"\n ) {\n this.options.onConnectionReady({\n timestamp: Date.now(),\n behavior: payload.data?.behavior,\n });\n }\n }\n break;\n\n case \"chatbot:close\":\n if (\n event.source === this.chatIframe?.contentWindow &&\n event.origin === this.getBaseUrl()\n ) {\n this.closeChat();\n this.displayMode = \"hidden\";\n this.state.displayMode = \"hidden\";\n }\n break;\n\n case \"chatbot:minimize\":\n if (\n event.source === this.chatIframe?.contentWindow &&\n event.origin === this.getBaseUrl()\n ) {\n if (this.isMinimalModeEnabled()) {\n if (!this.state.isOpen) {\n void this.openChat();\n }\n this.postMessageToWidget(\"minimize\");\n this.displayMode = \"minimal\";\n this.state.displayMode = \"minimal\";\n } else {\n this.closeChat();\n this.displayMode = \"hidden\";\n this.state.displayMode = \"hidden\";\n }\n }\n break;\n\n case \"trigger_clicked\":\n if (\n event.source === this.triggerIframe?.contentWindow &&\n event.origin === window.location.origin\n ) {\n this.openChat();\n }\n break;\n }\n });\n // Trigger the load event\n // if by 10 seconds the ready message is not received, we want to manually, set the container to visible\n setTimeout(() => {\n if (\n container &&\n !config.hideDefaultTrigger &&\n container.style.display === \"none\" &&\n this.state.isOpen === false\n ) {\n container.style.display = \"block\";\n }\n }, 10000);\n triggerIframe.src = \"about:blank\";\n });\n }\n\n private buildTriggerHTML(\n primaryColor: string,\n text: string,\n showText: boolean,\n customAvatar?: string,\n avatarType?: string,\n avatarText?: string,\n ): string {\n const avatarContent = customAvatar\n ? `<img src=\"${customAvatar}\" alt=\"Avatar\" style=\"width: 32px; height: 32px; border-radius: 50%;\" />`\n : avatarType === \"text\" && avatarText\n ? `<div style=\"width: 32px; height: 32px; border-radius: 50%; background: rgba(255,255,255,0.3); display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; color: white;\">${avatarText.substring(0, 2).toUpperCase()}</div>`\n : `<svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1 0-.9-2-2zm0 14H6l-2 2V4h16v12z\"/></svg>`;\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n overflow: hidden;\n }\n .trigger {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: ${showText ? \"12px\" : \"0\"};\n padding: ${showText ? \"10px 20px\" : \"10px\"};\n background: ${primaryColor};\n color: white;\n border-radius: ${showText ? \"26px\" : \"50%\"};\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 4px 16px rgba(0,0,0,0.15);\n animation: pulse 2s infinite;\n ${showText ? \"\" : \"width: 52px; height: 52px;\"}\n }\n .trigger:hover {\n transform: translateY(-2px);\n filter: brightness(1.1);\n box-shadow: 0 6px 24px ${primaryColor}99;\n }\n .trigger:active {\n transform: translateY(0);\n }\n .avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .text {\n font-size: 14px;\n font-weight: 600;\n white-space: nowrap;\n }\n .badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n display: none;\n animation: pulse 2s infinite;\n }\n .badge.show {\n display: block;\n }\n @keyframes pulse {\n 0%, 100% {\n transform: scale(1);\n box-shadow: 0 4px 16px rgba(0,0,0,0.15);\n }\n 50% {\n transform: scale(1.02);\n box-shadow: 0 6px 24px ${primaryColor}99;\n }\n }\n </style>\n</head>\n<body>\n <div style=\"position: relative;\">\n <div class=\"trigger\" onclick=\"handleClick()\">\n <div class=\"avatar\">${avatarContent}</div>\n ${showText ? `<span class=\"text\">${text}</span>` : \"\"}\n </div>\n <div class=\"badge\" id=\"badge\">0</div>\n </div>\n <script>\n function handleClick() {\n // Trigger iframe is same-origin with parent (about:blank + document.write),\n // so we can safely target the parent's origin.\n window.parent.postMessage({ type: 'trigger_clicked' }, window.location.origin);\n }\n \n // Listen for unread count updates\n window.addEventListener('message', function(event) {\n if (event.source !== window.parent) return;\n if (event.origin !== window.location.origin) return;\n if (event.data.type === 'updateUnreadCount') {\n const badge = document.getElementById('badge');\n const count = event.data.count || 0;\n badge.textContent = count;\n if (count > 0) {\n badge.classList.add('show');\n } else {\n badge.classList.remove('show');\n }\n }\n });\n </script>\n</body>\n</html>`;\n }\n\n private async openChat(): Promise<void> {\n if (!this.chatIframe || !this.widgetElement || !this.triggerIframe) return;\n if (this.state.isOpen) return; // Already open\n\n const config = this.options.config || {};\n const isMobile = window.innerWidth <= 768;\n const isTablet = window.innerWidth > 768 && window.innerWidth <= 1024;\n\n const ensureUnits = (\n value: string | number | undefined,\n defaultValue: string,\n ): string => {\n if (!value) return defaultValue;\n const str = String(value);\n if (str.match(/^[\\d.]+\\s*(px|em|rem|%|vh|vw)$/)) return str;\n if (str.match(/^[\\d.]+$/)) return `${str}px`;\n return str;\n };\n\n const widthValue = ensureUnits(config.width, \"350px\");\n const heightValue = ensureUnits(config.height, \"650px\");\n\n // Calculate chat dimensions\n const chatWidth = isMobile\n ? \"100vw\"\n : isTablet\n ? \"min(calc(100vw - 3rem), 370px)\"\n : widthValue;\n\n const chatHeight = isMobile\n ? \"100vh\"\n : isTablet\n ? \"min(calc(100vh - 3rem), 620px)\"\n : heightValue;\n\n // Resize container for chat\n this.widgetElement.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${chatWidth};\n height: ${chatHeight};\n ${isMobile ? \"max-width: 100vw; max-height: 100vh;\" : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", false)}\n display: block;\n overflow: visible;\n box-sizing: border-box;\n `;\n\n // Hide trigger, show chat\n this.triggerIframe.style.display = \"none\";\n this.chatIframe.style.display = \"block\";\n this.chatIframe.style.visibility = \"visible\";\n\n this.state.isMinimized = false;\n this.state.isOpen = true;\n this.displayMode = \"full\";\n this.state.displayMode = \"full\";\n this.emit(\"maximized\", { timestamp: Date.now() });\n }\n\n private closeChat(): void {\n if (!this.chatIframe || !this.widgetElement || !this.triggerIframe) return;\n\n const config = this.options.config || {};\n const showTriggerText = config.showTriggerText !== false;\n const hasTriggerText = !!config.triggerText;\n\n // Hide chat iframe\n this.chatIframe.style.display = \"none\";\n this.chatIframe.style.visibility = \"hidden\";\n\n // Resize container back to trigger size\n const triggerWidth = showTriggerText && hasTriggerText ? \"auto\" : \"52px\";\n const triggerHeight = \"52px\";\n const triggerMinWidth = showTriggerText && hasTriggerText ? \"auto\" : \"\";\n\n this.widgetElement.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 999999;\n width: ${triggerWidth};\n height: ${triggerHeight};\n ${triggerMinWidth ? `min-width: ${triggerMinWidth};` : \"\"}\n transition: width 0.3s ease, height 0.3s ease, border-radius 0.3s ease;\n ${this.getPositionStyles(config.position || \"bottom-right\", true)}\n display: block;\n overflow: hidden;\n box-sizing: border-box;\n `;\n\n // Show trigger again\n this.triggerIframe.style.display = \"block\";\n\n this.state.isMinimized = true;\n this.state.isOpen = false;\n this.displayMode = \"hidden\";\n this.state.displayMode = \"hidden\";\n this.emit(\"minimized\", { timestamp: Date.now() });\n }\n\n private getPositionStyles(\n position: string,\n isMinimized: boolean = false,\n ): string {\n // Responsive positioning following mobile-first best practices\n const viewportWidth = window.innerWidth;\n const isExtraSmall = viewportWidth <= 375;\n const isMobile = viewportWidth <= 768;\n const isTablet = viewportWidth > 768 && viewportWidth <= 1024;\n\n // For extra small devices (Galaxy S8+, iPhone SE, etc.), use minimal or no margins\n // For mobile, use small margins for breathing room\n // For tablet/desktop, use larger margins for floating appearance\n let margin: string;\n\n if (isMinimized) {\n // Minimized button always needs some space from edges\n margin = isMobile ? \"12px\" : \"20px\";\n } else if (isMobile) {\n // Full screen on all mobile devices (no margins)\n margin = \"0\";\n } else if (isTablet) {\n // Medium margins on tablets\n margin = \"16px\";\n } else {\n // Larger margins on desktop for floating effect\n margin = \"24px\";\n }\n\n // On mobile screens when not minimized, position at edges for full coverage\n if (isMobile && !isMinimized) {\n return `top: 0; left: 0; right: 0; bottom: 0;`;\n }\n\n // Standard positioning for larger screens or minimized state\n switch (position) {\n case \"bottom-right\":\n return `bottom: ${margin}; right: ${margin};`;\n case \"bottom-left\":\n return `bottom: ${margin}; left: ${margin};`;\n case \"top-right\":\n return `top: ${margin}; right: ${margin};`;\n case \"top-left\":\n return `top: ${margin}; left: ${margin};`;\n default:\n return `bottom: ${margin}; right: ${margin};`;\n }\n }\n\n private setupPostMessageAPI(iframe: HTMLIFrameElement): void {\n // Listen for messages from the iframe\n window.addEventListener(\"message\", (event) => {\n if (event.source !== iframe.contentWindow) {\n return;\n }\n\n // Verify origin for security\n if (event.origin !== this.getBaseUrl()) {\n return;\n }\n\n const payload = event.data;\n if (!payload || typeof payload !== \"object\") return;\n const { type, data } = payload;\n if (typeof type !== \"string\") return;\n\n switch (type) {\n case IFRAME_HANDSHAKE_ACK_TYPE:\n this.handshakeComplete = true;\n this.flushOutboundMessageQueue();\n break;\n\n case \"ready\":\n this.state.isLoaded = true;\n this.emit(\"ready\", data);\n if (this.options.onReady) {\n this.options.onReady(data);\n }\n break;\n\n case \"visibility_changed\":\n this.state.isOpen = data.visibility === \"visible\";\n this.emit(\"visibility_changed\", data);\n if (this.options.onVisibilityChanged) {\n this.options.onVisibilityChanged(data);\n }\n break;\n\n case \"new_message\":\n if (data.isFromBot) {\n this.state.unreadCount++;\n }\n this.emit(\"new_message\", data);\n if (this.options.onNewMessage) {\n this.options.onNewMessage(data);\n }\n break;\n\n case \"minimized\":\n this.syncServerBehaviorFromData(data);\n if (this.isMinimalModeEnabled()) {\n if (!this.state.isOpen) {\n void this.openChat();\n }\n this.displayMode = \"minimal\";\n this.state.displayMode = \"minimal\";\n } else {\n // Backward-compatible behavior.\n this.closeChat();\n }\n break;\n\n case \"new_unread_message\":\n // Update unread count in trigger\n this.state.unreadCount++;\n if (this.triggerIframe?.contentWindow) {\n this.triggerIframe.contentWindow.postMessage(\n { type: \"updateUnreadCount\", count: this.state.unreadCount },\n window.location.origin,\n );\n }\n break;\n\n case \"customer_data_updated\":\n this.customerData = data;\n this.emit(\"customer_data_updated\", data);\n break;\n\n case \"session_updated\":\n this.sessionVariables = data.variables;\n this.emit(\"session_updated\", data);\n break;\n\n case \"error\":\n this.emit(\"error\", data);\n if (this.options.onError) {\n this.options.onError(data.error);\n }\n break;\n }\n });\n }\n\n private sendParentHandshake(): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n try {\n iframeWindow.postMessage(\n {\n type: PARENT_HANDSHAKE_TYPE,\n data: { origin: window.location.origin },\n },\n targetOrigin,\n );\n } catch {\n // Best-effort; iframe may fall back to document.referrer for origin discovery.\n }\n }\n\n private flushOutboundMessageQueue(): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n const queued = this.outboundMessageQueue;\n if (queued.length === 0) return;\n\n this.outboundMessageQueue = [];\n for (const msg of queued) {\n iframeWindow.postMessage({ type: msg.type, data: msg.data }, targetOrigin);\n }\n }\n\n private postMessageToWidget(type: string, data?: any): void {\n const iframeWindow = this.chatIframe?.contentWindow;\n if (!iframeWindow) return;\n\n const targetOrigin = this.chatTargetOrigin ?? this.getBaseUrl();\n\n // Ensure handshake is sent before any other commands; queue until ack.\n if (!this.handshakeComplete && type !== PARENT_HANDSHAKE_TYPE) {\n const queue = this.outboundMessageQueue;\n if (queue.length < 50) {\n queue.push({ type, data });\n } else {\n this.outboundMessageQueue = [...queue.slice(-49), { type, data }];\n }\n this.sendParentHandshake();\n return;\n }\n\n iframeWindow.postMessage({ type, data }, targetOrigin);\n }\n\n private getBaseUrl(): string {\n // Return the base URL for the BuniAI platform\n // Priority: 1. config.baseUrl, 2. global BUNI_API_URL, 3. default platform URL\n const configUrl = (this.options?.config as any)?.baseUrl;\n const globalUrl = (globalThis as any).BUNI_API_URL;\n const rawUrl = configUrl || globalUrl || BUNI_PLATFORM_URL;\n\n try {\n return new URL(rawUrl).origin;\n } catch {\n return rawUrl;\n }\n }\n\n destroy(): void {\n this.postMessageToWidget(\"destroy\");\n\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n\n this.triggerIframe = null;\n this.chatIframe = null;\n this.eventListeners.clear();\n this.state.isLoaded = false;\n this.customerData = null;\n this.sessionVariables = null;\n }\n\n show(): void {\n // Show the widget container if it was hidden (hideDefaultTrigger mode)\n if (this.widgetElement) {\n this.widgetElement.style.display = \"block\";\n }\n // Open chat if not already open\n if (!this.chatIframe && !this.state.isOpen) {\n this.openChat();\n }\n }\n\n hide(): void {\n // Close chat if open\n if (this.chatIframe) {\n this.closeChat();\n }\n // If hideDefaultTrigger is enabled, completely hide the container\n if (this.options.config?.hideDefaultTrigger && this.widgetElement) {\n this.widgetElement.style.display = \"none\";\n }\n this.state.isOpen = false;\n this.emit(\"visibility_changed\", { visibility: \"hidden\" });\n }\n\n toggle(): void {\n if (this.chatIframe || this.state.isOpen) {\n this.closeChat();\n } else {\n this.openChat();\n }\n }\n\n minimize(): void {\n if (this.isMinimalModeEnabled()) {\n if (!this.state.isOpen) {\n void this.openChat();\n }\n this.postMessageToWidget(\"minimize\");\n this.displayMode = \"minimal\";\n this.state.displayMode = \"minimal\";\n return;\n }\n\n this.closeChat();\n }\n\n maximize(): void {\n void this.openChat();\n this.displayMode = \"full\";\n this.state.displayMode = \"full\";\n }\n\n setCustomerData(data: CustomerData): void {\n this.customerData = { ...this.customerData, ...data };\n this.postMessageToWidget(\"setCustomerData\", this.customerData);\n this.emit(\"customer_data_updated\", { data: this.customerData });\n }\n\n getCustomerData(): CustomerData | null {\n return this.customerData ? { ...this.customerData } : null;\n }\n\n setSessionVariables(variables: SessionVariables): void {\n this.sessionVariables = { ...this.sessionVariables, ...variables };\n this.postMessageToWidget(\"setSessionVariables\", this.sessionVariables);\n this.emit(\"session_updated\", { variables: this.sessionVariables });\n }\n\n getSessionVariables(): SessionVariables | null {\n return this.sessionVariables ? { ...this.sessionVariables } : null;\n }\n\n sendMessage(message: string): void {\n this.postMessageToWidget(\"sendMessage\", { message });\n\n const messageData = {\n message,\n isFromBot: false,\n timestamp: Date.now(),\n messageId: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n };\n\n this.emit(\"new_message\", messageData);\n }\n\n clearChat(): void {\n this.postMessageToWidget(\"clearChat\");\n this.state.unreadCount = 0;\n }\n\n setTheme(theme: \"light\" | \"dark\" | \"system\"): void {\n this.postMessageToWidget(\"theme-change\", { theme });\n this.emit(\"theme_changed\", { theme, timestamp: Date.now() });\n }\n\n open(): void {\n this.openChat();\n }\n\n close(): void {\n this.closeChat();\n this.displayMode = \"hidden\";\n this.state.displayMode = \"hidden\";\n }\n\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(callback);\n }\n\n off(event: string, callback?: Function): void {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n\n if (callback) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n } else {\n this.eventListeners.set(event, []);\n }\n }\n\n emit(event: string, data?: any): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n }\n\n getState(): BuniChatState {\n return {\n ...this.state,\n displayMode: this.displayMode,\n };\n }\n\n isReady(): boolean {\n return this.state.isLoaded;\n }\n}\n\n// Utility function - named export\nexport function createBuniChatWidget(options: BuniChatOptions): BuniChatWidget {\n const widget = new BuniChatWidget();\n widget.initialize(options);\n return widget;\n}\n\n// Default export - the main widget class\nexport default BuniChatWidget;\n\n// Global type declaration for the widget API\ndeclare global {\n interface Window {\n BuniChat?: {\n configure: (config: any) => void;\n show: () => void;\n hide: () => void;\n minimize: () => void;\n maximize: () => void;\n destroy: () => void;\n setCustomerData: (data: CustomerData) => void;\n setSessionVariables: (variables: SessionVariables) => void;\n sendMessage: (message: string) => void;\n clearChat: () => void;\n setTheme: (theme: \"light\" | \"dark\" | \"system\") => void;\n open: () => void;\n close: () => void;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback?: Function) => void;\n };\n }\n}\n","// Main exports for @buni.ai/chatbot-core\n\n// Export all types\nexport * from \"./types\";\n\n// Export everything from widget\nexport * from \"./widget\";\n\n// Make BuniChatWidget the default export as well\nimport { BuniChatWidget } from \"./widget\";\nexport default BuniChatWidget;\n"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -29,6 +29,24 @@ export interface BuniChatConfig {
29
29
  showPreChatForm?: boolean;
30
30
  showStartButton?: boolean;
31
31
  preChatFormFields?: any;
32
+ enableMinimalMode?: boolean;
33
+ defaultMode?: "full" | "minimal" | "hidden";
34
+ autoMessages?: Array<{
35
+ id: string;
36
+ condition: unknown;
37
+ delayMs?: number;
38
+ message: {
39
+ text: string;
40
+ buttons?: Array<{
41
+ text: string;
42
+ value: string;
43
+ }>;
44
+ quickReplies?: Array<{
45
+ text: string;
46
+ value: string;
47
+ }>;
48
+ };
49
+ }>;
32
50
  }
33
51
  export interface BuniChatOptions {
34
52
  token: string;
@@ -50,6 +68,7 @@ export interface BuniChatState {
50
68
  isLoaded: boolean;
51
69
  isMinimized: boolean;
52
70
  unreadCount: number;
71
+ displayMode?: "full" | "minimal" | "hidden";
53
72
  }
54
73
  export interface CustomerData {
55
74
  name?: string;
package/dist/widget.d.ts CHANGED
@@ -11,7 +11,11 @@ export declare class BuniChatWidget implements BuniChatAPI {
11
11
  private chatTargetOrigin;
12
12
  private handshakeComplete;
13
13
  private outboundMessageQueue;
14
+ private displayMode;
15
+ private readonly serverBehavior;
14
16
  constructor();
17
+ private isMinimalModeEnabled;
18
+ private syncServerBehaviorFromData;
15
19
  initialize(options: BuniChatOptions): Promise<void>;
16
20
  private loadWidget;
17
21
  private buildTriggerHTML;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buni.ai/chatbot-core",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
4
4
  "description": "Core functionality for BuniAI chat widget adapters",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs.js",