feat(menus): 右键菜单与切换五项(docs/21)

屏蔽 WebView 自带右键菜单(输入框除外);新增 useDismiss 统一修复菜单
点别处不消失(标签菜单实测中招、文件树菜单一并加固);侧栏页签行加收起
按钮、收起后编辑区左上角有展开按钮;编辑区右下角加源码/即时渲染切换按钮;
标签与文件树右键补保存/另存为/新窗口打开/导出/打印(针对目标文件,
未打开先打开再执行)。vitest 97 通过 + 2 跳过。
This commit is contained in:
Muse
2026-11-14 15:05:19 +08:00
parent 41e0331dc9
commit 2d1cd3045a
7 changed files with 334 additions and 20 deletions

View File

@@ -0,0 +1,44 @@
# 菜单与切换五项(2026-11-14)
## 1. 屏蔽浏览器右键菜单
App 全局监听 contextmenu 并 preventDefault:编辑区、标题栏等处不再冒出
WebView 自带菜单;应用自绘菜单(标签/文件树/菜单栏)走各自的 contextmenu
处理,不受影响。文本输入框(input/textarea)保留系统菜单,方便粘贴。
## 2. 菜单点别处不消失——全量排查与统一修复
排查结论:菜单栏下拉本身有外部 mousedown + Esc 关闭(正常);文件树菜单
只监听 window click(右键点别处、滚动时不关);**标签右键菜单只在标签栏
内部点击时关闭,点编辑区/侧边栏都不消失(实测确认)**。
新增共享 hook `src/hooks/useDismiss.ts`:捕获阶段监听 mousedown/contextmenu
(先于 React 的 contextmenu 处理,右键另一个标签时先关旧再开新)、Esc、
窗口失焦、菜单外滚动,统一应用到标签菜单与文件树菜单;菜单栏维持原实现。
## 3. 左侧栏收起
开关逻辑本身正常(视图菜单与 Ctrl+Shift+L 实测可收起),问题在侧栏自身
没有入口、必须去菜单里找。侧栏页签行右侧新增收起按钮(‹);收起后编辑区
左上角出现展开按钮(›)。菜单与快捷键保持不变。
## 4. 源码模式切换按钮
编辑区右下角新增浮动按钮:渲染模式下显示「源码模式」、源码模式下显示
「即时渲染」,一键切换,不必再去视图菜单。打印时隐藏。
## 5. 右键菜单补文件类动作
- 标签右键:新增 保存(未修改时禁用)、另存为…、在新窗口打开(桌面模式)、
导出…、打印 / 导出 PDF…,与原有关闭类动作以分隔线分组。动作针对被右键
的标签:导出/打印会先激活该标签再执行,不必先手动切过去。
- 文件树右键(文件条目):新增 在新窗口打开(桌面模式)、另存为…、导出…、
打印 / 导出 PDF…。文件未打开时先打开/激活再执行(withOpenedTab)。
## 验证
- tsc 0 错误;vitest 97 通过 + 2 跳过(新增 tests/context-menus.test.tsx:
两类菜单的条目、回调、点别处关闭)。
- 无头浏览器实测:编辑区 contextmenu 已被 preventDefault;标签菜单条目齐全、
点编辑区后关闭;收起/展开按钮往返正常;源码按钮切换后源码编辑器出现、
按钮文案翻转为「即时渲染」。
- 待真机验:桌面模式下「在新窗口打开」两处入口、文件树导出/打印的先开后行链路。