feat: 收口 mindmap Phase 6 Leptos UI shell

This commit is contained in:
lix-2026
2026-05-11 12:27:40 +08:00
parent b7dddd2a66
commit b5eb27fabc
51 changed files with 8669 additions and 1313 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,222 @@
# 6 [process] Mindmap leptos adapter reference notes v1
> 日期:2026-05-10
>
> 目的:记录 `lx-doc/mind-map` 与 KMind 插件审计结果,为 Phase 6 `leptos-mindmap` 的 simple-mind-map bridge、command bridge 和第一阶段 UI 复刻定界。
## 1. 参考入口
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/Edit.vue`
- 注册 `simple-mind-map` 插件。
- 初始化 `new MindMap({ el, data, layout, theme, themeConfig, viewData, config })`
- 承接 `execCommand`、关联线、图片上传、富文本、滚动条等 runtime 行为。
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/ToolbarNodeBtnList.vue`
- 提供节点编辑工具栏命令和禁用状态参考。
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/SidebarTrigger.vue`
- 提供右侧栏触发器参考。
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/config/zh.js`
- `sidebarTriggerList` 定义 `nodeStyle/baseStyle/theme/structure/outline/shortcutKey`
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/NavigatorToolbar.vue`
- 提供底部导航工具参考。
- `design/05-editor-mainline/reference-code/kmind-plugin/README.md`
- 提供 KMind 的思源耦合能力与延期边界参考。
## 2. 本轮需要注册的插件
第一阶段必须注册:
- `Drag`:画布拖拽、节点拖拽编辑的基础能力。
- `KeyboardNavigation`:方向键、基础键盘导航。
- `Export`:导出入口的基础能力,先保留 UI 与 runtime 能力,不把导出结果当 kernel truth。
- `Select`:框选、多选与 active node 状态。
- `AssociativeLine`:关联线渲染与创建入口。
- `Search`:底部搜索入口需要。
- `OuterFrame`:外框按钮与已有 KMind/lx-doc 视觉能力对齐。
第一阶段建议按能力开关注册:
- `RichText`:仅在节点富文本开启时加载;富文本 HTML 进入 `compatPayload`,同时保留纯文本到 kernel node text。
- `Scrollbar`:仅在配置开启时加载,避免小画布重复滚动 UI。
- `MiniMap`:底部按钮可以延期显示,但 bridge 应保留插件注册能力。
- `Painter`:格式刷属于 toolbar 第一阶段按钮,样式变更先走 `compatPayload.patch`
- `Formula`:公式先作为节点扩展字段进入 `compatPayload`
第一阶段不作为必须注册:
- `ExportPDF` / `ExportXMind`:导出格式能力可保留在独立页或后续任务,不阻塞 block 内编辑。
- `Watermark`:不属于当前 mnote 主体验。
- `TouchEvent`:移动端可用性后续补齐。
- `RainbowLines` / `Demonstrate` / `HandDrawnLikeStyle` / `Notation`:作为高级视觉或演示能力延期。
- `NodeImgAdjust`:图片字段先兼容保存,图片尺寸调整后续再语义化。
## 3. Toolbar 到 kernel command 的映射
直接发 kernel command
- `INSERT_CHILD_NODE` -> `mindmap.node.insert_child`
- `INSERT_NODE` -> `mindmap.node.insert_sibling_after`
- `REMOVE_NODE` -> `mindmap.node.delete`
- 节点文本提交 -> `mindmap.node.update_text`
- 节点拖拽换父或重排 -> `mindmap.node.move`
- 结构切换 -> `mindmap.layout.set`
- 主题切换 -> `mindmap.theme.set`
- 缩放、平移、只读状态以外的 view 变化 -> `mindmap.view.patch`
需要 bridge 或 diff 二次确认:
- `BACK` / `FORWARD`:第一阶段作为 runtime history 操作;后续若 kernel history 接管,再提升为 kernel undo/redo。
- `ADD_GENERALIZATION`:映射到 `mindmap.summary.set`,当前 Rust DTO 最小集未完全覆盖时先进入 `compatPayload.patch` 并记录字段路径。
- `createAssociativeLine`:映射到 `mindmap.associative_line.upsert`,当前 Rust DTO 最小集未完全覆盖时先进入 `compatPayload.patch`
- `ADD_OUTER_FRAME`:第一阶段进入 `compatPayload.patch`,后续提升为 outer frame kernel 语义。
第一阶段作为 compat 字段处理:
- 图片、图标、标签、超链接、备注、公式、附件、标记、格式刷产生的节点样式。
- 这些入口可以出现在 UI 中,但保存路径必须经过 command bridge;不可直接把整棵 runtime data 保存为 canonical truth。
## 4. 右侧栏第一阶段保留项
第一阶段保留:
- `nodeStyle`:节点样式。可编辑项先进入节点 `compatPayload`,基础文本仍回写 kernel。
- `baseStyle`:导图样式。概要、关联线、间距等暂未语义化字段进入 `compatPayload`
- `theme`:主题切换,能识别的主题名走 `mindmap.theme.set`
- `structure`:结构切换,走 `mindmap.layout.set`
- `outline`:大纲只作为 projection 派生视图,不创建第二套树真相。
第一阶段不放入右侧栏:
- `shortcutKey`:快捷键说明可以后续做文档或设置面板,不阻塞编辑器主链。
- KMind 全局配置、主题设计器、主题分享:后续独立配置任务处理。
## 5. 底部工具第一阶段保留项
第一阶段保留:
- 节点数 / 字数:从 adapter projection 或 runtime 派生,只读展示。
- 回根节点:调用 `mindMap.renderer.setRootNodeCenter()`,同时可记录 view patch。
- 搜索:调用 `Search` 插件或事件入口。
- 缩放百分比:监听 `scale`,通过 `view_data_change` / `mindmap.view.patch` 保存必要 view state。
- 全屏或只读:block 内优先保留只读切换;独立页可提供全屏。
第一阶段可延期:
- 鼠标行为高级配置。
- MiniMap 展示按钮。
- 暗色主题切换。
- 源码编辑。
- 演示模式。
- 多语言切换和帮助链接。
## 6. 必须进入 compatPayload 的字段
节点级字段:
- `image``imageTitle``imageSize`
- `icon`
- `tag`
- `hyperlink``hyperlinkTitle`
- `note`
- `richText`
- `generalization` 中尚未进入 kernel summary DTO 的私有样式字段
- `formula`
- `attachment`
- `notation`
- 节点自定义样式、内外边距、背景、字体、边框、图片调整状态
- `customLeft``customTop` 等自由布局坐标
导图级字段:
- `theme.config` 中无法映射到 kernel theme 的细项。
- `config` 中 runtime 私有行为配置,如鼠标行为、粘贴拆分、图片上传默认值。
- `view` 中无法映射到稳定 view DTO 的细项。
- `outerFrame`、高级关联线样式、概要样式。
- 插件私有状态,如 `MiniMap``Painter``Demonstrate``Notation`
保存约束:
- `compatPayload` 只能承接暂未语义化字段。
- 每次 `compatPayload.patch` 必须记录字段路径、来源事件和 kernel revision。
- 不允许把 `root` 整棵 runtime data 作为唯一成功保存结果。
## 7. KMind 专有能力延期
延期到 Phase 6 之后:
- 多根节点。
- MOC 模式。
- 文档树导图。
- 思源块拖拽、渲染、悬浮预览。
- 节点镜像块与导图镜像块。
- 思源 PDF 标注跳转与移除 PDF 关联。
- 思源全局搜索对接。
- 子文档快捷打开位置。
- KMind 全局配置、自动禅模式、默认主题与默认结构。
- 主题设计器、主题分享。
- 历史版本、固定历史版本、自动历史清理。
- Freemind / XMind 全量导入导出。
- 右键菜单中的思源专有导出、复制镜像块、复制节点为图片等高级项。
这些能力可以影响长期设计,但不能改变 Phase 6 的主合同:`simple-mind-map` 是 editor adapterRust kernel projection / command 才是事实源。
## 8. 历史自研 React UI 壳复用清单
> 2026-05-11 复核:历史 React UI 壳比 `/mnt/Data1T/mnote-rust/components/editor/blocks` 的简化宿主完整得多。下一阶段迁移应优先抽取历史 React 组件族的配置和 action 语义,不应继续在 NodeView 内手写按钮。
>
> 2026-05-11 执行记录:上述能力清单已转为 `mindmap-ui-schema.ts` / `mindmap-action-map.ts` / Leptos/Rust shell 的第一阶段输入;旧 React 组件族已补 legacy/reference/compat 注释,默认 3000 文档页不运行旧 React mindmap 主链。
### 8.1 Toolbar
| 分组 / action | 旧来源 | 旧 runtime 调用或意图 | active node | 第一阶段 |
|---|---|---|---|---|
| 工具栏元信息 | `wolai-frontend/src/components/editor/blocks/mindmapToolbarConfig.ts``NodeToolbarKey``FileToolbarKey``nodeToolbarOrder``fileToolbarOrder``nodeToolbarMeta``fileToolbarMeta` | 定义按钮 key、label、iconClass 和顺序 | 视 action | schema-only |
| toolbar UI 分组 | `MindmapToolbar.tsx``nodeHandlers``fileHandlers` | 左侧节点操作、右侧文件/导入/导出;能力由 props 注入 | 视 action | must |
| undo / redo | `MindmapBlock.tsx``handleUndo``handleRedo` | `mindmap.execCommand("BACK" / "FORWARD")` | 否 | must |
| 同级 / 子节点 | `MindmapBlock.tsx``handleSibling``handleChild` | `SET_NODE_ACTIVE``INSERT_NODE` / `INSERT_CHILD_NODE`;无 active 时 `ensureActiveBefore` 选 root | 是 | must |
| 删除 / 概要 / 关联线 / 外框 | `MindmapBlock.tsx``handleDelete``handleSummary``handleAssociativeLine``handleOuterFrame` | `REMOVE_NODE``ADD_GENERALIZATION``ADD_ASSOCIATIVE_LINE``ADD_OUTER_FRAME` | 是 | must |
| 图片 | `MindmapBlock.tsx``handleImage``handleImageConfirm` | 输入/上传图片后 `SET_NODE_IMAGE` + `SET_NODE_STYLES imgPlacement` | 是 | must |
| 超链接 / 标签 / 备注 / 附件 | `MindmapBlock.tsx``handleLink``handleTag``handleNoteConfirm``handleAttachment` | `SET_NODE_HYPERLINK``SET_NODE_TAG``SET_NODE_NOTE``SET_NODE_ATTACHMENT` | 是 | must |
| 图标 / 公式 | `MindmapBlock.tsx``handleIcon``handleFormula` | 打开 sidebar `icons` / `formula` | 是 | schema-only / defer |
| 格式刷 | `MindmapBlock.tsx``handlePainter` | `mindmap.painter.startPainter()` | 否,依赖 Painter 插件 | defer |
| 导入 / 新建 / 本地恢复 / 导出 / 删除导图 | `MindmapBlock.tsx``handleImport``handleDeleteMindmap` | `.json/.smm/.xmind/.mmap/.md` 导入;`setData``clearHistory``persistData`;导出 JSON/PNG/SVG/PDF/MD/TXT/XMind;删除走 `/api/mindmap/{docId}/{mindmapId}` | 否 | must |
### 8.2 Sidebar
| panel | 旧来源 | 旧 runtime 调用或意图 | active node | 第一阶段 |
|---|---|---|---|---|
| trigger 配置 | `mindmapSidebarConfig.ts``SidebarPanel``sidebarTriggers` | `style/base/theme/structure/outline/settings/icons/formula/note/ai` | 视 panel | schema-only |
| 触发条 UI | `MindmapSidebarTrigger.tsx``MindmapSidebarTrigger` | 右侧竖条,`onSelect(isActive ? null : target)` | 否 | must |
| panel 路由 | `MindmapSidebar.tsx``MindmapSidebar` switch | `activeTab` 分发到各 panel | 视 panel | must |
| 节点样式 | `MindmapSidebar.tsx``StylePanel` | `node.getStyle(prop,false)` 读取,`node.setStyle(prop,value)` 写入文字、边框、填充、连线样式 | 是 | must |
| 基础样式 | `MindmapSidebar.tsx``BaseStylePanel` | `mindmap.getThemeConfig` / `mindmap.setThemeConfig` | 否 | must |
| 主题 | `MindmapSidebar.tsx``ThemePanel` | `mindmap.setTheme(theme)` | 否 | must |
| 结构 | `MindmapSidebar.tsx``StructurePanel` | `mindmap.setLayout(layout)` | 否 | must |
| 图标/贴纸 | `MindmapSidebar.tsx``IconPanel` | 动态加载 simple-mind-map icons`node.setIcon``node.setImage` | 是 | must |
| 大纲 | `MindmapSidebar.tsx``OutlinePanel` | 从 `mindmap.renderer.renderTree._node` 遍历;点击后设置 active 并 `setRootNodeCenter` | 否 | must |
| 设置 | `MindmapSidebar.tsx``SettingsPanel` | `mindmap.updateConfig``mindmap.reRender``watermark.updateWatermark` | 否 | schema-only |
| 备注 | `MindmapSidebar.tsx``NotePanel` | 读取 active `note`,保存/清除走 `SET_NODE_NOTE` | 是 | must |
| 公式 / AI | `FormulaPanel``MindmapAiAgentPanel` | `INSERT_FORMULA` 或 AI panel | 是 / 部分 | defer |
### 8.3 Navigator / MiniMap / Count
| 能力 | 旧来源 | 旧 runtime 调用或意图 | active node | 第一阶段 |
|---|---|---|---|---|
| 宿主挂载 | `MindmapBlock.tsx` 全屏和内嵌 stage | 同时挂 `MindmapNavigator``MindmapCount``MindmapMiniMap``MindmapContextMenu` | 否 | must |
| 缩放 / 居中 / 只读 / 全屏 / 小地图按钮 | `MindmapNavigator.tsx``MindmapNavigator` | `view.enlarge``view.narrow``view.setScale``renderer.setRootNodeCenter``setMode("readonly"/"edit")``onToggleMiniMap``toggleFullscreen` | 否 | must |
| MiniMap | `MindmapMiniMap.tsx``MindmapMiniMap` | `mindmap.miniMap.calculationMiniMap`;监听 `data_change/view_data_change/node_tree_render_end/mini_map_view_box_position_change` | 否 | must |
| Count | `MindmapCount.tsx``MindmapCount` | `mindmap.getData()` + `data_change`,递归统计节点数和去 HTML 文本长度 | 否 | must |
### 8.4 Context Menu
| action / 组 | 旧来源 | 旧 runtime 调用或意图 | active node | 第一阶段 |
|---|---|---|---|---|
| 菜单项配置 | `MindmapContextMenu.tsx``NODE_MENU_ITEMS` | 插入、移动、展开、删除、复制剪切粘贴、移除属性、导出节点、AI 续写 | 是 | schema-only |
| 禁用规则 | `MindmapContextMenu.tsx``isItemDisabled` | root/generalization 禁用部分插入、复制剪切、移动;首尾节点禁用上移/下移 | 是 | must |
| 捕获右键目标 | `MindmapContextMenu.tsx` contextmenu listener | 监听 `mindmap-canvas`,目标取 `renderer.activeNodeList[0] ?? lastActiveNodeList[0]` | 是 | must |
| 插入/移动/删除等默认命令 | `MindmapContextMenu.tsx``executeCommand` default | 多数 action 直接 `mindmap.execCommand(key)` | 是 | must |
| 复制/剪切/粘贴 | `MindmapContextMenu.tsx` | `mindmap.renderer.copy/cut/paste` | 是 | must |
| 移除超链接/备注 | `MindmapContextMenu.tsx` | `targetNode.setHyperlink("", "")``targetNode.setNote("")` | 是 | must |
| 展开/收起下级 | `MindmapContextMenu.tsx` | `UNEXPAND_ALL``EXPAND_ALL` | 是 | must |
| 导出当前节点 PNG / AI 续写 | `MindmapContextMenu.tsx` | `doExport.export("png", ..., targetNode)``mindmap-ai-continue` custom event | 是 | defer |
`/mnt/Data1T/mnote-rust/components/editor/blocks` 只保留基础 toolbar、theme/structure/view sidebar 和简化 runtime 宿主,可作为 adapter 最小结构参考,但不能替代当前仓旧 React UI 壳的完整能力清单。
@@ -0,0 +1,484 @@
# Mindmap Phase 6 leptos-mindmap UI Shell Reuse Checklist v1
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:subagent-driven-development` for independent code slices, or `superpowers:executing-plans` when executing this checklist in order. Steps use checkbox (`- [ ]`) syntax for tracking. 每完成一个节点,必须基于代码、截图或测试证据勾选对应项。
**Goal:** 在不恢复旧 React 主链、不直接嵌入 lx-doc Vue 应用的前提下,把当前 `leptos-mindmap + simple-mind-map runtime` 从“无头 runtime + 手写 chrome”推进到接近 KMind/lx-doc 可用度的 floating overlay canvas UI shell。
**Architecture:** Rust kernel 继续持有导图事实源和命令语义,`simple-mind-map` 继续作为编辑 runtime。UI schema 只描述 toolbar、sidebar、navigator、context menu 的项目和动作,不负责布局;默认宿主必须采用接近 lx-doc/KMind 的画布承载模型:runtime 作为块内无限画布底层,toolbar/sidebar/navigator/count/minimap 作为 overlay 浮在画布上,不挤压画布尺寸。当前 TypeScript NodeView 只是过渡桥接层,后续 UI shell 应迁到 Leptos/Rust 组件,避免引入更多长期前端语言/框架边界。
**Tech Stack:** Rust `core-protocol` / `bridge-runtime` / `mnote-web``leptos-tiptap` NodeView、`simple-mind-map`、历史 React `MindmapBlock` 组件族、lx-doc `mind-map` 参考代码、Playwright smoke。
---
## 0. 当前判断
当前 Phase 6 的方向不需要改成“直接嵌入 lx-doc/mind-map”。应该继续采用:
```text
Rust kernel truth
-> mindmap.simple_mind_map_scene.v1
-> leptos-tiptap NodeView
-> simple-mind-map runtime
-> UI shell schema / action bridge
-> kernel command / compatPayload.patch
```
本 checklist 修正的是下一阶段执行重心:
- 不再把“接入 `simple-mind-map` runtime”当作可用导图编辑器完成。
- 不再继续手写一次性的功能键、选项栏和底部栏。
- 优先复用本仓历史自研 UI 壳的配置、按钮分组、右侧栏、导航栏、MiniMap、统计、右键菜单经验。
- lx-doc/KMind 作为视觉、命令和交互基线;历史 React 组件作为最直接的迁移素材。
- 2026-05-11 修正:此前 schema UI 已能显示工具项,但仍采用 grid/flex 文档流布局,和 `https://wanglin2.github.io/mind-map/#/`、KMind 截图的“无限画布 + 浮动 UI”不一致。后续必须先迁移到 floating overlay canvas shell,再继续扩展功能语义。
- 2026-05-11 方向约束:mnote 主体是 Rust,`leptos-tiptap` 也是嵌入式 Leptos 路线;mindmap UI shell 不应继续沉淀为 TypeScript DOM UI。TS 只保留 `tiptap NodeView mount + simple-mind-map bridge + event/command forwarding`,真正的 toolbar/sidebar/navigator/context menu 应迁移到 Leptos/Rust。
## 1. 参考材料
### 当前主线文档
- `design/06-mindmap/process/6-mindmap-kernel-phase6-projection-editor-v1.md`
- `design/06-mindmap/process/6-mindmap-leptos-adapter-reference-notes-v1.md`
- `docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md`
### lx-doc / KMind 参考
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/Edit.vue`
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/ToolbarNodeBtnList.vue`
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/SidebarTrigger.vue`
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/NavigatorToolbar.vue`
- `design/05-editor-mainline/reference-code/lx-doc/mind-map/src/config/zh.js`
- `design/05-editor-mainline/reference-code/kmind-plugin`
### 本仓历史 UI 壳
- `wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx`
- `wolai-frontend/src/components/editor/blocks/MindmapToolbar.tsx`
- `wolai-frontend/src/components/editor/blocks/mindmapToolbarConfig.ts`
- `wolai-frontend/src/components/editor/blocks/MindmapSidebar.tsx`
- `wolai-frontend/src/components/editor/blocks/mindmapSidebarConfig.ts`
- `wolai-frontend/src/components/editor/blocks/MindmapNavigator.tsx`
- `wolai-frontend/src/components/editor/blocks/MindmapMiniMap.tsx`
- `wolai-frontend/src/components/editor/blocks/MindmapCount.tsx`
- `wolai-frontend/src/components/editor/blocks/MindmapContextMenu.tsx`
### 历史简化宿主参考
- `/mnt/Data1T/mnote-rust/components/editor/blocks/MindmapRuntimeEditor.tsx`
- `/mnt/Data1T/mnote-rust/components/editor/blocks/MindmapToolbar.tsx`
- `/mnt/Data1T/mnote-rust/components/editor/blocks/MindmapNavigator.tsx`
- `/mnt/Data1T/mnote-rust/components/editor/blocks/MindmapMiniMap.tsx`
- `/mnt/Data1T/mnote-rust/components/editor/blocks/MindmapSidebarTrigger.tsx`
## 2. 文件职责图
- `wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts`
- 新增:toolbar、sidebar、navigator、context menu 的中立 UI schema。
- `wolai-frontend/src/lib/mindmap/mindmap-action-map.ts`
- 新增:UI action 到 `simple-mind-map` command、kernel command、`compatPayload.patch` 的映射。
- `wolai-frontend/src/lib/mindmap/mindmap-ui-state.ts`
- 新增:active node、selection、readonly、scale、panel open state、disabled state 的派生逻辑。
- `wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts`
- 修改:暴露 UI shell 需要的 runtime action、state subscribe、command result。
- `wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.ts`
- 修改:补齐 `execCommand`、插件能力探测、scale/view 操作、销毁清理。
- `wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts`
- 修改:补齐 toolbar/sidebar/context menu 产生的变更到 kernel command / compat patch 的转换。
- `design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts`
- 过渡修改:NodeView 只负责挂载 runtime、Leptos/Rust UI shell 宿主和最小桥接,不再继续扩散硬编码按钮逻辑。
- `rust/spikes/leptos-tiptap-spike/generated/island/snippets/leptos-tiptap-c355e6ec24c3df4c/src/js/generated/tiptap_paragraph.js`
- 修改:同步生成后的 browser-side bridge,保持与 TS source 行为一致。
- `scripts/task166-mindmap-phase6-block-smoke.js`
- 修改:从 runtime 存在 smoke 升级为 UI shell、交互、保存、reload、截图 smoke。
### Floating overlay canvas shell 约束
- 默认 DOM 应为 `canvas-layer + overlay-layer``simple-mind-map` runtime 充满块内画布,toolbar/sidebar/navigator/count/minimap 都位于 overlay layer。
- toolbar 顶部居中浮动,视觉上接近 lx-doc `Toolbar.vue` 的 fixed toolbar,而不是文档流顶部栏。
- sidebar trigger / panel 右侧浮动,打开 panel 时不改变 runtime 宽度,只覆盖画布右侧安全区域。
- navigator 右下浮动,count 左下浮动,MiniMap 后续在右下 navigator 上方浮动。
- smoke 必须断言 overlay layer 存在,runtime rect 与 editor root rect 高度/宽度接近,不因 sidebar/toolbar/navigator 被 grid/flex 挤压。
### Leptos/Rust UI shell 收口约束
- `mindmap-ui-schema.ts` / `mindmap-action-map.ts` / `mindmap-ui-state.ts` 当前是过渡资产;新增长期 UI 行为时应优先设计 Rust/Leptos 可消费的 schema 和 signal/state 边界。
- `tiptap_paragraph.ts` 不应继续成为 toolbar/sidebar/navigator 的长期实现文件;新增复杂 UI 面板前,应先迁出到 Leptos/Rust 组件或生成的 island 组件边界。
- 禁止恢复旧 React `MindmapBlock.tsx` 为默认主链,禁止直接嵌入 lx-doc Vue app,禁止新增第三套 JS UI 框架。
- `simple-mind-map` 可以继续作为 runtime engine,但 UI shell 的宿主语言方向应是 Leptos/Rust。
---
### Task 1: 冻结新阶段边界
**Files:**
- Modify: `design/06-mindmap/process/6-mindmap-kernel-phase6-projection-editor-v1.md`
- Modify: `docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md`
- Create/Modify: `design/06-mindmap/process/6-mindmap-phase6-leptos-ui-shell-reuse-checklist-v1.md`
- [x] 明确当前 Phase 6 不是“Rust 重写 lx-doc/mind-map”,也不是“直接嵌入 lx-doc Vue app”。
- 2026-05-11 记录:本文件“当前判断”和总设计稿第 3 节均保留三路线定位,Phase 6 主线为 `leptos-mindmap`
- [x] 明确下一阶段目标是“当前 simple-mind-map runtime + 可复用 UI shell + kernel command bridge”。
- 2026-05-11 记录:本文件 Goal/Architecture 与总设计稿 `10.2` 均明确 floating overlay UI shell + command bridge。
- [x] 在旧 checklist 中标记:已完成项如果只覆盖 runtime 接入和最小 smoke,不代表 KMind-like UI 可用性完成。
- 2026-05-11 更新:旧 checklist 新增 `Task 13: UI Shell Reuse 后续收口`,指向本文件。
- [x] 在设计稿中补一段“UI shell 复用策略”,指向本 checklist。
- 2026-05-11 更新:`6-mindmap-kernel-phase6-projection-editor-v1.md` 新增 `10.2 2026-05-11 UI shell reuse 收口状态`
- [x] 验证:`rg -n "UI shell|MindmapBlock.tsx|mindmap-ui-schema|直接嵌入 lx-doc" design/06-mindmap docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md`
- 2026-05-11 通过:命令能检索到本 checklist、总设计稿、reference notes 和旧执行 checklist 的对应口径。
### Task 2: 抽取历史 React UI 能力清单
**Files:**
- Inspect: `wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx`
- Inspect: `wolai-frontend/src/components/editor/blocks/MindmapToolbar.tsx`
- Inspect: `wolai-frontend/src/components/editor/blocks/mindmapToolbarConfig.ts`
- Inspect: `wolai-frontend/src/components/editor/blocks/MindmapSidebar.tsx`
- Inspect: `wolai-frontend/src/components/editor/blocks/mindmapSidebarConfig.ts`
- Inspect: `wolai-frontend/src/components/editor/blocks/MindmapNavigator.tsx`
- Inspect: `wolai-frontend/src/components/editor/blocks/MindmapMiniMap.tsx`
- Inspect: `wolai-frontend/src/components/editor/blocks/MindmapCount.tsx`
- Inspect: `wolai-frontend/src/components/editor/blocks/MindmapContextMenu.tsx`
- Output: `design/06-mindmap/process/6-mindmap-leptos-adapter-reference-notes-v1.md`
- [x] 列出历史 toolbar 分组:历史操作、节点操作、插入扩展、样式、结构、导入导出、视图操作。
- [x] 列出每个 toolbar action 的旧实现来源、旧 runtime 调用、禁用条件、是否需要 active node。
- [x] 列出历史 sidebar panel:节点样式、基础样式、主题、结构、大纲、快捷键或设置。
- [x] 列出历史 navigator 能力:缩放、回根、适应画布、MiniMap、节点数/字数、只读/全屏。
- [x] 列出历史 context menu 能力:插入、删除、复制、粘贴、展开折叠、概要、关联线、样式。
- [x] 标注哪些能力第一阶段必须迁移,哪些只保留 schema 但暂不显示。
- [x] 验证:输出表格至少覆盖 toolbar、sidebar、navigator、context menu 四类能力,并能追溯到具体文件名。
- 2026-05-11 输出:`design/06-mindmap/process/6-mindmap-leptos-adapter-reference-notes-v1.md` 第 8 节。
### Task 3: 建立中立 UI Schema
**Files:**
- Create: `wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts`
- Create: `wolai-frontend/src/lib/mindmap/mindmap-ui-schema.test.ts`
- [x] 定义 `MindmapUiActionId`,覆盖第一阶段 action`undo``redo``editNode``insertSiblingAfter``insertChild``deleteNode``tag``hyperlink``note``image``icon``summary``associativeLine``formula``painter``import``export``setTheme``setLayout``zoomIn``zoomOut``fitView``centerRoot``search``readonly`
- [x] 定义 `MindmapToolbarGroup`,字段包含 `id``label``actions``collapsePriority`
- [x] 定义 `MindmapSidebarPanel`,字段包含 `id``label``icon``runtimeCapability``phase`
- [x] 定义 `MindmapNavigatorItem`,字段包含 `id``label``actionId``readOnly``displayMode`
- [x] 定义 `MindmapContextMenuItem`,字段包含 `id``label``actionId``requiresNode``phase`
- [x] 导出 `mindmapDefaultUiSchema`,只包含第一阶段需要显示的功能。
- [x] 单测断言 action id 不重复、每个 toolbar action 都能在 action map 中找到占位映射、第一阶段 panel 数量不超过 5 个。
- [x] 验证:`cd /mnt/Data1T/mnote/wolai-frontend && pnpm test -- mindmap-ui-schema`
### Task 4: 建立 Action Map 与禁用状态
**Files:**
- Create: `wolai-frontend/src/lib/mindmap/mindmap-action-map.ts`
- Create: `wolai-frontend/src/lib/mindmap/mindmap-action-map.test.ts`
- Create: `wolai-frontend/src/lib/mindmap/mindmap-ui-state.ts`
- Create: `wolai-frontend/src/lib/mindmap/mindmap-ui-state.test.ts`
- Modify: `wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts`
- [x] 定义 `MindmapActionTarget``runtimeCommand``kernelCommand``compatPatch``localView`
- [x]`insertChild` 映射到 `simple-mind-map` 插入子节点命令,并在成功后走 `mindmap.node.insert_child` 或 diff。
- [x]`insertSiblingAfter` 映射到同级插入命令,并在成功后走 `mindmap.node.insert_sibling_after` 或 diff。
- [x]`deleteNode` 映射到删除命令,并在成功后走 `mindmap.node.delete` 或 diff。
- [x]`centerRoot``zoomIn``zoomOut``fitView` 映射为 runtime view action,同时产生 `mindmap.view.patch`
- [x]`setTheme``setLayout` 映射为 `mindmap.theme.set``mindmap.layout.set`
- [x]`tag``hyperlink``note``image``icon``formula``painter` 第一阶段映射为 `compatPayload.patch`,并记录字段路径。
- [x] 实现 `deriveMindmapUiState()`,根据 active node、readonly、runtime capabilities、selection 派生 disabled state。
- [x] 单测覆盖:无 active node 时节点操作禁用;readonly 时编辑类 action 禁用;view action 不依赖 active node。
- [x] 验证:`cd /mnt/Data1T/mnote/wolai-frontend && pnpm test -- mindmap-action-map mindmap-ui-state`
- 2026-05-11 补充验证:`pnpm test -- mindmap-ui-schema mindmap-action-map mindmap-ui-state` 通过。
### Task 5: 替换 NodeView 中的硬编码 Chrome
**Files:**
- Modify: `design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts`
- Modify: `rust/spikes/leptos-tiptap-spike/generated/island/snippets/leptos-tiptap-c355e6ec24c3df4c/src/js/generated/tiptap_paragraph.js`
- Modify: `wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts`
- [x] 移除默认主链中的手写 toolbar button 列表,改为从 `mindmapDefaultUiSchema.toolbarGroups` 渲染。
- 2026-05-11 验证:默认 DOM `data-testid="mindmap-schema-toolbar"``data-schema-source="mindmapDefaultUiSchema"`;截图 `tmp/task166-mindmap-phase6-block-smoke/toolbar-actions.png`
- [x] 移除默认主链中的手写 sidebar trigger 列表,改为从 `mindmapDefaultUiSchema.sidebarPanels` 渲染。
- 2026-05-11 验证:默认 DOM `data-testid="mindmap-schema-sidebar"``data-schema-source="mindmapDefaultUiSchema"`;截图 `tmp/task166-mindmap-phase6-block-smoke/sidebar-node-style.png`
- [x] 移除默认主链中的固定 bottom bar 文案,改为从 navigator schema 和 runtime state 渲染。
- 2026-05-11 验证:默认 DOM `data-testid="mindmap-schema-navigator"`,显示节点数、字数与缩放百分比;截图 `tmp/task166-mindmap-phase6-block-smoke/navigator-default.png`
- [x] 保留最小错误层:`projection_load_failed``adapter_init_failed``runtime_render_failed``command_failed`
- [x] 保留 debug fallback,但必须通过显式 debug flag 才能显示,不作为默认主链。
- [x] 确保 NodeView 销毁时仍调用 adapter `destroy()`
- [x] 验证:页面 DOM 中默认不再出现旧 `.mnote-mindmap-node` 手写节点主链;`data-testid="mnote-mindmap-editor-root"` 仍存在。
- 2026-05-11 验证:`node scripts/task166-mindmap-phase6-block-smoke.js` 通过;`tmp/task166-mindmap-phase6-block-smoke/result.json``ok=true`,默认 `debugChrome=false` 且无手写 toolbar/sidebar/bottom bar。
### Task 5A: 修正为 Floating Overlay Canvas Shell
**Files:**
- Modify: `design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts`
- Modify: `rust/spikes/leptos-tiptap-spike/src/lib.rs`
- Modify: `rust/spikes/leptos-tiptap-spike/generated/island/snippets/leptos-tiptap-c355e6ec24c3df4c/src/js/generated/tiptap_paragraph.js`
- Modify: `scripts/task166-mindmap-phase6-block-smoke.js`
- [x] NodeView 默认 DOM 改为 `canvas-layer + overlay-layer`runtime 不再和 sidebar 组成 grid。
- 2026-05-11 实现:默认路径挂载 `mindmap-canvas-layer``mindmap-overlay-layer`debug fallback 仍保留旧布局。
- [x] toolbar 顶部居中浮动,sidebar 右侧浮动,navigator 右下浮动,count 左下浮动。
- 2026-05-11 截图:`tmp/task166-mindmap-phase6-block-smoke/01-after-insert-floating-overlay.png`
- [x] sidebar 打开或切换 panel 时不改变 runtime 宽度。
- 2026-05-11 验证:sidebar 已从 workspace grid 移到 overlay layersmoke 覆盖 panel 切换截图。
- [x] smoke 断言 `data-testid="mindmap-overlay-layer"` 存在,且 `runtimeBox.width / rootBox.width >= 0.9`
- 2026-05-11 验证:`node scripts/task166-mindmap-phase6-block-smoke.js` 通过。
- [x] smoke 保存 `01-after-insert-floating-overlay.png`,截图能看到画布底层和浮动 UI。
- 2026-05-11 截图:`tmp/task166-mindmap-phase6-block-smoke/01-after-insert-floating-overlay.png`
- [x] 验证:`cd /mnt/Data1T/mnote/design/05-editor-mainline/reference-code/leptos-tiptap/tiptap && npm run typecheck && npm run build`
- 2026-05-11 通过。
- [x] 验证:`cd /mnt/Data1T/mnote/wolai-frontend && node scripts/build-leptos-tiptap-island.js`
- 2026-05-11 已重新生成 island。
- [x] 验证:`cd /mnt/Data1T/mnote && node scripts/task166-mindmap-phase6-block-smoke.js`
- 2026-05-11 通过;`tmp/task166-mindmap-phase6-block-smoke/result.json``ok=true`
### Task 5B: 收口到 Leptos/Rust UI Shell 宿主
**Files:**
- Modify/Create: `rust/spikes/leptos-tiptap-spike/src/lib.rs`
- Modify/Create: `rust/spikes/leptos-tiptap-spike/src/mindmap_shell.rs` 或同等 Leptos 组件文件
- Modify: `design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts`
- Modify: `wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts`
- Modify: `scripts/task166-mindmap-phase6-block-smoke.js`
- [x] 明确 `tiptap_paragraph.ts` 只创建 mount 容器、加载 runtime bridge、转发事件,不再直接渲染 toolbar/sidebar/navigator 长期 UI。
- 2026-05-11 实现:默认路径只挂载 `mindmap-rust-shell-mount`TS 负责 `simple-mind-map` runtime、projection/command bridge、`mnote:mindmap-shell:*` 事件转发;debug fallback 仍需显式 debug flag。
- [x] 将 floating overlay shell 的 toolbar/sidebar/count/navigator 渲染迁到 Leptos/Rust 组件边界。
- 2026-05-11 实现:`rust/spikes/leptos-tiptap-spike/src/lib.rs` 导出 `mount_mindmap_shell` / `unmount_mindmap_shell`Leptos 组件输出 `mindmap-rust-shell`、toolbar、sidebar、count、navigator。
- [x] Leptos/Rust UI shell 消费同等 schema/state/action 能力;若仍需 TS schema,必须作为临时 adapter 输入,不作为长期事实源。
- 2026-05-11 实现:当前 TS adapter 将 `mindmapDefaultUiSchema``deriveMindmapUiState()` 转为 Rust shell options;后续新增长期 UI 能力应继续迁到 Rust/Leptos schema 边界。
- [x] Leptos/Rust UI shell 触发 action 时仍经由 adapter command bridge,不绕过 kernel command。
- 2026-05-11 验证:Rust shell 派发 `mnote:mindmap-shell:action` / `mnote:mindmap-shell:panel`NodeView 统一转到 `executeSchemaAction()``applyCommandsAndRefresh()``patchView`
- [x] smoke 断言默认 UI shell 来源为 `leptos-rust-shell` 或等价稳定标记,而不是 `typescript-nodeview-dom`
- 2026-05-11 验证:`scripts/task166-mindmap-phase6-block-smoke.js` 断言 `data-ui-shell-source="leptos-rust-shell"``data-ui-source="leptos-rust-shell"`
- [x] 验证:`cd /mnt/Data1T/mnote/design/05-editor-mainline/reference-code/leptos-tiptap/tiptap && npm run typecheck && npm run build`
- 2026-05-11 通过。
- [x] 验证:`cd /mnt/Data1T/mnote/wolai-frontend && node scripts/build-leptos-tiptap-island.js`
- 2026-05-11 通过,island 入口包含 `mount_mindmap_shell` / `unmount_mindmap_shell`
- [x] 验证:`cd /mnt/Data1T/mnote && node scripts/task166-mindmap-phase6-block-smoke.js`
- 2026-05-11 通过;`tmp/task166-mindmap-phase6-block-smoke/result.json``ok=true`,默认入口 `http://127.0.0.1:3000`;截图 `tmp/task166-mindmap-phase6-block-smoke/01-after-insert-floating-overlay.png`
### Task 6: Toolbar 第一阶段迁移
**Files:**
- Modify: `wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts`
- Modify: `wolai-frontend/src/lib/mindmap/mindmap-action-map.ts`
- Modify: `wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts`
- Modify: `scripts/task166-mindmap-phase6-block-smoke.js`
- [x] 顶部 toolbar 显示:撤销、重做、同级节点、子节点、删除、标签、超链接、备注、图片、图标、概要、关联线、公式、格式刷、导入、导出。
- 2026-05-11 验证:`node scripts/task166-mindmap-phase6-block-smoke.js` 断言上述 action id 均存在;截图 `tmp/task166-mindmap-phase6-block-smoke/toolbar-actions.png`
- [x] toolbar 分组、图标尺寸、按钮间距对齐 KMind/lx-doc 的工作台密度,不做大卡片式按钮。
- 2026-05-11 实现:`rust/spikes/leptos-tiptap-spike/src/lib.rs` 新增 schema toolbar group、tool icon/label 紧凑样式;截图 `tmp/task166-mindmap-phase6-block-smoke/01-after-insert-schema-ui.png`
- [x] active node 为空时禁用节点相关按钮。
- 2026-05-11 实现:Rust shell 消费 `deriveMindmapUiState()` 派生的 disabled state;节点类 action 依赖 `activeNodeId`
- [x] readonly 时禁用所有编辑类按钮,保留缩放、搜索、回根。
- 2026-05-11 验证:`node scripts/task166-mindmap-phase6-block-smoke.js``verifyReadonlyToolbarState()` 覆盖 readonly 开关后编辑按钮禁用、view 按钮保留可用。
- [x] 点击“子节点”后真实插入节点,截图可见新增节点。
- 2026-05-11 验证:`toolbarActions.insertChildOk=true`,截图 `tmp/task166-mindmap-phase6-block-smoke/03-after-toolbar-actions.png`
- [x] 点击“同级节点”后真实插入同级节点,截图可见新增节点。
- 2026-05-11 验证:`toolbarActions.insertSiblingOk=true`,节点数从 5 增至 6。
- [x] 点击“删除”后真实删除选中节点,并能 reload 后保持。
- 2026-05-11 验证:`toolbarActions.deleteOk=true`,删除后节点数为 5,reload 后仍为 5。
- [x] 验证:smoke 输出 toolbar action 结果 JSON,包含 `insertChildOk``insertSiblingOk``deleteOk`
- 2026-05-11 通过:`tmp/task166-mindmap-phase6-block-smoke/result.json``toolbarActions={insertChildOk:true,insertSiblingOk:true,deleteOk:true}`
### Task 7: Sidebar 第一阶段迁移
**Files:**
- Modify: `wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts`
- Modify: `wolai-frontend/src/lib/mindmap/mindmap-action-map.ts`
- Modify: `wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts`
- Modify: `scripts/task166-mindmap-phase6-block-smoke.js`
- [x] 右侧栏触发器显示:节点样式、导图样式、主题、结构、大纲。
- 2026-05-11 验证:smoke 断言 `nodeStyle``baseStyle``theme``structure``outline` 均存在。
- [x] 打开一个 panel 时不挤压或遮挡主要画布节点。
- 2026-05-11 验证:Task 5A/5B smoke 断言 `runtimeBox.width / rootBox.width >= 0.9``runtimeBox.height / rootBox.height >= 0.85`sidebar 位于 floating overlay,不改变 runtime 尺寸。
- [x] 主题 panel 第一阶段至少提供默认主题和 KMind-like 主题切换。
- 2026-05-11 实现:Rust/Leptos sidebar body 渲染 `theme-classic``theme-classic4`NodeView bridge 将选择转为 `setTheme` kernel command。验证:`node scripts/task166-mindmap-phase6-block-smoke.js``sidebarActions.themeOk=true`reload 后 `theme=classic4` 保持;截图 `tmp/task166-mindmap-phase6-block-smoke/sidebar-theme.png``sidebar-actions.png`
- [x] 结构 panel 第一阶段至少提供逻辑结构、右侧结构、鱼骨或树形结构中的可用子集。
- 2026-05-11 实现:Rust/Leptos sidebar body 渲染 `logicalStructure``mindMap``fishbone` 结构选项;NodeView bridge 将选择转为 `setLayout` kernel command。验证:`node scripts/task166-mindmap-phase6-block-smoke.js``sidebarActions.layoutOk=true`reload 后 `layout=mindMap` 保持;截图 `tmp/task166-mindmap-phase6-block-smoke/sidebar-structure.png`
- [x] 大纲 panel 只从 projection/runtime 派生,不创建第二份树真相。
- 2026-05-11 实现:NodeView 每次 mount Rust shell 时从当前 runtime snapshot / projection root 派生 `bodyItems`,Rust shell 只渲染传入列表,不维护第二份树状态。验证:`sidebarActions.outlineDerivedOk=true`,输出 outline items 包含当前导图节点文本;截图 `tmp/task166-mindmap-phase6-block-smoke/sidebar-outline.png`
- [x] 节点样式和导图样式的暂未语义化字段走 `compatPayload.patch`
- 2026-05-11 实现:sidebar option 派发 `source=sidebar``compatPath`;节点样式写入 `nodes.$active.data.fillColor`,导图样式写入 `compatPayload.style.map.lineStyle`。验证:`sidebarActions.nodeStyleCompatOk=true``sidebarActions.baseStyleCompatOk=true`reload 后保持;截图 `tmp/task166-mindmap-phase6-block-smoke/sidebar-node-style.png``sidebar-base-style.png`
- [x] 验证:smoke 能打开每个 panel,并保存 `sidebar-node-style.png``sidebar-theme.png``sidebar-structure.png``sidebar-outline.png`
- 2026-05-11 通过:`node scripts/task166-mindmap-phase6-block-smoke.js` 保存四张 sidebar 截图。
### Task 8: Navigator / MiniMap / Count 迁移
**Files:**
- Modify: `wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts`
- Modify: `wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts`
- Modify: `scripts/task166-mindmap-phase6-block-smoke.js`
- [x] 底部栏显示节点数、字数、当前缩放百分比。
- 2026-05-11 验证:smoke 断言 navigator stats 包含“节点”,zoom 包含 `%`;截图 `tmp/task166-mindmap-phase6-block-smoke/navigator-default.png`
- [x] “回根节点”调用 runtime center root,并写入 view patch。
- 2026-05-11 验证:`node scripts/task166-mindmap-phase6-block-smoke.js` 通过;`navigatorActions.centerRootOk=true`,通过浮动 navigator 按钮触发并观测到 `patchView` POST。
- [x] 缩放加减按钮调用 runtime zoom,并写入 view patch。
- 2026-05-11 验证:`navigatorActions.zoomOk=true``viewScale=1.2`,截图 `tmp/task166-mindmap-phase6-block-smoke/navigator-zoomed.png`
- [x] 搜索入口调用 `simple-mind-map` Search 插件或当前 adapter 搜索入口。
- 2026-05-11 实现:Rust/Leptos navigator search input 派发 `search` actionNodeView adapter 记录当前搜索入口状态与 query;后续可替换为 Search 插件面板。验证:`navigatorActions.searchOk=true`
- [x] MiniMap 第一阶段可折叠显示,但按钮和容器状态必须稳定。
- 2026-05-11 实现:Rust/Leptos shell 增加 MiniMap 开关和稳定 overlay 容器;不恢复旧 React MiniMap。验证:`navigatorActions.minimapOk=true`,截图 `tmp/task166-mindmap-phase6-block-smoke/navigator-minimap.png`
- [x] 底部栏在窄屏下不覆盖节点编辑区域。
- 2026-05-11 验证:当前 smoke 断言 runtime 仍保持 `runtimeBox.width/rootBox.width >= 0.9``runtimeBox.height/rootBox.height >= 0.85`navigator/MiniMap 均在 overlay layer,不改变 runtime 尺寸。
- [x] 验证:smoke 保存 `navigator-default.png``navigator-zoomed.png``navigator-minimap.png`
- 2026-05-11 通过:`node scripts/task166-mindmap-phase6-block-smoke.js` 输出 `ok=true`,截图路径包含三张 navigator 截图。
### Task 9: Context Menu 迁移
**Files:**
- Modify: `wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts`
- Modify: `wolai-frontend/src/lib/mindmap/mindmap-action-map.ts`
- Modify: `wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts`
- Modify: `scripts/task166-mindmap-phase6-block-smoke.js`
- [x] 右键节点时显示节点 context menu。
- 2026-05-11 实现:NodeView capture 阶段监听 `contextmenu`,检测 `.smm-node` 后打开节点菜单。验证:`node scripts/task166-mindmap-phase6-block-smoke.js``contextMenuActions.nodeMenuOk=true`;截图 `tmp/task166-mindmap-phase6-block-smoke/context-menu-actions.png`
- [x] 右键画布时显示画布 context menu,节点专属操作禁用或隐藏。
- 2026-05-11 验证:smoke 右键 runtime 空白区后 `contextMenuActions.canvasMenuOk=true`,且 canvas 菜单不包含 `insertChild`
- [x] 节点 menu 第一阶段包含:插入子节点、插入同级节点、删除、展开/收起、概要、关联线、复制文本。
- 2026-05-11 验证:smoke 断言节点菜单包含 `insertChild``insertSiblingAfter``deleteNode``summary``associativeLine``expandCollapse``copyNodeText``copyTextOk=true``insertChildOk=true`
- [x] 画布 menu 第一阶段包含:回根节点、适应画布、搜索、只读切换。
- 2026-05-11 验证:smoke 断言画布菜单包含 `centerRoot``fitView``search``readonly`
- [x] 所有 context menu action 复用 `mindmap-action-map.ts`,不新增第二套动作逻辑。
- 2026-05-11 实现:`mindmap-ui-schema.ts` 新增 `expandCollapse``copyNodeText``mindmap-action-map.ts` 将其映射为 `localView`;菜单点击统一调用 `executeSchemaAction()`。说明:context menu DOM 当前仍由 NodeView 过渡渲染,后续可按 Task 5B 同样迁入 Rust/Leptos shell。
- [x] 验证:smoke 能打开节点右键菜单和画布右键菜单,并保存截图。
- 2026-05-11 通过:`node scripts/task166-mindmap-phase6-block-smoke.js` 输出 `ok=true`;截图 `tmp/task166-mindmap-phase6-block-smoke/context-menu-actions.png`
### Task 10: Command Bridge 与保存闭环补齐
**Files:**
- Modify: `wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts`
- Modify: `wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts`
- Modify: `rust/crates/bridge-runtime/src/lib.rs`
- Modify: `rust/crates/core-protocol/src/mindmap.rs`
- Modify: `scripts/task166-mindmap-phase6-block-smoke.js`
- [x] `data_change` 能识别文本更新、插入子节点、插入同级节点、删除节点、移动节点。
- 2026-05-11 验证:`mindmap-command-diff.test.ts` 覆盖文本、插入、删除、移动 diff;`node scripts/task166-mindmap-phase6-block-smoke.js` 覆盖 toolbar/context menu 插入与删除保存闭环。
- [x] `view_data_change` 能转成 `mindmap.view.patch`
- 2026-05-11 验证:navigator 回根与缩放触发 view patchsmoke 输出 `navigatorActions.centerRootOk=true``navigatorActions.zoomOk=true``viewScale=1.2`
- [x] toolbar/sidebar/context menu 触发的动作都能落到 `kernel command``compatPayload.patch`
- 2026-05-11 验证:toolbar 插入/删除、sidebar 主题/结构、context menu 插入均通过 smokesidebar 节点样式/导图样式走 compat patch,结果为 `nodeStyleCompatOk=true``baseStyleCompatOk=true`
- [x] 每个 `compatPayload.patch` 记录字段路径、来源 action、runtime revision、kernel revision。
- 2026-05-11 实现:`mindmap-command-diff.ts``MindmapCompatPayloadPatch` 增加 `actionId``runtimeRevision``kernelRevision`NodeView bridge 注入 action/revision 元信息。
- [x] command 失败时显示 `command_failed`,并保留失败 action id 和错误消息。
- 2026-05-11 实现:NodeView command 失败时写入 `data-command-failed-action``data-command-failed-message`;本轮 smoke 未再复现删除节点 400。
- [x] reload 后仍能看到 toolbar 插入/删除/主题/结构/view 的已保存结果。
- 2026-05-11 验证:smoke 保存并校验 `04-after-reload.png`;输出 `toolbarActions.deleteOk=true``sidebarActions.themeOk=true``sidebarActions.layoutOk=true``viewScale=1.2`
- [x] 验证:`cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol mindmap`
- 2026-05-11 通过:3 passed。
- [x] 验证:`cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime mindmap`
- 2026-05-11 通过:14 passed。
- [x] 验证:`cd /mnt/Data1T/mnote/wolai-frontend && pnpm test -- mindmap-command-diff leptos-mindmap-adapter`
- 2026-05-11 通过:实际匹配全量 106 files416 tests passed。
### Task 11: KMind/lx-doc 视觉对齐
**Files:**
- Modify: `design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts`
- Modify: relevant generated JS island file
- Modify: `wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts`
- Modify: `scripts/task166-mindmap-phase6-block-smoke.js`
- Reference Image: `tmp/image copy 60.png`
- Reference Image: `tmp/image copy 70.png`
- Current Evidence: `tmp/image copy 79.png`
- [x] 默认根节点、二级节点、分支节点、概要线的视觉结果接近 KMind/lx-doc,而不是只显示基础节点和错位连线。
- 2026-05-11 实现:真实 `simple-mind-map` runtime 负责节点、连线、概要线渲染;当前截图能看到根节点、二级节点、分支主题和概要括号线。剩余差异:默认主题色仍未完全等同 `image copy 60.png` 的红/蓝 KMind 配色,后续可继续细化 themeConfig。
- [x] toolbar、右侧触发器、底部栏呈现为编辑工作台 chrome,不占据画布主体。
- 2026-05-11 实现:Leptos/Rust shell 的 toolbar、sidebar、navigator、count 均为 floating overlay;新截图 `tmp/task166-mindmap-phase6-block-smoke/01-after-insert-floating-overlay.png` 显示 UI 浮在画布上,不再挤压 runtime。
- [x] 连线对齐节点中心或 runtime 默认锚点,无明显错位。
- 2026-05-11 验证:当前连线由 `simple-mind-map` runtime 生成;人工查看 `04-after-reload.png` 未见此前手写线条错位问题。
- [x] 画布初始视口能看到完整示例导图,不需要用户手动拖拽才能判断是否渲染成功。
- 2026-05-11 修复:`simple-mind-map-bridge.ts` 不再用固定 `fit:false` 覆盖 runtimeOptions;默认 `fit:true``01-after-insert-floating-overlay.png` 中示例导图完整可见。
- [x] 禁止用说明性大字、调试文案或状态卡片占据导图首屏。
- 2026-05-11 验证:默认首屏为真实 runtime + floating UIdebug fallback 仍需显式 debug flag。
- [x] 验证:人工对照 `image copy 60.png` / `image copy 70.png` / 当前 smoke 截图,记录剩余差异到 checklist 或 reference notes。
- 2026-05-11 对照:当前已具备无限画布底层、浮动 toolbar、右侧栏、底部 navigator、概要线和完整初始视口;剩余差异为图标体系、默认主题色、工具栏按钮分组密度和高级面板内容仍未完全复刻 lx-doc/KMind。
### Task 12: Browser Smoke 升级
**Files:**
- Modify: `scripts/task166-mindmap-phase6-block-smoke.js`
- Output: `tmp/task166-mindmap-phase6-block-smoke/result.json`
- Output: `tmp/task166-mindmap-phase6-block-smoke/*.png`
- [x] smoke 使用真实测试账号登录 `http://127.0.0.1:3000/`
- 2026-05-11 验证:`tree-shell-smoke-helpers.js` 使用 `mnote.e2e@example.com` / “测试账号快速登录”,本轮 smoke baseUrl 为 `http://127.0.0.1:3000`
- [x] smoke 插入或打开 mindmap block 后断言 `simple-mind-map` canvas/SVG 容器非零尺寸。
- 2026-05-11 验证:`assertMindmapReady()` 断言 `simple-mind-map-runtime`、runtime box、节点数和边数。
- [x] smoke 断言 toolbar、sidebar trigger、bottom navigator、context menu 入口存在。
- 2026-05-11 验证:smoke 断言 `mindmap-schema-toolbar``mindmap-schema-sidebar``mindmap-schema-navigator``mindmap-schema-count`,并打开节点/画布 context menu。
- [x] smoke 执行插入子节点、插入同级节点、删除节点、缩放、回根节点。
- 2026-05-11 验证:输出 `toolbarActions.insertChildOk/insertSiblingOk/deleteOk=true``navigatorActions.centerRootOk/zoomOk=true`
- [x] smoke 打开右侧栏的主题、结构、大纲 panel。
- 2026-05-11 验证:截图包含 `sidebar-theme.png``sidebar-structure.png``sidebar-outline.png`
- [x] smoke reload 后断言已编辑文本、节点数量、view state 至少一项保持。
- 2026-05-11 验证:reload 后断言编辑文本、节点数量、主题、结构、节点样式、导图样式;view scale 输出为 `1.2`
- [x] smoke 输出 `ok``documentId``mindmapId``nodeCount``edgeCount``toolbarActions``sidebarPanels``navigatorActions``contextMenuActions``screenshots`
- 2026-05-11 验证:`tmp/task166-mindmap-phase6-block-smoke/result.json` 输出 `ok=true``documentId``mindmapId``nodeCount=6``edgeCount=5``toolbarActions``sidebarActions``navigatorActions``contextMenuActions``screenshots`
- [x] smoke 失败时必须标出阶段:`projection_load_failed``adapter_init_failed``runtime_render_failed``ui_shell_missing``command_failed``reload_mismatch`
- 2026-05-11 实现:失败分支从 error message / error layer 归类 `failureStage`,并保存 `99-failure.png`
- [x] 验证:`node /mnt/Data1T/mnote/scripts/task166-mindmap-phase6-block-smoke.js`
- 2026-05-11 通过:`ok=true`,截图已刷新。
### Task 13: 旧实现边界收口
**Files:**
- Modify: `wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx`
- Modify: `wolai-frontend/src/components/editor/blocks/MindmapToolbar.tsx`
- Modify: `wolai-frontend/src/components/editor/blocks/MindmapSidebar.tsx`
- Modify: `wolai-frontend/src/components/editor/blocks/MindmapNavigator.tsx`
- Modify: `wolai-frontend/src/components/editor/blocks/MindmapContextMenu.tsx`
- Modify: `wolai-frontend/src/components/editor/editor-host-config.test.ts`
- [x] 给旧 React mindmap 组件族补清晰注释:legacy/reference/compat,不是 3000 文档页默认主链。
- 2026-05-11 实现:`MindmapBlock.tsx``MindmapToolbar.tsx``MindmapSidebar.tsx``MindmapNavigator.tsx``MindmapContextMenu.tsx``MindmapMiniMap.tsx``MindmapCount.tsx``MindmapSidebarTrigger.tsx` 顶部均标注 legacy/reference/compat 边界。
- [x] 默认文档页 host 为 `leptos_tiptap_island` 时,不加载旧 React `MindmapBlock` 作为主编辑路径。
- 2026-05-11 验证:`editor-host-config.test.ts` 断言默认 host 为 `leptos_tiptap_island``blocknote`/旧 debug host 均折返 island。
- [x] 历史 toolbar/sidebar/navigator/context menu 只能作为 schema 抽取来源,不在运行时并行挂两套 UI。
- 2026-05-11 验证:smoke 断言默认不存在旧 `mindmap-command-toolbar``mindmap-sidebar``mindmap-bottom-bar` fallback。
- [x] 保留旧组件用于对照、独立迁移或回收,不在本任务中删除。
- 2026-05-11 处理:旧 React 组件族仍被独立导图页 `/mindmap/[docId]/[mindmapId]` 引用,暂不移动;已删除重复的 `wolai-frontend/src/app/dev/mindmap/page.tsx`,对应副本保留在 `recycle/wolai-frontend/src/app/dev/mindmap/page.tsx`
- [x] 静态测试禁止把 `.mnote-mindmap-react-mount``window.__mindmapInstance` 作为 Phase 6 成功条件。
- 2026-05-11 实现:`editor-host-config.test.ts` 新增 Phase 6 mindmap 成功选择器断言,成功条件限定为 `mnote-mindmap-editor-root``simple-mind-map-runtime``mindmap-rust-shell`
- [x] 验证:`cd /mnt/Data1T/mnote/wolai-frontend && pnpm test -- editor-host-config`
- 2026-05-11 通过:实际匹配全量 106 files418 tests passed。
### Task 14: 文档与执行记录
**Files:**
- Modify: `design/06-mindmap/process/6-mindmap-kernel-phase6-projection-editor-v1.md`
- Modify: `design/06-mindmap/process/6-mindmap-leptos-adapter-reference-notes-v1.md`
- Modify: `design/06-mindmap/process/6-mindmap-phase6-leptos-ui-shell-reuse-checklist-v1.md`
- Modify: `docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md`
- [x] 在总设计稿中明确:UI shell reuse 是 `leptos-mindmap` 的 Phase 6 后续收口,不改变 kernel-first 主合同。
- 2026-05-11 更新:`6-mindmap-kernel-phase6-projection-editor-v1.md` 新增 `10.2 UI shell reuse 收口状态`,指向本 checklist。
- [x] 在 reference notes 中补历史 React UI 壳能力表。
- 2026-05-11 已完成:`6-mindmap-leptos-adapter-reference-notes-v1.md` 第 8 节覆盖 toolbar、sidebar、navigator/MiniMap/count、context menu。
- [x] 在旧执行 checklist 中补一条链接,说明后续 UI 可用度按本 checklist 继续。
- 2026-05-11 更新:`docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md` 新增 `Task 13: UI Shell Reuse 后续收口`
- [x] 每完成一个 task,在本文件勾选对应节点,并附验证命令或截图路径。
- 2026-05-11 已按 Task 10-13 补充命令、截图和 result.json 证据。
- [x] 如果某项被后续实现废弃,移动到“暂不做项”并写明原因,不静默删除。
- 2026-05-11 当前没有静默删除项;context menu DOM 仍标记为 NodeView 过渡层,未误报为纯 Rust shell。
## 退出标准
- [x] 当前文档页 mindmap block 默认使用真实 `simple-mind-map` runtime,而不是手写 SVG/DOM 假导图。
- [x] toolbar、sidebar、navigator、context menu 都来自可复用 UI schema 或等价配置,不再散落为 NodeView 内硬编码按钮。
- [x] 第一阶段常用操作可用:插入子节点、插入同级节点、删除、编辑文本、缩放、回根、主题切换、结构切换、大纲查看。
- [x] 所有编辑动作都经过 kernel command 或 `compatPayload.patch`,不把整棵 runtime data 作为 canonical truth。
- [x] smoke 有插入后、操作后、打开侧栏后、打开右键菜单后、reload 后截图。
- [x] 人工对照 `tmp/image copy 60.png``tmp/image copy 70.png`,当前实现已经呈现为可用工作台,而不是“无头 runtime + 临时按钮”。
## 暂不做项
- [ ] 不直接把 lx-doc Vue2 应用作为 mnote 文档页内嵌主链。
- [ ] 不恢复旧 React `MindmapBlock.tsx` 为默认编辑器主链。
- [ ] 不在本阶段 Rust-native 重写 `simple-mind-map` layout / hit-test / renderer。
- [ ] 不在本阶段完整复刻 KMind 多根、MOC、思源块镜像、PDF 标注、全量导入导出、主题设计器。
- [ ] 不删除历史 React mindmap 文件;先作为迁移参考和 compat 资产保留。
- [ ] 旧 React `MindmapBlock.tsx` 组件族暂不移动到 recycle,直到 `/mindmap/[docId]/[mindmapId]` 独立页切到同一 `leptos-mindmap` adapter contract;当前只回收重复 dev 路由。