Appearance
功能规格说明:操作确认对话框
创建日期:2026-07-29 设计稿:Figma — 操作确认对话框
用户场景与测试 (必填)
用户故事:消息回滚二次确认(优先级:P1)
作为用户,我在点击消息的回滚按钮后,希望先在应用内看到居中的确认对话框并明确告知后果,再决定是否执行,以避免误操作丢失对话与文件更改;且在 VS Code、JetBrains 与桌面应用中看到完全一致的确认界面。
为什么是这个优先级:回滚会删除消息并撤销文件更改,属于破坏性操作;目前三端各自弹宿主原生确认(VS Code 模态框 / JetBrains 对话框 / 操作系统弹窗),样式与交互不统一。
独立测试:hover 一条用户消息并点击回滚按钮,验证屏幕中央出现确认对话框;点击「确定」执行回滚,点击「取消」或按 Esc 不执行任何操作。
验收场景:
- 假设对话中有多条消息,当用户点击某条用户消息的回滚按钮时,则屏幕中央显示确认对话框(标题「确定要回滚到此消息吗?」,描述「这将删除之后的所有消息并撤销相关的文件更改。」),此时不执行回滚。
- 假设确认对话框已显示,当用户点击「确定」(或按 Enter)时,则执行回滚并关闭对话框。
- 假设确认对话框已显示,当用户点击「取消」或按 Esc 时,则对话框关闭,对话与文件保持不变。
- 假设用户在 VS Code、JetBrains 或桌面应用中触发回滚,当确认流程出现时,则三端均显示同一个应用内确认对话框,不再出现宿主原生弹窗。
用户故事:删除会话二次确认(优先级:P1)
作为桌面应用用户,我在侧边栏点击删除会话时,希望看到与回滚一致的应用内确认对话框,而不是浏览器原生 confirm 弹窗,以获得统一的视觉与交互体验。
为什么是这个优先级:删除会话(尤其 worktree 会话)不可逆;浏览器原生 confirm 样式简陋且与应用主题不一致。
独立测试:在桌面应用侧边栏点击某会话的删除图标,验证应用内确认对话框出现;确认后删除会话,取消后不删除。
验收场景:
- 假设侧边栏存在会话条目,当用户点击删除图标时,则屏幕中央显示确认对话框,标题为「确定删除会话「X」?」(X 为会话标题)。
- 假设被删会话是 worktree 会话,当确认对话框显示时,则描述文案明确告知将一并删除 worktree 目录与临时分支、未提交改动将丢失。
- 假设确认对话框已显示,当用户点击「确定」时,则执行删除;点击「取消」或按 Esc 时不删除。
用户故事:确认对话框的初始焦点(优先级:P1)
作为键盘用户,我希望确认对话框出现时焦点就落在主按钮上(若主按钮暂时不可用,则在它变为可用时补上),以便我按 Enter 就能确认,而不必先用 Tab 摸索进对话框。
为什么是这个优先级:对话框由侧边栏行菜单、消息回滚按钮等触发元素打开,焦点留在触发元素上;如果对话框拿不到焦点,Enter 会落到那个触发元素上(例如重新打开侧边栏行菜单)而不是执行确认——用户按 Enter 得到的是「菜单又弹出来」。worktree 删除确认还要先等宿主回报将丢失的改动,主按钮在回报前不可用,而只在挂载瞬间生效的自动聚焦在这种情形下落空(不可用的按钮也接不住焦点),必须等主按钮变为可用时补上。
独立测试:把焦点放在触发元素上打开确认对话框,验证焦点落在主按钮、按 Enter 执行确认;对需要「正在检查」阶段的 worktree 删除确认(宿主尚未回报)验证检查期间焦点不停在不可用的主按钮上,回报后焦点落到主按钮;若用户在检查期间已 Tab 到「取消」,回报后验证焦点不被抢走。
验收场景:
- 假设确认对话框打开且主按钮可用,当对话框挂载时,则焦点落在主按钮上,此时按 Enter 执行确认(由按钮自身处理,窗口级 Enter 处理不得再触发一次)。
- 假设确认对话框打开时主按钮因后果未知而不可用(worktree 改动检查尚未返回,见「删除会话二次确认」与
desktop-sessions.md),当检查返回、主按钮变为可用时,则焦点落到主按钮上,对话框不得因「打开时按钮不可用」而永久停留在失焦状态。 - 假设检查期间用户已把焦点移进对话框(如 Tab 到「取消」),当检查返回、主按钮变为可用时,则焦点保持在用户当前所在元素上,不被抢走。
- 假设用户在 VS Code、JetBrains 或桌面应用中打开该对话框,当焦点规则生效时,则三端表现一致(同一共享对话框组件)。
边界情况
- 流式生成中点击回滚按钮怎么办? 保持现状:直接忽略,不弹确认对话框。
- 主按钮的后果检查迟迟不返回怎么办? 对话框按
desktop-sessions.md的时限自行放开主按钮;放开后按场景 2 落焦,不得因为「等待无果」而让对话框保持无焦点。 - 确认对话框显示期间重复触发怎么办? 同一时刻最多存在一个操作确认对话框,新的触发被忽略。
- 点击遮罩会关闭对话框吗? 不会。破坏性操作要求显式选择「取消」或「确定」(Esc 可取消)。
- 浅色主题下可读吗? 全部颜色取自
--vscode-*主题变量,亮暗主题均可读。