fix: stabilize block menu undo focus

This commit is contained in:
lix-2026
2026-05-25 02:03:47 +08:00
parent fda2224b6f
commit ab34050742
5 changed files with 56 additions and 13 deletions
@@ -36,11 +36,13 @@
## 根因
块菜单按钮点击后,删除命令先通过 Tiptap history-safe `delete_range` 路径删除目标块,并在 helper 内调用了一次 `editor.focus()`。但随后 Leptos 继续关闭 block menu / anchor / hovered block 状态,点击目标按钮被卸载,最终浏览器焦点可能落回非 ProseMirror 元素。`Control+Z` 因此没有稳定送到 Tiptap editor,表现为删除成功但撤销不恢复。
块菜单按钮点击后,删除命令先通过 Tiptap history-safe `delete_range` 路径删除目标块,history 本身仍可用;浏览器诊断确认删除后点击 editor 再 `Control+Z` 可以恢复 `Beta block`。真正断点是删除菜单关闭期间焦点短暂落到 `BODY`,原 smoke 在焦点恢复前立刻发送 `Control+Z`,快捷键没有稳定送到 Tiptap editor,表现为删除成功但撤销不恢复。
## 修复
- 在块菜单删除成功、关闭菜单状态后,再补一次 `editor.focus()`,确保后续键盘撤销进入 ProseMirror
- 删除菜单项 `mousedown` 阶段阻止默认焦点转移,减少按钮卸载后焦点落回 `BODY` 的窗口
- 在块菜单删除成功、关闭菜单状态后,异步补一次 `editor.focus()`,确保正常用户操作后的键盘撤销进入 ProseMirror。
-`BODY` 短暂持有焦点时,只兜底转发 `Ctrl/Cmd+Z``Ctrl/Cmd+Y``Shift+Ctrl/Cmd+Z` 到当前 editor,覆盖 smoke 中删除后立即按撤销的竞态。
- 同批拆出 `editor_runtime/block_menu_document.rs`,隔离 legacy 顶层块 JSON helper;当前运行路径仍优先使用 history-safe command,不回退到 HTML 整文替换删除。
## 验收