@senguoyun/dsh-arkme 0.1.72 → 0.1.73

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.
@@ -27,3 +27,14 @@
27
27
  预览脚本:`/Users/tison/arkme/.codex-artifacts/web-preview-3098/check-quick-add-hover.mjs`。
28
28
 
29
29
  仅更新独立 3098 Web 预览,未修改已安装 Arkme 客户端。Git 提交推送单独执行,不代表已合并或发布。
30
+
31
+ ## 第二轮:500ms 缓冲与点击固定
32
+
33
+ - 用户反馈对话入口仍不易从按钮移入菜单。旧版 3098 的真实鼠标测试确认:越出菜单停留 350ms 已关闭。
34
+ - 添加菜单离开缓冲改为 500ms;进入按钮、菜单或过渡间隙取消关闭。鼠标离开文档与窗口失焦也遵循缓冲,避免绕过定时器立即收起。
35
+ - 悬浮与点击使用独立状态。点击(包括触摸和键盘激活)固定展开,取消原有倒计时;随后鼠标移开、再次经过按钮均不关闭或退回悬浮模式。
36
+ - 点击外部、选择菜单操作或 Escape 关闭并重置状态,下次单纯悬浮仍按 500ms 规则收起。外部点击覆盖嵌入页面及阻止冒泡的元素。
37
+ - 对话和联系人复用相同入口。其他悬浮菜单未配置延时时仍保持原有立即关闭行为。
38
+ - 定向回归 11 个测试文件、67 项通过;类型检查、通话资源校验和构建通过。
39
+ - 更新独立 3098 后,Chromium 对话及联系人入口在 1440、900、420px 均通过:跨按钮下方间隙、斜向移入、越出 350ms 再返回、点击固定后移开 800ms、重新经过按钮、菜单项可达、外部点击及键盘关闭;无 pageerror。
40
+ - 预览安装包为 `senguoyun-dsh-arkme-0.1.72.tgz`;本地与预览安装目录的 `client.js` SHA256 相同:`a41546e5126b39389f4f509ec22abdd5651b1266445e898aa2abd1d4f2408052`。旧预览包已备份为 `backups/quick-add-before-20260921-0345.tgz`。
@@ -2114,7 +2114,7 @@ Arkme 用户 {v0}|Arkme user {v0}
2114
2114
  else scheduleClose();
2115
2115
  };
2116
2116
  const leave = (event) => {
2117
- if (event.relatedTarget === null) close();
2117
+ if (event.relatedTarget === null) scheduleClose();
2118
2118
  };
2119
2119
  const observer = new MutationObserver(() => {
2120
2120
  if (!anchor.isConnected) close();
@@ -2124,14 +2124,16 @@ Arkme 用户 {v0}|Arkme user {v0}
2124
2124
  subtree: true
2125
2125
  });
2126
2126
  doc.addEventListener("pointermove", move, true);
2127
+ doc.addEventListener("pointerover", move, true);
2127
2128
  doc.addEventListener("pointerout", leave, true);
2128
- doc.defaultView?.addEventListener("blur", close);
2129
+ doc.defaultView?.addEventListener("blur", scheduleClose);
2129
2130
  return () => {
2130
2131
  cancel();
2131
2132
  observer.disconnect();
2132
2133
  doc.removeEventListener("pointermove", move, true);
2134
+ doc.removeEventListener("pointerover", move, true);
2133
2135
  doc.removeEventListener("pointerout", leave, true);
2134
- doc.defaultView?.removeEventListener("blur", close);
2136
+ doc.defaultView?.removeEventListener("blur", scheduleClose);
2135
2137
  };
2136
2138
  }, [
2137
2139
  open,
package/lib/client.js CHANGED
@@ -110836,7 +110836,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
110836
110836
  else scheduleClose();
110837
110837
  };
110838
110838
  const leave = (event) => {
110839
- if (event.relatedTarget === null) close();
110839
+ if (event.relatedTarget === null) scheduleClose();
110840
110840
  };
110841
110841
  const observer = new MutationObserver(() => {
110842
110842
  if (!anchor.isConnected) close();
@@ -110846,14 +110846,16 @@ Please report this to https://github.com/markedjs/marked.`, e) {
110846
110846
  subtree: true
110847
110847
  });
110848
110848
  doc.addEventListener("pointermove", move, true);
110849
+ doc.addEventListener("pointerover", move, true);
110849
110850
  doc.addEventListener("pointerout", leave, true);
110850
- doc.defaultView?.addEventListener("blur", close);
110851
+ doc.defaultView?.addEventListener("blur", scheduleClose);
110851
110852
  return () => {
110852
110853
  cancel();
110853
110854
  observer.disconnect();
110854
110855
  doc.removeEventListener("pointermove", move, true);
110856
+ doc.removeEventListener("pointerover", move, true);
110855
110857
  doc.removeEventListener("pointerout", leave, true);
110856
- doc.defaultView?.removeEventListener("blur", close);
110858
+ doc.defaultView?.removeEventListener("blur", scheduleClose);
110857
110859
  };
110858
110860
  }, [
110859
110861
  open,
@@ -153135,7 +153137,7 @@ html body {
153135
153137
  anchor,
153136
153138
  align: "end",
153137
153139
  onClose,
153138
- hoverCloseDelayMs: 250,
153140
+ hoverCloseDelayMs: 500,
153139
153141
  ...getAnchorRect === void 0 ? {} : { getAnchorRect },
153140
153142
  ...hoverAnchor === void 0 ? {} : { hoverAnchor },
153141
153143
  actions: [
@@ -153184,7 +153186,9 @@ html body {
153184
153186
  }
153185
153187
  function ArkmeQuickAddButton({ onContactAdd, onSourceCreated, onBotCreated, onNewDshSession, notificationActivationRevision = 0, onBlockingOverlayChange }) {
153186
153188
  useArkmeLocale();
153187
- const [menuOpen, setMenuOpen] = (0, react$1.useState)(false);
153189
+ const [menuMode, setMenuMode] = (0, react$1.useState)();
153190
+ const menuOpen = menuMode !== void 0;
153191
+ const closeMenu = () => setMenuMode(void 0);
153188
153192
  const [menuError, setMenuError] = (0, react$1.useState)("");
153189
153193
  const [dialogKind, setDialogKind] = (0, react$1.useState)();
153190
153194
  const [dialogBusy, setDialogBusy] = (0, react$1.useState)(false);
@@ -153207,7 +153211,7 @@ html body {
153207
153211
  if (notificationRevisionRef.current === notificationActivationRevision) return;
153208
153212
  notificationRevisionRef.current = notificationActivationRevision;
153209
153213
  pendingNotificationDismissRef.current = true;
153210
- setMenuOpen(false);
153214
+ closeMenu();
153211
153215
  if (!dialogBusy) {
153212
153216
  pendingNotificationDismissRef.current = false;
153213
153217
  setDialogKind(void 0);
@@ -153219,18 +153223,18 @@ html body {
153219
153223
  setDialogKind(void 0);
153220
153224
  }, [dialogBusy]);
153221
153225
  const chooseDialog = (kind) => {
153222
- setMenuOpen(false);
153226
+ closeMenu();
153223
153227
  setDialogBusy(false);
153224
153228
  setDialogKind(kind);
153225
153229
  };
153226
153230
  const openMenu = () => {
153227
153231
  setMenuError("");
153228
- setMenuOpen(true);
153232
+ setMenuMode((current) => current ?? "hover");
153229
153233
  };
153230
153234
  const menu = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeQuickAddMenu, {
153231
153235
  open: menuOpen,
153232
- onClose: () => setMenuOpen(false),
153233
- hoverAnchor: triggerRef.current ?? void 0,
153236
+ onClose: closeMenu,
153237
+ hoverAnchor: menuMode === "hover" ? triggerRef.current ?? void 0 : void 0,
153234
153238
  anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
153235
153239
  "data-arkme-feedback": "neutral",
153236
153240
  ref: triggerRef,
@@ -153243,9 +153247,9 @@ html body {
153243
153247
  onPointerEnter: (event) => {
153244
153248
  if (event?.pointerType !== "touch") openMenu();
153245
153249
  },
153246
- onClick: (event) => {
153247
- if ((event?.detail ?? 0) === 0) setMenuOpen((open) => !open);
153248
- else openMenu();
153250
+ onClick: () => {
153251
+ setMenuError("");
153252
+ setMenuMode("pinned");
153249
153253
  },
153250
153254
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, {
153251
153255
  size: 20,
@@ -153257,13 +153261,13 @@ html body {
153257
153261
  try {
153258
153262
  onNewDshSession();
153259
153263
  setMenuError("");
153260
- setMenuOpen(false);
153264
+ closeMenu();
153261
153265
  } catch (error) {
153262
153266
  setMenuError(error instanceof Error ? error.message : "暂时无法新建 DSH 会话,请稍后再试");
153263
153267
  }
153264
153268
  },
153265
153269
  onContactAdd: () => {
153266
- setMenuOpen(false);
153270
+ closeMenu();
153267
153271
  onContactAdd();
153268
153272
  },
153269
153273
  onCreateGroup: () => {
@@ -201413,7 +201417,7 @@ registerProcessor('arkme-pcm-journal', ArkmePcmJournal);
201413
201417
  const c$3 = e$24;
201414
201418
  //#endregion
201415
201419
  //#region package.json
201416
- var version = "0.1.72";
201420
+ var version = "0.1.73";
201417
201421
  //#endregion
201418
201422
  //#region src/client/profile-change-store.ts
201419
201423
  let revision = 0;