# 对话与联系人添加按钮回归（2026-09-21）

## 已确认的交互

- 第二栏添加按钮与搜索框同高，使用 40×40px 方形按钮、11px 圆角及原有主题色。
- 悬浮立即展开，按钮与菜单之间可连续移动；短暂移出后 250ms 内返回取消关闭。
- 选择菜单项、点击外部、Escape 仍直接关闭；保留键盘与触摸入口。
- 联系人和对话入口统一使用同一个组件，不新增另一套菜单。

## 根因与修改

- 旧添加按钮为 28×28px，搜索框为 40px 高。3098 修改前实测分别为 28px、40px。
- 原 hover 区域只覆盖左右菜单间隙；下拉菜单实际在按钮下方 4px，该间隙不属于有效区域。修改前浏览器鼠标移入间隙立即关闭。
- 添加按钮直接引用 `directorySearchLayout.field` 的高度和圆角，图标从 14px 放大到 20px。
- 补齐上、下方向的短距离菜单过渡区域；仅添加菜单启用 250ms 离开缓冲，其他菜单原有关闭时序不变。
- 返回按钮、菜单或过渡区取消定时关闭；连续向外移动不重置倒计时；关闭或卸载取消旧定时器，避免影响下一次展开。
- `ArkmePersistentShell` 联系人入口和 `ArkmeVirtualWorkspace` 对话入口均复用 `ArkmeQuickAddButton`，本次修改同时生效。

## 验证

- 20 个相关测试文件、186 项测试通过；包含四方向过渡区域、停留间隙、移出再返回、菜单重开、外部点击、Esc、触摸、键盘、联系人真实工具栏尺寸及原有菜单交互。
- 类型检查、完整构建和打包通过。
- 独立 3098 页面：对话与联系人各在 1440、900、420px 宽度下验证。两个入口按钮均为 40×40px，与搜索框同高且顶部对齐。
- 浏览器实际鼠标验证：停留 4px 间隙、斜向进入菜单、短暂移出后返回、离开主页面菜单区域关闭；键盘 Enter/方向键/Escape、外部点击关闭均通过，未出现页面异常。
- 浏览器验证未创建联系人、群聊、Bot、任务或真实通话；相关业务写请求被拦截，选项动作由组件测试验证。

预览脚本：`/Users/tison/arkme/.codex-artifacts/web-preview-3098/check-quick-add-hover.mjs`。

仅更新独立 3098 Web 预览，未修改已安装 Arkme 客户端。Git 提交推送单独执行，不代表已合并或发布。

## 第二轮：500ms 缓冲与点击固定

- 用户反馈对话入口仍不易从按钮移入菜单。旧版 3098 的真实鼠标测试确认：越出菜单停留 350ms 已关闭。
- 添加菜单离开缓冲改为 500ms；进入按钮、菜单或过渡间隙取消关闭。鼠标离开文档与窗口失焦也遵循缓冲，避免绕过定时器立即收起。
- 悬浮与点击使用独立状态。点击（包括触摸和键盘激活）固定展开，取消原有倒计时；随后鼠标移开、再次经过按钮均不关闭或退回悬浮模式。
- 点击外部、选择菜单操作或 Escape 关闭并重置状态，下次单纯悬浮仍按 500ms 规则收起。外部点击覆盖嵌入页面及阻止冒泡的元素。
- 对话和联系人复用相同入口。其他悬浮菜单未配置延时时仍保持原有立即关闭行为。
- 定向回归 11 个测试文件、67 项通过；类型检查、通话资源校验和构建通过。
- 更新独立 3098 后，Chromium 对话及联系人入口在 1440、900、420px 均通过：跨按钮下方间隙、斜向移入、越出 350ms 再返回、点击固定后移开 800ms、重新经过按钮、菜单项可达、外部点击及键盘关闭；无 pageerror。
- 预览安装包为 `senguoyun-dsh-arkme-0.1.72.tgz`；本地与预览安装目录的 `client.js` SHA256 相同：`a41546e5126b39389f4f509ec22abdd5651b1266445e898aa2abd1d4f2408052`。旧预览包已备份为 `backups/quick-add-before-20260921-0345.tgz`。
