release: v0.3.13 — MeToast 集成与全面质量修复

- 集成 MetonaToast v2.0.0 替换自研 Toast 组件(右上角、进度条、自动关闭、主题联动)
- 修复 sidebar resize 未持久化到 IndexedDB
- 修复 Ctrl+Tab MRU 切换逻辑与文档不一致
- 完善 WYSIWYG 模式标签切换选区恢复
- 清理死代码(useActiveHeading observerRef、旧 Toast 样式、重复滚动条样式、SearchReplace 重复检查)
- 同步 DESIGN.md / docs 文档(CodeMirror→Milkdown、stores 计数、editorStore 字段)
- 新增 .npmrc.example 模板
- 更新关于对话框与文档远程地址为 Gitea
- 版本号 0.3.12 → 0.3.13
This commit is contained in:
2026-07-22 15:55:45 +08:00
parent 77fdf03ed7
commit 43b0778849
24 changed files with 170 additions and 387 deletions
+27 -13
View File
@@ -1,4 +1,4 @@
# MarkLite v0.3.12 — 架构设计文档
# MarkLite v0.3.13 — 架构设计文档
## 1. 项目概述
@@ -44,7 +44,7 @@ MarkLite 是一款轻量级的 Windows 本地 Markdown 编辑器桌面应用程
┌───────────────────────▼──────────────────────────────────────┐
│ Preload Script (src/preload/) 1 文件 │
│ index.ts contextBridge 类型安全暴露 │
│ electronAPI 18 个方法/事件的类型安全接口 │
│ electronAPI 22 个方法/事件的类型安全接口 │
└───────────────────────┬──────────────────────────────────────┘
┌───────────────────────▼──────────────────────────────────────┐
@@ -57,7 +57,8 @@ MarkLite 是一款轻量级的 Windows 本地 Markdown 编辑器桌面应用程
│ SearchReplace · DropOverlay · ErrorBoundary│
│ AboutDialog · LoadingSpinner · Icons │
│ │
│ stores/ (3) tabStore · editorStore · sidebarStore
│ stores/ (5) tabStore · editorStore · sidebarStore │
│ statusBarStore · autoSaveStore │
│ hooks/ (19) useTheme · useSettings · useSettingsInit │
│ useKeyboard · useDragDrop · useFileWatch │
│ useAutoSave · useIpcListeners ... │
@@ -83,7 +84,7 @@ MarkLite 是一款轻量级的 Windows 本地 Markdown 编辑器桌面应用程
|------|------|------|
| Electron | `contextIsolation: true` | 渲染进程与主进程隔离 |
| Electron | `nodeIntegration: false` | 渲染进程无法访问 Node.js API |
| IPC | `contextBridge.exposeInMainWorld` | 仅暴露 22 个类型安全方法/事件 |
| IPC | `contextBridge.exposeInMainWorld` | 仅暴露 18 个类型安全方法 + 4 个事件订阅 |
| CSP | `default-src 'self'; script-src 'self'` | 阻断内联脚本、外部资源 |
| HTML | `rehype-sanitize` | 渲染 Markdown 时过滤危险标签/属性 |
| 链接 | 协议白名单 | 仅允许 `http:` / `https:` / `#` 锚点 |
@@ -101,12 +102,18 @@ MarkLite 是一款轻量级的 Windows 本地 Markdown 编辑器桌面应用程
│ │ │ │ (CM6) │ │
├─────────┴──────────┴──────────┴──────────┴──────────────┤
│ Zustand Stores │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ │ tabStore │ │editorStore│ │sidebarStore│
│ │ - tabs │ │- viewMode│ │- tree │
│ │- activeId│ │- darkMode│ │- expanded │
│ │ - mru │ │ │ │- rootPath │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────┐
│ │ tabStore │ │editorStore│ │sidebarStore│ │statusBarStore│
│ │ - tabs │ │- viewMode│ │- tree │ │- items │
│ │- activeId│ │- darkMode│ │- expanded │
│ │ - mru │ │- extMod │ │- rootPath │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └─────┬──────┘
│ │ │ │ │ │
│ ┌────▼────────────▼────────────▼──────────────▼──────┐ │
│ │ ┌──────────────┐ │ │
│ │ │autoSaveStore │ │ │
│ │ │- isAutoSaving│ │ │
│ │ └──────────────┘ │ │
│ │ │ │ │
│ ┌────▼────────────▼────────────▼────────────────────┐ │
│ │ IndexedDB (Dexie.js) │ │
@@ -139,8 +146,10 @@ interface TabState {
```typescript
interface EditorState {
viewMode: 'editor' | 'preview' // 视图模式
viewMode: 'editor' | 'preview' | 'source' // 视图模式
darkMode: boolean // 暗色主题
externallyModified: { filePath: string } | null // 外部修改检测状态
loadingStates: Record<string, boolean> // 全局加载状态
}
```
@@ -151,7 +160,7 @@ interface SidebarState {
isVisible: boolean // 是否显示
rootPath: string | null // 当前打开的文件夹路径
tree: FileNode[] // 目录树数据
expandedDirs: Set<string> // 已展开的目录集合
expandedDirs: string[] // 已展开的目录集合
sidebarWidth: number // 侧边栏宽度 (180~500)
}
```
@@ -221,6 +230,11 @@ db.version(1).stores({
两种模式共享同一 tabStore 数据源,可随时切换。
### 6.1.1 主题切换
Milkdown 编辑器通过 CSS class`milkdown-dark`)切换暗色主题,无需销毁重建 EditorView
切换标签时保持光标位置和选区。
### 6.2 插件体系
| 插件 | 说明 |
@@ -351,7 +365,7 @@ npm run build:portable # 便携版(免安装)
| zustand | ^5.0 | 状态管理 |
| dexie | ^4.0 | IndexedDB 封装 |
| nanoid | ^5.0 | 唯一 ID 生成 |
| @codemirror/* | ^6.x | 代码编辑器 |
| @milkdown/* | 7.21.1 | WYSIWYG Markdown 编辑器(基于 ProseMirror |
| unified / remark / rehype | ^11.0 | Markdown 渲染管线 |
| rehype-highlight | ^7.0 | 代码语法高亮 |