82315853a2
fix(tiptap): slash 命令创建可运行代码块时模态框被立即关闭
...
斜杠菜单中按 Enter 选择「可运行代码块」时,openRunnableModal 在
同一个 keydown 事件处理中同步调用。模态框的 document keydown 监听
立即注册后,该 Enter 事件继续冒泡到 document 触发模态框的 Enter
处理——insert() → close(),模态框在同一 tick 内创建又销毁,用户
看不到配置弹框。
将 document.addEventListener("keydown", ...) 延迟到 setTimeout(0)
注册,确保触发事件完成传播后才开始监听。
2026-07-07 17:51:06 +08:00
1fa1984703
feat(editor): 点语言标签编辑可运行代码块的语言与配置
...
openRunnableModal 新增编辑模式(editPos + currentInfo):
- 回填当前块的 lang + overrides(解析 info string)
- 标题改「编辑」、按钮改「保存」
- 确认用 setNodeMarkup 原地更新 language 属性(保留块内代码)
CodeBlockNodeView 的语言标签在 runnable 块上可点击(绿字 hover 提示),
点击触发编辑模式(getPos 传 NodeView)。update() 在 language 变化时同步
刷新 <code> 的 class,让高亮按新语言重算。
补 4 个编辑模式用例(回填/标题/保存走 setNodeMarkup/改语言写入)。
Playwright 验证:python→node 编辑后 lang 标签与 code class 同步更新。
2026-07-07 16:12:11 +08:00
df8f7397b2
fix(editor): 斜杠命令文本残留进新节点(/code 带入 codeBlock)
...
Suggestion 传给 command 的 range 在某些输入路径下过时——停在首次
输入 '/' 的位置 {from:1,to:2},不随后续字符更新。deleteRange 只删 '/',
命令文本(如 'code')残留,被 toggleCodeBlock 包进新节点。
该 bug 同时导致衍生症状:残留文本让 codeBlock 非空,Backspace 的
clearNodes 条件(!textContent.length)不成立,空块退格看似无效。
修复:command 转发处防御性重算 range——基于当前 selection 在同一段落
内往前找触发字符 '/',删到光标位置。对所有命令统一生效。
经 Playwright 真实浏览器复现验证(happy-dom 无法复现此 bug):
- /code 回车:codeBlock 现为空(原残留 'code' 文本)
- 空 codeBlock 退格:正常删除变段落(原无反应)
2026-07-07 11:59:26 +08:00
7fbaae7622
feat(editor): 斜杠命令空状态显示「无匹配命令」
...
搜索无结果时浮层显示居中提示(非空白卡片)。同步修两个空列表 bug:
- ArrowUp/Down 对 % 0 产生 NaN(除零)
- Enter 被吞(preventDefault 后无项可选,用户回车无反应)
空列表时方向键/回车放行(return false),仅 Escape 拦截关闭。
导出 createPopup 补 6 个 happy-dom 用例。
2026-07-07 10:24:54 +08:00
9a90514470
feat(editor): 斜杠命令支持英文别名搜索(中英文互通)
...
每条命令补 keywords 字段(空格分隔英文/常见词),搜索时 title/description/
keywords 任一命中即匹配。/code 现在能命中「代码块」,/link 命中「链接」。
提取 matchCommand 纯函数(原 inline filter),补 30 个用例覆盖中英文命中、
大小写不敏感、keywords 缺省回退、不命中场景。
2026-07-07 10:15:44 +08:00
0b4346ecd4
fix(editor): 语言下拉展开时 Enter 不误触发插入
...
<select> 展开时 Enter 用于确认选项,不应提交整个弹框。
HTMLSelectElement.open 浏览器存在但 TS lib.dom 未声明,用交叉类型断言。
2026-07-06 14:15:25 +08:00
9b4c0ea36e
style(editor): biome 格式化 runnable 模态框代码
...
biome check --write 修正 import 排序 + 格式化 openRunnableModal 链式调用
(TDD 阶段子代理未跑 make fix,此处补齐以过 make lint)。
2026-07-06 14:08:06 +08:00
d6fc98d253
feat(editor): 斜杠菜单新增「可运行代码块」条目
...
触发 openRunnableModal,配置后插入标准 CodeBlock(language 承载
'python runnable {...}' info string)。
2026-07-06 14:02:12 +08:00
5929ab68b4
feat(editor): 新增 openRunnableModal 模态框配置可运行代码块
...
原生 DOM 模态框(遮罩+卡片),语言 select + 超时/内存/网络 3 项 overrides
+ 实时预览。确认插入 setCodeBlock({language: 'python runnable {...}'}),
Esc/遮罩/取消关闭不插入。
2026-07-06 13:58:51 +08:00
84b3da9db6
feat(editor): 新增 buildRunnableInfo 构造 runnable fence info string
...
纯函数,把语言+overrides 配置转成 'python runnable {...}' 形态。
dirty=false 省略 JSON,dirty=true 写 timeout/memory/network 三项,
字段顺序固定。
2026-07-06 13:45:11 +08:00
b1b1c88a74
chore(biome): 引入 Biome v2.5 monorepo 配置并格式化全量源码
...
新增根 biome.json(v2.5,v2 起原生支持 monorepo,子包自动向上查找):
- formatter: 2 空格缩进、单引号、行宽 100、LF、尾逗号、箭头函数括号
(匹配现有代码风格)
- linter: recommended preset + 项目化裁剪
- useTemplate/useTemplate off(geometry.ts 故意保留字符串拼接,
且测试用精确浮点断言锁定行为)
- noNonNullAssertion off(测试与 DOM 访问里的 ! 是惯用写法)
- noConsole off(4 个 lib 用 console.error/warn 做错误上报)
- CSS 关闭 noDescendingSpecificity/noDuplicateProperties
(手写 CSS 的 fallback 模式)
- useImportType/useNodejsImportProtocol/noUnusedVariables warn
- vcs.useIgnoreFile 自动读 .gitignore;排除 public/target/node_modules/
dist/.dioxus/static + Tailwind 入口 input.css(含 @theme 等 Biome 无法
解析的 at-rules)
首次格式化覆盖 29 个源文件:import 排序、node: 协议、引号/缩进统一,
并修复 index.ts 两处 forEach 回调隐式返回值(useIterableCallbackReturn)。
90 个 vitest 用例全绿,确认无语义改动。
2026-07-02 17:54:46 +08:00
8ff051689f
refactor(tiptap): export isValidUrl and UploadImageNodeView for testability
2026-06-24 10:04:59 +08:00
6ffcd55c94
fix(tiptap): correct link command order + validate URL scheme in slash commands
2026-06-23 18:42:57 +08:00
558191e922
refactor(tiptap): type CommandItem.editor as Editor, explicit SlashPopup return type
2026-06-23 18:33:59 +08:00
34c8b47436
feat(editor): route slash-command image upload through coordinator
...
- slash-command.ts: SlashCommandOptions 加 onInsertUploading option
- slash-command.ts: 上传图片命令优先走 onInsertUploading(coordinator 占位符+上传),
退回 uploadFn 直接上传(无占位符)
- index.ts: SlashCommand.configure 注入 onInsertUploading,
闭包延迟读取 this.coordinator(在 editor 创建后才实例化)
2026-06-22 15:30:39 +08:00
6ff37322b2
feat(editor): add image upload to slash command and build tiptap in make dev
...
斜杠命令图片上传 + Makefile dev 构建修复
1. 斜杠命令接入图片上传管线
- slash-command.ts: SlashCommand 扩展改为 Extension.create<Options>,
新增 onImageUpload 选项;原单一"图片"命令拆成两个:
· "上传图片"(📤 ): 仅在 onImageUpload 可用时出现,触发原生文件选择器
(accept 限定 jpeg/png/gif/webp,与 upload 端点 MIME 一致),
上传成功后 setImage 插入,失败 console.error(与 FileHandler 一致)
· "图片链接"(🖼): 保留原 window.prompt URL 方式
- index.ts: SlashCommand.configure({ onImageUpload }) 透传宿主回调,
复用 write.rs 已注入的 /api/upload 管线,无需 Rust 端改动
2. Makefile: make dev 不再忽略 tiptap 构建
- 根因: 原 dev target 只起 tailwindcss watch + dx serve,从不构建
tiptap 编辑器,导致 dev server 始终 serve 上次 make build 残留的
旧 editor.js(本次新增的"上传图片"命令在 dev 下永远不生效)
- 新增 build-editor-incremental target (跳过 npm ci,直接 vite build,~1s)
- dev 现在依赖 build-editor-incremental,启动前先增量构建编辑器
3. Makefile: clean 不再删 public/tiptap
- public/tiptap 是跨子项目(npm)构建产物,删除后必须重跑 make build-editor
(含 npm ci) 才能恢复;原 clean 会删它是陷阱(make clean && make dev
会导致编辑器直接消失)。现在 clean 只清 Rust 产物和缓存
2026-06-22 14:18:05 +08:00
a8704e199f
feat(editor): add slash command, table, task list, image and link extensions
...
- Add @tiptap/suggestion-based slash command menu with 12 commands
- Add TableKit for table support (3x3 with header)
- Add Image extension with base64 support
- Add Link extension with autolink and paste detection
- Add TaskList/TaskItem extensions for checklists
- Upgrade all tiptap packages from 3.23.6 to 3.25.0
- Add CSS styles for all new features including dark theme
2026-06-05 10:20:47 +08:00