feat: 收口 mindmap Phase 6 Leptos UI shell
This commit is contained in:
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 adapter,Rust 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 layer;smoke 覆盖 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` action,NodeView 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 patch;smoke 输出 `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 插入均通过 smoke;sidebar 节点样式/导图样式走 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 files,416 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 UI;debug 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 files,418 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 路由。
|
||||
Reference in New Issue
Block a user