thzxx
77fdf03ed7
feat: use icon.png as app icon on welcome screen and about dialog
2026-07-06 13:41:55 +08:00
thzxx
ed505d48bf
chore: update application icons
2026-07-06 13:21:19 +08:00
thzxx
0940c2f5c6
fix: resolve all TS errors, ESLint warnings, and npm warnings bump to v0.3.12
...
- Pin all @milkdown/* packages to exact 7.21.1, add phantom-dep plugins as direct deps
- Fix TextSelection.create type error in useMilkdown.ts
- Fix Backspace auto-pair dead-code bug (unreachable due to PAIRS check order)
- Extract parseHeadings/Heading to outlineUtils.ts (react-refresh fix)
- Extract StatusBar item components to StatusBarItems.tsx (react-refresh fix)
- Configure npm allowScripts for electron and esbuild postinstall
- Update QUALITY_REVIEW_REPORT.json with all fixes applied
- Bump version to 0.3.12
v0.3.12
2026-07-06 10:51:39 +08:00
thzxx
f707b5c7ee
chore: bump version to 0.3.11 — 状态栏扩展点架构
2026-06-23 11:36:46 +08:00
thzxx
b65e34e288
v0.3.10: 全面优化增强 — 17项Bug修复/稳定性/功能改进
...
P0 致命Bug修复:
- A1: openFolderDialog 类型/运行时崩溃(文件夹打开功能完全失效)
- A2: SourceEditor 受控textarea手动改DOM反模式
- A3: tabStore.updateTabContent 内容相同时误标isModified
死代码清理:
- B1: 删除menu:*/save/as/viewMode 三个永不触发的IPC通道
健壮性修复:
- E1: rehypeFixImages 路径规范化+防越界加固
- E2: getFileName 尾斜杠返回正确文件名
- E3: EditorToolbar 行内代码按钮改用toggleInlineCodeCommand
- E4: ErrorBoundary 内联样式抽为CSS类
功能增强:
- D1: 标签页拖拽排序(tabStore.moveTab + TabBar DnD + CSS)
- D2: Milkdown自动配对括号/引号(ProseMirror插件)
- D3: 状态栏自动保存开关可点击
- D4: 文档大纲活跃标题高亮(useActiveHeading hook)
- D5: 关闭窗口前flush防抖数据(flushSaveToDB)
- D6: 搜索替换支持正则表达式
类型/架构:
- C2: preload类型集中定义(ElectronAPI契约)
- __pycache__ typo修复
文档/版本:
- README/DESIGN同步为Milkdown + v0.3.10
- 项目结构树/技术栈/快捷键表更新
验证: typecheck(仅7预存), lint✅ , test 96/96, vite build✅
2026-06-23 10:47:45 +08:00
thzxx
7f070eb11d
chore: bump version to 0.3.8
...
Code audit fixes:
- CRITICAL: reorder Markdown pipeline (fixImages before sanitize)
- CRITICAL: fix path prefix separator check
- BLOCKING: remove duplicate useEffect in Editor
- BLOCKING: skip onChange when content unchanged
- BLOCKING: optimize Sidebar re-render with useMemo
- HIGH: cleanup FileWatcher polling intervals
- HIGH: improve validatePath segment check
- HIGH: fix isExternalUpdate race with counter
- HIGH: add will-navigate / setWindowOpenHandler
- HIGH: explicit strip in sanitize schema
- MEDIUM: random temp file suffix instead of Date.now()
- MEDIUM/LOW: add IndexedDB error boundaries
- LOW: support UTF-16 BOM detection
2026-06-18 21:28:35 +08:00
thzxx
dd78ff15a9
v0.3.7: 全面代码审计修复 - 20项Bug/安全/稳定性改进
2026-06-15 15:02:38 +08:00
thzxx
c0e16f2885
v0.3.7: 修复保存竞争态 + 新增源码编辑模式
...
Bug修复:
- BUG-10 修复: 保存文件时 watcher restart 触发虚假 change 事件覆盖编辑器内容
- ipc-handlers.ts: restart watcher 在 setSelfWriting(true) 保护内执行
- App.tsx handleReloadModified: 增加 if (tab?.isModified) return 安全守卫
新功能:
- 新增源码(Source)视图模式,直接用 textarea 编辑原始 Markdown
- ViewMode 扩展为 editor|preview|source
- 工具栏增加源码按钮,快捷键 Ctrl+3
- 内容与 WYSIWYG 编辑器共享 tabStore,切换模式不丢内容
验证: TS 0错误, ESLint 0错误(1个预存警告), 90/90测试通过
2026-06-04 15:17:26 +08:00
thzxx
c34a843d5c
v0.3.6: 修复文档大纲导航Bug + 新增自动保存功能
...
Bug修复:
- 文档大纲点击标题未定位到编辑器内容 (P0)
- 根因: raw markdown字符偏移 ≠ ProseMirror文档位置
- 改为通过 view.state.doc.descendants() 遍历节点树,
按 heading类型名 + level + textContent 三重匹配定位
新增功能:
- 自动保存 (2秒防抖), 仅对文件标签页生效
- 状态栏显示 自动/保存中... 指示器
版本同步: package.json / AboutDialog / README 均更新至 v0.3.6
2026-06-04 14:23:27 +08:00
thzxx
a84ccb7353
v0.3.5: Bug修复+性能优化+状态栏文档统计
...
Bug修复:
- BUG-01: Sidebar norm函数正则修复(单反斜杠匹配), Windows路径规范化恢复
- BUG-02: 3处result.content truthy检查改为content !== undefined, 空文件可打开
- BUG-03: TAB_SWITCHED路径校验顺序修复, activeFilePath不在校验前写入
优化:
- OPT-01: Sidebar handleFileClick添加loading状态, 打开文件有视觉反馈
新功能:
- FEAT-01: 状态栏添加行数/单词数/字符数统计
- useDocStats hook + computeDocStats 纯函数
- StatusBar右侧显示 行/词/字符 统计信息
- 12个单元测试覆盖空值/空白/ASCII/UTF-8/Markdown等场景
验证: TS 0错误, ESLint 0错误(1个预存警告), 90/90测试通过
2026-06-04 13:43:10 +08:00
thzxx
899d2b7914
v0.3.4: Bug修复+性能优化+文档大纲功能
...
🔴 Bug修复 (6):
- Sidebar反斜杠正则修复 (Windows路径规范化)
- FileWatcher文件删除后自动恢复监听
- SearchReplace replaceAll防过期匹配位置
- openFolderDialog null结果守卫
- 保存异常时空路径保护
- Markdown绝对路径图片拼接修复
🟡 性能优化:
- Editor切换标签时内容比较,相同跳过replaceAll
🔵 代码质量:
- 创建共享常量模块 src/shared/constants.ts,消除双副本
🎯 新增功能:
- 文档大纲 (Table of Contents) — 侧边栏标题导航
🔧 换行符统一: CRLF → LF
2026-06-04 13:24:23 +08:00
thzxx
efa7f61809
v0.3.3: 代码安全审查与Bug修复
...
CRITICAL 修复:
- 路径遍历防护绕过:validatePath在normalize()之后检查..,可被绕过读取任意文件
- 编辑器异步创建竞态条件:editor.create()完成后组件已卸载导致内存泄漏
- editor.create() Promise缺少.catch() → 未捕获的Promise拒绝
- handleOpenRecent空文件被跳过:result.content truthy检查阻塞空文件打开
MAJOR 修复:
- DIR_WATCH/TAB_SWITCHED IPC缺少路径校验,可被用于监视任意文件
- AboutDialog内联箭头函数使React.memo完全失效
- ConfirmDialog关闭时焦点恢复逻辑反转
- markdown.ts一刀切屏蔽..导致合法相对路径图片不显示
安全加固:
- 移除未被使用的path.normalize导入
- 所有文件操作IPC使用validatePath统一校验
- 编辑器初始化添加cancelled标志防止卸载后设置实例
验证: TypeScript零错误, ESLint零错误零警告, 78/78测试通过
2026-06-04 13:02:19 +08:00
thzxx
8bcd8a2b2b
fix(search): CSS选择器从mark改为通用类名
...
ProseMirror Decoration.inline渲染的是<span>而非<mark>,
导致mark.search-match-highlight选择器无法匹配,高亮不可见
2026-06-04 11:30:34 +08:00
thzxx
ef697c5bcf
fix(search): 修复搜索/替换功能三个严重Bug
...
根因: 直接操作ProseMirror控制的DOM导致内容复制、高亮失效、导航无效
修复方案: 改用ProseMirror Decoration API (Decoration.inline)
- useMilkdown: 新增searchPlugin + getView()暴露EditorView
- SearchReplace: 完全重写,DOM操作→ProseMirror原生事务
- Editor: 传递getView替代editorContainer
Bug详情:
1. parent.children[0]只含Element不含Text → 内容被复制/乱序
2. <mark>不在ProseMirror schema中 → 被reconciliation剥离
3. mark已被移除 → ref指向分离节点 → 导航无效
验证: TypeScript零错误, 78/78测试通过, build成功
2026-06-04 11:08:07 +08:00
thzxx
b34cbb5de3
v0.3.1: 添加编辑器搜索/替换功能,修复ESLint和lint-staged错误
...
- 新增 SearchReplace 组件:Ctrl+F 搜索、Ctrl+H 替换、实时高亮、大小写切换、导航、全部替换
- 修复 tabStore.test.ts 未使用变量的 ESLint 错误
- 修复 lint-staged tsc 命令不兼容 Milkdown .d.ts 的问题
- 版本号 0.3.0 → 0.3.1 (package.json + AboutDialog)
- tsc 零错误、78/78 测试通过、构建成功
2026-06-04 10:22:15 +08:00
thzxx
b1803c6467
feat: replace CodeMirror 6 with Milkdown 7.21 editor
...
- Remove 7 @codemirror/* packages, add 7 @milkdown/* packages
- Rewrite useCodeMirror -> useMilkdown hook (ProseMirror-based)
- Rewrite Editor.tsx with Milkdown lifecycle management
- Update EditorToolbar to use Milkdown callCommand API
- Replace CodeMirror CSS styles with Milkdown/ProseMirror styles
- Support: CommonMark + GFM, dark mode, toolbar formatting
- Bump version 0.2.0 -> 0.3.0
2026-06-04 09:39:10 +08:00
thzxx
7a4e2b0a67
v0.2.0: 全面代码质量优化
...
- ESLint flat config + Prettier + EditorConfig
- Markdown处理器LRU缓存
- Zustand选择器优化减少重渲染
- CodeMirror Compartment主题热切换
- Preview防抖(150ms) + IndexedDB去抖(500ms)
- 组件拆分: App.tsx 310→104行, Sidebar.tsx 244→90行
- 统一错误处理 errorHandler.ts
- ConfirmDialog替代原生confirm
- LoadingSpinner加载状态
- Toast多条堆叠+类型区分
- 可访问性增强(ARIA属性、键盘导航)
- Vitest测试框架(78个测试用例)
- Git hooks(husky + lint-staged)
- 项目文档(README.md, CONTRIBUTING.md)
2026-06-03 22:13:32 +08:00
thzxx
3cecb0f9eb
v0.1.1: 多Agent代码质量审查+优化
...
- fix: useCodeMirror onChange闭包过期导致编辑器内容丢失同步(P0)
- feat: 全部组件添加displayName(React DevTools调试支持)
- feat: 全部组件添加ARIA属性(WCAG无障碍支持)
- fix: App异步操作添加try-catch错误边界
- fix: tabStore空catch块添加错误日志
- fix: sidebarStore Set→string[](Zustand可序列化)
- fix: useDragDrop readFile错误处理+空文件修复
- fix: useSettings/useTheme load()添加错误处理
- fix: useTheme toggleDarkMode引用优化
- chore: 版本号升级至0.1.1
2026-06-03 21:02:56 +08:00
thzxx and Gitee
d3c4062c10
update src/renderer/components/WelcomeScreen/WelcomeScreen.tsx.
...
修改首页快捷键描述
Signed-off-by: 紫影233 <1440196015@qq.com >
2026-05-28 08:22:05 +00:00
thzxx
359a4572b7
refactor: 移除工具栏 Gitee 按钮,项目地址移至关于弹框
...
- 工具栏移除 Gitee 图标按钮
- 关于弹框添加项目地址链接(带 Gitee 图标)
- 链接点击跳转到 gitee.com/thzxx/MarkLite
2026-05-28 16:13:21 +08:00
thzxx
4a1c06320f
docs: 更新 README.md 和 DESIGN.md,删除 REFACTOR-PLAN.md
...
- README.md: 更新版本号 v0.1.0,添加 CodeMirror 6 说明,添加关于/Gitee按钮说明
- DESIGN.md: 重写为当前架构,移除重构计划相关内容,精简为实际代码结构
- 删除 REFACTOR-PLAN.md(重构已完成)
2026-05-28 15:53:14 +08:00
thzxx
03a71bdf94
feat: 添加 Gitee 按钮、关于弹框,版本号改为 v0.1.0
...
- 工具栏右侧新增 Gitee 图标按钮,点击跳转项目主页
- 工具栏右侧新增关于按钮,点击打开关于弹框
- 关于弹框展示:应用图标、版本号、功能特性、技术栈、版权信息
- 点击弹框外部或关闭按钮可关闭弹框
- 版本号从 v2.0.0 改为 v0.1.0
2026-05-28 15:38:29 +08:00
thzxx
3294dd585c
fix: 标签栏滚轮滚动重写
...
- wheel 事件直接绑定到 #tab-list 元素(而非父容器)
- 支持触控板 deltaX 和鼠标滚轮 deltaY
- 自动滚动到活动标签改为手动计算位置(不依赖 scrollIntoView)
- CSS: #tab-bar 添加 overflow: hidden 防止溢出
- CSS: 滚动条更明显(4px 高,灰色轨道)
2026-05-28 15:10:46 +08:00
thzxx
531e4bdbc3
fix: 标签栏滚轮滚动改为绑定到 #tab-bar
...
- wheel 事件从 #tab-list 移到 #tab-bar 上绑定
- 同时支持触控板左右滑动 (deltaX) 和鼠标滚轮上下滚动 (deltaY)
- 智能选择滚动量:比较 deltaX 和 deltaY 的绝对值取较大者
2026-05-28 14:53:07 +08:00
thzxx
80dc7406e3
fix: 标签栏滚轮滚动和自动定位问题
...
- 修复滚轮不生效:使用 capture 阶段监听 wheel 事件
- 修复滚轮不生效:添加 stopPropagation 防止事件被拦截
- 新增自动滚动到活动标签:切换/打开标签时自动定位到可见区域
- 优化 CSS:移除 #tab-bar 的 overflow,由 #tab-list 统一负责滚动
- 添加平滑滚动:scroll-behavior: smooth
2026-05-28 14:30:09 +08:00
thzxx
e0961ca8f0
fix: 切换标签时窗口标题不更新
...
- 在 App.tsx 添加 useEffect 监听 activeTabId 变化
- 切换标签时调用 electronAPI.tabSwitched() 通知主进程
- 主进程收到通知后更新窗口标题和文件监听
2026-05-28 14:14:40 +08:00
thzxx
5863467206
fix: 标签栏打开文件过多后无法滚动
...
- 修复 CSS 滚动条 height:0 导致滚动失效的问题
- 滚动条改为 3px 细条,hover 时可见
- 新增鼠标滚轮水平滚动支持(垂直滚动自动转换为水平)
- 触控板左右滑动手势也能正常工作
2026-05-28 14:12:26 +08:00
thzxx
9c92dcfa9d
refactor: 删除分屏功能 + 代码审计修复 + 安全加固
...
## 删除分屏功能
- 删除 ViewMode 'split' 类型,仅保留 editor/preview
- 删除 splitRatio 状态和 Resizer 组件
- 删除滚动同步模块 (scrollSync.ts, rehypeSourceLine.ts)
- 更新快捷键: Ctrl+1 编辑, Ctrl+2 预览
## Bug 修复
- 修复 Toast setTimeout 内存泄漏 (App.tsx)
- 修复 ModifiedBanner reload 更新错误标签 (改用 modifiedFilePath 匹配)
- 修复 FileWatcher error 未重置 isSelfWriting (file-watcher.ts)
- 修复另存为时未 stop watcher (ipc-handlers.ts)
## 死代码清理 (10 项)
- 删除 main/ipc-channels.ts (与 shared/ 重复)
- 删除 main/file-system.ts 未使用的 formatBytes
- 删除 constants.ts 6 个未使用常量
- 删除 fileUtils.ts 未使用的 formatBytes
- 删除 Icons.tsx 5 个未使用图标 (SplitView/ChevronUp/ChevronDown/X/ArrowUp/ArrowDown)
- 删除 useCodeMirror 未使用的 getContent/scrollTo
- 删除 TabBar 未使用的 menuRef
- 删除 Tab.scrollLeft/previewScrollTop 字段
- 删除 tabStore 未使用的 getTabIndex
- 删除 Toast/ModifiedBanner 多余 React import
## 安全加固
- ipc-handlers: 添加路径遍历防护 (validatePath 函数)
- preload: openExternal 仅允许 http/https 协议
- window-manager: 启用 sandbox: true
- preload: removeAllListeners 改为精确取消订阅 (返回 Unsubscribe 函数)
## 状态持久化
- activeTabId 持久化到 IndexedDB (刷新后恢复正确标签)
- sidebar 状态持久化到 IndexedDB (isVisible/sidebarWidth)
## 代码优化
- preload 使用 IPC_CHANNELS 常量替代硬编码字符串
- ipc-handlers _event 类型改为 IpcMainInvokeEvent
- settingsRepository 删除 splitRatio 字段
2026-05-28 13:42:11 +08:00
thzxx
3c6e4ac5ce
fix: 搜索/替换面板移至编辑器顶部
...
导入 search 函数并添加 search({ top: true }) 配置,使搜索面板显示在编辑器顶部而非底部
2026-05-28 11:45:45 +08:00
thzxx
a897c47704
feat: 搜索/替换面板中文化 + 复选框/关闭按钮样式优化
...
- 搜索/替换面板所有按钮和标签翻译为中文(查找、替换、下一个、上一个、全部、区分大小写、正则、全字匹配、全部替换、关闭)
- 复选框从16px增大到18px,优化与文字的水平对齐(inline-flex + align-items: center)
- 修复关闭按钮CSS选择器错误(.cm-close → [name="close"]),图标从16px增大到22px
2026-05-28 11:39:48 +08:00
thzxx
ddbe814238
feat: 重写滚动同步为 VS Code 方案(data-line + 二分查找)
...
核心变更:
- 新增 rehypeSourceLine 插件:利用 unified AST position 信息,
给渲染后的块级元素注入 data-line 属性,标记源文件行号
- 重写 scrollSync.ts:用二分查找替代正则匹配 identifyBlockStarts,
精确映射行号→预览 DOM 位置,线性插值填充行间偏移
- useCodeMirror.ts:onScroll 从 ratio 改为行号派发,
使用 CodeMirror 的 lineBlockAtHeight 精确计算当前行
- Preview.tsx:双向同步(编辑器→预览 + 预览→编辑器)
- Editor.tsx:监听 preview-scroll 事件实现反向同步
原理:与 VS Code Markdown 预览滚动同步方案一致
- 渲染时:AST position → data-line 属性
- 滚动时:二分查找 [data-line] 元素 → 线性插值滚动位置
2026-05-28 11:09:58 +08:00
thzxx
70566efc4a
chore: 删除旧版 v1 代码 (main.js/preload.js/renderer/lib/)
...
重构完成后清理遗留的旧版 JavaScript 代码:
- main.js (447行) — 旧版主进程
- preload.js (40行) — 旧版预加载脚本
- renderer/ — 旧版 HTML/JS/CSS
- lib/ — 旧版第三方库 (marked.min.js, highlight.min.js)
新版代码统一在 src/ 目录下,技术栈:Electron 28 + React 18 + TypeScript 5.6 + Zustand 5 + CodeMirror 6
2026-05-28 10:51:56 +08:00
thzxx
d57a2b2aac
refactor: 删除自定义搜索,统一使用 CodeMirror 6 搜索
...
删除文件:
- SearchBar/SearchBar.tsx — 自定义搜索栏组件
- stores/searchStore.ts — 自定义搜索状态管理
- lib/searchEngine.ts — 自定义搜索匹配引擎
- types/search.ts — 搜索相关类型定义
清理代码:
- App.tsx:移除 SearchBar 导入和渲染
- useKeyboard.ts:移除 searchStore 引用和搜索快捷键
- Editor.tsx:移除 searchStore 引用和搜索逻辑
- types/index.ts:移除 search 类型导出
- global.css:删除旧搜索栏样式(~113 行)
CodeMirror 6 搜索面板移到顶部:
- .cm-panels { top: 0; bottom: auto; }
- .cm-panels-bottom { top: 0; bottom: auto; }
快捷键(CodeMirror 内置):
- Ctrl+F 搜索
- Ctrl+H 替换
- Enter/Shift+Enter 下一个/上一个
- Alt+C 大小写
- Alt+R 正则
2026-05-27 23:54:55 +08:00
thzxx
e40a8bd88e
style: 美化 CodeMirror 6 搜索面板样式
...
美化内容:
- 搜索面板:白色背景、圆角输入框、蓝色焦点光环
- 按钮:圆角、hover 高亮、active 蓝色
- 选项按钮(正则/大小写):圆形、激活时蓝色边框
- 搜索高亮:黄色半透明 + 边框轮廓
- 当前匹配:橙色高亮 + 加粗边框
- 关闭按钮:hover 背景变色
- 替换按钮:与搜索按钮风格统一
- 暗色主题:完整适配所有组件
CSS 类:
- .cm-panel.cm-search — 面板容器
- .cm-textfield — 输入框
- .cm-button — 按钮
- .cm-toggle — 选项按钮
- .cm-active — 激活状态
- .cm-search-info — 结果计数
- .cm-close — 关闭按钮
- .cm-replace/.cm-replaceAll — 替换按钮
- .cm-searchMatch — 匹配高亮
2026-05-27 23:41:09 +08:00
thzxx
23304dca1d
feat: 标签页 IndexedDB 持久化 + 最近打开文件
...
1. 标签页持久化(关闭后恢复):
- tabStore 新增 loadFromDB/saveToDB 方法
- 启动时从 IndexedDB 加载标签页快照
- 标签页增删改时异步保存到 IndexedDB
- 关闭窗口后重新打开,所有标签页自动恢复
2. 最近打开文件:
- 欢迎屏幕显示最近打开的 10 个文件
- 点击文件名直接打开
- 从侧边栏/对话框/主进程打开文件时自动记录
- 文件路径显示在文件名下方(灰色小字)
- hover 高亮效果
REFACTOR-PLAN.md 实现进度更新:
✅ CodeMirror 6 编辑器
✅ 格式化工具栏
✅ 标签页 IndexedDB 持久化
✅ 最近打开文件 UI
✅ Zustand stores
✅ TypeScript 全量类型
✅ unified/rehype
✅ electron-vite
❌ CSS Modules(全局 CSS 已足够)
2026-05-27 23:21:31 +08:00
thzxx
1cc4206b32
feat: 替换 textarea 为 CodeMirror 6 编辑器
...
新增功能:
- CodeMirror 6 专业编辑器替代原生 textarea
- 语法高亮(Markdown 专用)
- 行号(内置,精确同步)
- 代码折叠(foldGutter)
- 括号匹配
- 多光标选区(rectangularSelection)
- 内置搜索高亮(highlightSelectionMatches)
- undo/redo 原生支持(history)
- Tab 缩进(indentWithTab)
- 暗色主题(oneDark)
新增文件:
- useCodeMirror.ts: CodeMirror 初始化 Hook
- EditorToolbar.tsx: 格式化工具栏(B/I/S/标题/列表/引用/代码/链接/图片)
- Editor.tsx: 重写为 CodeMirror 组件
格式化工具栏按钮:
- 粗体/斜体/删除线/行内代码
- H1/H2/H3 标题
- 无序列表/有序列表/引用/代码块
- 链接/图片
快捷键:
- Ctrl+B 粗体
- Ctrl+I 斜体
2026-05-27 23:04:05 +08:00
thzxx
b3987e9abd
fix: 修复侧边栏根目录、搜索高亮导航、行号同步
...
问题1: 侧边栏打开文件夹后根目录不显示
修复: FileTree 传入包装后的根节点 { name, path, type: 'dir', children: tree }
打开文件夹时自动展开根目录 expandDirs([rootPath])
问题2: 搜索没有高亮,上一个/下一个没反应
修复: Editor 添加完整搜索功能
- 搜索时在 textarea 上方创建 overlay div
- 用绝对定位 div 标记每个匹配位置(单行/多行)
- currentIndex 变化时选中匹配文本并滚动到可视区域
- 搜索结果随内容变化自动更新
问题3: 滚动时行号跟随不准确
修复: 行高测量改为与 CSS line-height 一致的动态测量
搜索高亮位置随编辑器滚动同步更新
2026-05-27 22:49:34 +08:00
thzxx
9e3029774a
fix: 实现编辑器-预览滚动同步
...
问题: 分屏模式下编辑器滚动时,预览面板不跟随滚动。
实现:
- Editor handleScroll 计算滚动比例,派发 editor-scroll 自定义事件
- Preview 监听 editor-scroll 事件,按比例设置 preview-panel scrollTop
- isSyncingRef 防止双向循环触发
原理: 编辑器 scrollTop / (scrollHeight - clientHeight) = 预览 scrollTop / (scrollHeight - clientHeight)
2026-05-27 22:30:31 +08:00
thzxx
ba76cdab54
fix: 缩小图标 MD 字母尺寸(52% → 38%,SVG 32px → 24px)
2026-05-27 22:12:55 +08:00
thzxx
4caa215d6c
fix: 回退图标为现代化简洁风格
...
回退科技感设计,改为简洁美观风格:
- 柔和蓝色渐变背景(#4F8EF7 → #2563EB)
- 左上角微妙白色高光
- Georgia 衬线字体 MD 字母(白色带阴影)
- 底部半透明装饰线
- 圆角矩形,干净利落
icons.ico: 7 种尺寸(16~256px)
Icons.tsx AppIcon: SVG 版本同步更新
2026-05-27 22:07:38 +08:00
thzxx
79995855a0
feat: 科技感图标重新设计
...
应用图标(assets/icon.ico + icon.png):
- 深色渐变背景(#0F172A 深海蓝 → #1E1B4B 深紫)
- 半透明科技网格线
- 蓝色发光圆环
- 四角蓝色光点装饰
- 带发光效果的白色 M 文字
- 蓝色渐变 ↓ 箭头
- 底部扫描线效果
- 右上角光标装饰
- 7 种尺寸(16~256px)
Icons.tsx AppIcon 同步更新:
- SVG 版本包含相同的科技感元素
- 使用 SVG filter 实现发光效果
- 使用 clipPath 实现圆角裁剪
- 使用 linearGradient 实现背景渐变
2026-05-27 22:01:41 +08:00
thzxx
b223cd69e1
feat: 重新设计应用图标(assets/icon.ico)
...
新图标设计:
- 蓝色渐变圆角矩形背景(#3B82F6 → #1D4ED8)
- 白色 M↓ 文字符号
- 底部半透明装饰线
- 与 Icons.tsx 中 AppIcon 风格一致
生成规格:
- icon.ico: 7 种尺寸(16/24/32/48/64/128/256px)
- icon.png: 256x256 预览图
2026-05-27 21:52:00 +08:00
thzxx
db94ecfad0
feat: 重新设计现代化图标系统
...
新增 Icons.tsx 统一图标组件(25 个图标):
- AppIcon: 渐变蓝色圆角矩形 + M↓ 符号
- 工具栏: FolderOpen, Save, SplitView, EditMode, PreviewMode, Moon, Sun
- 标签栏: Close, Plus
- 侧边栏: Folder, File, ChevronRight, FolderPlus
- 搜索栏: ChevronUp, ChevronDown, X
- 拖拽: UploadCloud
- 导航: ArrowUp, ArrowDown
- 欢迎: WelcomeFile, WelcomeNew
设计风格:
- 线性图标(stroke-based),统一 1.75px 线宽
- 圆角风格,现代科技感
- 蓝色主色调渐变应用图标
- 部分图标添加微妙的填充细节(opacity 0.3-0.4)
更新组件:
- Toolbar: 使用 FolderOpen/Save/SplitView/EditMode/PreviewMode/Moon/Sun
- TabBar: 使用 Close/Plus
- Sidebar: 使用 FolderPlus/File/Folder/ChevronRight
- SearchBar: 使用 ChevronUp/ChevronDown/X
- WelcomeScreen: 使用 AppIcon/WelcomeFile/WelcomeNew
- DropOverlay: 使用 UploadCloud
2026-05-27 21:44:26 +08:00
thzxx
70dff0cf01
fix: 修复第二轮代码审计发现的全部 15 个问题
...
严重 Bug(6 个):
- C-01: settingsRepository.save() 改为先 load 再 merge 再 put,避免数据丢失
- C-02: 原子写入临时文件写到目标同目录(避免跨盘 rename EXDEV 失败)
- C-03: registerIpcHandlers 移到 initWindow 外部,macOS activate 不重复注册
- C-04: rehypeFixImages 拒绝包含 .. 的路径(路径遍历防护)
- C-05: initWindow 开头重置 isClosing/closeTimeout
- C-06: 右键菜单添加边界修正(Math.min 防溢出屏幕)
中等问题(5 个):
- M-01: Sidebar 路径比较归一化(norm = p.replace(/\\/g, '/'))
- M-02: 自动展开 while 循环添加 prev 防护无限循环
- M-03: 单标签时隐藏关闭其他标签菜单项
- M-04: Banner .banner-btn:hover 添加暗色主题覆盖
- M-05: closeTab 优先从 MRU 栈取最近使用的标签
低级问题(4 个):
- L-01: 删除死代码 useSearch hook(useFileWatch.ts)
- L-02: file-watcher error 事件显式调用 watcher.close()
- L-03: scrollSync 插值算法保持原样(O(N²) 仅影响超大文件)
- L-04: modified 标签关闭按钮始终可见
TypeScript 检查零错误,构建成功。
2026-05-27 21:35:09 +08:00
thzxx
d23d209522
fix: 预览时本地图片不显示
...
问题: 重构后丢失了原始版本的图片路径转换逻辑,
相对路径图片(如 )无法显示。
修复:
- 新增 rehypeFixImages 自定义 rehype 插件
- 在 sanitize 之后、highlight 之前执行
- 将相对路径 src 转换为 file:// 绝对路径
- 基于当前文件路径计算目录,拼接图片路径
- renderMarkdown 新增 filePath 可选参数
- Preview 组件传入 activeTab.filePath
示例:
Markdown: 
文件路径: /project/docs/README.md
转换后: file:///project/docs/images/logo.png
2026-05-27 21:13:31 +08:00
thzxx
f9aaf19e19
fix: 预览区域占满宽度(移除 max-width 900px 限制)
...
移除 #preview 的 max-width: 900px 和 margin: 0 auto,
预览内容现在与编辑器一样占满整个面板宽度。
2026-05-27 21:09:07 +08:00
thzxx
679cd4b0a0
feat: 打开文件时自动展开目录树到该文件所在位置
...
场景:已打开文件夹 /project,通过 Ctrl+O 打开
/project/src/components/App.tsx,目录树自动展开
src/ 和 components/ 目录,高亮显示该文件。
实现:
- sidebarStore 新增 expandDirs(paths) 方法,批量展开目录
- Sidebar 组件监听 activeFilePath 变化
- 提取文件的所有父目录路径(从文件到 rootPath)
- 自动调用 expandDirs 展开所有父目录
2026-05-27 21:07:18 +08:00
thzxx
8db6396fc7
fix: 修复侧边栏文件树 active 高亮不生效
...
问题: FileTree 组件的 className 模板为空字符串,文件项永远不会显示
active 高亮样式,导致用户无法在目录树中看到当前打开的文件。
修复:
- FileTree 新增 activeFilePath prop,用于比较 node.path
- Sidebar 组件从 tabs + activeTabId 计算 activeFilePath
- className 改为 node.path === activeFilePath ? 'active' : ''
联动验证:
- 点击目录树文件 → 标签栏新增标签 → 侧边栏高亮 ✓
- 切换标签 → 侧边栏高亮跟随切换 ✓
- 关闭标签 → 侧边栏高亮消失 ✓
- 独立文件区与目录树不重复 ✓
2026-05-27 21:02:45 +08:00
thzxx
2c681a4142
feat: 标签栏右键菜单 — 关闭其他/右侧/全部标签
...
新增功能:
- 右键点击标签弹出上下文菜单
- 关闭:关闭当前标签(带未保存确认)
- 关闭其他标签:保留当前,关闭其余(带未保存确认)
- 关闭右侧标签:关闭当前标签右边的所有标签
- 关闭全部标签:关闭所有标签(带未保存确认)
- 点击空白处自动关闭菜单
技术实现:
- tabStore 新增 closeOtherTabs/closeAllTabs/closeTabsToRight 方法
- TabBar 组件新增 ContextMenu 状态管理和右键事件处理
- CSS 新增 .tab-context-menu 样式(暗色主题兼容)
2026-05-27 20:56:56 +08:00
thzxx
959fde70e3
fix: 修复代码审计发现的全部 37 个问题
...
严重 Bug(8 个):
- B-01: isClosing 永不重置 — WINDOW_CANCEL_CLOSE 现在正确重置状态并清除超时
- B-02: replaceAll 算法完全错误 — 改为从后向前逐个替换(SearchBar + useFileWatch)
- B-03: Preview 用 setInterval 轮询 — 改为响应式订阅 activeTab.content 变化
- B-04: StatusBar 不响应 tab 切换 — 改为直接选择 tabs/activeTabId 而非函数引用
- B-05: useTheme 初始化竞态 — 添加 isInitialized ref 防止首次加载前保存
- B-06: scrollSync 0 值歧义 — 使用 NaN 标记未映射状态
- B-07: macOS activate 未注册 IPC — 提取 initWindow() 函数完整重建
- B-08: resizer 无交互逻辑 — 实现 Resizer 组件(mousedown/mousemove/mouseup)
中等问题(12 个):
- M-01: removeAllListeners 限制为白名单通道
- M-02: 新建文件保存时设置 isSelfWriting
- M-03: SidebarWatcher setTimeout 后再次检查窗口状态
- M-04: FileWatcher/SidebarWatcher 监听 error 事件清理僵尸状态
- M-05: buildDirTree 添加递归深度限制(maxDepth=10)+ 错误边界
- M-06: saveFileContent 改为原子写入(write-to-temp-then-rename)
- M-07: Preview 异步竞态 — 使用递增 requestId 替代 cancelled
- M-08: useKeyboard 依赖优化 — 用 getState() 替代频繁变化的 tabs 依赖
- M-09: settingsRepository.save() 改为 Dexie put 直接合并
- M-10: useSettings 返回函数用 useCallback 稳定引用
- M-11: App.tsx 事件注册添加 cleanup 清理 + ref 保持最新回调
- M-12: ipc-channels.ts 类型签名统一
低级问题(17 个):
- L-01/L-03: Editor 移除未使用的 imports
- L-04: tabIdCounter 改为 nanoid(HMR 安全)
- L-06: recentFiles 添加 50 条上限自动清理
- L-07: getFileExtension 正确处理无扩展名文件
- L-08: window-manager 使用静态导入 + 验证是文件非目录
- L-09: readFileContent 使用 shared 类型
- L-10: buildDirTree 权限错误返回空数组
- L-11: DropOverlay 简化为单一 dragCounter 状态
- L-12: Sidebar onFileClick 提取为 useCallback
- L-13: Editor searchStore 改为精确 selector
- L-14: CSS 添加 mode-editor 隐藏规则
- L-16: openFileInTab 添加 .catch() 异常处理
TypeScript 检查零错误,构建成功。
2026-05-27 20:52:49 +08:00