# WriteFlow Changelog ## Phase 1 – MVP 基础编辑器 ### 迭代 1.1 – 项目骨架与编辑器内核 (2026-07-15) #### 新增 - 配置 `vite.config.ts` 与 `tsconfig.json` 的 `@` 别名,指向 `src` 目录 - 集成 Milkdown 编辑器:`@milkdown/kit` + `@milkdown/vue`,配置 CommonMark 预设 - 创建 `Editor.vue` 编辑器组件,支持 v-model 双向绑定、历史记录 (history)、剪贴板 (clipboard) - 实现纯键盘驱动所见即所得编辑(无工具栏) - 自定义标题栏:含 WriteFlow Logo、主题切换按钮、窗口控制(最小化/最大化/关闭) - 使用 `@vicons/ionicons5` 图标库,通过 Naive UI `n-icon` 组件渲染(`CreateOutline`、`SunnyOutline`、`MoonOutline`、`RemoveOutline`、`ExpandOutline`、`ContractOutline`、`CloseOutline`) - 亮色 / 暗色主题切换:CSS 变量驱动,标题栏、编辑器、滚动条同步变化 - 集成 Naive UI 组件库,使用 `n-config-provider` 管理全局主题 - 编辑器样式覆盖:标题、列表、引用、代码块、表格、链接等 Markdown 元素样式完整 - Markdown 内容变化通过 `listener` 插件实时同步到 v-model #### 技术要点 - Milkdown v7 编辑器通过 `useEditor` composable 创建实例 - 自定义标题栏使用 Tauri `data-tauri-drag-region` 实现窗口拖拽 - 主题通过 `html.dark` CSS 类切换,Naive UI 同步切换 `darkTheme` - 编辑器 `ProseMirror` 输出 markdown 通过 `listenerCtx.markdownUpdated` 实时获取 #### 修复 - 修复页面空白:`MilkdownProvider` 需作为 `useEditor` 的祖先组件提供上下文,将其从 Editor.vue 提升至 App.vue - 修复窗口拖拽权限:补充 `core:window:allow-is-maximized`、`allow-maximize`、`allow-unmaximize` - 修复编辑器无法滚动:`#app` 改用 `padding-top: 40px` 替代 `.app-body` 的 `margin-top: 40px`,避免 `overflow: hidden` 裁掉底部内容导致高度计算错误 - 移除 `milkdown.css` 中 `min-height: 100%` 避免干扰 flex 布局高度约束 - 导入 ProseMirror 和 Tables 基础 CSS(`@milkdown/kit/prose/view/style/prosemirror.css`、`tables.css`) ### 迭代 1.2 – 文件系统集成 (2026-07-15) #### 新增 - **Rust 后端**:添加 `tauri-plugin-fs` + `tauri-plugin-dialog` 插件,实现文件系统 Tauri commands - `read_directory` — 递归读取目录,返回文件树结构(仅 `.md` 文件和非空目录) - `read_file_content` / `write_file_content` — 读写文件内容 - `create_file` / `rename_file` / `delete_file` / `file_exists` — 文件增删改查 - **前端插件**:安装 `@tauri-apps/plugin-fs` + `@tauri-apps/plugin-dialog` - **文件树侧边栏** (`Sidebar.vue` + `FileTree.vue`):使用 Naive UI `n-tree` 渲染目录结构 - 支持展开/折叠文件夹,点击 `.md` 文件在编辑器中打开 - 顶部工具栏:打开工作区、刷新、最近文件切换 - **新建/打开/保存文件** - `Ctrl+N` 新建空白文件,`Ctrl+O` 打开文件对话框 - `Ctrl+S` 保存当前文件,`Ctrl+Shift+S` 另存为 - 首次启动自动弹出工作区目录选择 - **工作区管理**:工作区路径持久化到 `localStorage`,后续启动自动加载 - **最近文件列表**:记录最近 10 个打开的文件,存储在 `localStorage`,重启保留 - **标题栏增强**:显示当前文件名 + 未保存标记(●) - **Editor 组件增强**:支持外部内容替换(`replaceAll`),用于打开文件时更新编辑器 #### 技术要点 - 文件操作通过 Rust `std::fs` 实现,前端通过 `invoke` 调用 Tauri commands - 目录遍历过滤隐藏文件和 `node_modules`/`target` 目录,仅展示 `.md` 文件 - 编辑器使用 `@milkdown/kit/utils` 的 `replaceAll` 实现外部内容替换 - 使用 `@tauri-apps/plugin-dialog` 的 `open`/`save` 实现原生文件对话框 - 快捷键通过全局 `keydown` 监听,区分 `Ctrl`/`Cmd` + 组合键