feat(editor): 图片可拖拽手柄缩放(docs/31 补)

上一笔只有弹窗输数值,用户追问为何不能拖边缘。NodeView 改包装
结构 span.img-wrap > img + 右下角手柄:图片选中时手柄出现,拖动
实时预览(只改 CSS),松手提交 width 属性(px,夹取 20..段落宽)。
两个坑:手柄的 mouse 事件须吞掉防 PM 按点击位置捣乱;setNodeMarkup
提交后 PM 会回读 DOM 选区把 NodeSelection 塌成文本光标,提交事务
须同带 setSelection 保住选区(updateImageAtElement 同修)。
无头 Chrome 真实拖拽实测:240→+80=320→−30=290,选区全程不丢;
vitest 148+2、构建通过。
This commit is contained in:
Muse
2026-11-15 09:48:54 +08:00
parent 5f4a80fa01
commit 0c09d94501
4 changed files with 76 additions and 3 deletions

View File

@@ -48,6 +48,19 @@ Markdown 没有尺寸语法,通行写法是 HTML。方案(imageSchema.ts)
往返实测:`<img src="b.png" alt="乙" width="300">` 解析/序列化逐字
一致;普通图片、非 img 的 HTML 均不受影响(tests/image-size.test.ts)。
**拖拽缩放**(同日用户追问后补):NodeView 改为包装结构
`span.img-wrap > img + span.img-resize-handle`,图片选中时右下角出现
手柄,拖动实时预览(只改 CSS 宽度),松手才提交节点属性(px 值,
上限为段落宽度、下限 20px)。两个坑:
- PM 用 mouse 事件:手柄上的 mousedown/mouseup/click 要吞掉,否则
PM 会按点击位置捣乱;
- `setNodeMarkup` 提交后 PM 会按 DOM 选区回读、把 NodeSelection 塌
成文本光标(手柄随之消失、无法连续拖)——提交事务里必须同带
`setSelection(NodeSelection)` 把选区设回去;
`updateImageAtElement`(弹窗改尺寸/链接)同理保选区。
无头 Chrome 真实拖拽实测:240 → 拖 +80 得 width="320"、再拖 −30 得
"290",选区全程不丢。
## ② 图片超链接
原「超链接」是文本链接:对选区套 link 标记,预填只有 `https://`,