Document the VSCode-like local-first product shape, demote Convex to a control-plane role, and retire stale architecture drafts. Add local workspace migration/export references plus smoke coverage for no-Convex managed workspace startup, local markdown title/body/options persistence, asset upload behavior, and Convex fixture export. Verification: git diff --cached --check; node scripts/check-local-first-convex-guard.js --staged; node scripts/task444-convex-workspace-export-local-fixture-smoke.js; node scripts/task166-local-first-managed-workspace-no-convex-smoke.js; node scripts/task167-local-markdown-title-body-options-no-convex-smoke.js
146 lines
8.8 KiB
Markdown
146 lines
8.8 KiB
Markdown
# Wolai 基础功能 ↔ mnote 实现完整对照矩阵
|
||
|
||
> 生成时间:2026-05-19
|
||
> 说明:逐项对照 Wolai 帮助中心基础功能和当前 mnote 代码,每项标注 ✅/❌/🔧 并附证据路径
|
||
|
||
## 一、基础操作
|
||
|
||
| # | Wolai 功能 | 状态 | mnote 证据 |
|
||
|---|-----------|------|-----------|
|
||
| 1 | **基本编辑**(输入/换行/方向键) | ✅ | leptos-tiptap island ProseMirror 编辑器 |
|
||
| 2 | **块概念**(Block Editor 模式) | ✅ | `EditorBlockType` 枚举定义 15 种块(`core-protocol/src/editor/model.rs:7-22`)|
|
||
| 3 | **拖动块**(:: 手柄拖拽) | ✅ | `HANDLE_SHELL_SELECTOR` / `DragEvent`(`lib.rs:45, 136`)|
|
||
| 4 | **选中块**(Esc/方向键/Shift多选) | ✅ | `TiptapSelectionState` 选择状态(`lib.rs`)|
|
||
| 5 | **上方/下方插入块**(+按钮 / a/b快捷键) | ✅ | block handle shell + 快捷键处理 |
|
||
| 6 | **分栏**(拖拽到左/右侧) | ❌ | `columnsLayout` Tiptap 扩展未注册 |
|
||
| 7 | **块布局显示**(Ctrl+Shift+U) | 🔧 | `pageOptionIsSupported` 未包含此选项 |
|
||
| 8 | **块转换**(文本↔标题↔列表↔页面) | ✅ | `EditorCommand::ReplaceBlock`(`editor/command.rs:22`)|
|
||
| 9 | **块菜单**(点击 :: → 转换/颜色/操作) | 🔧 | 上下文菜单存在,但块菜单功能可比 |
|
||
| 10 | **复制/粘贴** | ✅ | `write_mnote_text_to_clipboard` |
|
||
| 11 | **缩进/取消缩进**(Tab/Shift+Tab) | ✅ | Tiptap 原生支持 |
|
||
| 12 | **文本样式工具条**(粗/斜/下划/删除线/行内代码) | ✅ | `TextMark::{Bold, Italic, Underline, Strike, Code}`|
|
||
| 13 | **文字颜色/背景色** | ✅ | `TiptapColorAttributes` `TiptapHighlightAttributes` |
|
||
| 14 | **超链接**(Ctrl+K) | ✅ | `TiptapLinkResource` `TiptapMarkName::Link` |
|
||
| 15 | **行内数学公式** | ✅ | 数学公式 Tiptap 扩展 |
|
||
| 16 | **选中文字 → 页面引用** | 🔧 | `PageReference` 块类型存在,快捷交互待接线 |
|
||
| 17 | **块引用** | ✅ | `EditorBlockType::BlockReference` + `TiptapNodeName` 支持 |
|
||
| 18 | **脚注与注释** | ❌ | 无脚注/注释扩展 |
|
||
|
||
## 二、页面选项
|
||
|
||
| # | 选项 | 状态 | mnote 证据 |
|
||
|---|------|------|-----------|
|
||
| 1 | **自适应宽度**(wideLayout) | ✅ 已接通 | `layout.rs:531`: `maxWidth = wideLayout ? '980px' : '760px'` |
|
||
| 2 | **小字体**(smallText) | ✅ 已接通 | `data-page-small-text` attribute(`layout.rs:529`)|
|
||
| 3 | **标题目录**(showToc) | 🔧 UI可见待接线 | `layout.rs:438` 说"当前 Rust 壳还没有正式目录面板" |
|
||
| 4 | **标题自动编号**(showHeadingNumbers) | ✅ 已接通 | `layout.rs:439` hint: "标题前显示顺序编号" |
|
||
| 5 | **编辑保护**(protectEditing) | 🔧 UI可见待接线 | `layout.rs:447` hint: "只显示降级说明" |
|
||
| 6 | **折叠反向引用**(collapseBacklinks) | 🔧 UI可见待接线 | |
|
||
| 7 | **隐藏子页面**(hideChildPages) | 🔧 UI可见待接线 | |
|
||
| 8 | **显示块引用数字**(showBlockRefCount) | 🔧 UI可见待接线 | |
|
||
| 9 | **布局密度**(layoutDensity) | ✅ 已接通 | hint: "段落与列表间距会变化" |
|
||
| 10 | **页面字体**(pageFont) | ✅ 已接通 | hint: "当前页面字体会切换" |
|
||
| 11 | **字数统计** | ✅ | `computeLivePageStats()` 实时计算(`layout.rs:485-507`)|
|
||
| 12 | **待办统计** | ✅ | `todoTotal` / `todoDone` 统计(`layout.rs:503-506`)|
|
||
| 13 | **暗色模式** | ✅ | Good Night 模式 / 跟随系统(`layout.rs`)|
|
||
| 14 | **删除页面**(进垃圾桶) | ✅ | `tree.resource.archive` |
|
||
| 15 | **移动到...** | ✅ | `tree` 命令 `routes/tree.rs` |
|
||
| 16 | **页面引用链接复制** | ✅ | 上下文菜单"复制页面引用链接"(`layout.rs:3146-3148`)|
|
||
| 17 | **导出页面** | ❌ | 无导出 UI |
|
||
|
||
## 三、基础块类型
|
||
|
||
| # | 块类型 | Wolai 命令 | 状态 | mnote 证据 |
|
||
|---|--------|-----------|------|-----------|
|
||
| 1 | **文本/段落** | `/wb /wenben /text /plain` | ✅ | `Paragraph` + `TiptapExtension::Paragraph` |
|
||
| 2 | **标题 H1-H4** | `/bt /biaoti /h1 /h2 /h3 /h4` | ✅ | `Heading` + `TiptapExtension::Heading` |
|
||
| 3 | **列表(无序)** | `/lb /liebiao /wuxu /bullet` | ✅ | `BulletListItem` + `TiptapExtension::BulletList` |
|
||
| 4 | **数字列表(有序)** | `/szlb /shuzi /number` | ✅ | `NumberedListItem` + `TiptapExtension::OrderedList` |
|
||
| 5 | **待办列表** | `/dblb /daiban /todo` | ✅ | `Todo` + `TiptapExtension::TaskList` + `TiptapExtension::TaskItem` |
|
||
| 6 | **折叠列表** | `/zdlb /toggle` `+ space` | ❌ | 无 `Toggle` 扩展 |
|
||
| 7 | **页面块(subpage)** | 块转换 → 页面 | 🔧 | `PageReference` 类型存在,嵌入页 UI 待确认 |
|
||
| 8 | **引述文字(blockquote)** | `/yswz /quote` | ✅ | `Quote` + `TiptapExtension::Blockquote` |
|
||
| 9 | **着重文字(callout)** | `/zzwz /callout` `!! space` | ❌ | 无 `Callout` 扩展 |
|
||
| 10 | **代码片段** | `/dmpd /code` | ✅ | `CodeBlock` + `TiptapExtension::CodeBlock` |
|
||
| 11 | **数学公式** | `/sxgs /latex /math` | ✅ | LaTeX 公式扩展 |
|
||
| 12 | **分割线** | `/fgx /fengexian` | ✅ | `Divider` + `TiptapExtension::HorizontalRule` |
|
||
|
||
## 四、进阶块类型(基础级)
|
||
|
||
| # | 块类型 | 状态 | mnote 证据 |
|
||
|---|--------|------|-----------|
|
||
| 1 | **简单表格** | ✅ | `Table` + `TiptapExtension::Table/TableRow/TableCell/TableHeader` |
|
||
| 2 | **数据表格(database)** | ❌ | 无 Database/Notion-DB 扩展 |
|
||
| 3 | **统计图表** | ❌ | 无 Charts 扩展 |
|
||
| 4 | **Mermaid 绘图** | ❌ | 无 Mermaid 扩展 |
|
||
| 5 | **思维导图** | ✅ | `Mindmap` + `routes/mindmap_api.rs` + `ssr/pages/mindmap.rs` |
|
||
| 6 | **页面目录(TOC)** | 🔧 | `Toc` + `TiptapExtension::TocNode` 已注册,但 `showToc` 标注"待接线" |
|
||
| 7 | **按钮** | ❌ | 无 Button 扩展 |
|
||
| 8 | **进度条** | ❌ | 无 ProgressBar 扩展 |
|
||
| 9 | **仪表数字** | ❌ | 无 Dashboard/Counter 扩展 |
|
||
| 10 | **会议** | ❌ | 无 Meeting 扩展 |
|
||
| 11 | **嵌入第三方应用** | 🔧 | OnlyOffice 已接,其他 iframe embed 待定 |
|
||
| 12 | **网址书签** | ❌ | 无 Bookmark 扩展 |
|
||
|
||
## 五、媒体与文件
|
||
|
||
| # | 类型 | 状态 | mnote 证据 |
|
||
|---|------|------|-----------|
|
||
| 1 | **图片** | ✅ | `Image` + `TiptapExtension::Image` + `TiptapImageResource` |
|
||
| 2 | **视频** | ✅ | 视频 Tiptap 扩展 |
|
||
| 3 | **音频** | ❌ | 无 Audio 扩展 |
|
||
| 4 | **文件附件** | ✅ | OnlyOffice adapter + 附件块 |
|
||
| 5 | **Emoji 表情** | ✅ | Emoji 选择器 |
|
||
| 6 | **Font Awesome 图标** | ❌ | 无 FA 图标选择器 |
|
||
| 7 | **动态图标** | ❌ | 无动态图标 |
|
||
| 8 | **卡通头像** | ❌ | 仅有文字头像(`layout.rs:7873`: `"L"`)|
|
||
|
||
## 六、编辑器 UI / 壳
|
||
|
||
| # | 功能 | 状态 | mnote 证据 |
|
||
|---|------|------|-----------|
|
||
| 1 | **侧栏**(品牌/搜索/页面树) | ✅ | `layout.rs:7801`: "左侧栏 + 内容区的双栏布局" |
|
||
| 2 | **浮动 AI 按钮** | ✅ | `wolai-floating-ai` button(`layout.rs:7927`)|
|
||
| 3 | **浮动帮助按钮** | ✅ | `wolai-floating-help` button(`layout.rs:7926`)|
|
||
| 4 | **搜索模态**(Ctrl+P) | ✅ | 搜索壳 + smoke 验证 |
|
||
| 5 | **垃圾桶入口** | ✅ | 侧栏下方入口 |
|
||
| 6 | **模板中心** | ❌ | 无模板功能 |
|
||
| 7 | **右侧边栏(双栏编辑)** | 🔧 | 上下文菜单有"在右侧边栏打开",面板 UI 待确认 |
|
||
| 8 | **今日速记/日记** | ❌ | 无每日速记功能 |
|
||
| 9 | **页面关系图** | ❌ | 无关系图可视化 |
|
||
| 10 | **导航历史** | 🔧 | 页面上下文菜单含"块历史",但非历史列表 |
|
||
|
||
## 七、键盘快捷键
|
||
|
||
| # | 快捷键 | 功能 | 状态 |
|
||
|---|--------|------|------|
|
||
| 1 | `Ctrl+P` | 搜索 | ✅ |
|
||
| 2 | `Ctrl+Shift+L` | 标题目录 | 🔧(选项UI可见但功能待接线)|
|
||
| 3 | `Ctrl+Shift+U` | 显示块结构 | ❌ |
|
||
| 4 | `Ctrl+Shift+C` | 编辑保护 | 🔧 |
|
||
| 5 | `Ctrl+Z` | 撤回 | ✅ |
|
||
| 6 | `Ctrl+Shift+V` | 匹配样式粘贴 | ✅ |
|
||
| 7 | `Tab` / `Shift+Tab` | 缩进/取消缩进 | ✅ |
|
||
| 8 | `Esc` | 选中块 | ✅ |
|
||
| 9 | `a` / `b` | 上方/下方插入块 | ✅ |
|
||
| 10 | `Enter`(思维导图)| 插入同级节点 | ✅ |
|
||
| 11 | `Alt+O` | 右侧边栏打开 | 🔧 |
|
||
| 12 | `Alt+Q` | 打开/关闭右侧边栏 | ❌ |
|
||
| 13 | `Ctrl+Alt+G` | Good Night 暗色模式 | ✅ |
|
||
| 14 | `Ctrl+` | 今日速记 | ❌ |
|
||
|
||
## 八、汇总
|
||
|
||
| 类别 | 总数 | ✅ | 🔧 | ❌ | 覆盖率 |
|
||
|------|------|----|-----|-----|--------|
|
||
| 基础操作 | 18 | 11 | 3 | 4 | 61% |
|
||
| 页面选项 | 17 | 10 | 5 | 2 | 59% |
|
||
| 基础块类型 | 12 | 9 | 1 | 2 | 75% |
|
||
| 进阶块类型 | 12 | 2 | 2 | 8 | 17% |
|
||
| 媒体与文件 | 8 | 4 | 0 | 4 | 50% |
|
||
| 编辑器 UI/壳 | 10 | 6 | 2 | 2 | 60% |
|
||
| 键盘快捷键 | 14 | 8 | 3 | 3 | 57% |
|
||
| **总计** | **91** | **50** | **16** | **25** | **55%** |
|
||
|
||
> 注:🔧 = 存在代码/UI 但功能未完全接通(如标题目录 TOC 扩展已注册但 UI 面板未挂接)
|