71df6abe5d
refactor(tiptap): drop redundant single-arg mergeAttributes call
2026-06-23 18:35:05 +08:00
18ae6a915e
refactor(tiptap): type coordinatorRef via Pick<UploadCoordinator> instead of duck typing
2026-06-23 18:34:37 +08:00
558191e922
refactor(tiptap): type CommandItem.editor as Editor, explicit SlashPopup return type
2026-06-23 18:33:59 +08:00
073f6936e3
build(tiptap): add tsconfig + typecheck script
2026-06-23 18:32:26 +08:00
a3896c24a5
refactor(write): replace all js_sys::eval with tiptap_bridge bindings
...
write.rs changes (Tasks 7-11):
- use_drop: EditorHandle::drop replaces eval destroy + global reset (#1 )
- init use_effect: closure-driven bridge.create replaces eval initEditor
script + 100ms ready polling (#2/#3/#4/#5)
- getMarkdown: read via EditorHandle instead of eval (#8 )
- delete upload polling use_future: driven by onUploadEvent closure (#6/#7)
- removeUploadByUploadId: call via EditorHandle instead of eval (#9 )
Bridge fixes during integration:
- UploadCountsJs: drop Copy derive (wasm_bindgen types can't be Copy)
- split module: shared types compile on both targets, wasm externs gated
- add WritableExt/Readable/Writable trait imports for .write()/.set()
- use FnMut closures (Signal write/set take &mut self)
- consume_upload_event takes &mut Signal params
Also: remove stale window.__tiptap_content in index.ts source-mode handler.
2026-06-23 11:25:06 +08:00
92cfda7d5a
refactor(tiptap): EditorOptions onReady/onUploadEvent callbacks replace polling
2026-06-23 10:52:30 +08:00
b09216ef29
refactor(tiptap): UploadCoordinator emit callback replaces window global
2026-06-23 10:52:20 +08:00
876cb55e91
style(editor): smooth blur/grayscale transition on placeholder image
...
给 img 加 transition: filter 0.2s ease,blur 出现和消失(上传中→成功/
失败)平滑过渡,而非瞬间切换。transition 写在基础 img 规则上,
确保 is-uploading class 移除时过渡也能触发。
2026-06-22 16:27:02 +08:00
6e04940edc
style(editor): blur uploading placeholder image, keep overlay text sharp
...
上传中占位符图片加高斯模糊,遮罩文字保持清晰。
- .is-uploading img 加 filter: blur(8px)
- container.is-uploading 加 overflow: hidden 防止 blur 边缘渗出
- overlay 文字(spinner/"上传中…")不受影响:overlay 是 img 的兄弟元素
而非后代,CSS filter 只作用于目标元素本身,不波及兄弟
2026-06-22 16:24:02 +08:00
cee4f3f3ef
fix(upload): address code review findings
...
final code review 后的修复:
1. blob 检查收紧(Important): md.contains("blob:") 误伤合法讨论 blob URL
的代码块/正文,改为检测 markdown 图片语法 ](blob: 才算占位符泄漏
2. 重试错误原地更新(Minor): seen_error_ids 去重逻辑导致重试后再失败时
顶部提示停留在旧错误文案;改为已存在 id 时原地更新 message
3. destroy 清理 coordinatorRef(Minor): destroy() 调 setUploadCoordinator(null),
避免 NodeView 指向已销毁的 coordinator(防御性)
4. 删除 NodeView 未用的 editor 字段(Nit): 死代码清理
验证: cargo test (384 passed) / clippy (本次零警告) / dx check / tiptap build 全过
2026-06-22 15:49:23 +08:00
8ffb4451b1
style(editor): add upload placeholder NodeView styles (overlay/spinner/error)
2026-06-22 15:32:32 +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
5d527778a5
feat(editor): wire UploadCoordinator and custom Image in TiptapEditorInstance
...
- index.ts: 替换 Image.configure 为 UploadImage(自定义扩展+NodeView)
- index.ts: editor 创建后实例化 UploadCoordinator 并注入 NodeView
- index.ts: FileHandler onPaste/onDrop 改走 coordinator.insertUploading
- index.ts: 暴露 removeUploadByUploadId 供 Rust ×关闭调用
- index.ts: destroy 清理 coordinator
- upload-image.ts: 修正 import 来源(Image 来自 extension-image, mergeAttributes 来自 core)
2026-06-22 15:28:40 +08:00
57bea05aa3
feat(editor): add custom Image extension with upload-state NodeView
2026-06-22 15:25:25 +08:00
8ce9c58997
feat(editor): maintain window.__tiptap_uploads for Rust polling
2026-06-22 15:24:37 +08:00
6506931c1d
feat(editor): add runUpload and retryUpload to UploadCoordinator
2026-06-22 15:23:57 +08:00
e06667f792
feat(editor): add UploadCoordinator skeleton with pending map and node removal
2026-06-22 15:22:42 +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
6ce8915e6c
fix(editor): 修复 focus() 把源码视图滚动到底部
...
切换到源码模式时 sourceTextarea.focus() 会触发浏览器将光标
所在行滚动进可视区域,光标默认在内容末尾,导致 textarea 被
拉到底部覆盖已设的滚动位置。改为 focus 后立即恢复 scrollTop。
同时移除调试日志。
2026-06-16 16:13:46 +08:00
ae6d80c9cc
fix(editor): 修复滚动比例同步失效导致切换到底部
...
原 syncScrollRatio 封装在 display:'none' 之后重复读取源容器
scrollTop,此时浏览器已将其归零,导致比例计算为 0。改为提前
读取比例并直接应用,移除二次封装与调试日志。
2026-06-16 15:58:50 +08:00
914f168551
fix(editor): 切换视图时按滚动比例同步位置
...
修复切回富文本时编辑器滚动到底部的问题:移除 commands.focus()
(会强制滚动到光标位置),改用滚动比例跨模式同步,富文本与源码
视图按相同比例定位,保持视觉位置一致。
2026-06-16 15:53:28 +08:00
480aa92bb4
feat(editor): 新增 Markdown 源码视图切换
...
在 Tiptap 编辑器右上角增加 </> 悬浮按钮,支持在富文本与
Markdown 源码视图间双向切换,内容自动同步。getMarkdown() 在
源码模式下返回 textarea 内容,使 Rust 端提交逻辑无需改动。
2026-06-16 15:50:09 +08:00
012704d0a5
chore(tiptap-editor): update package-lock.json
2026-06-08 15:54:27 +08:00
72ba8ea9ec
chore(tiptap-editor): update package-lock.json
2026-06-06 00:29:53 +08:00
078e9b1da1
fix(tiptap-editor): configure link via StarterKit to avoid duplicate extension warning
2026-06-05 18:19:24 +08:00
ad208a4603
fix(tiptap-editor): correct setContent call signature for markdown parsing
2026-06-05 18:05:47 +08:00
26eb62c2ae
fix(upload): disable default body limit and fix error object serialization
2026-06-05 16:52:52 +08:00
c2c7b46958
fix(tiptap-editor): use insertContentAt with drop position in onDrop handler
...
Previously dropped images were inserted at the current cursor position
instead of the actual drop position. Now uses insertContentAt(pos, ...)
to place images at the correct location.
2026-06-05 15:21:38 +08:00
00c5a880f4
feat(editor): add FileHandler extension for image paste/drop upload
2026-06-05 15:19:31 +08:00
3d7dd5b5a5
deps(editor): add @tiptap/extension-file-handler
2026-06-05 15:17:39 +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
cd45ab17de
build: simplify tiptap build by setting fixed output filename in vite config
2026-06-04 16:26:25 +08:00
956b2d7374
修复编辑器暗色主题和列表样式
...
- CSS 暗色主题选择器从 [data-theme="dark"] 改为 .dark
- 恢复无序列表圆点(覆盖 Tailwind preflight 重置)
- placeholder 改用 :has() 选择器适配 Tiptap v3
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 18:02:52 +08:00
f6d60520eb
集成 Tiptap Markdown 编辑器到文章撰写页面
...
- 新增 libs/tiptap-editor/ 打包子项目(Tiptap Core + StarterKit + Markdown)
- 构建产物输出到 public/tiptap/
- 替换原有的 textarea + pulldown_cmark 预览为 WYSIWYG 编辑器
- Makefile 新增 build-editor target
- Dioxus.toml 引入 editor.js 和 editor.css
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 17:46:04 +08:00