@xpert-ai/chatkit-web-component 0.3.0 → 0.3.2

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.
@@ -51,7 +51,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
51
51
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
52
52
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
53
53
 
54
- var _a, _b, _setTrainingOptOut_dec, _hideHistory_dec, _showHistory_dec, _sendCustomAction_dec, _shareThread_dec, _setThreadId_dec, _setComposerValue_dec, _sendUserMessage_dec, _fetchUpdates_dec, _focusComposer_dec, _c, _opts, _frameUrl, _frame, _wrapper, _launcherCloseButton, _launcherOpen, _framePetOptionsOverride, _shadow, _petOverlay, _resolveLoaded, _loaded, _messenger, _ChatKitElementBase_instances, emitAndThrow_fn, setOptionsDataAttributes_fn, getDisplayMode_fn, getConfiguredPetOptions_fn, getOverlayPetOptions_fn, resolvePetAssetUrl_fn, resolveOverlayPetOptions_fn, getFrameOptions_fn, setLauncherOpen_fn, handlePetActivate_fn, handlePetReply_fn, handlePetThreadSummaryActivate_fn, _handleLauncherClose, getFrameUrl_fn, setFrameUrl_fn, consumeFrameUrl_fn, _handleFrameLoad, _initialized, maybeInit_fn, _init;
54
+ var _a, _b, _setTrainingOptOut_dec, _hideHistory_dec, _showHistory_dec, _sendCustomAction_dec, _shareThread_dec, _setThreadId_dec, _setComposerValue_dec, _sendUserMessage_dec, _fetchUpdates_dec, _focusComposer_dec, _c, _opts, _frameUrl, _frame, _wrapper, _launcherCloseButton, _launcherOpen, _framePetOptionsOverride, _petClosedByContextMenu, _shadow, _petOverlay, _resolveLoaded, _loaded, _messenger, _ChatKitElementBase_instances, emitAndThrow_fn, setOptionsDataAttributes_fn, getDisplayMode_fn, getConfiguredPetOptions_fn, getOverlayPetOptions_fn, resolvePetAssetUrl_fn, resolveOverlayPetOptions_fn, getFrameOptions_fn, setLauncherOpen_fn, handlePetActivate_fn, handlePetClose_fn, handlePetReply_fn, handlePetThreadSummaryActivate_fn, _handleLauncherClose, getFrameUrl_fn, setFrameUrl_fn, consumeFrameUrl_fn, _handleFrameLoad, _initialized, maybeInit_fn, _init;
55
55
  class EventEmitter {
56
56
  constructor() {
57
57
  __publicField(this, "callbacks", /* @__PURE__ */ new Map());
@@ -1141,8 +1141,10 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1141
1141
  const PET_SUMMARY_GAP = 12;
1142
1142
  const PET_SUMMARY_WIDTH = 320;
1143
1143
  const PET_SUMMARY_MARGIN = 12;
1144
+ const PET_CONTEXT_MENU_MARGIN = 8;
1144
1145
  const PET_OVERLAY_COPY = {
1145
1146
  "en-US": {
1147
+ closePetMenuItem: "Close pet",
1146
1148
  hideMessage: "Hide message",
1147
1149
  expandMessage: "Expand message",
1148
1150
  collapseMessage: "Collapse message",
@@ -1154,6 +1156,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1154
1156
  sendFailed: "Failed to send"
1155
1157
  },
1156
1158
  "zh-CN": {
1159
+ closePetMenuItem: "关闭宠物",
1157
1160
  hideMessage: "隐藏消息",
1158
1161
  expandMessage: "展开消息",
1159
1162
  collapseMessage: "收起消息",
@@ -1301,6 +1304,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1301
1304
  constructor(root, options) {
1302
1305
  this.overlayElement = null;
1303
1306
  this.petElement = null;
1307
+ this.contextMenuElement = null;
1304
1308
  this.summaryElement = null;
1305
1309
  this.summaryToggleElement = null;
1306
1310
  this.mediaElement = null;
@@ -1341,6 +1345,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1341
1345
  this.mediaQuery = null;
1342
1346
  this.connected = false;
1343
1347
  this.handleViewportChange = () => {
1348
+ this.closeContextMenu();
1344
1349
  this.render();
1345
1350
  };
1346
1351
  this.handleReducedMotionChange = () => {
@@ -1361,6 +1366,36 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1361
1366
  this.enterRestingAfterDelay();
1362
1367
  }
1363
1368
  };
1369
+ this.handleContextMenu = (event) => {
1370
+ event.preventDefault();
1371
+ event.stopPropagation();
1372
+ this.openContextMenu({ x: event.clientX, y: event.clientY });
1373
+ };
1374
+ this.handleContextMenuEvent = (event) => {
1375
+ event.preventDefault();
1376
+ event.stopPropagation();
1377
+ };
1378
+ this.handleContextMenuOutsidePointerDown = (event) => {
1379
+ const menu = this.contextMenuElement;
1380
+ if (menu && event.composedPath().includes(menu)) {
1381
+ return;
1382
+ }
1383
+ this.closeContextMenu();
1384
+ };
1385
+ this.handleContextMenuKeyDown = (event) => {
1386
+ if (event.key !== "Escape") {
1387
+ return;
1388
+ }
1389
+ event.preventDefault();
1390
+ this.closeContextMenu();
1391
+ };
1392
+ this.handleClosePetMenuItemClick = (event) => {
1393
+ var _a2;
1394
+ event.preventDefault();
1395
+ event.stopPropagation();
1396
+ this.closeContextMenu();
1397
+ (_a2 = this.onClose) == null ? void 0 : _a2.call(this);
1398
+ };
1364
1399
  this.handleSummaryPointerEnter = () => {
1365
1400
  this.isSummaryHovering = true;
1366
1401
  this.render();
@@ -1428,7 +1463,11 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1428
1463
  };
1429
1464
  this.handlePointerDown = (event) => {
1430
1465
  var _a2, _b2;
1431
- if (!((_a2 = this.options) == null ? void 0 : _a2.position.draggable) || event.button !== 0) {
1466
+ if (event.button !== 0 || event.ctrlKey) {
1467
+ return;
1468
+ }
1469
+ this.closeContextMenu();
1470
+ if (!((_a2 = this.options) == null ? void 0 : _a2.position.draggable)) {
1432
1471
  return;
1433
1472
  }
1434
1473
  event.preventDefault();
@@ -1504,6 +1543,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1504
1543
  };
1505
1544
  this.root = root;
1506
1545
  this.onActivate = options == null ? void 0 : options.onActivate;
1546
+ this.onClose = options == null ? void 0 : options.onClose;
1507
1547
  this.onReply = options == null ? void 0 : options.onReply;
1508
1548
  this.onThreadSummaryActivate = options == null ? void 0 : options.onThreadSummaryActivate;
1509
1549
  this.connect();
@@ -1518,6 +1558,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1518
1558
  this.render();
1519
1559
  }
1520
1560
  setOptions(pet) {
1561
+ this.closeContextMenu();
1521
1562
  const nextOptions = normalizePetOptions(pet);
1522
1563
  this.options = nextOptions;
1523
1564
  if (!nextOptions) {
@@ -1565,6 +1606,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1565
1606
  this.copyLocale = nextLocale;
1566
1607
  this.copy = PET_OVERLAY_COPY[nextLocale];
1567
1608
  this.summaryRenderKey = null;
1609
+ this.closeContextMenu();
1568
1610
  this.render();
1569
1611
  }
1570
1612
  setThreadSummary(summary) {
@@ -1630,8 +1672,14 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1630
1672
  installViewportListeners() {
1631
1673
  var _a2, _b2;
1632
1674
  window.addEventListener("resize", this.handleViewportChange);
1633
- (_a2 = window.visualViewport) == null ? void 0 : _a2.addEventListener("resize", this.handleViewportChange);
1634
- (_b2 = window.visualViewport) == null ? void 0 : _b2.addEventListener("scroll", this.handleViewportChange);
1675
+ (_a2 = window.visualViewport) == null ? void 0 : _a2.addEventListener(
1676
+ "resize",
1677
+ this.handleViewportChange
1678
+ );
1679
+ (_b2 = window.visualViewport) == null ? void 0 : _b2.addEventListener(
1680
+ "scroll",
1681
+ this.handleViewportChange
1682
+ );
1635
1683
  }
1636
1684
  installReducedMotionListener() {
1637
1685
  var _a2, _b2;
@@ -1682,6 +1730,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1682
1730
  pet.addEventListener("pointerenter", this.handlePointerEnter);
1683
1731
  pet.addEventListener("pointerleave", this.handlePointerLeave);
1684
1732
  pet.addEventListener("pointerdown", this.handlePointerDown);
1733
+ pet.addEventListener("contextmenu", this.handleContextMenu);
1685
1734
  pet.addEventListener("click", this.handleClick);
1686
1735
  overlay.append(style, pet);
1687
1736
  this.root.append(overlay);
@@ -1692,6 +1741,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1692
1741
  var _a2;
1693
1742
  this.clearRestingDelayTimer();
1694
1743
  this.clearTimers();
1744
+ this.closeContextMenu();
1695
1745
  if (this.petElement) {
1696
1746
  this.petElement.removeEventListener(
1697
1747
  "pointerenter",
@@ -1701,7 +1751,14 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1701
1751
  "pointerleave",
1702
1752
  this.handlePointerLeave
1703
1753
  );
1704
- this.petElement.removeEventListener("pointerdown", this.handlePointerDown);
1754
+ this.petElement.removeEventListener(
1755
+ "pointerdown",
1756
+ this.handlePointerDown
1757
+ );
1758
+ this.petElement.removeEventListener(
1759
+ "contextmenu",
1760
+ this.handleContextMenu
1761
+ );
1705
1762
  this.petElement.removeEventListener("click", this.handleClick);
1706
1763
  }
1707
1764
  this.isHovering = false;
@@ -1865,7 +1922,10 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1865
1922
  (_b2 = this.summaryToggleElement) == null ? void 0 : _b2.remove();
1866
1923
  this.summaryElement = this.createSummaryBubble(summary);
1867
1924
  this.summaryToggleElement = this.createSummaryToggleButton("v");
1868
- (_c2 = this.overlayElement) == null ? void 0 : _c2.append(this.summaryElement, this.summaryToggleElement);
1925
+ (_c2 = this.overlayElement) == null ? void 0 : _c2.append(
1926
+ this.summaryElement,
1927
+ this.summaryToggleElement
1928
+ );
1869
1929
  this.summaryRenderKey = nextRenderKey;
1870
1930
  if (this.isReplyOpen && !this.isReplySubmitting) {
1871
1931
  window.setTimeout(() => {
@@ -1917,7 +1977,10 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
1917
1977
  return;
1918
1978
  }
1919
1979
  const viewport = getViewportSize();
1920
- const width = Math.min(PET_SUMMARY_WIDTH, viewport.width - PET_SUMMARY_MARGIN * 2);
1980
+ const width = Math.min(
1981
+ PET_SUMMARY_WIDTH,
1982
+ viewport.width - PET_SUMMARY_MARGIN * 2
1983
+ );
1921
1984
  bubble.style.width = `${width}px`;
1922
1985
  const bubbleHeight = bubble.offsetHeight || 96;
1923
1986
  const aboveY = position.y - bubbleHeight - PET_SUMMARY_GAP;
@@ -2162,6 +2225,95 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2162
2225
  }
2163
2226
  return form;
2164
2227
  }
2228
+ createContextMenu() {
2229
+ const menu = document.createElement("div");
2230
+ menu.setAttribute("data-chatkit-pet-context-menu", "");
2231
+ menu.setAttribute("role", "menu");
2232
+ menu.addEventListener("contextmenu", this.handleContextMenuEvent);
2233
+ menu.addEventListener("pointerdown", stopEventPropagation);
2234
+ menu.addEventListener("click", stopEventPropagation);
2235
+ menu.style.position = "absolute";
2236
+ menu.style.top = "0";
2237
+ menu.style.left = "0";
2238
+ menu.style.boxSizing = "border-box";
2239
+ menu.style.minWidth = "132px";
2240
+ menu.style.padding = "4px";
2241
+ menu.style.pointerEvents = "auto";
2242
+ menu.style.border = "1px solid rgba(148, 163, 184, 0.28)";
2243
+ menu.style.borderRadius = "10px";
2244
+ menu.style.background = "rgba(255, 255, 255, 0.96)";
2245
+ menu.style.color = "#1f2937";
2246
+ menu.style.boxShadow = "0 12px 28px rgba(15, 23, 42, 0.16)";
2247
+ menu.style.font = '500 13px/1.3 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif';
2248
+ menu.style.backdropFilter = "blur(10px)";
2249
+ const closeItem = document.createElement("button");
2250
+ closeItem.type = "button";
2251
+ closeItem.textContent = this.copy.closePetMenuItem;
2252
+ closeItem.setAttribute("role", "menuitem");
2253
+ closeItem.addEventListener("click", this.handleClosePetMenuItemClick);
2254
+ closeItem.style.display = "block";
2255
+ closeItem.style.width = "100%";
2256
+ closeItem.style.border = "0";
2257
+ closeItem.style.borderRadius = "7px";
2258
+ closeItem.style.background = "transparent";
2259
+ closeItem.style.color = "inherit";
2260
+ closeItem.style.cursor = "pointer";
2261
+ closeItem.style.padding = "7px 10px";
2262
+ closeItem.style.textAlign = "left";
2263
+ closeItem.style.font = "inherit";
2264
+ menu.append(closeItem);
2265
+ return menu;
2266
+ }
2267
+ openContextMenu(position) {
2268
+ var _a2;
2269
+ const overlay = this.overlayElement;
2270
+ if (!overlay) {
2271
+ return;
2272
+ }
2273
+ this.closeContextMenu();
2274
+ const menu = this.createContextMenu();
2275
+ overlay.append(menu);
2276
+ this.contextMenuElement = menu;
2277
+ this.positionContextMenu(position);
2278
+ (_a2 = menu.querySelector("button")) == null ? void 0 : _a2.focus({ preventScroll: true });
2279
+ window.addEventListener(
2280
+ "pointerdown",
2281
+ this.handleContextMenuOutsidePointerDown,
2282
+ true
2283
+ );
2284
+ window.addEventListener("keydown", this.handleContextMenuKeyDown);
2285
+ }
2286
+ closeContextMenu() {
2287
+ var _a2;
2288
+ (_a2 = this.contextMenuElement) == null ? void 0 : _a2.remove();
2289
+ this.contextMenuElement = null;
2290
+ window.removeEventListener(
2291
+ "pointerdown",
2292
+ this.handleContextMenuOutsidePointerDown,
2293
+ true
2294
+ );
2295
+ window.removeEventListener("keydown", this.handleContextMenuKeyDown);
2296
+ }
2297
+ positionContextMenu(position) {
2298
+ const menu = this.contextMenuElement;
2299
+ if (!menu) {
2300
+ return;
2301
+ }
2302
+ const viewport = getViewportSize();
2303
+ const width = menu.offsetWidth || 132;
2304
+ const height = menu.offsetHeight || 40;
2305
+ const maxX = Math.max(
2306
+ PET_CONTEXT_MENU_MARGIN,
2307
+ viewport.width - width - PET_CONTEXT_MENU_MARGIN
2308
+ );
2309
+ const maxY = Math.max(
2310
+ PET_CONTEXT_MENU_MARGIN,
2311
+ viewport.height - height - PET_CONTEXT_MENU_MARGIN
2312
+ );
2313
+ const x = clampNumber(position.x, PET_CONTEXT_MENU_MARGIN, maxX);
2314
+ const y = clampNumber(position.y, PET_CONTEXT_MENU_MARGIN, maxY);
2315
+ menu.style.transform = `translate3d(${x}px, ${y}px, 0)`;
2316
+ }
2165
2317
  renderAtlas(animationName, animationMode) {
2166
2318
  var _a2;
2167
2319
  if (!this.petElement || ((_a2 = this.resolved) == null ? void 0 : _a2.kind) !== "atlas" || !this.options) {
@@ -2262,13 +2414,16 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2262
2414
  this.rescheduleAnimation();
2263
2415
  }, PET_RESTING_DELAY_MS);
2264
2416
  }
2265
- isPointerOverPet(event) {
2417
+ isPointOverPet(clientX, clientY) {
2266
2418
  var _a2;
2267
2419
  const rect = (_a2 = this.petElement) == null ? void 0 : _a2.getBoundingClientRect();
2268
2420
  if (!rect) {
2269
2421
  return false;
2270
2422
  }
2271
- return event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;
2423
+ return clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;
2424
+ }
2425
+ isPointerOverPet(event) {
2426
+ return this.isPointOverPet(event.clientX, event.clientY);
2272
2427
  }
2273
2428
  async submitReply() {
2274
2429
  var _a2;
@@ -2344,9 +2499,11 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2344
2499
  __privateAdd(this, _launcherCloseButton);
2345
2500
  __privateAdd(this, _launcherOpen, false);
2346
2501
  __privateAdd(this, _framePetOptionsOverride);
2502
+ __privateAdd(this, _petClosedByContextMenu, false);
2347
2503
  __privateAdd(this, _shadow, this.attachShadow({ mode: "open" }));
2348
2504
  __privateAdd(this, _petOverlay, new PetOverlay(__privateGet(this, _shadow), {
2349
2505
  onActivate: () => __privateMethod(this, _ChatKitElementBase_instances, handlePetActivate_fn).call(this),
2506
+ onClose: () => __privateMethod(this, _ChatKitElementBase_instances, handlePetClose_fn).call(this),
2350
2507
  onReply: (text) => __privateMethod(this, _ChatKitElementBase_instances, handlePetReply_fn).call(this, text),
2351
2508
  onThreadSummaryActivate: (threadId) => void __privateMethod(this, _ChatKitElementBase_instances, handlePetThreadSummaryActivate_fn).call(this, threadId)
2352
2509
  }));
@@ -2669,6 +2826,9 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2669
2826
  __privateGet(this, _messenger).on("pet_options_change", (data) => {
2670
2827
  const payload = parsePetOptionsChangePayload(data);
2671
2828
  if (payload) {
2829
+ if (!__privateGet(this, _petClosedByContextMenu) || payload.pet === null) {
2830
+ __privateSet(this, _petClosedByContextMenu, false);
2831
+ }
2672
2832
  __privateSet(this, _framePetOptionsOverride, payload.pet);
2673
2833
  __privateGet(this, _petOverlay).setOptions(__privateMethod(this, _ChatKitElementBase_instances, getOverlayPetOptions_fn).call(this));
2674
2834
  }
@@ -2706,6 +2866,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2706
2866
  }
2707
2867
  applySanitizedOptions(newOptions) {
2708
2868
  __privateSet(this, _opts, newOptions);
2869
+ __privateSet(this, _petClosedByContextMenu, false);
2709
2870
  __privateGet(this, _petOverlay).setLocale(newOptions.locale);
2710
2871
  __privateGet(this, _petOverlay).setOptions(__privateMethod(this, _ChatKitElementBase_instances, getOverlayPetOptions_fn).call(this));
2711
2872
  if (__privateGet(this, _initialized)) {
@@ -2788,6 +2949,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2788
2949
  _launcherCloseButton = new WeakMap();
2789
2950
  _launcherOpen = new WeakMap();
2790
2951
  _framePetOptionsOverride = new WeakMap();
2952
+ _petClosedByContextMenu = new WeakMap();
2791
2953
  _shadow = new WeakMap();
2792
2954
  _petOverlay = new WeakMap();
2793
2955
  _resolveLoaded = new WeakMap();
@@ -2819,6 +2981,9 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2819
2981
  return options.pet ?? null;
2820
2982
  };
2821
2983
  getOverlayPetOptions_fn = function() {
2984
+ if (__privateGet(this, _petClosedByContextMenu)) {
2985
+ return null;
2986
+ }
2822
2987
  let pet = __privateGet(this, _framePetOptionsOverride) !== void 0 ? __privateGet(this, _framePetOptionsOverride) : __privateMethod(this, _ChatKitElementBase_instances, getConfiguredPetOptions_fn).call(this);
2823
2988
  if (__privateMethod(this, _ChatKitElementBase_instances, getDisplayMode_fn).call(this) === "pet" && !normalizePetOptions(pet ?? null)) {
2824
2989
  pet = true;
@@ -2880,6 +3045,16 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2880
3045
  __privateMethod(this, _ChatKitElementBase_instances, setLauncherOpen_fn).call(this, true);
2881
3046
  __privateGet(this, _loaded).then(() => this.focusComposer()).catch(() => void 0);
2882
3047
  };
3048
+ handlePetClose_fn = function() {
3049
+ __privateSet(this, _petClosedByContextMenu, true);
3050
+ __privateSet(this, _framePetOptionsOverride, null);
3051
+ __privateMethod(this, _ChatKitElementBase_instances, setLauncherOpen_fn).call(this, false);
3052
+ __privateGet(this, _petOverlay).setOptions(null);
3053
+ if (__privateMethod(this, _ChatKitElementBase_instances, getDisplayMode_fn).call(this) === "pet") {
3054
+ return;
3055
+ }
3056
+ __privateGet(this, _loaded).then(() => __privateGet(this, _messenger).commands.setPetEnabled({ enabled: false })).catch(() => void 0);
3057
+ };
2883
3058
  handlePetReply_fn = async function(text) {
2884
3059
  await this.sendUserMessage({ text });
2885
3060
  };