Checkpoint current workspace

This commit is contained in:
lix-2026
2026-05-02 06:25:26 +08:00
parent 015ad5bedd
commit 98b6360595
88 changed files with 40217 additions and 178 deletions
@@ -129,6 +129,7 @@ GREEN
## 4. Phase A:基线和全局 token
| ID | 状态 | 任务 | 验收要点 |
| --- | --- | --- | --- |
| A1 | GREEN | 固定基线视口与截图目录 | `task129` 已支持 `WOLAI_ALINE_VIEWPORTS`;主线程已生成 `1392x1213``1440x900``390x844` 三组截图;subagent 已复测默认视口 |
@@ -140,6 +141,7 @@ GREEN
## 5. Phase BSidebar / 页面树
| ID | 状态 | 任务 | 验收要点 |
| --- | --- | --- | --- |
| B1 | PARITY | 侧栏宽度与背景 | `task131` 覆盖宽 `248px`、背景 `rgb(245,245,245)`、无右侧 inset、topbar.x=sidebar.rightsubagent post-fix2 复核通过 |
@@ -206,6 +208,7 @@ RED / GREEN
## 6. Phase C:顶栏、breadcrumb、搜索
| ID | 状态 | 任务 | 验收要点 |
| --- | --- | --- | --- |
| C1 | PARITY | 顶栏高度与按钮密度 | `task135` 覆盖顶栏约 40px、右侧按钮组无搜索入口、icon 不再渲染成黑色方块;`task119` 复核 topbarHeight=40 |
@@ -264,6 +267,7 @@ GREEN
## 7. Phase D:文档画布与阅读态
| ID | 状态 | 任务 | 验收要点 |
| --- | --- | --- | --- |
| D1 | PARITY | 主内容列宽 | `task136` 覆盖普通文档主列 `760px`,大屏居中不贴左;移动端沿既有 media query 保持不溢出 |
@@ -322,6 +326,7 @@ GREEN
## 8. Phase E:主编辑器块交互
| ID | 状态 | 任务 | 验收要点 |
| --- | --- | --- | --- |
| E0 | DONE | editable-test 焦点护栏 | Wolai Hermes editable-test 与本地 smoke 均断言写入前焦点在正文测试块,不在标题、breadcrumb 或隐藏输入 |
@@ -361,35 +366,59 @@ GREEN
- `tiptap-notion-like-registry` / `tiptap-notion-like-template` 包含 197 个 registry 组件,核心能力不是单个菜单,而是 `DragContextMenu``SlashDropdownMenu``NotionToolbarFloating`、AI、颜色、链接、表格、图片、TOC、缩进、节点背景、节点对齐、emoji、mention、协作和移动端 toolbar 的组合。
- `leptos-tiptap` 当前已支持 `starter-kit``full`blockquote、bold、bullet/ordered/task list、code/codeBlock、heading、history、horizontalRule、italic、strike、text-align、highlight、image、link、placeholder、youtube;未直接覆盖表格、数学、emoji、mention、TOC、AI、collaboration caret、节点背景、节点对齐、缩进和 UniqueID。
- Phase E 后续实施按 Wolai 基线优先级拆小任务;参考 Tiptap 能力先进入 checklist,不直接视为 mnote 必须一次性照搬。
- E11-E31 统一改为“参考 Tiptap 来 aline mnote”:每个任务先定位 `tiptap-notion-like-registry` / `tiptap-notion-like-template` 的组件、hook、extension 或 `leptos-tiptap` bridge 命令,再对照 Wolai 实测决定 mnote 的最小实现。不得绕过已有 Tiptap 参考自行造一套同类 UI 或命令。
- 旧 E16 / E24 / E28 中分散的颜色、背景色、link popover、floating toolbar 能力已合并为 E15-E17 的统一能力包;后续实现颜色相关功能时优先参考 `ColorMenu``NodeBackground``highlight` / `link` bridge,不再分别在 selection toolbar、drag menu、floating toolbar 中重复造轮子。
### Phase E Tiptap 参考优先 backlog
执行规则:E11-E31 中任何一项进入实现前,必须先在任务记录中写出参考路径、可复用代码点、mnote 真源落点和 Wolai-aline smoke 断言。若参考实现不适合直接复用,需要说明不复用的原因。
### Phase E Tiptap 参考执行记录(2026-05-01
- E11 参考入口已固化:`tiptap-notion-like-registry/materialized/tiptap-ui/*``tiptap-notion-like-registry/materialized/tiptap-extension/*``tiptap-notion-like-template/tiptap-notion-like-template/src/components/tiptap-*``leptos-tiptap/src/api/commands.rs`。后续 E13-E31 实现前必须先写参考路径和不复用原因。
- E12 bridge 边界:`rust/spikes/leptos-tiptap-spike``leptos-tiptap` `features=["component", "full"]` 编译;可直接复用的命令包括基础块转换、`set_horizontal_rule``toggle_task_list``toggle_bullet_list``toggle_ordered_list``set/toggle_text_align``set/toggle_highlight``set/toggle_link``set_image``set_youtube_video`、history 与通用 `insert_content(_at)`
- E12 缺口边界:TableKit 已补最小 table schema、行列/标题行列/隐藏边框命令和保存链;完整 TableHandle、TableSelectionOverlay、列宽拖拽、fit、数据表格、Mention、Emoji、TOC、AI、UniqueID/anchor、NodeBackground、NodeAlignment、Indent、ListNormalization 仍不在 `leptos-tiptap` bridge 直接能力内;进入实现时优先扩 bridge 或落 mnote tree/page 命令,不允许只加前端临时 DOM 状态。
- E13 Wolai slash 基线:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task142-e13-slash-wolai-baseline/report.md`Wolai 菜单为 fixed 弹层约 `315x400`,首屏分组 `AI 助理 /ai``基础块列表 /jichukuai`,完整分组还包括进阶块、脚注/注释、快速分栏、转换为、媒体与附件、第三方应用、快速输入、插入引用、行内块、快速功能、文字颜色、背景色、荧光背景色;包含分割线、简单表格/数据表格、图片、页面目录、Emoji,未见明确 mention。
- E13 当前本地 slash 状态:`rust/spikes/leptos-tiptap-spike/src/lib.rs``SLASH_ACTIONS` 已包含 `分割线``简单表格 /jdbg`,分别走 `editor.set_horizontal_rule()` 和真实 Tiptap table 插入;参考 template `components/tiptap-node/horizontal-rule-node/*`。本地与 Wolai 明确缺口是页面 `/ym`、折叠块、页面目录 `/toc`、数据表格 `/db`、Emoji `/bq`、颜色分组、插入引用和行内块;图片 `/tp` 已进入 E24 最小真源切片,但上传/最近上传/浮动工具条仍未完成。
- E13 分割线真源闭环:2026-05-01 已补 `EditorBlockType::Divider``TiptapNode::HorizontalRule``mnote-web` bootstrap `divider -> horizontalRule` 恢复、bridge `horizontalRule -> divider` 保存、JS bridge `Map -> Object` 规范化,以及从 `conflictDetectionKey` 后缀恢复 revision;本地 smoke 已断言 slash 点击后 `/api/documents/content` 返回 `divider`,刷新后 ProseMirror 仍有 `<hr>`。主线程通过截图目录:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task143-e13-divider-persistence-local-v8`subagent 后验通过截图目录:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task143-e13-divider-persistence-subagent`
- E15/E16 当前本地 toolbar 状态:`rust/spikes/leptos-tiptap-spike/src/lib.rs``mnote-leptos-tiptap-toolbar` 已用 `toggle_bold/italic/strike/code``toggle_mark(Underline)``set/toggle_link``set_color/unset_color``set_highlight/unset_highlight``set_text_align` 等 bridge 命令;参考路径为 `tiptap-ui/color-menu/*``color-text-button/*``color-highlight-button/*``mark-button/*``text-align-button/*`。缺口是 node background、recent colors、drag menu 颜色子菜单复用、完整 link popover、AI、sup/sub、indent/outdent。
- E19 列表缩进真源闭环:2026-05-01 已按 Wolai Hermes 基线确认 `Tab` 会把第二个列表项挂到父项 `sub-node-container``Shift+Tab` 提升回同级,不只是视觉 padding。参考路径为 `tiptap-extension/indent-extension.ts``list-normalization-extension.ts``leptos-tiptap/src/api/commands.rs``sink_list_item` / `lift_list_item`;本地已有 Tiptap 列表键盘命令,修复点落在 `core-protocol` Tiptap bridge 与 `bridge-runtime` canonical legacy content,保存时保留 `childBlockIds` / `children``mnote-web` bootstrap 可从 legacy `children` 恢复嵌套 Tiptap 列表。Wolai 基线:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task144-e19-indent-wolai-baseline/comparison-matrix.md`;本地 smoke`MNOTE_PHASE_E_SCREENSHOT_DIR=/mnt/Data1T/mnote/tmp/wolai-editor-parity/task144-e19-indent-local-green-final node scripts/task144-e19-indent-list-smoke.js`,通过并覆盖 Tiptap JSON、`/api/documents/save``/api/documents/content` 真源和刷新恢复。
- E20 块布局/文字居中局部闭环:2026-05-01 已按 Wolai Hermes 基线确认 `Ctrl/Cmd+Shift+U` 会进入块布局选中态,块菜单存在 `文字居中`,点击后 Wolai 视觉居中且刷新后保持;Wolai DOM 语义表现为内部内容 class `_1PQWZ`,不是根块 `text-align:center`。本地当前实现 `Ctrl+Shift+U` 后显示 `data-testid=block-layout-outline` 虚线轮廓,并采用 `leptos-tiptap` `set_text_align(TiptapTextAlign::Center)` 作为 Tiptap 参考优先的文字居中真源实现;保存请求、`/api/documents/content` 与刷新恢复均保留 `textAlign=center`。Wolai 基线:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task145-e20-alignment-wolai-baseline/precise-summary.json`;本地 smoke`MNOTE_UI_BASE_URL=http://127.0.0.1:3000 MNOTE_PHASE_E_SCREENSHOT_DIR=/mnt/Data1T/mnote/tmp/wolai-editor-parity/task145-e20-layout-align-local-current node scripts/task145-e20-alignment-smoke.js`。剩余拆分:selection toolbar 当前 Wolai 基线未出现对齐入口,拖拽分栏/节点级对齐尚无有效 Wolai 基线,后续不能把 E20 标 DONE。
- E21 页面当前类型勾选态与 slash 拼音入口局部闭环:2026-05-01 `task137-wolai-phase-e-smoke.js` 已覆盖 `转换为 -> 页面` 后二次打开块菜单时 `block-transform-item-page``data-current=true``✓` 勾选态;本轮复跑通过截图目录 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task146-e21-current-state-regression`。同日新增 slash 查询态 smoke:输入 `/` 后继续输入 `zhw`,本地菜单显示 `转换为 /zhw`,对应 Wolai slash 基线 `task142-e13-slash-wolai-baseline``转换为 /zhw`RED 截图目录 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task146-e21-slash-zhw-red`GREEN 截图目录 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task146-e21-slash-zhw-green`。2026-05-01 继续补 `页面 /ym` 查询入口,Wolai 基线同目录 `04-slash-menu-candidates.json` / `06-slash-menu-rows.json` 均包含 `页面 /ym`;本地 RED 截图目录 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task147-e21-slash-ym-red`GREEN 截图目录 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task147-e21-slash-ym-green`。同日补 H4 小标题二次打开当前态:RED 截图目录 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task148-e21-h4-current-red`GREEN 截图目录 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task148-e21-h4-current-green`,当前项写入 `data-current=true` 并显示 `✓`。同日补基础转换快捷键 `Ctrl/Cmd+Shift+1/2/3/5/6/7` 的本地命令映射,RED 截图目录 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task149-e21-hotkey-h1-red`GREEN 截图目录 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task149-e21-hotkey-h1-green`。当前 `/zhw``/ym` 入口只作为 Wolai slash 分组入口展示,真实转换/页面创建仍走块菜单或选区工具栏,后续需补 Wolai 二次勾选态基线和其余类型全量当前态。
- E22 折叠标题局部闭环:2026-05-01 复用 Wolai Hermes `task138-phase-e-wolai-refresh` 基线,确认 `转换为 -> 折叠标题` 会展开三级菜单 `折叠主标题/折叠大标题/折叠中标题/折叠小标题`,不是 disabled 文案。本地已补 `leptos-tiptap` heading `collapsed` attr、`core-protocol` Tiptap bridge、`bridge-runtime` legacy props、`mnote-web` bootstrap 和块菜单三级菜单;`task150-e22-folding-blocks-smoke.js` 覆盖点击 `折叠主标题` 后 h1 `data-collapsed=true`、保存请求 `attrs.collapsed=true``/api/documents/content` 真源和刷新恢复。当前只完成折叠标题最小切片,折叠待办/折叠列表和折叠后的子块显隐状态仍需后续拆分。
- E23 简单表格局部闭环:2026-05-01 Wolai Hermes 可编辑基线已确认 `简单表格 /jdbg` 默认插入 `4x3` HTML `<table class="table-content">`,外层 `data-block-type="table"`,URL 不变;行侧/列顶 aux 点击会插入行/列并呈现淡红 overlay,选项菜单含标题行/标题列/隐藏边框线 switch,未确认到清空/fit。当前本地已对齐 slash `简单表格 /jdbg`,并通过 bridge 调用 Tiptap 官方 `insertTable({ rows: 4, cols: 3, withHeaderRow: false })` 插入 `4x3` 真实 Tiptap table,并补表格 toolbar 的下方插入行、右侧插入列、清空当前单元格、删除行/列/表格;已补 `选项` 菜单,`标题行``标题列``隐藏边框线` 均使用 `role="switch"``aria-checked`,切换后写入 `tableHeader` 节点或 `attrs.hiddenBorders=true`。已补表格行侧/列顶 aux controls 和最小 TableSelectionOverlay`table-row-aux-*` 点击后从 `4x3` 进入 `5x3``table-col-aux-*` 点击后进入 `5x4`,并显示 `data-testid="table-selection-overlay"` 淡红覆盖层,toolbar 保持可用。2026-05-01 继续补列宽拖拽:Tiptap table 开启 `resizable=true`,列宽拖拽回到官方 `columnResizing` 路径;拖拽首列右边缘后写入单元格 `attrs.colwidth`,保存请求、`/api/documents/content` 与 reload 后 DOM 宽度/col 样式均由 `task151-e23-table-smoke.js` 覆盖;保留 `MnoteTableView` 作为 mnote 属性同步适配,避免 resizable node view 丢失 `data-hidden-borders` / `data-block-id`。2026-05-01 继续补真实 ProseMirror TableSelectionbridge 增加 `select_table_row` / `select_table_column` 命令,行侧/列顶 aux 插入后同步 Tiptap 官方 `CellSelection.rowSelection` / `CellSelection.colSelection`smoke 断言目标行/列 `.selectedCell` 数量和位置,并静态断言不再使用 `setCellSelection` 或手写 `simple_table_node()` 插入路径;同时把 `@tiptap/pm/tables` 纳入 shared hosted modules,避免 tableEditing decorations 与 EditorView 跨 bundle 混用。Wolai 基线截图:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task151-e23-wolai-tablekit-baseline/`;本地列宽版截图:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task151-e23-table-resize-green`;本地官方 resize 复核截图:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task151-e23-official-resize-green`;本地官方 TableKit 命令复核截图:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task151-e23-official-tablekit-commands-green`;本地真实 TableSelection 截图:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task151-e23-table-selection-green`;回归截图:`task144-e19-regression-after-e23-resize``task145-e20-regression-after-e23-resize``task150-e22-regression-after-e23-resize``task137-phase-e-regression-after-e23-resize`
- E24 图片最小真源闭环:2026-05-01 已按 Wolai E13 slash 基线确认 `媒体与附件` 分组存在 `图片 /tp``最近上传图片 /tp`;第一段实现 `图片 /tp` 最小切片,参考 `leptos-tiptap` 官方 `TiptapImageResource` / `set_image` bridge`src/api/types/extensions/image.rs``src/api/commands.rs``tiptap/src/extensions/tiptap_image.ts`)与 template `components/tiptap-node/image-node/*``image-upload-node/*`,不手写 image JSON。当前本地 `SLASH_ACTIONS` 已补 `图片 /tp``媒体与附件` 分组,`p0_extensions()` 显式启用 `TiptapExtension::Image`,点击后调用 `editor.set_image(TiptapImageResource { ... })` 插入真实 Tiptap `image` 节点;`core-protocol` 新增 `EditorBlockType::Image` / `TiptapNode::Image``bridge-runtime` 保存为 legacy `image` 且保留 `props.tiptapImage``mnote-web` bootstrap 从 content API 恢复为 `<img>`;本地只读占位资源走 `/api/editor/image-placeholder.svg`,避免 smoke 依赖外网或破图。第二段补图片点击选中态与图片专用 floating toolbar,参考 `tiptap-notion-like-registry/materialized/tiptap-node/image-node/image-node-floating.tsx``image-node-extension.ts``tiptap-ui/image-align-button/use-image-align.ts``tiptap-ui/image-download-button/use-image-download.ts`:本地点击 `<img>` 后展示 `image-floating-toolbar`,提供左/中/右对齐和同源图片下载,删除入口本切片保持禁用;图片对齐通过 `Image.extend({ addAttributes: { "data-align" } })` 扩展官方 Image schema 后调用 `editor.update_attributes(TiptapSchemaTarget::Node(TiptapNodeName::Image), ...)`,不是 UI 伪样式;同源下载只读当前 NodeSelection 图片 DOM 的 `src/title/alt`,用隐藏 `<a download>` 触发,不触发保存链。`task152-e24-image-smoke.js` 覆盖 slash 入口、DOM `<img>`、图片实际加载、图片 toolbar、同源下载事件、删除入口禁用态、居中对齐 `data-align`、保存请求 `tiptapDocument``/api/documents/content` image 真源与 reload 恢复;通过截图目录:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task152-e24-image-download-green`。剩余:真实上传、最近上传图片、caption、resize、replace、跨源下载 fallback、删除保存链、移动端 toolbar、上传失败态另拆后续。
- E25 TOC 最小真源闭环:2026-05-01 已按 Wolai slash 基线确认 `页面目录 /toc`,并参考 `tiptap-notion-like-template/src/components/tiptap-node/toc-node/*``toc-show-title-button/*``toc-sidebar/*``notion-like-editor.tsx``TableOfContents.configure({ onUpdate })` 的数据链路。当前本地先完成第一段:`leptos-tiptap` 新增 `toc_node` bridge 扩展,真实 Tiptap schema 名为 `tocNode`slash `页面目录 /toc` 调用 `editor.insert_toc_node(TiptapTocNodeAttrs { top_offset: 0, max_show_count: 20, show_title: true })`,不是普通 div 或手写 spike JSONNodeView 从当前 Tiptap doc 的 heading 节点派生目录项,支持点击目录项定位并更新 hash,支持标题显示开关并通过 `updateAttributes("tocNode", { showTitle })` 持久化。保存链新增 `EditorBlockType::Toc` / `TiptapNode::TocNode``bridge-runtime` legacy content 保留 `props.tiptapTocNode``mnote-web` reload 恢复 `tocNode``task153-e25-toc-smoke.js` 覆盖 `/toc` 入口、真实 tocNode DOM、heading 列表派生、动态 heading 更新、点击定位、标题开关、保存请求、content API 和 reload 恢复。截图目录:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task153-e25-toc-local-smoke`。剩余:接入 Tiptap 官方 `@tiptap/extension-table-of-contents` v3 数据源或完成等价 bridge 评估、TOC sidebar、active heading 高亮、完整块菜单标题开关入口、Wolai 像素级视觉、移动端行为、UniqueID/anchor 统一化。
### Phase E 说明页扩展 backlog
| ID | 状态 | 任务 | 验收要点 |
| --- | --- | --- | --- |
| E11 | TODO | `Tab` / `Shift+Tab` 缩进结构 | 缩进改变父子块结构,不只是视觉 padding;覆盖不允许缩进的块类型 |
| E12 | TODO | `Ctrl/Cmd+Shift+U` 块布局 | 显示/隐藏块布局虚线框,且不影响编辑保存 |
| E13 | TODO | 块转换三入口 | 块菜单、快捷键、slash `/zh + 拼音首字母` 均能转换文本类块 |
| E14 | TODO | 复制/粘贴与匹配样式粘贴 | 文本选择、块选择、`Ctrl/Cmd+Shift+V` 分别有 smoke |
| E15 | TODO | 链接创建 | 选中文字 `Ctrl/Cmd+K` 与直接粘贴 URL 创建链接 |
| E16 | TODO | 文本颜色/背景色/行内公式/页面引用 | selection toolbar 子菜单真实写入 Tiptap 内容,不只显示入口 |
| E17 | TODO | 评论入口 | 块评论、选中文字评论、评论气泡数量和 `Ctrl/Cmd+Alt+M` 后续对标 |
| E18 | TODO | 块引用与右侧边栏引用 | 块引用搜索、引用预览/别名、右侧边栏拖拽引用后续对标 |
| E19 | TODO | 块历史 | 块历史查看与恢复版本按 Wolai 说明页单列验证 |
| E20 | TODO | 拖拽分栏 | 横线/竖线预览、父子块随父块移动、测试块间安全释放与清理 |
| E21 | DONE | 块菜单二级转换基础版 | `转换为` hover 后主菜单保持、二级菜单包含 Wolai 当前项目;`文本/待办/高级待办/H1/H2/H3/H4/页面/列表/数字列表/引述/代码` 其中 H4 与页面至少有真实 smoke |
| E22 | TODO | 折叠标题三级菜单 | hover `折叠标题` 显示 `折叠主标题/折叠大标题/折叠中标题/折叠小标题`;真实折叠语义需接 editor/core 命令,不用 disabled 文案伪装完成 |
| E23 | TODO | 折叠待办三级菜单 | hover `折叠待办` 显示 `折叠待办列表/折叠高级待办列表`;真实折叠待办语义需接 editor/core 命令 |
| E24 | TODO | 复制链接/颜色/文字翻译子菜单 | 复制链接、颜色、文字翻译按 Wolai 展开子菜单;颜色至少覆盖文字色/背景色真实写入,复制链接不只反馈文案 |
| E25 | TODO | 块菜单关闭状态机 | Esc 与外部点击关闭所有层级;鼠标移出菜单保持打开,三级菜单可按 Wolai 收回到二级菜单;smoke 覆盖三条路径 |
| E26 | DONE | `转换为 -> 页面` 真源 | 已按 task140 修正:本地转换时调用 `/api/tree/commands` 创建 `parentId=当前文档` 的真实子页面,当前块原地变 page block,页面块 href 指向子页面且点击可打开,刷新后页面树显示同名子页面;仍需在后续任务补齐 Wolai 重新打开菜单时 `页面` 勾选态的完整二次复核 |
| E27 | TODO | 参考 Tiptap slash 插入扩展 | 对齐 `tiptap-notion-like-template`:slash 菜单除文本/标题/列表/引用/代码外,还应覆盖 AI continue/ask、mention、emoji、table、divider、TOC、image upload;每项要按 schema/后端能力拆 smoke,不只显示文案 |
| E28 | TODO | 参考 Tiptap floating toolbar 扩展 | 对齐 floating toolbarImprove/AI、TurnInto、bold/italic/underline/strike/code、image floating、link popover、text color、superscript/subscript、text align、indent/outdent;当前仅覆盖基础行内样式与颜色入口,真实写入需补齐 |
| E29 | TODO | 参考 Tiptap drag context menu 扩展 | 对齐 drag contextcopy to clipboard、copy anchor link、reset formatting、Ask AI、ColorMenu、TableAlign/Fit/Clear、TOC show title、image download、delete;当前块菜单仍有多项静态或缺失 |
| E30 | TODO | 参考 Tiptap 表格/图片/TOC 节点 | 对齐 TableKit/TableHandle/TableSelectionOverlay/ImageUpload/Image floating/TOC sidebar;本地 `leptos-tiptap` crate 当前 full feature 只到 image/link/highlight/youtube,表格、数学、emoji、mention、TOC、协作光标等需按架构另列能力边界 |
| E31 | TODO | 参考 Tiptap 节点级样式扩展 | 对齐 NodeBackground、NodeAlignment、Indent、ListNormalization、UniqueID/anchor;当前有 text-align/color/highlight 的局部能力,块背景、缩进结构、锚点复制和列表规范化需补 smoke 真源映射 |
| E11 | DONE | Tiptap 参考优先执行门 | 已固化:每个 Phase E 子任务先记录参考路径、可复用代码点、mnote 真源落点和 Wolai-aline smoke;参考入口覆盖 `registry/materialized/tiptap-extension/*``registry/materialized/tiptap-ui/*``template/src/components/tiptap-*``leptos-tiptap/src/api/commands.rs`,无参考路径不得直接实现 UI |
| E12 | DONE | `leptos-tiptap` bridge 能力边界 | 已盘点:当前 full bridge 覆盖基础块/行内 mark、history、horizontalRule、task/bullet/ordered list、text-align、highlight、image、link、youtube、table/tableRow/tableCell/tableHeader 最小 schema;仍缺 mention、emoji、TOC、AI、UniqueID、NodeBackground/Alignment、非列表 Indent/ListNormalization,后续按能力包判断扩 bridge、走 mnote 命令或暂缓 |
| E13 | PARTIAL | SlashDropdownMenu 能力包 | 参考 `tiptap-ui/slash-dropdown-menu/*` 与 template horizontalRule;本地已覆盖 AI 文案入口、基础块、待办、标题、列表、引述、代码、分割线、简单表格、图片,其中分割线已走 `set_horizontal_rule()`、保存为 kernel `divider`、刷新恢复为 `<hr>`,简单表格已走真实 Tiptap `table` schema,默认 `4x3` 并由 `task151-e23-table-smoke.js` 覆盖保存/刷新/基础行列、表格选项、行/列 aux 插入、selection overlay 和列宽拖拽持久化操作,图片 `/tp` 已走 `set_image` 并由 `task152-e24-image-smoke.js` 覆盖保存/刷新;Wolai 基线已确认还需补页面、折叠块、TOC、数据表格、Emoji、颜色、引用、行内块等分组,且每项需真实 schema/bridge 或明确未接入状态 |
| E14 | PARTIAL | DragContextMenu 能力包 | 以 `DragContextMenu` 为主参考重组块手柄菜单;当前四点/三横线、菜单位置、基础二级转换已对齐,后续补 copy/delete/copy anchor/reset formatting/Ask AI 等命令时复用同一菜单模型 |
| E15 | PARTIAL | NotionToolbarFloating 能力包 | 参考 `NotionToolbarFloating`;本地 selection toolbar 已接 TurnInto、bold/italic/underline/strike/code、link、color、text-align 的真实 Tiptap 命令;仍缺 AI、superscript/subscript、indent/outdent、完整 link popover 和 image floating toolbar |
| E16 | PARTIAL | 颜色与节点样式统一能力包 | 参考 `ColorMenu``color-text-button``color-highlight-button``node-background-extension.ts`;本地 toolbar 文字色走 `set_color`,背景色走 `set_highlight`,清除颜色走 `unset_color` + `unset_highlight`;仍缺 node background bridge、recent colors、drag menu 颜色子菜单复用和 smoke 对 JSON/刷新恢复断言 |
| E17 | PARTIAL | Link / Page / Reference 能力包 | 参考 link popover 与 `leptos-tiptap` `set_link/toggle_link`;已完成 `转换为 -> 页面` 真源和页面树可见,仍需补选中文字 `Ctrl/Cmd+K`、直接粘贴 URL、页面引用、块引用、右侧引用预览 |
| E18 | TODO | Clipboard / Paste 能力包 | 参考 registry 的 clipboard/copy 相关按钮与 Tiptap paste 规则;覆盖文本选择、块选择、复制副本、匹配样式粘贴、跨块粘贴,smoke 验证真实 Tiptap JSON 和 mnote 保存链 |
| E19 | PARTIAL | Indent / ListNormalization 能力包 | 已完成列表项 `Tab` / `Shift+Tab` 真父子结构闭环:Tiptap JSON 嵌套列表、mnote 保存链 `childBlockIds` / legacy `children`、刷新恢复均由 `task144-e19-indent-list-smoke.js` 覆盖;后续补非列表块 indent-extension、list-normalization 边界和不允许缩进块类型 |
| E20 | PARTIAL | NodeAlignment / BlockLayout 能力包 | 已完成 `Ctrl/Cmd+Shift+U` 块布局虚线轮廓和块菜单 `文字居中` 的 Tiptap textAlign 保存链:快捷键后 `block-layout-outline`、块菜单入口、点击后视觉居中、保存请求、`/api/documents/content` 和刷新恢复由 `task145-e20-alignment-smoke.js` 覆盖;剩余 selection toolbar 是否有对齐入口、拖拽分栏预览与节点级对齐需继续拆小任务,不能标 DONE |
| E21 | PARTIAL | TurnInto 转换能力包 | 参考 TurnInto 菜单模型;当前 `文本/待办/高级待办/H1-H4/页面/列表/数字列表/引述/代码` 基础入口部分完成,页面转换已接真实子页面;页面块与 H4 小标题二次打开 `转换为` 已有 `✓` 当前态 smokeslash `zhw` 已能显示 `转换为 /zhw`slash `ym` 已能显示 `页面 /ym`,基础快捷键 `Ctrl/Cmd+Shift+1/2/3/5/6/7` 已接本地 Tiptap 转换命令;后续补其余类型全量当前态与 Wolai 二次勾选态基线 |
| E22 | PARTIAL | Folding Blocks 能力包 | 已完成 `转换为 -> 折叠标题 -> 折叠主标题` 最小真源闭环:三级菜单、heading collapsed attr、保存请求、content API 和刷新恢复由 `task150-e22-folding-blocks-smoke.js` 覆盖;后续补折叠大/中/小标题 smoke、折叠待办/折叠列表真实语义、折叠后的子块显隐与当前态 |
| E23 | PARTIAL | TableKit 能力包 | 已完成简单表格可验收切片:`leptos-tiptap` 增加 table/tableRow/tableCell/tableHeader schemaslash `简单表格 /jdbg` 按 Wolai 基线插入 `4x3` 真实 `<table>`,本地 table toolbar 支持下方插入行、右侧插入列、清空当前单元格、删除当前行/列/表格,并补 `选项` 菜单的标题行、标题列、隐藏边框线 switch;已补行侧/列顶 aux controls 和最小 TableSelectionOverlay,点击行/列 aux 会插入行/列并显示对应淡红选择覆盖层,toolbar 保持可用;`core-protocol`/`bridge-runtime`/`mnote-web` 保存与刷新恢复保留 `table` Tiptap 快照、`tableHeader``attrs.hiddenBorders`;本地 smoke `task151-e23-table-smoke.js` 覆盖入口、DOM、row/column aux 插入、selection overlay、列宽拖拽、switch 语义/状态、保存请求、content API、reload 和删除。剩余表格对齐、fit、数据表格入口,以及 Wolai 选项菜单图标/toolbar 视觉细节另拆后续 |
| E24 | PARTIAL | Image / Media 能力包 | 已完成图片 `/tp` 最小真源闭环与图片 toolbar 小闭环:slash `媒体与附件` 分组入口调用 `leptos-tiptap` 官方 `set_image(TiptapImageResource)`,启用 `TiptapExtension::Image`,保存链新增 `EditorBlockType::Image` / `TiptapNode::Image` 并保留 `props.tiptapImage``mnote-web` reload 恢复 `<img>`;点击图片后出现 `image-floating-toolbar`,删除入口本切片保持禁用,左/中/右对齐通过官方 Image 扩展 `addAttributes("data-align")` + `updateAttributes("image")` 持久化,同源下载通过隐藏 `<a download>` 触发且不改文档;`task152-e24-image-smoke.js` 覆盖入口、实际图片加载、toolbar、同源下载、删除入口禁用态、居中对齐、保存请求、content API 和刷新恢复;剩余上传、最近上传、caption、resize、replace、跨源下载 fallback、删除保存链、移动端 toolbar、失败态 |
| E25 | PARTIAL | TOC 能力包 | 已完成 `/toc` 最小真源闭环:`leptos-tiptap` 新增真实 `tocNode` schema/commandslash `页面目录 /toc` 插入真实节点,NodeView 从当前 headings 派生目录项,支持点击定位、标题显示开关、保存请求、content API 与 reload 恢复;`task153-e25-toc-smoke.js` 覆盖入口、动态 heading 更新、hash 定位和 `props.tiptapTocNode`。剩余 TOC sidebar、active heading 高亮、完整块菜单入口、官方 TableOfContents v3 数据源评估、移动端与像素级视觉 |
| E26 | TODO | UniqueID / Anchor 能力包 | 参考 UniqueID/anchor/copy anchor link 相关实现;每个块需要稳定 id,复制链接应指向可恢复的页面/块锚点,刷新后仍可定位 |
| E27 | TODO | AI 编辑能力包 | 参考 `ai-context`、AI icons、Improve/Ask AI/continue/regenerate/summarize/translate;先接 mnote 现有 AI command/tool 真源,再做 Wolai 菜单入口和流式状态 |
| E28 | TODO | Mention / Emoji 能力包 | 参考 mention trigger 与 emoji menu;实现 `@`、emoji 搜索、键盘导航、插入后的 Tiptap JSON 和 mnote 保存链,不作为纯文本占位 |
| E29 | TODO | Comment / History 能力包 | 参考评论入口、块历史入口的菜单形态,结合 mnote 后端能力决定先做 smoke 占位还是真实存储;`Ctrl/Cmd+Alt+M`、评论气泡数量、块历史恢复需单列对标 |
| E30 | TODO | Menu / Floating 状态机能力包 | 参考 `use-floating-element``use-menu-navigation``use-floating-toolbar-visibility`;统一 Esc、外部点击、鼠标移出、方向键、Enter、层级菜单收起逻辑,避免每个菜单各写一套状态机 |
| E31 | PARTIAL | Tiptap 参考对标 smoke 矩阵 | `task137-wolai-phase-e-smoke.js` 已覆盖 E13 分割线的 DOM `<hr>``/api/documents/content` `divider`、刷新恢复和页面转换 `_self` 打开;后续每完成一个能力包仍必须同时断言 Tiptap JSON/schema、mnote 真源保存、Wolai 视觉/交互截图、刷新恢复;截图差异未复核不得标 DONE |
## 9. Phase FPage Aggregate 和命令边界
| ID | 状态 | 任务 | 验收要点 |
| --- | --- | --- | --- |
| F1 | TODO | 标题单一真源 | 标题修改后 breadcrumb、sidebar、file tree、document title 同步 |
Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff