# 5-2 [process] Tiptap Notion-Like 模板裁剪与 `leptos-tiptap` 映射分析 v1

> 更新时间：2026-04-19
>
> 这份文档已经按当前进展修正：
>
> 现在的问题不再是“这套模板能不能迁进来”，而是：
>
> **默认主编辑器已经切到页面内 `leptos-tiptap` island；当前问题转为：应该从官方模板保留什么行为模型，并优先把哪些能力继续收口到当前主编辑器主链。**

## 1. 修正后的总判断

当前对官方模板的使用方式应当明确为：

1. 它是体验 benchmark，不是直接照搬对象。
2. 它是行为模型参考，不是 React 代码迁移目标。
3. 现阶段最值钱的不是再扩更多模板功能，而是把已实现能力接入主编辑器。

因此，这份模板的正确用途是：

> **借它定义“官方行为应当是什么”，再用 `leptos-tiptap` + Rust 把这些行为落到 `mnote` 的主链。**

## 2. 官方模板里当前最该保留的参考

### 2.1 主编辑器扩展组合

核心参考文件：

- `/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/tiptap-notion-like-registry/materialized/tiptap-templates/notion-like/components/notion-like-editor.tsx`

当前值得保留的不是整份文件，而是这些决策：

- 以 Tiptap 正式 schema 组织常用块
- 常用块优先于低频复杂块
- `task list / task item` 使用正式扩展，不做 HTML 占位
- `UniqueID` 作为块身份辅助机制
- `Indent` 作为普通块缩进增强的参考扩展

### 2.2 slash 菜单行为模型

核心参考文件：

- `/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/tiptap-notion-like-registry/materialized/tiptap-ui/slash-dropdown-menu/slash-dropdown-menu.tsx`
- `/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/tiptap-notion-like-registry/materialized/tiptap-ui/slash-dropdown-menu/use-slash-dropdown-menu.ts`

当前最该保留的是：

- slash 入口就是块编辑器的主入口之一
- 菜单项的分组与命令组织方式
- 菜单锚点应跟随 caret，而不是随便找一个固定位置

### 2.3 浮动工具条行为模型

核心参考文件：

- `/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/tiptap-notion-like-registry/materialized/tiptap-templates/notion-like/components/notion-like-editor-toolbar-floating.tsx`

当前最该保留的是：

- 工具条只在文本 selection 语境下出现
- 文本格式命令和 `turn into` 要分清语境
- 不要把固定显示工具条误当成“功能已完成”

### 2.4 左侧手柄与块菜单行为模型

核心参考文件：

- `/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/tiptap-notion-like-registry/materialized/tiptap-ui/drag-context-menu/drag-context-menu.tsx`

当前最该保留的是：

- hover 先只显露手柄，不自动弹块菜单
- 块菜单应由左侧手柄点击触发
- `turn into / duplicate / delete / drag` 是块菜单的核心动作

这点非常关键，因为它直接影响我们后续对标 Wolai/Notion 的交互正确性。

## 3. 结合当前代码后的现实判断

### 3.1 已经有的东西

从当前实现看，下面这些已经不是“要不要做”，而是“如何迁进主链”：

- `paragraph / heading / list / todo / quote / code block / divider`
- slash 菜单
- 浮动工具条
- 左侧手柄
- 块菜单
- `turn into`
- 顶层拖拽
- refresh 后结构保留

对应当前实现入口：

- `/mnt/Data1T/mnote/rust/spikes/leptos-tiptap-spike/src/main.rs`

### 3.2 当前真正的缺口

当前真正的缺口不是模板 feature 数量，而是下面这些：

- 它还在 spike 里，不在主编辑器里
- 保存还没接上正式 Rust truth
- `block_id` 还没成为正式合同
- 页面引用 / 块引用还没打通
- 图片上传与附件桥还没接
- 表格还没做

所以现阶段不该继续把注意力平均分配到：

- Markdown 导入导出回归
- `kode` 组件分层整理
- 表格
- AI Cloud
- 协作链

## 4. `P0.5` 该如何采用官方模板

### 4.1 `P0.5` 要保留的部分

`P0.5` 应保留的不是一堆零散 feature，而是以下几类“官方行为”：

- 主编辑器使用正式 Tiptap 扩展，而不是临时 HTML 拼接
- slash 菜单锚定 caret
- 选中文字才出现浮动工具条
- hover 只显手柄，点击手柄才弹块菜单
- `turn into` 作为块菜单和工具条共享的一组块类型切换动作
- `UniqueID` 作为 runtime 辅助，但最终块 id 仍归 Rust

### 4.2 `P0.5` 不要再继续扩的部分

`P0.5` 不应该继续向下扩这些模板能力：

- 协作
- AI
- TOC
- 完整表格
- 图片上传整链
- 移动端全量工具条

原因很简单：

这些都不会帮助我们更快完成“接入主编辑器”。

## 5. 官方模板到 `mnote` 的映射口径

### 5.1 直接借行为，不借代码

以下部分应当“借行为模型”，不应当尝试直接照搬 React 代码：

- `slash-dropdown-menu`
- `drag-context-menu`
- `notion-like-editor-toolbar-floating`

原因：

- React hooks / context / portal 不能直接进入 Leptos
- 真正有价值的是交互时机、状态边界、动作分组
- 不是 `tsx` 组件本身

### 5.2 `block id` 需要现在就纳入主线

官方模板里的 `UniqueID.configure(...)` 很重要，但口径要修正成：

- 官方参考：
  `/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/tiptap-notion-like-registry/materialized/tiptap-templates/notion-like/components/notion-like-editor.tsx`
- Rust 真相字段：
  `/mnt/Data1T/mnote/rust/crates/core-protocol/src/editor/model.rs`

最终原则：

1. Rust `EditorBlock.block_id` 是持久化真相。
2. Tiptap `UniqueID` 只负责浏览器 runtime 内的节点身份辅助。
3. 不允许把前端临时 id 倒灌成正式文档真相。

### 5.3 `Indent` 值得做，但不在这一轮前排

官方缩进扩展很值得参考：

- `/mnt/Data1T/mnote/design/05-editor-mainline/reference-code/tiptap-notion-like-registry/materialized/tiptap-extension/indent-extension.ts`

但当前它不应排在主编辑器接入之前。

更合理的顺序是：

1. 先完成主编辑器接入
2. 再完成 Rust 保存边界
3. 再考虑普通块缩进增强

### 5.4 图片上传与表格都先后置

官方模板确实有图片与表格能力，但现在不应让它们进入主 checklist 前排。

原因：

- 图片上传不是当前切流主编辑器的阻塞项
- 表格更不是当前高频刚需
- 两者都容易把工作重新带到复杂 UI / 服务桥接细节

## 6. 哪些旧 checklist 应从主线降级

下面这些项不删，但不应继续放在当前主线前排：

- Markdown 导入导出回归
  参考 `blocks` 仍然有价值，但它更像切流后的回归与兼容工作。

- 借 `kode` 做 Leptos 组件分层
  这个参考可以保留，但它属于实现注记，不是当前交付里程碑。

- 完整表格
  继续后置。

- 完整图片上传
  继续后置，只保留后续最小桥接预留。

## 7. 对接下来工作的直接建议

基于当前代码和官方模板，接下来最合理的顺序是：

1. 先把当前 `leptos-tiptap` 编辑器接入主编辑器。
2. 同时建立正式的 Rust load/save 边界。
3. 在这个过程中引入稳定 block id 策略。
4. 等它真正成为主编辑器后，再规划 `P1 / P1.5` 的 Wolai 对标体验增强。

这也意味着：

当前官方模板对我们的最大价值，不是再提供更多可抄的 feature，而是帮助我们定义：

- 哪些交互已经够了
- 哪些交互时机必须修正
- 哪些功能现在根本不该做

## 8. 最终结论

当前对这份模板的正确使用方式是：

> **以后续主编辑器开发继续以 Tiptap 官方能力模型为体验上限，以 `leptos-tiptap` 为运行时接入层；先完成主编辑器接入和 Rust truth 落地，再单独规划 Wolai 对标增强，不再把模板 feature 数量当作当前阶段目标。**
