2026-05-21 05:57:19 +08:00
|
|
|
|
# 5-25 Editor Tab Keyboard and MRU Checklist v1
|
|
|
|
|
|
|
2026-05-21 09:04:13 +08:00
|
|
|
|
> 状态:done
|
|
|
|
|
|
>
|
|
|
|
|
|
> 归档说明(2026-05-21):editor tab keyboard 与 MRU 行为已完成。
|
2026-05-21 05:57:19 +08:00
|
|
|
|
>
|
|
|
|
|
|
> 日期:2026-05-21
|
|
|
|
|
|
>
|
|
|
|
|
|
> Owner:main editor tab keyboard / MRU behavior
|
|
|
|
|
|
|
|
|
|
|
|
## 1. 目标
|
|
|
|
|
|
|
|
|
|
|
|
参考 Sidex / VSCode `MultiEditorTabsControl`,补 MNote main tab 的基础键盘和 MRU 行为。当前只做轻量交互,不照搬完整 tab control。
|
|
|
|
|
|
|
|
|
|
|
|
## 2. 允许修改范围
|
|
|
|
|
|
|
|
|
|
|
|
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
|
|
|
|
- `rust/crates/mnote-web/src/ssr/styles.rs`
|
|
|
|
|
|
- 可新增聚焦 smoke
|
|
|
|
|
|
|
|
|
|
|
|
## 3. 禁止事项
|
|
|
|
|
|
|
|
|
|
|
|
- 不新增全局快捷键与浏览器默认冲突。
|
|
|
|
|
|
- 不实现完整 tab overflow 复杂布局。
|
|
|
|
|
|
- 不改变 resource tab identity。
|
|
|
|
|
|
|
|
|
|
|
|
## 4. Checklist
|
|
|
|
|
|
|
|
|
|
|
|
- [x] tab strip 支持左右箭头 roving focus。
|
|
|
|
|
|
- [x] `Enter` / `Space` 激活当前 focused tab。
|
|
|
|
|
|
- [x] 关闭 active resource tab 后回到 MRU 或 page tab,行为稳定。
|
|
|
|
|
|
- [x] tab 上保留可测试 DOM 状态。
|
|
|
|
|
|
- [x] 补测试或 smoke。
|
|
|
|
|
|
|
|
|
|
|
|
## 5. 验收
|
|
|
|
|
|
|
|
|
|
|
|
- `cargo test -p mnote-web web_shell -- --test-threads=1`
|
|
|
|
|
|
- 如新增 smoke:`node scripts/task47*-editor-tab-keyboard-*.js`
|
|
|
|
|
|
|
|
|
|
|
|
## 6. 执行记录
|
|
|
|
|
|
|
|
|
|
|
|
> 引用 proposal:`.codex/reasonix-proposals/2026-05-21-tab-keyboard-mru-proposal.md`
|
|
|
|
|
|
|
|
|
|
|
|
### 已确认
|
|
|
|
|
|
|
|
|
|
|
|
- `resourceTabMru` 数组 + `touchResourceTabMru` / `lastActiveResourceTabKey` / `removeFromResourceTabMru` 逻辑完整,MRU 核心逻辑无需改动。
|
|
|
|
|
|
- `activateMainEditorTab` 已正确维护 roving tabindex(active → `tabindex="0"`, others → `tabindex="-1"`)。
|
|
|
|
|
|
- `createResourceTabDom` 中 resource tab 初始 `tabindex="-1"` 符合预期。
|
|
|
|
|
|
|
|
|
|
|
|
### 已实现
|
|
|
|
|
|
|
|
|
|
|
|
- [x] 新增 `bindMainEditorTabStrip()` 函数(keydown 事件委托 + collectTabs + 箭头/Home/End/Enter/Space)。
|
|
|
|
|
|
- [x] 修改 `closeResourceTab()` 末尾,关闭后 focus 迁移到新激活的 tab。
|
|
|
|
|
|
- [x] 在 `styles.rs` 补充 `:focus-visible` 样式。
|
|
|
|
|
|
- [x] 更新 Rust contract test 断言。
|
|
|
|
|
|
- [x] `cargo test -p mnote-web web_shell -- --test-threads=1` 通过。
|
|
|
|
|
|
|
|
|
|
|
|
### 后续可选
|
|
|
|
|
|
|
|
|
|
|
|
- [ ] 如后续需要浏览器级回归,可新增 `scripts/task475-editor-tab-keyboard-mru-smoke.js`,覆盖多 tab 键盘切换与关闭后 focus。
|
|
|
|
|
|
|
|
|
|
|
|
### 非预期发现
|
|
|
|
|
|
|
|
|
|
|
|
- `closeResourceTab` 在 activate 后未显式调用 `focus()`,导致 keyboard focus 丢失。需修复。
|
|
|
|
|
|
- tab strip 无 `:focus-visible` 样式,键盘用户在箭头导航后看不到 focus 环。
|
|
|
|
|
|
|
|
|
|
|
|
### Codex 实施记录
|
|
|
|
|
|
|
|
|
|
|
|
- 2026-05-21:Reasonix Worker B 按要求只输出 proposal,未直接改源码。
|
|
|
|
|
|
- 2026-05-21:Codex 按 proposal 的最小安全集实现键盘 roving focus、Enter/Space 激活、关闭后 MRU/page tab focus 迁移。
|
|
|
|
|
|
- 2026-05-21:未新增全局快捷键;事件只绑定在 `[data-mnote-main-tab-strip]` 内。
|
|
|
|
|
|
|
|
|
|
|
|
## 7. 非目标
|
|
|
|
|
|
|
|
|
|
|
|
- 不做拖拽 tab 排序。
|
|
|
|
|
|
- 不做 close others / close saved 复杂菜单。
|