@mario9/tiptap-editor 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +4 -17
- package/dist/tiptap-editor.css +1 -1
- package/dist/tiptap-editor.js +717 -698
- package/dist/tiptap-editor.umd.cjs +1 -1
- package/package.json +1 -1
package/dist/tiptap-editor.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import
|
|
3
|
-
import { nodeViewProps as
|
|
4
|
-
import { TaskList as
|
|
5
|
-
import { TextAlign as
|
|
6
|
-
import { Placeholder as
|
|
7
|
-
import { CodeBlockLowlight as
|
|
8
|
-
import { createLowlight as
|
|
9
|
-
import { Image as
|
|
10
|
-
import { Plugin as
|
|
11
|
-
import { Decoration as
|
|
12
|
-
import { TableRow as
|
|
13
|
-
import { Mathematics as
|
|
14
|
-
import { Node as
|
|
15
|
-
import { ElTooltip as
|
|
16
|
-
import
|
|
17
|
-
import { BubbleMenu as
|
|
18
|
-
const
|
|
1
|
+
import { defineComponent as c, computed as V, ref as H, createVNode as e, createTextVNode as m, mergeProps as k, inject as B, watch as D, nextTick as P, watchEffect as G, Fragment as de, provide as z } from "vue";
|
|
2
|
+
import pe from "@tiptap/starter-kit";
|
|
3
|
+
import { nodeViewProps as Ce, NodeViewWrapper as ve, VueNodeViewRenderer as fe, useEditor as he, EditorContent as ge } from "@tiptap/vue-3";
|
|
4
|
+
import { TaskList as me, TaskItem as we } from "@tiptap/extension-list";
|
|
5
|
+
import { TextAlign as be } from "@tiptap/extension-text-align";
|
|
6
|
+
import { Placeholder as ke } from "@tiptap/extension-placeholder";
|
|
7
|
+
import { CodeBlockLowlight as xe } from "@tiptap/extension-code-block-lowlight";
|
|
8
|
+
import { createLowlight as He, common as Be } from "lowlight";
|
|
9
|
+
import { Image as Ae } from "@tiptap/extension-image";
|
|
10
|
+
import { Plugin as ye, NodeSelection as Me } from "@tiptap/pm/state";
|
|
11
|
+
import { Decoration as Ie, DecorationSet as Le } from "@tiptap/pm/view";
|
|
12
|
+
import { TableRow as Ee, TableHeader as Fe, TableCell as Ve, Table as Te } from "@tiptap/extension-table";
|
|
13
|
+
import { Mathematics as Ze } from "@tiptap/extension-mathematics";
|
|
14
|
+
import { Node as Re, mergeAttributes as De } from "@tiptap/core";
|
|
15
|
+
import { ElTooltip as R, ElButton as Z, ElPopover as J, ElInput as X, ElDropdown as j, ElDropdownMenu as W, ElDropdownItem as E, ElDialog as Se, ElRadioGroup as Ue, ElRadioButton as q } from "element-plus";
|
|
16
|
+
import _e from "katex";
|
|
17
|
+
import { BubbleMenu as Pe } from "@tiptap/vue-3/menus";
|
|
18
|
+
const ze = Ae.extend({
|
|
19
19
|
addAttributes() {
|
|
20
20
|
return {
|
|
21
21
|
...this.parent?.(),
|
|
@@ -29,130 +29,134 @@ const Ye = De.extend({
|
|
|
29
29
|
addProseMirrorPlugins() {
|
|
30
30
|
const t = this.name;
|
|
31
31
|
return [
|
|
32
|
-
new
|
|
32
|
+
new ye({
|
|
33
33
|
props: {
|
|
34
34
|
decorations(l) {
|
|
35
35
|
const n = [];
|
|
36
|
-
return l.doc.descendants((
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"data-align":
|
|
36
|
+
return l.doc.descendants((o, u) => {
|
|
37
|
+
o.type.name === t && o.attrs.align && n.push(
|
|
38
|
+
Ie.node(u, u + o.nodeSize, {
|
|
39
|
+
"data-align": o.attrs.align
|
|
40
40
|
})
|
|
41
41
|
);
|
|
42
|
-
}),
|
|
42
|
+
}), Le.create(l.doc, n);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
})
|
|
46
46
|
];
|
|
47
47
|
}
|
|
48
|
-
}),
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}, n1 = { class: "tiptap-image-upload-preview-content" }, o1 = { class: "tiptap-image-upload-text" }, i1 = { class: "tiptap-image-upload-subtext" }, r1 = ["onClick"], u1 = ["accept", "multiple"], a1 = /* @__PURE__ */ d({
|
|
52
|
-
__name: "ImageUploadView",
|
|
53
|
-
props: Be,
|
|
48
|
+
}), Oe = /* @__PURE__ */ c({
|
|
49
|
+
name: "ImageUploadView",
|
|
50
|
+
props: Ce,
|
|
54
51
|
setup(t) {
|
|
55
|
-
const l =
|
|
56
|
-
if (
|
|
57
|
-
return
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
const l = V(() => t.node.attrs.accept), n = V(() => t.node.attrs.limit), o = V(() => t.node.attrs.maxSize), u = H([]), s = H(), f = H(!1), g = async (a) => {
|
|
53
|
+
if (o.value > 0 && a.size > o.value)
|
|
54
|
+
return t.extension.options.onError?.(new Error(`文件大小超出限制 ${o.value / 1024 / 1024}MB`)), null;
|
|
55
|
+
const d = crypto.randomUUID();
|
|
56
|
+
u.value.push({
|
|
57
|
+
id: d,
|
|
58
|
+
file: a,
|
|
59
|
+
progress: 0,
|
|
60
|
+
status: "uploading"
|
|
61
|
+
});
|
|
62
62
|
try {
|
|
63
|
-
const
|
|
64
|
-
if (!
|
|
65
|
-
const
|
|
66
|
-
if (!
|
|
67
|
-
const
|
|
68
|
-
return
|
|
69
|
-
} catch (
|
|
70
|
-
const
|
|
71
|
-
return
|
|
63
|
+
const v = t.extension.options.upload;
|
|
64
|
+
if (!v) throw new Error("未配置 upload 函数");
|
|
65
|
+
const h = await v(a);
|
|
66
|
+
if (!h) throw new Error("上传失败:未返回 URL");
|
|
67
|
+
const A = u.value.find((T) => T.id === d);
|
|
68
|
+
return A && (A.status = "success", A.progress = 100), t.extension.options.onSuccess?.(h), h;
|
|
69
|
+
} catch (v) {
|
|
70
|
+
const h = u.value.find((A) => A.id === d);
|
|
71
|
+
return h && (h.status = "error", h.progress = 0), t.extension.options.onError?.(v instanceof Error ? v : new Error("上传失败")), null;
|
|
72
72
|
}
|
|
73
|
-
},
|
|
74
|
-
if (!
|
|
75
|
-
if (
|
|
76
|
-
|
|
73
|
+
}, r = async (a) => {
|
|
74
|
+
if (!a.length) return;
|
|
75
|
+
if (a.length > n.value) {
|
|
76
|
+
t.extension.options.onError?.(new Error(`最多上传 ${n.value} 个文件`));
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
|
-
const
|
|
80
|
-
if (
|
|
81
|
-
const
|
|
82
|
-
if (typeof
|
|
83
|
-
const
|
|
84
|
-
|
|
79
|
+
const d = (await Promise.all(a.map(g))).filter((v) => !!v);
|
|
80
|
+
if (d.length > 0) {
|
|
81
|
+
const v = t.getPos();
|
|
82
|
+
if (typeof v != "number") return;
|
|
83
|
+
const h = d.map((A) => ({
|
|
84
|
+
type: "image",
|
|
85
|
+
attrs: {
|
|
86
|
+
src: A
|
|
87
|
+
}
|
|
88
|
+
}));
|
|
89
|
+
t.editor.chain().focus().deleteRange({
|
|
90
|
+
from: v,
|
|
91
|
+
to: v + t.node.nodeSize
|
|
92
|
+
}).insertContentAt(v, h).run();
|
|
85
93
|
}
|
|
86
|
-
},
|
|
87
|
-
u.value.length === 0 &&
|
|
88
|
-
}, i = (
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
},
|
|
92
|
-
|
|
93
|
-
},
|
|
94
|
-
|
|
95
|
-
},
|
|
96
|
-
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
},
|
|
100
|
-
u.value = u.value.filter((
|
|
94
|
+
}, C = () => {
|
|
95
|
+
u.value.length === 0 && s.value && (s.value.value = "", s.value.click());
|
|
96
|
+
}, i = (a) => {
|
|
97
|
+
const d = a.target.files;
|
|
98
|
+
d && r(Array.from(d));
|
|
99
|
+
}, p = (a) => {
|
|
100
|
+
a.preventDefault(), f.value = !0;
|
|
101
|
+
}, w = (a) => {
|
|
102
|
+
a.currentTarget.contains(a.relatedTarget) || (f.value = !1);
|
|
103
|
+
}, I = (a) => {
|
|
104
|
+
a.preventDefault(), f.value = !1;
|
|
105
|
+
const d = Array.from(a.dataTransfer?.files ?? []);
|
|
106
|
+
d.length && r(d);
|
|
107
|
+
}, x = (a) => {
|
|
108
|
+
u.value = u.value.filter((d) => d.id !== a);
|
|
101
109
|
};
|
|
102
|
-
return (
|
|
103
|
-
class: "tiptap-image-upload"
|
|
104
|
-
onClick: o
|
|
110
|
+
return () => e(ve, {
|
|
111
|
+
class: "tiptap-image-upload"
|
|
105
112
|
}, {
|
|
106
|
-
default:
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
},
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
]),
|
|
152
|
-
_: 1
|
|
153
|
-
}));
|
|
113
|
+
default: () => [e("div", {
|
|
114
|
+
onClick: C
|
|
115
|
+
}, [u.value.length ? e("div", {
|
|
116
|
+
class: "tiptap-image-upload-previews"
|
|
117
|
+
}, [u.value.map((a) => e("div", {
|
|
118
|
+
key: a.id,
|
|
119
|
+
class: "tiptap-image-upload-preview"
|
|
120
|
+
}, [a.status === "uploading" && e("div", {
|
|
121
|
+
class: "tiptap-image-upload-progress",
|
|
122
|
+
style: {
|
|
123
|
+
width: `${a.progress}%`
|
|
124
|
+
}
|
|
125
|
+
}, null), e("div", {
|
|
126
|
+
class: "tiptap-image-upload-preview-content"
|
|
127
|
+
}, [e("span", {
|
|
128
|
+
class: "tiptap-image-upload-text"
|
|
129
|
+
}, [a.file.name]), e("span", {
|
|
130
|
+
class: "tiptap-image-upload-subtext"
|
|
131
|
+
}, [a.status === "uploading" ? `${a.progress}%` : a.status === "error" ? "上传失败" : "上传成功"]), e("button", {
|
|
132
|
+
class: "tiptap-image-upload-remove",
|
|
133
|
+
onClick: (d) => {
|
|
134
|
+
d.stopPropagation(), x(a.id);
|
|
135
|
+
}
|
|
136
|
+
}, [m("×")])])]))]) : e("div", {
|
|
137
|
+
class: ["tiptap-image-upload-drag-area", {
|
|
138
|
+
"drag-active": f.value
|
|
139
|
+
}],
|
|
140
|
+
onDragover: p,
|
|
141
|
+
onDragleave: w,
|
|
142
|
+
onDrop: I
|
|
143
|
+
}, [e("div", {
|
|
144
|
+
class: "tiptap-image-upload-content"
|
|
145
|
+
}, [e("span", {
|
|
146
|
+
class: "tiptap-image-upload-text"
|
|
147
|
+
}, [e("em", null, [m("点击上传")]), m(" 或拖拽图片到此处")]), e("span", {
|
|
148
|
+
class: "tiptap-image-upload-subtext"
|
|
149
|
+
}, [m("最多 "), n.value, m(" 个文件"), o.value ? `,每个不超过 ${o.value / 1024 / 1024}MB` : ""])])]), e("input", {
|
|
150
|
+
ref: s,
|
|
151
|
+
type: "file",
|
|
152
|
+
accept: l.value,
|
|
153
|
+
multiple: n.value > 1,
|
|
154
|
+
onChange: i,
|
|
155
|
+
onClick: (a) => a.stopPropagation()
|
|
156
|
+
}, null)])]
|
|
157
|
+
});
|
|
154
158
|
}
|
|
155
|
-
}),
|
|
159
|
+
}), $e = Re.create({
|
|
156
160
|
name: "imageUpload",
|
|
157
161
|
group: "block",
|
|
158
162
|
draggable: !0,
|
|
@@ -194,12 +198,12 @@ const Ye = De.extend({
|
|
|
194
198
|
renderHTML({
|
|
195
199
|
HTMLAttributes: t
|
|
196
200
|
}) {
|
|
197
|
-
return ["div",
|
|
201
|
+
return ["div", De({
|
|
198
202
|
"data-type": "image-upload"
|
|
199
203
|
}, t)];
|
|
200
204
|
},
|
|
201
205
|
addNodeView() {
|
|
202
|
-
return
|
|
206
|
+
return fe(Oe);
|
|
203
207
|
},
|
|
204
208
|
addCommands() {
|
|
205
209
|
return {
|
|
@@ -221,18 +225,18 @@ const Ye = De.extend({
|
|
|
221
225
|
nodeAfter: n
|
|
222
226
|
} = l.$from;
|
|
223
227
|
if (n?.type.name === "imageUpload" && t.isActive("imageUpload")) {
|
|
224
|
-
const
|
|
225
|
-
if (
|
|
226
|
-
const
|
|
227
|
-
if (
|
|
228
|
-
return
|
|
228
|
+
const o = t.view.nodeDOM(l.$from.pos);
|
|
229
|
+
if (o instanceof HTMLElement) {
|
|
230
|
+
const u = o.firstChild;
|
|
231
|
+
if (u instanceof HTMLElement)
|
|
232
|
+
return u.click(), !0;
|
|
229
233
|
}
|
|
230
234
|
}
|
|
231
235
|
return !1;
|
|
232
236
|
}
|
|
233
237
|
};
|
|
234
238
|
}
|
|
235
|
-
}),
|
|
239
|
+
}), Ne = {
|
|
236
240
|
icon: {
|
|
237
241
|
type: Object,
|
|
238
242
|
required: !0
|
|
@@ -251,16 +255,16 @@ const Ye = De.extend({
|
|
|
251
255
|
onClick: {
|
|
252
256
|
type: Function
|
|
253
257
|
}
|
|
254
|
-
},
|
|
258
|
+
}, b = /* @__PURE__ */ c({
|
|
255
259
|
name: "IconButton",
|
|
256
|
-
props:
|
|
260
|
+
props: Ne,
|
|
257
261
|
setup(t) {
|
|
258
|
-
return () => e(
|
|
262
|
+
return () => e(R, {
|
|
259
263
|
showArrow: !1,
|
|
260
264
|
offset: 6,
|
|
261
265
|
content: t.tooltip
|
|
262
266
|
}, {
|
|
263
|
-
default: () => [e(
|
|
267
|
+
default: () => [e(Z, {
|
|
264
268
|
text: !0,
|
|
265
269
|
icon: t.icon,
|
|
266
270
|
class: ["tiptap-button", {
|
|
@@ -271,7 +275,7 @@ const Ye = De.extend({
|
|
|
271
275
|
}, null)]
|
|
272
276
|
});
|
|
273
277
|
}
|
|
274
|
-
}),
|
|
278
|
+
}), je = /* @__PURE__ */ c({
|
|
275
279
|
name: "UndoIcon",
|
|
276
280
|
setup(t, {
|
|
277
281
|
attrs: l
|
|
@@ -289,7 +293,7 @@ const Ye = De.extend({
|
|
|
289
293
|
fill: "currentColor"
|
|
290
294
|
}, null)]);
|
|
291
295
|
}
|
|
292
|
-
}),
|
|
296
|
+
}), We = /* @__PURE__ */ c({
|
|
293
297
|
name: "RedoIcon",
|
|
294
298
|
setup(t, {
|
|
295
299
|
attrs: l
|
|
@@ -307,23 +311,23 @@ const Ye = De.extend({
|
|
|
307
311
|
fill: "currentColor"
|
|
308
312
|
}, null)]);
|
|
309
313
|
}
|
|
310
|
-
}),
|
|
314
|
+
}), qe = /* @__PURE__ */ c({
|
|
311
315
|
name: "UndoRedoButton",
|
|
312
316
|
setup() {
|
|
313
|
-
const t =
|
|
314
|
-
return () => e("div", null, [e(
|
|
315
|
-
icon:
|
|
317
|
+
const t = B("editor"), l = V(() => t?.value?.can().undo() ?? !1), n = V(() => t?.value?.can().redo() ?? !1);
|
|
318
|
+
return () => e("div", null, [e(b, {
|
|
319
|
+
icon: je,
|
|
316
320
|
tooltip: "撤销",
|
|
317
321
|
disabled: !l.value,
|
|
318
322
|
onClick: () => t?.value?.chain().focus().undo().run()
|
|
319
|
-
}, null), e(
|
|
320
|
-
icon:
|
|
323
|
+
}, null), e(b, {
|
|
324
|
+
icon: We,
|
|
321
325
|
tooltip: "重做",
|
|
322
326
|
disabled: !n.value,
|
|
323
327
|
onClick: () => t?.value?.chain().focus().redo().run()
|
|
324
328
|
}, null)]);
|
|
325
329
|
}
|
|
326
|
-
}),
|
|
330
|
+
}), Ke = /* @__PURE__ */ c({
|
|
327
331
|
name: "LinkIcon",
|
|
328
332
|
setup(t, {
|
|
329
333
|
attrs: l
|
|
@@ -342,7 +346,7 @@ const Ye = De.extend({
|
|
|
342
346
|
fill: "currentColor"
|
|
343
347
|
}, null)]);
|
|
344
348
|
}
|
|
345
|
-
}),
|
|
349
|
+
}), Ge = /* @__PURE__ */ c({
|
|
346
350
|
name: "CornerDownLeftIcon",
|
|
347
351
|
setup(t, {
|
|
348
352
|
attrs: l
|
|
@@ -363,7 +367,7 @@ const Ye = De.extend({
|
|
|
363
367
|
d: "M20 4v7a4 4 0 0 1-4 4H4"
|
|
364
368
|
}, null)]);
|
|
365
369
|
}
|
|
366
|
-
}),
|
|
370
|
+
}), Je = /* @__PURE__ */ c({
|
|
367
371
|
name: "ExternalLinkIcon",
|
|
368
372
|
setup(t, {
|
|
369
373
|
attrs: l
|
|
@@ -389,7 +393,7 @@ const Ye = De.extend({
|
|
|
389
393
|
y2: "3"
|
|
390
394
|
}, null)]);
|
|
391
395
|
}
|
|
392
|
-
}),
|
|
396
|
+
}), Xe = /* @__PURE__ */ c({
|
|
393
397
|
name: "TrashIcon",
|
|
394
398
|
setup(t, {
|
|
395
399
|
attrs: l
|
|
@@ -410,52 +414,52 @@ const Ye = De.extend({
|
|
|
410
414
|
d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"
|
|
411
415
|
}, null)]);
|
|
412
416
|
}
|
|
413
|
-
}),
|
|
417
|
+
}), Qe = /* @__PURE__ */ c({
|
|
414
418
|
name: "LinkPopover",
|
|
415
419
|
setup() {
|
|
416
|
-
const t =
|
|
417
|
-
let
|
|
418
|
-
|
|
419
|
-
|
|
420
|
+
const t = B("editor"), l = H(!1), n = H("");
|
|
421
|
+
let o = !1;
|
|
422
|
+
D(() => t?.value?.isActive("link"), (i) => {
|
|
423
|
+
o || i && (n.value = t?.value?.getAttributes("link").href ?? "", P(() => {
|
|
420
424
|
l.value = !0;
|
|
421
425
|
}));
|
|
422
426
|
});
|
|
423
|
-
const
|
|
424
|
-
const
|
|
425
|
-
if (!
|
|
426
|
-
|
|
427
|
+
const u = () => {
|
|
428
|
+
const i = t?.value;
|
|
429
|
+
if (!i || !n.value) return;
|
|
430
|
+
o = !0;
|
|
427
431
|
const {
|
|
428
|
-
empty:
|
|
429
|
-
} =
|
|
430
|
-
let
|
|
432
|
+
empty: p
|
|
433
|
+
} = i.state.selection;
|
|
434
|
+
let w = i.chain().focus().extendMarkRange("link").setLink({
|
|
431
435
|
href: n.value
|
|
432
436
|
});
|
|
433
|
-
|
|
437
|
+
p && (w = w.insertContent({
|
|
434
438
|
type: "text",
|
|
435
439
|
text: n.value
|
|
436
|
-
})),
|
|
437
|
-
|
|
440
|
+
})), w.run(), l.value = !1, P(() => {
|
|
441
|
+
o = !1;
|
|
438
442
|
});
|
|
439
|
-
},
|
|
440
|
-
const
|
|
441
|
-
|
|
442
|
-
|
|
443
|
+
}, s = () => {
|
|
444
|
+
const i = t?.value;
|
|
445
|
+
i && (o = !0, i.chain().focus().extendMarkRange("link").unsetLink().run(), n.value = "", l.value = !1, P(() => {
|
|
446
|
+
o = !1;
|
|
443
447
|
}));
|
|
444
|
-
},
|
|
445
|
-
const
|
|
446
|
-
|
|
447
|
-
},
|
|
448
|
-
|
|
449
|
-
},
|
|
450
|
-
|
|
451
|
-
},
|
|
452
|
-
n.value =
|
|
448
|
+
}, f = () => {
|
|
449
|
+
const i = t?.value?.getAttributes("link").href;
|
|
450
|
+
i && window.open(i, "_blank", "noopener,noreferrer");
|
|
451
|
+
}, g = (i) => {
|
|
452
|
+
i.key === "Enter" && (i.preventDefault(), u());
|
|
453
|
+
}, r = (i) => {
|
|
454
|
+
i && (n.value = t?.value?.getAttributes("link").href ?? ""), l.value = i;
|
|
455
|
+
}, C = (i) => {
|
|
456
|
+
n.value = i;
|
|
453
457
|
};
|
|
454
458
|
return () => {
|
|
455
|
-
const
|
|
456
|
-
return e(
|
|
459
|
+
const i = t?.value?.isActive("link") ?? !1;
|
|
460
|
+
return e(J, {
|
|
457
461
|
visible: l.value,
|
|
458
|
-
"onUpdate:visible":
|
|
462
|
+
"onUpdate:visible": r,
|
|
459
463
|
placement: "bottom",
|
|
460
464
|
width: 300,
|
|
461
465
|
trigger: "click",
|
|
@@ -463,63 +467,63 @@ const Ye = De.extend({
|
|
|
463
467
|
popperClass: "link-popover-popper",
|
|
464
468
|
offset: 6
|
|
465
469
|
}, {
|
|
466
|
-
reference: () => e("span", null, [e(
|
|
470
|
+
reference: () => e("span", null, [e(b, {
|
|
467
471
|
tooltip: "链接",
|
|
468
|
-
icon:
|
|
472
|
+
icon: Ke,
|
|
469
473
|
class: ["tiptap-button", {
|
|
470
|
-
"is-active":
|
|
474
|
+
"is-active": i
|
|
471
475
|
}]
|
|
472
476
|
}, null)]),
|
|
473
477
|
default: () => e("div", {
|
|
474
478
|
class: "link-popover-inner"
|
|
475
|
-
}, [e(
|
|
479
|
+
}, [e(X, {
|
|
476
480
|
modelValue: n.value,
|
|
477
|
-
"onUpdate:modelValue":
|
|
481
|
+
"onUpdate:modelValue": C,
|
|
478
482
|
type: "url",
|
|
479
483
|
placeholder: "请输入链接...",
|
|
480
484
|
size: "small",
|
|
481
485
|
autofocus: !0,
|
|
482
|
-
onKeydown:
|
|
486
|
+
onKeydown: g
|
|
483
487
|
}, null), e("div", {
|
|
484
488
|
class: "link-popover-actions"
|
|
485
|
-
}, [e(
|
|
489
|
+
}, [e(R, {
|
|
486
490
|
content: "确认",
|
|
487
491
|
showArrow: !1,
|
|
488
492
|
offset: 4
|
|
489
493
|
}, {
|
|
490
|
-
default: () => [e(
|
|
494
|
+
default: () => [e(Z, {
|
|
491
495
|
text: !0,
|
|
492
|
-
icon:
|
|
496
|
+
icon: Ge,
|
|
493
497
|
disabled: !n.value,
|
|
494
|
-
onClick:
|
|
498
|
+
onClick: u
|
|
495
499
|
}, null)]
|
|
496
|
-
}), e(
|
|
500
|
+
}), e(R, {
|
|
497
501
|
content: "在新标签页打开",
|
|
498
502
|
showArrow: !1,
|
|
499
503
|
offset: 4
|
|
500
504
|
}, {
|
|
501
|
-
default: () => [e(
|
|
505
|
+
default: () => [e(Z, {
|
|
502
506
|
text: !0,
|
|
503
|
-
icon:
|
|
504
|
-
disabled: !n.value && !
|
|
505
|
-
onClick:
|
|
507
|
+
icon: Je,
|
|
508
|
+
disabled: !n.value && !i,
|
|
509
|
+
onClick: f
|
|
506
510
|
}, null)]
|
|
507
|
-
}), e(
|
|
511
|
+
}), e(R, {
|
|
508
512
|
content: "移除链接",
|
|
509
513
|
showArrow: !1,
|
|
510
514
|
offset: 4
|
|
511
515
|
}, {
|
|
512
|
-
default: () => [e(
|
|
516
|
+
default: () => [e(Z, {
|
|
513
517
|
text: !0,
|
|
514
|
-
icon:
|
|
515
|
-
disabled: !
|
|
516
|
-
onClick:
|
|
518
|
+
icon: Xe,
|
|
519
|
+
disabled: !i,
|
|
520
|
+
onClick: s
|
|
517
521
|
}, null)]
|
|
518
522
|
})])])
|
|
519
523
|
});
|
|
520
524
|
};
|
|
521
525
|
}
|
|
522
|
-
}),
|
|
526
|
+
}), Q = /* @__PURE__ */ c({
|
|
523
527
|
name: "BoldIcon",
|
|
524
528
|
setup(t, {
|
|
525
529
|
attrs: l
|
|
@@ -537,7 +541,7 @@ const Ye = De.extend({
|
|
|
537
541
|
fill: "currentColor"
|
|
538
542
|
}, null)]);
|
|
539
543
|
}
|
|
540
|
-
}),
|
|
544
|
+
}), Y = /* @__PURE__ */ c({
|
|
541
545
|
name: "ItalicIcon",
|
|
542
546
|
setup(t, {
|
|
543
547
|
attrs: l
|
|
@@ -553,7 +557,7 @@ const Ye = De.extend({
|
|
|
553
557
|
fill: "currentColor"
|
|
554
558
|
}, null)]);
|
|
555
559
|
}
|
|
556
|
-
}),
|
|
560
|
+
}), ee = /* @__PURE__ */ c({
|
|
557
561
|
name: "StrikeIcon",
|
|
558
562
|
setup(t, {
|
|
559
563
|
attrs: l
|
|
@@ -572,7 +576,7 @@ const Ye = De.extend({
|
|
|
572
576
|
fill: "currentColor"
|
|
573
577
|
}, null)]);
|
|
574
578
|
}
|
|
575
|
-
}),
|
|
579
|
+
}), te = /* @__PURE__ */ c({
|
|
576
580
|
name: "UnderlineIcon",
|
|
577
581
|
setup(t, {
|
|
578
582
|
attrs: l
|
|
@@ -590,33 +594,33 @@ const Ye = De.extend({
|
|
|
590
594
|
fill: "currentColor"
|
|
591
595
|
}, null)]);
|
|
592
596
|
}
|
|
593
|
-
}),
|
|
597
|
+
}), Ye = /* @__PURE__ */ c({
|
|
594
598
|
name: "TextStyleButton",
|
|
595
599
|
setup() {
|
|
596
|
-
const t =
|
|
597
|
-
return () => e("div", null, [e(
|
|
598
|
-
icon:
|
|
600
|
+
const t = B("editor");
|
|
601
|
+
return () => e("div", null, [e(b, {
|
|
602
|
+
icon: Q,
|
|
599
603
|
tooltip: "粗体",
|
|
600
604
|
isActive: t?.value?.isActive("bold"),
|
|
601
605
|
onClick: () => t?.value?.chain().focus().toggleBold().run()
|
|
602
|
-
}, null), e(
|
|
603
|
-
icon:
|
|
606
|
+
}, null), e(b, {
|
|
607
|
+
icon: Y,
|
|
604
608
|
tooltip: "斜体",
|
|
605
609
|
isActive: t?.value?.isActive("italic"),
|
|
606
610
|
onClick: () => t?.value?.chain().focus().toggleItalic().run()
|
|
607
|
-
}, null), e(
|
|
608
|
-
icon:
|
|
611
|
+
}, null), e(b, {
|
|
612
|
+
icon: ee,
|
|
609
613
|
tooltip: "删除线",
|
|
610
614
|
isActive: t?.value?.isActive("strike"),
|
|
611
615
|
onClick: () => t?.value?.chain().focus().toggleStrike().run()
|
|
612
|
-
}, null), e(
|
|
613
|
-
icon:
|
|
616
|
+
}, null), e(b, {
|
|
617
|
+
icon: te,
|
|
614
618
|
tooltip: "下划线",
|
|
615
619
|
isActive: t?.value?.isActive("underline"),
|
|
616
620
|
onClick: () => t?.value?.chain().focus().toggleUnderline().run()
|
|
617
|
-
}, null), e(
|
|
621
|
+
}, null), e(Qe, null, null)]);
|
|
618
622
|
}
|
|
619
|
-
}),
|
|
623
|
+
}), le = /* @__PURE__ */ c({
|
|
620
624
|
name: "AlignLeftIcon",
|
|
621
625
|
setup(t, {
|
|
622
626
|
attrs: l
|
|
@@ -644,7 +648,7 @@ const Ye = De.extend({
|
|
|
644
648
|
fill: "currentColor"
|
|
645
649
|
}, null)]);
|
|
646
650
|
}
|
|
647
|
-
}),
|
|
651
|
+
}), ne = /* @__PURE__ */ c({
|
|
648
652
|
name: "AlignCenterIcon",
|
|
649
653
|
setup(t, {
|
|
650
654
|
attrs: l
|
|
@@ -672,7 +676,7 @@ const Ye = De.extend({
|
|
|
672
676
|
fill: "currentColor"
|
|
673
677
|
}, null)]);
|
|
674
678
|
}
|
|
675
|
-
}),
|
|
679
|
+
}), oe = /* @__PURE__ */ c({
|
|
676
680
|
name: "AlignRightIcon",
|
|
677
681
|
setup(t, {
|
|
678
682
|
attrs: l
|
|
@@ -700,7 +704,7 @@ const Ye = De.extend({
|
|
|
700
704
|
fill: "currentColor"
|
|
701
705
|
}, null)]);
|
|
702
706
|
}
|
|
703
|
-
}),
|
|
707
|
+
}), e1 = /* @__PURE__ */ c({
|
|
704
708
|
name: "AlignJustifyIcon",
|
|
705
709
|
setup(t, {
|
|
706
710
|
attrs: l
|
|
@@ -728,33 +732,33 @@ const Ye = De.extend({
|
|
|
728
732
|
fill: "currentColor"
|
|
729
733
|
}, null)]);
|
|
730
734
|
}
|
|
731
|
-
}),
|
|
735
|
+
}), t1 = /* @__PURE__ */ c({
|
|
732
736
|
name: "TextAlignButton",
|
|
733
737
|
setup() {
|
|
734
|
-
const t =
|
|
735
|
-
return () => e("div", null, [e(
|
|
736
|
-
icon:
|
|
738
|
+
const t = B("editor");
|
|
739
|
+
return () => e("div", null, [e(b, {
|
|
740
|
+
icon: le,
|
|
737
741
|
tooltip: "左边对齐",
|
|
738
742
|
isActive: t?.value?.isActive({
|
|
739
743
|
textAlign: "left"
|
|
740
744
|
}),
|
|
741
745
|
onClick: () => t?.value?.chain().focus().setTextAlign("left").run()
|
|
742
|
-
}, null), e(
|
|
743
|
-
icon:
|
|
746
|
+
}, null), e(b, {
|
|
747
|
+
icon: ne,
|
|
744
748
|
tooltip: "中间对齐",
|
|
745
749
|
isActive: t?.value?.isActive({
|
|
746
750
|
textAlign: "center"
|
|
747
751
|
}),
|
|
748
752
|
onClick: () => t?.value?.chain().focus().setTextAlign("center").run()
|
|
749
|
-
}, null), e(
|
|
750
|
-
icon:
|
|
753
|
+
}, null), e(b, {
|
|
754
|
+
icon: oe,
|
|
751
755
|
tooltip: "右边对齐",
|
|
752
756
|
isActive: t?.value?.isActive({
|
|
753
757
|
textAlign: "right"
|
|
754
758
|
}),
|
|
755
759
|
onClick: () => t?.value?.chain().focus().setTextAlign("right").run()
|
|
756
|
-
}, null), e(
|
|
757
|
-
icon:
|
|
760
|
+
}, null), e(b, {
|
|
761
|
+
icon: e1,
|
|
758
762
|
tooltip: "两端对齐",
|
|
759
763
|
isActive: t?.value?.isActive({
|
|
760
764
|
textAlign: "justify"
|
|
@@ -762,7 +766,7 @@ const Ye = De.extend({
|
|
|
762
766
|
onClick: () => t?.value?.chain().focus().setTextAlign("justify").run()
|
|
763
767
|
}, null)]);
|
|
764
768
|
}
|
|
765
|
-
}),
|
|
769
|
+
}), l1 = /* @__PURE__ */ c({
|
|
766
770
|
name: "ListIcon",
|
|
767
771
|
setup(t, {
|
|
768
772
|
attrs: l
|
|
@@ -805,7 +809,7 @@ const Ye = De.extend({
|
|
|
805
809
|
fill: "currentColor"
|
|
806
810
|
}, null)]);
|
|
807
811
|
}
|
|
808
|
-
}),
|
|
812
|
+
}), n1 = /* @__PURE__ */ c({
|
|
809
813
|
name: "ListOrderedIcon",
|
|
810
814
|
setup(t, {
|
|
811
815
|
attrs: l
|
|
@@ -848,7 +852,7 @@ const Ye = De.extend({
|
|
|
848
852
|
fill: "currentColor"
|
|
849
853
|
}, null)]);
|
|
850
854
|
}
|
|
851
|
-
}),
|
|
855
|
+
}), o1 = /* @__PURE__ */ c({
|
|
852
856
|
name: "ListTodoIcon",
|
|
853
857
|
setup(t, {
|
|
854
858
|
attrs: l
|
|
@@ -886,28 +890,28 @@ const Ye = De.extend({
|
|
|
886
890
|
fill: "currentColor"
|
|
887
891
|
}, null)]);
|
|
888
892
|
}
|
|
889
|
-
}),
|
|
893
|
+
}), i1 = /* @__PURE__ */ c({
|
|
890
894
|
name: "ListButton",
|
|
891
895
|
setup() {
|
|
892
|
-
const t =
|
|
893
|
-
return () => e("div", null, [e(
|
|
894
|
-
icon:
|
|
896
|
+
const t = B("editor");
|
|
897
|
+
return () => e("div", null, [e(b, {
|
|
898
|
+
icon: l1,
|
|
895
899
|
tooltip: "无序列表",
|
|
896
900
|
isActive: t?.value?.isActive("bulletList"),
|
|
897
901
|
onClick: () => t?.value?.chain().focus().toggleBulletList().run()
|
|
898
|
-
}, null), e(
|
|
899
|
-
icon:
|
|
902
|
+
}, null), e(b, {
|
|
903
|
+
icon: n1,
|
|
900
904
|
tooltip: "有序列表",
|
|
901
905
|
isActive: t?.value?.isActive("orderedList"),
|
|
902
906
|
onClick: () => t?.value?.chain().focus().toggleOrderedList().run()
|
|
903
|
-
}, null), e(
|
|
904
|
-
icon:
|
|
907
|
+
}, null), e(b, {
|
|
908
|
+
icon: o1,
|
|
905
909
|
tooltip: "任务列表",
|
|
906
910
|
isActive: t?.value?.isActive("taskList"),
|
|
907
911
|
onClick: () => t?.value?.chain().focus().toggleTaskList().run()
|
|
908
912
|
}, null)]);
|
|
909
913
|
}
|
|
910
|
-
}),
|
|
914
|
+
}), u1 = /* @__PURE__ */ c({
|
|
911
915
|
name: "ImagePlusIcon",
|
|
912
916
|
setup(t, {
|
|
913
917
|
attrs: l
|
|
@@ -925,17 +929,17 @@ const Ye = De.extend({
|
|
|
925
929
|
fill: "currentColor"
|
|
926
930
|
}, null)]);
|
|
927
931
|
}
|
|
928
|
-
}),
|
|
932
|
+
}), r1 = /* @__PURE__ */ c({
|
|
929
933
|
name: "ImageButton",
|
|
930
934
|
setup() {
|
|
931
|
-
const t =
|
|
932
|
-
return () => e("div", null, [e(
|
|
933
|
-
icon:
|
|
935
|
+
const t = B("editor");
|
|
936
|
+
return () => e("div", null, [e(b, {
|
|
937
|
+
icon: u1,
|
|
934
938
|
tooltip: "图片",
|
|
935
939
|
onClick: () => t?.value?.commands.setImageUploadNode()
|
|
936
940
|
}, null)]);
|
|
937
941
|
}
|
|
938
|
-
}),
|
|
942
|
+
}), a1 = /* @__PURE__ */ c({
|
|
939
943
|
name: "TableIcon",
|
|
940
944
|
setup(t, {
|
|
941
945
|
attrs: l
|
|
@@ -953,42 +957,42 @@ const Ye = De.extend({
|
|
|
953
957
|
fill: "currentColor"
|
|
954
958
|
}, null)]);
|
|
955
959
|
}
|
|
956
|
-
}),
|
|
960
|
+
}), s1 = 8, c1 = 8, d1 = /* @__PURE__ */ c({
|
|
957
961
|
name: "TableButton",
|
|
958
962
|
setup() {
|
|
959
|
-
const t =
|
|
960
|
-
n.value =
|
|
961
|
-
},
|
|
962
|
-
n.value = 0,
|
|
963
|
-
},
|
|
963
|
+
const t = B("editor"), l = H(!1), n = H(0), o = H(0), u = (g, r) => {
|
|
964
|
+
n.value = g, o.value = r;
|
|
965
|
+
}, s = () => {
|
|
966
|
+
n.value = 0, o.value = 0;
|
|
967
|
+
}, f = (g, r) => {
|
|
964
968
|
t?.value?.chain().focus().insertTable({
|
|
965
|
-
rows:
|
|
966
|
-
cols:
|
|
969
|
+
rows: r,
|
|
970
|
+
cols: g,
|
|
967
971
|
withHeaderRow: !0
|
|
968
972
|
}).run(), l.value = !1;
|
|
969
973
|
};
|
|
970
|
-
return () => e(
|
|
974
|
+
return () => e(J, {
|
|
971
975
|
visible: l.value,
|
|
972
|
-
"onUpdate:visible": (
|
|
976
|
+
"onUpdate:visible": (g) => l.value = g,
|
|
973
977
|
trigger: "click",
|
|
974
978
|
placement: "bottom-start",
|
|
975
979
|
popperClass: "table-picker-popper",
|
|
976
980
|
width: "auto",
|
|
977
981
|
showArrow: !1
|
|
978
982
|
}, {
|
|
979
|
-
reference: () => e("span", null, [e(
|
|
983
|
+
reference: () => e("span", null, [e(R, {
|
|
980
984
|
content: "表格",
|
|
981
985
|
showArrow: !1,
|
|
982
986
|
offset: 6,
|
|
983
987
|
disabled: l.value
|
|
984
988
|
}, {
|
|
985
|
-
default: () => [e(
|
|
989
|
+
default: () => [e(Z, {
|
|
986
990
|
text: !0,
|
|
987
991
|
class: ["tiptap-button", {
|
|
988
992
|
"is-active": l.value
|
|
989
993
|
}]
|
|
990
994
|
}, {
|
|
991
|
-
default: () => [e(
|
|
995
|
+
default: () => [e(a1, {
|
|
992
996
|
class: "tiptap-button-icon"
|
|
993
997
|
}, null)]
|
|
994
998
|
})]
|
|
@@ -997,34 +1001,34 @@ const Ye = De.extend({
|
|
|
997
1001
|
class: "table-picker"
|
|
998
1002
|
}, [e("div", {
|
|
999
1003
|
class: "table-picker-grid",
|
|
1000
|
-
onMouseleave:
|
|
1004
|
+
onMouseleave: s
|
|
1001
1005
|
}, [Array.from({
|
|
1002
|
-
length:
|
|
1003
|
-
}, (
|
|
1004
|
-
key:
|
|
1006
|
+
length: c1
|
|
1007
|
+
}, (g, r) => e("div", {
|
|
1008
|
+
key: r,
|
|
1005
1009
|
class: "table-picker-row"
|
|
1006
1010
|
}, [Array.from({
|
|
1007
|
-
length:
|
|
1008
|
-
}, (
|
|
1009
|
-
key:
|
|
1011
|
+
length: s1
|
|
1012
|
+
}, (C, i) => e("div", {
|
|
1013
|
+
key: i,
|
|
1010
1014
|
class: ["table-picker-cell", {
|
|
1011
|
-
"is-active":
|
|
1015
|
+
"is-active": i < n.value && r < o.value
|
|
1012
1016
|
}],
|
|
1013
|
-
onMouseenter: () =>
|
|
1014
|
-
onClick: () =>
|
|
1017
|
+
onMouseenter: () => u(i + 1, r + 1),
|
|
1018
|
+
onClick: () => f(i + 1, r + 1)
|
|
1015
1019
|
}, null))]))]), e("div", {
|
|
1016
1020
|
class: "table-picker-footer"
|
|
1017
1021
|
}, [e("div", {
|
|
1018
1022
|
class: "table-picker-counter"
|
|
1019
|
-
}, [e("span", null, [
|
|
1023
|
+
}, [e("span", null, [m("列")]), e("span", null, [n.value || 1])]), e("span", {
|
|
1020
1024
|
class: "table-picker-x"
|
|
1021
|
-
}, [
|
|
1025
|
+
}, [m("x")]), e("div", {
|
|
1022
1026
|
class: "table-picker-counter"
|
|
1023
|
-
}, [e("span", null, [
|
|
1027
|
+
}, [e("span", null, [m("行")]), e("span", null, [o.value || 1])])])])
|
|
1024
1028
|
});
|
|
1025
1029
|
}
|
|
1026
1030
|
});
|
|
1027
|
-
function
|
|
1031
|
+
function p1(t) {
|
|
1028
1032
|
let l = t.nodeType === Node.TEXT_NODE ? t.parentElement : t;
|
|
1029
1033
|
for (; l && l instanceof HTMLElement; ) {
|
|
1030
1034
|
if (l.tagName === "TD" || l.tagName === "TH") return l;
|
|
@@ -1032,106 +1036,106 @@ function T1(t) {
|
|
|
1032
1036
|
}
|
|
1033
1037
|
return null;
|
|
1034
1038
|
}
|
|
1035
|
-
function
|
|
1039
|
+
function C1(t) {
|
|
1036
1040
|
if (!t.isActive("tableCell") && !t.isActive("tableHeader")) return null;
|
|
1037
1041
|
const {
|
|
1038
1042
|
node: l
|
|
1039
|
-
} = t.view.domAtPos(t.state.selection.from), n =
|
|
1043
|
+
} = t.view.domAtPos(t.state.selection.from), n = p1(l);
|
|
1040
1044
|
if (!n) return null;
|
|
1041
|
-
const
|
|
1042
|
-
if (!
|
|
1043
|
-
const
|
|
1045
|
+
const o = n.parentElement, u = o.parentElement, s = n.closest("table");
|
|
1046
|
+
if (!s) return null;
|
|
1047
|
+
const f = Array.from(o.children).indexOf(n), g = Array.from(u.children).indexOf(o), r = o.children.length, C = u.children.length, i = n.getBoundingClientRect(), p = s.getBoundingClientRect(), w = t.view.dom.closest(".tiptap-editor").getBoundingClientRect();
|
|
1044
1048
|
return {
|
|
1045
1049
|
cell: n,
|
|
1046
|
-
colIndex:
|
|
1047
|
-
rowIndex:
|
|
1048
|
-
totalCols:
|
|
1049
|
-
totalRows:
|
|
1050
|
-
cellRect:
|
|
1051
|
-
tableRect:
|
|
1052
|
-
editorRect:
|
|
1050
|
+
colIndex: f,
|
|
1051
|
+
rowIndex: g,
|
|
1052
|
+
totalCols: r,
|
|
1053
|
+
totalRows: C,
|
|
1054
|
+
cellRect: i,
|
|
1055
|
+
tableRect: p,
|
|
1056
|
+
editorRect: w
|
|
1053
1057
|
};
|
|
1054
1058
|
}
|
|
1055
|
-
function
|
|
1059
|
+
function K(t) {
|
|
1056
1060
|
const {
|
|
1057
1061
|
state: l
|
|
1058
1062
|
} = t, n = l.selection.from;
|
|
1059
|
-
let
|
|
1060
|
-
return l.doc.nodesBetween(0, l.doc.content.size, (
|
|
1061
|
-
if (
|
|
1062
|
-
return
|
|
1063
|
-
node:
|
|
1064
|
-
pos:
|
|
1063
|
+
let o = null;
|
|
1064
|
+
return l.doc.nodesBetween(0, l.doc.content.size, (u, s) => {
|
|
1065
|
+
if (u.type.name === "table" && s <= n && n <= s + u.nodeSize)
|
|
1066
|
+
return o = {
|
|
1067
|
+
node: u,
|
|
1068
|
+
pos: s
|
|
1065
1069
|
}, !1;
|
|
1066
|
-
}),
|
|
1070
|
+
}), o;
|
|
1067
1071
|
}
|
|
1068
|
-
const
|
|
1072
|
+
const v1 = /* @__PURE__ */ c({
|
|
1069
1073
|
name: "TableControls",
|
|
1070
1074
|
setup() {
|
|
1071
|
-
const t =
|
|
1072
|
-
function
|
|
1073
|
-
const
|
|
1074
|
-
if (
|
|
1075
|
+
const t = B("editor"), l = B("readonly"), n = H(null), o = H(null);
|
|
1076
|
+
function u() {
|
|
1077
|
+
const i = t?.value;
|
|
1078
|
+
if (o.value && (o.value.classList.remove("tcc-cell-focused"), o.value = null), !i) {
|
|
1075
1079
|
n.value = null;
|
|
1076
1080
|
return;
|
|
1077
1081
|
}
|
|
1078
|
-
const
|
|
1079
|
-
n.value =
|
|
1082
|
+
const p = C1(i);
|
|
1083
|
+
n.value = p, p && (p.cell.classList.add("tcc-cell-focused"), o.value = p.cell);
|
|
1080
1084
|
}
|
|
1081
|
-
|
|
1082
|
-
const
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
+
G((i) => {
|
|
1086
|
+
const p = t?.value;
|
|
1087
|
+
p && (p.on("selectionUpdate", u), p.on("transaction", u), i(() => {
|
|
1088
|
+
p.off("selectionUpdate", u), p.off("transaction", u), o.value && (o.value.classList.remove("tcc-cell-focused"), o.value = null);
|
|
1085
1089
|
}));
|
|
1086
1090
|
});
|
|
1087
|
-
function
|
|
1088
|
-
const
|
|
1089
|
-
if (!
|
|
1091
|
+
function s(i) {
|
|
1092
|
+
const p = t?.value;
|
|
1093
|
+
if (!p || !n.value) return;
|
|
1090
1094
|
const {
|
|
1091
|
-
colIndex:
|
|
1092
|
-
totalCols:
|
|
1093
|
-
} = n.value,
|
|
1094
|
-
if (
|
|
1095
|
-
const
|
|
1096
|
-
if (!
|
|
1095
|
+
colIndex: w,
|
|
1096
|
+
totalCols: I
|
|
1097
|
+
} = n.value, x = i === "left" ? w - 1 : w + 1;
|
|
1098
|
+
if (x < 0 || x >= I) return;
|
|
1099
|
+
const a = K(p);
|
|
1100
|
+
if (!a) return;
|
|
1097
1101
|
const {
|
|
1098
|
-
node:
|
|
1099
|
-
pos:
|
|
1100
|
-
} =
|
|
1101
|
-
|
|
1102
|
-
if (
|
|
1103
|
-
|
|
1102
|
+
node: d,
|
|
1103
|
+
pos: v
|
|
1104
|
+
} = a, h = [];
|
|
1105
|
+
d.forEach((L) => {
|
|
1106
|
+
if (L.type.name !== "tableRow") {
|
|
1107
|
+
h.push(L);
|
|
1104
1108
|
return;
|
|
1105
1109
|
}
|
|
1106
|
-
const
|
|
1107
|
-
|
|
1108
|
-
const
|
|
1109
|
-
|
|
1110
|
+
const y = [];
|
|
1111
|
+
L.forEach((U) => y.push(U));
|
|
1112
|
+
const S = y[w];
|
|
1113
|
+
y[w] = y[x], y[x] = S, h.push(L.type.create(L.attrs, y, L.marks));
|
|
1110
1114
|
});
|
|
1111
|
-
const
|
|
1112
|
-
|
|
1115
|
+
const A = d.type.create(d.attrs, h, d.marks), T = p.state.tr.replaceWith(v, v + d.nodeSize, A);
|
|
1116
|
+
p.view.dispatch(T);
|
|
1113
1117
|
}
|
|
1114
|
-
function
|
|
1115
|
-
const
|
|
1116
|
-
if (!
|
|
1118
|
+
function f(i) {
|
|
1119
|
+
const p = t?.value;
|
|
1120
|
+
if (!p || !n.value) return;
|
|
1117
1121
|
const {
|
|
1118
|
-
rowIndex:
|
|
1119
|
-
totalRows:
|
|
1120
|
-
} = n.value,
|
|
1121
|
-
if (
|
|
1122
|
-
const
|
|
1123
|
-
if (!
|
|
1122
|
+
rowIndex: w,
|
|
1123
|
+
totalRows: I
|
|
1124
|
+
} = n.value, x = i === "up" ? w - 1 : w + 1;
|
|
1125
|
+
if (x < 0 || x >= I) return;
|
|
1126
|
+
const a = K(p);
|
|
1127
|
+
if (!a) return;
|
|
1124
1128
|
const {
|
|
1125
|
-
node:
|
|
1126
|
-
pos:
|
|
1127
|
-
} =
|
|
1128
|
-
|
|
1129
|
-
const
|
|
1130
|
-
|
|
1131
|
-
const
|
|
1132
|
-
|
|
1129
|
+
node: d,
|
|
1130
|
+
pos: v
|
|
1131
|
+
} = a, h = [];
|
|
1132
|
+
d.forEach((y) => h.push(y));
|
|
1133
|
+
const A = h[w];
|
|
1134
|
+
h[w] = h[x], h[x] = A;
|
|
1135
|
+
const T = d.type.create(d.attrs, h, d.marks), L = p.state.tr.replaceWith(v, v + d.nodeSize, T);
|
|
1136
|
+
p.view.dispatch(L);
|
|
1133
1137
|
}
|
|
1134
|
-
const
|
|
1138
|
+
const g = () => e("svg", {
|
|
1135
1139
|
width: "16",
|
|
1136
1140
|
height: "4",
|
|
1137
1141
|
viewBox: "0 0 16 4",
|
|
@@ -1148,7 +1152,7 @@ const F1 = /* @__PURE__ */ d({
|
|
|
1148
1152
|
cx: "14",
|
|
1149
1153
|
cy: "2",
|
|
1150
1154
|
r: "1.5"
|
|
1151
|
-
}, null)]),
|
|
1155
|
+
}, null)]), r = () => e("svg", {
|
|
1152
1156
|
width: "4",
|
|
1153
1157
|
height: "16",
|
|
1154
1158
|
viewBox: "0 0 4 16",
|
|
@@ -1165,7 +1169,7 @@ const F1 = /* @__PURE__ */ d({
|
|
|
1165
1169
|
cx: "2",
|
|
1166
1170
|
cy: "14",
|
|
1167
1171
|
r: "1.5"
|
|
1168
|
-
}, null)]),
|
|
1172
|
+
}, null)]), C = () => e("svg", {
|
|
1169
1173
|
width: "10",
|
|
1170
1174
|
height: "10",
|
|
1171
1175
|
viewBox: "0 0 10 10",
|
|
@@ -1178,121 +1182,121 @@ const F1 = /* @__PURE__ */ d({
|
|
|
1178
1182
|
}, null)]);
|
|
1179
1183
|
return () => {
|
|
1180
1184
|
if (l?.value) return null;
|
|
1181
|
-
const
|
|
1182
|
-
if (!
|
|
1185
|
+
const i = n.value;
|
|
1186
|
+
if (!i) return null;
|
|
1183
1187
|
const {
|
|
1184
|
-
colIndex:
|
|
1185
|
-
rowIndex:
|
|
1186
|
-
totalCols:
|
|
1187
|
-
totalRows:
|
|
1188
|
-
cellRect:
|
|
1189
|
-
tableRect:
|
|
1190
|
-
editorRect:
|
|
1191
|
-
} =
|
|
1188
|
+
colIndex: p,
|
|
1189
|
+
rowIndex: w,
|
|
1190
|
+
totalCols: I,
|
|
1191
|
+
totalRows: x,
|
|
1192
|
+
cellRect: a,
|
|
1193
|
+
tableRect: d,
|
|
1194
|
+
editorRect: v
|
|
1195
|
+
} = i, h = d.top - v.top, A = d.left - v.left, T = d.right - v.left, L = d.bottom - v.top, y = a.left - v.left, S = a.top - v.top, U = a.width, O = a.height, ie = {
|
|
1192
1196
|
position: "absolute",
|
|
1193
|
-
top: `${
|
|
1194
|
-
left: `${
|
|
1195
|
-
},
|
|
1197
|
+
top: `${h - 20}px`,
|
|
1198
|
+
left: `${y + U / 2 - 18}px`
|
|
1199
|
+
}, ue = {
|
|
1196
1200
|
position: "absolute",
|
|
1197
|
-
top: `${
|
|
1198
|
-
left: `${
|
|
1199
|
-
},
|
|
1201
|
+
top: `${S + O / 2 - 18}px`,
|
|
1202
|
+
left: `${A - 20}px`
|
|
1203
|
+
}, re = {
|
|
1200
1204
|
position: "absolute",
|
|
1201
|
-
top: `${
|
|
1202
|
-
left: `${
|
|
1203
|
-
},
|
|
1205
|
+
top: `${S + O / 2 - 12}px`,
|
|
1206
|
+
left: `${T + 6}px`
|
|
1207
|
+
}, ae = {
|
|
1204
1208
|
position: "absolute",
|
|
1205
|
-
top: `${
|
|
1206
|
-
left: `${
|
|
1207
|
-
},
|
|
1209
|
+
top: `${L + 6}px`,
|
|
1210
|
+
left: `${y + U / 2 - 12}px`
|
|
1211
|
+
}, se = p === 0, $ = p === I - 1, ce = w === 0, N = w === x - 1, F = t?.value;
|
|
1208
1212
|
return e("div", {
|
|
1209
1213
|
class: "table-cell-controls"
|
|
1210
|
-
}, [e(
|
|
1214
|
+
}, [e(j, {
|
|
1211
1215
|
trigger: "click",
|
|
1212
1216
|
placement: "bottom",
|
|
1213
|
-
style:
|
|
1214
|
-
onCommand: (
|
|
1215
|
-
|
|
1217
|
+
style: ie,
|
|
1218
|
+
onCommand: (M) => {
|
|
1219
|
+
M === "move-left" ? s("left") : M === "move-right" ? s("right") : M === "insert-left" ? F?.chain().focus().addColumnBefore().run() : M === "insert-right" ? F?.chain().focus().addColumnAfter().run() : M === "delete" && F?.chain().focus().deleteColumn().run();
|
|
1216
1220
|
}
|
|
1217
1221
|
}, {
|
|
1218
1222
|
default: () => [e("button", {
|
|
1219
1223
|
class: "tcc-btn tcc-btn--col"
|
|
1220
|
-
}, [e(
|
|
1221
|
-
dropdown: () => e(
|
|
1222
|
-
default: () => [e(
|
|
1224
|
+
}, [e(g, null, null)])],
|
|
1225
|
+
dropdown: () => e(W, null, {
|
|
1226
|
+
default: () => [e(E, {
|
|
1223
1227
|
command: "move-left",
|
|
1224
|
-
disabled:
|
|
1228
|
+
disabled: se
|
|
1225
1229
|
}, {
|
|
1226
|
-
default: () => [
|
|
1227
|
-
}), e(
|
|
1230
|
+
default: () => [m("移动列到左侧")]
|
|
1231
|
+
}), e(E, {
|
|
1228
1232
|
command: "move-right",
|
|
1229
|
-
disabled:
|
|
1233
|
+
disabled: $
|
|
1230
1234
|
}, {
|
|
1231
|
-
default: () => [
|
|
1232
|
-
}), e(
|
|
1235
|
+
default: () => [m("移动列到右侧")]
|
|
1236
|
+
}), e(E, {
|
|
1233
1237
|
command: "insert-left"
|
|
1234
1238
|
}, {
|
|
1235
|
-
default: () => [
|
|
1236
|
-
}), e(
|
|
1239
|
+
default: () => [m("在左侧插入一列")]
|
|
1240
|
+
}), e(E, {
|
|
1237
1241
|
command: "insert-right"
|
|
1238
1242
|
}, {
|
|
1239
|
-
default: () => [
|
|
1240
|
-
}), e(
|
|
1243
|
+
default: () => [m("在右侧插入一列")]
|
|
1244
|
+
}), e(E, {
|
|
1241
1245
|
command: "delete",
|
|
1242
1246
|
divided: !0
|
|
1243
1247
|
}, {
|
|
1244
|
-
default: () => [
|
|
1248
|
+
default: () => [m("删除列")]
|
|
1245
1249
|
})]
|
|
1246
1250
|
})
|
|
1247
|
-
}), e(
|
|
1251
|
+
}), e(j, {
|
|
1248
1252
|
trigger: "click",
|
|
1249
1253
|
placement: "right",
|
|
1250
|
-
style:
|
|
1251
|
-
onCommand: (
|
|
1252
|
-
|
|
1254
|
+
style: ue,
|
|
1255
|
+
onCommand: (M) => {
|
|
1256
|
+
M === "move-up" ? f("up") : M === "move-down" ? f("down") : M === "insert-above" ? F?.chain().focus().addRowBefore().run() : M === "insert-below" ? F?.chain().focus().addRowAfter().run() : M === "delete" && F?.chain().focus().deleteRow().run();
|
|
1253
1257
|
}
|
|
1254
1258
|
}, {
|
|
1255
1259
|
default: () => [e("button", {
|
|
1256
1260
|
class: "tcc-btn tcc-btn--row"
|
|
1257
|
-
}, [e(
|
|
1258
|
-
dropdown: () => e(
|
|
1259
|
-
default: () => [e(
|
|
1261
|
+
}, [e(r, null, null)])],
|
|
1262
|
+
dropdown: () => e(W, null, {
|
|
1263
|
+
default: () => [e(E, {
|
|
1260
1264
|
command: "move-up",
|
|
1261
|
-
disabled:
|
|
1265
|
+
disabled: ce
|
|
1262
1266
|
}, {
|
|
1263
|
-
default: () => [
|
|
1264
|
-
}), e(
|
|
1267
|
+
default: () => [m("上移")]
|
|
1268
|
+
}), e(E, {
|
|
1265
1269
|
command: "move-down",
|
|
1266
|
-
disabled:
|
|
1270
|
+
disabled: N
|
|
1267
1271
|
}, {
|
|
1268
|
-
default: () => [
|
|
1269
|
-
}), e(
|
|
1272
|
+
default: () => [m("下移")]
|
|
1273
|
+
}), e(E, {
|
|
1270
1274
|
command: "insert-above"
|
|
1271
1275
|
}, {
|
|
1272
|
-
default: () => [
|
|
1273
|
-
}), e(
|
|
1276
|
+
default: () => [m("在上方插入一行")]
|
|
1277
|
+
}), e(E, {
|
|
1274
1278
|
command: "insert-below"
|
|
1275
1279
|
}, {
|
|
1276
|
-
default: () => [
|
|
1277
|
-
}), e(
|
|
1280
|
+
default: () => [m("在下方插入一行")]
|
|
1281
|
+
}), e(E, {
|
|
1278
1282
|
command: "delete",
|
|
1279
1283
|
divided: !0
|
|
1280
1284
|
}, {
|
|
1281
|
-
default: () => [
|
|
1285
|
+
default: () => [m("删除行")]
|
|
1282
1286
|
})]
|
|
1283
1287
|
})
|
|
1284
|
-
}),
|
|
1288
|
+
}), $ && e("button", {
|
|
1285
1289
|
class: "tcc-btn tcc-btn--add",
|
|
1286
|
-
style:
|
|
1287
|
-
onClick: () =>
|
|
1288
|
-
}, [e(
|
|
1290
|
+
style: re,
|
|
1291
|
+
onClick: () => F?.chain().focus().addColumnAfter().run()
|
|
1292
|
+
}, [e(C, null, null)]), N && e("button", {
|
|
1289
1293
|
class: "tcc-btn tcc-btn--add",
|
|
1290
|
-
style:
|
|
1291
|
-
onClick: () =>
|
|
1292
|
-
}, [e(
|
|
1294
|
+
style: ae,
|
|
1295
|
+
onClick: () => F?.chain().focus().addRowAfter().run()
|
|
1296
|
+
}, [e(C, null, null)])]);
|
|
1293
1297
|
};
|
|
1294
1298
|
}
|
|
1295
|
-
}),
|
|
1299
|
+
}), f1 = /* @__PURE__ */ c({
|
|
1296
1300
|
name: "MathIcon",
|
|
1297
1301
|
setup(t, {
|
|
1298
1302
|
attrs: l
|
|
@@ -1310,145 +1314,158 @@ const F1 = /* @__PURE__ */ d({
|
|
|
1310
1314
|
fill: "currentColor"
|
|
1311
1315
|
}, null)]);
|
|
1312
1316
|
}
|
|
1313
|
-
}),
|
|
1317
|
+
}), h1 = /* @__PURE__ */ c({
|
|
1314
1318
|
name: "MathButton",
|
|
1315
1319
|
setup() {
|
|
1316
|
-
const t =
|
|
1317
|
-
return () => e(
|
|
1318
|
-
icon:
|
|
1320
|
+
const t = B("editor"), l = B("openMathDialog");
|
|
1321
|
+
return () => e(b, {
|
|
1322
|
+
icon: f1,
|
|
1319
1323
|
tooltip: "数学公式",
|
|
1320
1324
|
isActive: t?.value?.isActive("inlineMath") || t?.value?.isActive("blockMath"),
|
|
1321
1325
|
onClick: () => l?.()
|
|
1322
1326
|
}, null);
|
|
1323
1327
|
}
|
|
1324
|
-
}),
|
|
1325
|
-
|
|
1326
|
-
class: "math-preview__placeholder"
|
|
1327
|
-
}, U1 = ["innerHTML"], $1 = /* @__PURE__ */ d({
|
|
1328
|
-
__name: "MathEditDialog",
|
|
1328
|
+
}), g1 = /* @__PURE__ */ c({
|
|
1329
|
+
name: "MathEditDialog",
|
|
1329
1330
|
props: {
|
|
1330
|
-
visible: {
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1331
|
+
visible: {
|
|
1332
|
+
type: Boolean,
|
|
1333
|
+
required: !0
|
|
1334
|
+
},
|
|
1335
|
+
latex: {
|
|
1336
|
+
type: String,
|
|
1337
|
+
required: !0
|
|
1338
|
+
},
|
|
1339
|
+
pos: {
|
|
1340
|
+
type: Number,
|
|
1341
|
+
default: null
|
|
1342
|
+
},
|
|
1343
|
+
type: {
|
|
1344
|
+
type: String,
|
|
1345
|
+
required: !0
|
|
1346
|
+
}
|
|
1334
1347
|
},
|
|
1335
1348
|
emits: ["update:visible"],
|
|
1336
|
-
setup(t, {
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
}, {
|
|
1343
|
-
|
|
1344
|
-
|
|
1349
|
+
setup(t, {
|
|
1350
|
+
emit: l
|
|
1351
|
+
}) {
|
|
1352
|
+
const n = B("editor"), o = H(""), u = H("inline");
|
|
1353
|
+
D(() => t.latex, (r) => {
|
|
1354
|
+
o.value = r;
|
|
1355
|
+
}, {
|
|
1356
|
+
immediate: !0
|
|
1357
|
+
}), D(() => t.type, (r) => {
|
|
1358
|
+
u.value = r;
|
|
1359
|
+
}, {
|
|
1360
|
+
immediate: !0
|
|
1361
|
+
});
|
|
1362
|
+
const s = V(() => t.pos === null), f = V(() => o.value.trim() ? _e.renderToString(o.value, {
|
|
1363
|
+
displayMode: u.value === "block",
|
|
1345
1364
|
throwOnError: !1
|
|
1346
|
-
}) : ""),
|
|
1347
|
-
const
|
|
1348
|
-
if (!(!
|
|
1349
|
-
if (
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1365
|
+
}) : ""), g = () => {
|
|
1366
|
+
const r = n?.value;
|
|
1367
|
+
if (!(!r || !o.value.trim())) {
|
|
1368
|
+
if (s.value)
|
|
1369
|
+
u.value === "inline" ? r.chain().focus().insertInlineMath({
|
|
1370
|
+
latex: o.value
|
|
1371
|
+
}).run() : r.chain().focus().insertBlockMath({
|
|
1372
|
+
latex: o.value
|
|
1373
|
+
}).run();
|
|
1374
|
+
else if (u.value === t.type)
|
|
1375
|
+
t.type === "inline" ? r.commands.updateInlineMath({
|
|
1376
|
+
latex: o.value,
|
|
1377
|
+
pos: t.pos
|
|
1378
|
+
}) : r.commands.updateBlockMath({
|
|
1379
|
+
latex: o.value,
|
|
1380
|
+
pos: t.pos
|
|
1381
|
+
});
|
|
1353
1382
|
else {
|
|
1354
|
-
const
|
|
1355
|
-
|
|
1383
|
+
const C = t.pos;
|
|
1384
|
+
t.type === "inline" ? r.chain().focus().deleteInlineMath({
|
|
1385
|
+
pos: C
|
|
1386
|
+
}).insertBlockMath({
|
|
1387
|
+
latex: o.value
|
|
1388
|
+
}).run() : r.chain().focus().deleteBlockMath({
|
|
1389
|
+
pos: C
|
|
1390
|
+
}).insertInlineMath({
|
|
1391
|
+
latex: o.value
|
|
1392
|
+
}).run();
|
|
1356
1393
|
}
|
|
1357
|
-
|
|
1394
|
+
l("update:visible", !1);
|
|
1358
1395
|
}
|
|
1359
1396
|
};
|
|
1360
|
-
return (
|
|
1361
|
-
|
|
1362
|
-
title:
|
|
1397
|
+
return () => e(Se, {
|
|
1398
|
+
modelValue: t.visible,
|
|
1399
|
+
title: s.value ? "插入数学公式" : "编辑数学公式",
|
|
1363
1400
|
width: "520px",
|
|
1364
|
-
"onUpdate:modelValue":
|
|
1401
|
+
"onUpdate:modelValue": (r) => l("update:visible", r)
|
|
1365
1402
|
}, {
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1403
|
+
default: () => [e("div", {
|
|
1404
|
+
class: "math-dialog"
|
|
1405
|
+
}, [e(Ue, {
|
|
1406
|
+
modelValue: u.value,
|
|
1407
|
+
"onUpdate:modelValue": (r) => {
|
|
1408
|
+
u.value = r;
|
|
1409
|
+
}
|
|
1410
|
+
}, {
|
|
1411
|
+
default: () => [e(q, {
|
|
1412
|
+
value: "inline"
|
|
1369
1413
|
}, {
|
|
1370
|
-
default:
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
_: 1
|
|
1374
|
-
}),
|
|
1375
|
-
e(g(U), {
|
|
1376
|
-
type: "primary",
|
|
1377
|
-
disabled: !u.value.trim(),
|
|
1378
|
-
onClick: y
|
|
1414
|
+
default: () => [m("行内公式")]
|
|
1415
|
+
}), e(q, {
|
|
1416
|
+
value: "block"
|
|
1379
1417
|
}, {
|
|
1380
|
-
default:
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
type: "textarea",
|
|
1412
|
-
rows: 3,
|
|
1413
|
-
placeholder: "请输入 LaTeX 公式,例如:E=mc^2"
|
|
1414
|
-
}, null, 8, ["modelValue"]),
|
|
1415
|
-
L("div", {
|
|
1416
|
-
class: ne(["math-preview", { "math-preview--empty": !h.value }])
|
|
1417
|
-
}, [
|
|
1418
|
-
h.value ? (Z(), R("div", {
|
|
1419
|
-
key: 1,
|
|
1420
|
-
innerHTML: h.value
|
|
1421
|
-
}, null, 8, U1)) : (Z(), R("span", S1, "预览将在此处显示"))
|
|
1422
|
-
], 2)
|
|
1423
|
-
])
|
|
1424
|
-
]),
|
|
1425
|
-
_: 1
|
|
1426
|
-
}, 8, ["model-value", "title"]));
|
|
1418
|
+
default: () => [m("块级公式")]
|
|
1419
|
+
})]
|
|
1420
|
+
}), e(X, {
|
|
1421
|
+
modelValue: o.value,
|
|
1422
|
+
type: "textarea",
|
|
1423
|
+
rows: 3,
|
|
1424
|
+
placeholder: "请输入 LaTeX 公式,例如:E=mc^2",
|
|
1425
|
+
"onUpdate:modelValue": (r) => {
|
|
1426
|
+
o.value = r;
|
|
1427
|
+
}
|
|
1428
|
+
}, null), e("div", {
|
|
1429
|
+
class: ["math-preview", {
|
|
1430
|
+
"math-preview--empty": !f.value
|
|
1431
|
+
}]
|
|
1432
|
+
}, [f.value ? e("div", {
|
|
1433
|
+
innerHTML: f.value
|
|
1434
|
+
}, null) : e("span", {
|
|
1435
|
+
class: "math-preview__placeholder"
|
|
1436
|
+
}, [m("预览将在此处显示")])])])],
|
|
1437
|
+
footer: () => e(de, null, [e(Z, {
|
|
1438
|
+
onClick: () => l("update:visible", !1)
|
|
1439
|
+
}, {
|
|
1440
|
+
default: () => [m("取消")]
|
|
1441
|
+
}), e(Z, {
|
|
1442
|
+
type: "primary",
|
|
1443
|
+
disabled: !o.value.trim(),
|
|
1444
|
+
onClick: g
|
|
1445
|
+
}, {
|
|
1446
|
+
default: () => [m("确认")]
|
|
1447
|
+
})])
|
|
1448
|
+
});
|
|
1427
1449
|
}
|
|
1428
|
-
}),
|
|
1429
|
-
const n = t.__vccOpts || t;
|
|
1430
|
-
for (const [r, s] of l)
|
|
1431
|
-
n[r] = s;
|
|
1432
|
-
return n;
|
|
1433
|
-
}, O1 = /* @__PURE__ */ z1($1, [["__scopeId", "data-v-995dc22f"]]), P1 = [{
|
|
1450
|
+
}), m1 = [{
|
|
1434
1451
|
value: "left",
|
|
1435
1452
|
title: "居左",
|
|
1436
|
-
Icon:
|
|
1453
|
+
Icon: le
|
|
1437
1454
|
}, {
|
|
1438
1455
|
value: "center",
|
|
1439
1456
|
title: "居中",
|
|
1440
|
-
Icon:
|
|
1457
|
+
Icon: ne
|
|
1441
1458
|
}, {
|
|
1442
1459
|
value: "right",
|
|
1443
1460
|
title: "居右",
|
|
1444
|
-
Icon:
|
|
1445
|
-
}],
|
|
1446
|
-
function
|
|
1461
|
+
Icon: oe
|
|
1462
|
+
}], _ = (t) => t.preventDefault();
|
|
1463
|
+
function w1(t) {
|
|
1447
1464
|
if (!t.isActive("image")) return null;
|
|
1448
1465
|
const {
|
|
1449
1466
|
selection: l
|
|
1450
1467
|
} = t.state;
|
|
1451
|
-
if (!(l instanceof
|
|
1468
|
+
if (!(l instanceof Me) || l.node.type.name !== "image") return null;
|
|
1452
1469
|
const n = l.node;
|
|
1453
1470
|
return {
|
|
1454
1471
|
pos: l.from,
|
|
@@ -1457,11 +1474,11 @@ function N1(t) {
|
|
|
1457
1474
|
align: n.attrs.align ?? "left"
|
|
1458
1475
|
};
|
|
1459
1476
|
}
|
|
1460
|
-
function
|
|
1477
|
+
function b1(t) {
|
|
1461
1478
|
const l = t.startsWith("data:") ? "image.png" : t.split("/").pop()?.split("?")[0] || "image.png", n = document.createElement("a");
|
|
1462
1479
|
n.href = t, n.download = l, document.body.appendChild(n), n.click(), document.body.removeChild(n);
|
|
1463
1480
|
}
|
|
1464
|
-
const
|
|
1481
|
+
const k1 = () => e("svg", {
|
|
1465
1482
|
width: "16",
|
|
1466
1483
|
height: "16",
|
|
1467
1484
|
viewBox: "0 0 24 24",
|
|
@@ -1479,7 +1496,7 @@ const W1 = () => e("svg", {
|
|
|
1479
1496
|
y1: "15",
|
|
1480
1497
|
x2: "12",
|
|
1481
1498
|
y2: "3"
|
|
1482
|
-
}, null)]),
|
|
1499
|
+
}, null)]), x1 = () => e("svg", {
|
|
1483
1500
|
width: "16",
|
|
1484
1501
|
height: "16",
|
|
1485
1502
|
viewBox: "0 0 24 24",
|
|
@@ -1492,7 +1509,7 @@ const W1 = () => e("svg", {
|
|
|
1492
1509
|
points: "1 4 1 10 7 10"
|
|
1493
1510
|
}, null), e("path", {
|
|
1494
1511
|
d: "M3.51 15a9 9 0 1 0 .49-4.1L1 10"
|
|
1495
|
-
}, null)]),
|
|
1512
|
+
}, null)]), H1 = () => e("svg", {
|
|
1496
1513
|
width: "16",
|
|
1497
1514
|
height: "16",
|
|
1498
1515
|
viewBox: "0 0 24 24",
|
|
@@ -1509,88 +1526,88 @@ const W1 = () => e("svg", {
|
|
|
1509
1526
|
d: "M10 11v6M14 11v6"
|
|
1510
1527
|
}, null), e("path", {
|
|
1511
1528
|
d: "M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2"
|
|
1512
|
-
}, null)]),
|
|
1529
|
+
}, null)]), B1 = /* @__PURE__ */ c({
|
|
1513
1530
|
name: "ImageControls",
|
|
1514
1531
|
setup() {
|
|
1515
|
-
const t =
|
|
1516
|
-
function
|
|
1517
|
-
const
|
|
1518
|
-
if (!
|
|
1532
|
+
const t = B("editor"), l = B("readonly"), n = H(null);
|
|
1533
|
+
function o() {
|
|
1534
|
+
const u = t?.value;
|
|
1535
|
+
if (!u) {
|
|
1519
1536
|
n.value = null;
|
|
1520
1537
|
return;
|
|
1521
1538
|
}
|
|
1522
|
-
n.value =
|
|
1539
|
+
n.value = w1(u);
|
|
1523
1540
|
}
|
|
1524
|
-
return
|
|
1525
|
-
const
|
|
1526
|
-
|
|
1527
|
-
|
|
1541
|
+
return G((u) => {
|
|
1542
|
+
const s = t?.value;
|
|
1543
|
+
s && (s.on("transaction", o), u(() => {
|
|
1544
|
+
s.off("transaction", o);
|
|
1528
1545
|
}));
|
|
1529
1546
|
}), () => {
|
|
1530
|
-
const
|
|
1531
|
-
if (!s) return null;
|
|
1532
|
-
const u = t?.value;
|
|
1547
|
+
const u = n.value;
|
|
1533
1548
|
if (!u) return null;
|
|
1549
|
+
const s = t?.value;
|
|
1550
|
+
if (!s) return null;
|
|
1534
1551
|
const {
|
|
1535
|
-
pos:
|
|
1536
|
-
nodeSize:
|
|
1537
|
-
src:
|
|
1538
|
-
align:
|
|
1539
|
-
} =
|
|
1540
|
-
if (!
|
|
1541
|
-
const
|
|
1542
|
-
if (!
|
|
1543
|
-
const
|
|
1552
|
+
pos: f,
|
|
1553
|
+
nodeSize: g,
|
|
1554
|
+
src: r,
|
|
1555
|
+
align: C
|
|
1556
|
+
} = u, i = l?.value ?? !1, p = s.view.nodeDOM(f);
|
|
1557
|
+
if (!p || !(p instanceof HTMLElement)) return null;
|
|
1558
|
+
const w = p.querySelector("[data-resize-wrapper]") ?? p, I = s.view.dom.closest(".tiptap-editor");
|
|
1559
|
+
if (!I) return null;
|
|
1560
|
+
const x = w.getBoundingClientRect(), a = I.getBoundingClientRect(), d = {
|
|
1544
1561
|
position: "absolute",
|
|
1545
|
-
top: `${
|
|
1546
|
-
left: `${
|
|
1562
|
+
top: `${x.top - a.top}px`,
|
|
1563
|
+
left: `${x.left - a.left + x.width / 2}px`,
|
|
1547
1564
|
transform: "translate(-50%, calc(-100% - 8px))",
|
|
1548
1565
|
zIndex: 20
|
|
1549
1566
|
};
|
|
1550
1567
|
return e("div", {
|
|
1551
1568
|
class: "image-controls",
|
|
1552
|
-
style:
|
|
1553
|
-
}, [!
|
|
1554
|
-
value:
|
|
1555
|
-
title:
|
|
1556
|
-
Icon:
|
|
1569
|
+
style: d
|
|
1570
|
+
}, [!i && m1.map(({
|
|
1571
|
+
value: v,
|
|
1572
|
+
title: h,
|
|
1573
|
+
Icon: A
|
|
1557
1574
|
}) => e("button", {
|
|
1558
|
-
key:
|
|
1559
|
-
class: ["image-controls-btn",
|
|
1560
|
-
title:
|
|
1561
|
-
onMousedown:
|
|
1562
|
-
onClick: () =>
|
|
1563
|
-
align:
|
|
1575
|
+
key: v,
|
|
1576
|
+
class: ["image-controls-btn", C === v && "is-active"],
|
|
1577
|
+
title: h,
|
|
1578
|
+
onMousedown: _,
|
|
1579
|
+
onClick: () => s.chain().focus().updateAttributes("image", {
|
|
1580
|
+
align: v
|
|
1564
1581
|
}).run()
|
|
1565
|
-
}, [e(
|
|
1582
|
+
}, [e(A, null, null)])), !i && e("span", {
|
|
1566
1583
|
class: "image-controls-separator"
|
|
1567
1584
|
}, null), e("button", {
|
|
1568
1585
|
class: "image-controls-btn",
|
|
1569
1586
|
title: "下载",
|
|
1570
|
-
onMousedown:
|
|
1571
|
-
onClick: () =>
|
|
1572
|
-
}, [e(
|
|
1587
|
+
onMousedown: _,
|
|
1588
|
+
onClick: () => b1(r)
|
|
1589
|
+
}, [e(k1, null, null)]), !i && e("button", {
|
|
1573
1590
|
class: "image-controls-btn",
|
|
1574
1591
|
title: "重新上传",
|
|
1575
|
-
onMousedown:
|
|
1576
|
-
onClick: () =>
|
|
1577
|
-
from:
|
|
1578
|
-
to:
|
|
1579
|
-
}).insertContentAt(
|
|
1592
|
+
onMousedown: _,
|
|
1593
|
+
onClick: () => s.chain().focus().deleteRange({
|
|
1594
|
+
from: f,
|
|
1595
|
+
to: f + g
|
|
1596
|
+
}).insertContentAt(f, {
|
|
1580
1597
|
type: "imageUpload"
|
|
1581
1598
|
}).run()
|
|
1582
|
-
}, [e(
|
|
1599
|
+
}, [e(x1, null, null)]), !i && e("button", {
|
|
1583
1600
|
class: "image-controls-btn",
|
|
1584
1601
|
title: "删除",
|
|
1585
|
-
onMousedown:
|
|
1586
|
-
onClick: () =>
|
|
1587
|
-
from:
|
|
1588
|
-
to:
|
|
1602
|
+
onMousedown: _,
|
|
1603
|
+
onClick: () => s.chain().focus().deleteRange({
|
|
1604
|
+
from: f,
|
|
1605
|
+
to: f + g
|
|
1589
1606
|
}).run()
|
|
1590
|
-
}, [e(
|
|
1607
|
+
}, [e(H1, null, null)])]);
|
|
1591
1608
|
};
|
|
1592
1609
|
}
|
|
1593
|
-
}),
|
|
1610
|
+
}), A1 = /* @__PURE__ */ c({
|
|
1594
1611
|
name: "CodeBlockIcon",
|
|
1595
1612
|
setup(t, {
|
|
1596
1613
|
attrs: l
|
|
@@ -1611,22 +1628,22 @@ const W1 = () => e("svg", {
|
|
|
1611
1628
|
points: "8 6 2 12 8 18"
|
|
1612
1629
|
}, null)]);
|
|
1613
1630
|
}
|
|
1614
|
-
}),
|
|
1631
|
+
}), y1 = /* @__PURE__ */ c({
|
|
1615
1632
|
name: "CodeBlockButton",
|
|
1616
1633
|
setup() {
|
|
1617
|
-
const t =
|
|
1618
|
-
return () => e(
|
|
1619
|
-
icon:
|
|
1634
|
+
const t = B("editor");
|
|
1635
|
+
return () => e(b, {
|
|
1636
|
+
icon: A1,
|
|
1620
1637
|
tooltip: "代码块",
|
|
1621
1638
|
isActive: t?.value?.isActive("codeBlock"),
|
|
1622
1639
|
onClick: () => t?.value?.chain().focus().toggleCodeBlock().run()
|
|
1623
1640
|
}, null);
|
|
1624
1641
|
}
|
|
1625
|
-
}),
|
|
1642
|
+
}), M1 = /* @__PURE__ */ c({
|
|
1626
1643
|
name: "BubbleMenuBar",
|
|
1627
1644
|
setup() {
|
|
1628
|
-
const t =
|
|
1629
|
-
return () => t?.value ? e(
|
|
1645
|
+
const t = B("editor"), l = B("readonly");
|
|
1646
|
+
return () => t?.value ? e(Pe, {
|
|
1630
1647
|
editor: t.value,
|
|
1631
1648
|
class: "bubble-menu",
|
|
1632
1649
|
options: {
|
|
@@ -1638,153 +1655,155 @@ const W1 = () => e("svg", {
|
|
|
1638
1655
|
shouldShow: (n) => {
|
|
1639
1656
|
if (l?.value) return !1;
|
|
1640
1657
|
const {
|
|
1641
|
-
editor:
|
|
1642
|
-
from:
|
|
1643
|
-
to:
|
|
1658
|
+
editor: o,
|
|
1659
|
+
from: u,
|
|
1660
|
+
to: s
|
|
1644
1661
|
} = n;
|
|
1645
|
-
return !(
|
|
1662
|
+
return !(u === s || o.isActive("image") || o.isActive("table"));
|
|
1646
1663
|
}
|
|
1647
1664
|
}, {
|
|
1648
1665
|
default: () => [e("div", {
|
|
1649
1666
|
class: "bubble-menu-content"
|
|
1650
|
-
}, [e(
|
|
1651
|
-
icon:
|
|
1667
|
+
}, [e(b, {
|
|
1668
|
+
icon: Q,
|
|
1652
1669
|
tooltip: "粗体",
|
|
1653
1670
|
isActive: t.value.isActive("bold"),
|
|
1654
1671
|
onClick: () => t.value?.chain().focus().toggleBold().run()
|
|
1655
|
-
}, null), e(
|
|
1656
|
-
icon:
|
|
1672
|
+
}, null), e(b, {
|
|
1673
|
+
icon: Y,
|
|
1657
1674
|
tooltip: "斜体",
|
|
1658
1675
|
isActive: t.value.isActive("italic"),
|
|
1659
1676
|
onClick: () => t.value?.chain().focus().toggleItalic().run()
|
|
1660
|
-
}, null), e(
|
|
1661
|
-
icon:
|
|
1677
|
+
}, null), e(b, {
|
|
1678
|
+
icon: ee,
|
|
1662
1679
|
tooltip: "删除线",
|
|
1663
1680
|
isActive: t.value.isActive("strike"),
|
|
1664
1681
|
onClick: () => t.value?.chain().focus().toggleStrike().run()
|
|
1665
|
-
}, null), e(
|
|
1666
|
-
icon:
|
|
1682
|
+
}, null), e(b, {
|
|
1683
|
+
icon: te,
|
|
1667
1684
|
tooltip: "下划线",
|
|
1668
1685
|
isActive: t.value.isActive("underline"),
|
|
1669
1686
|
onClick: () => t.value?.chain().focus().toggleUnderline().run()
|
|
1670
1687
|
}, null)])]
|
|
1671
1688
|
}) : null;
|
|
1672
1689
|
}
|
|
1673
|
-
}),
|
|
1674
|
-
|
|
1675
|
-
class: "tiptap-toolbar"
|
|
1676
|
-
}, gt = /* @__PURE__ */ d({
|
|
1677
|
-
__name: "TiptapEditor",
|
|
1690
|
+
}), I1 = He(Be), W1 = /* @__PURE__ */ c({
|
|
1691
|
+
name: "TiptapEditor",
|
|
1678
1692
|
props: {
|
|
1679
|
-
modelValue: {
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1693
|
+
modelValue: {
|
|
1694
|
+
type: String,
|
|
1695
|
+
default: ""
|
|
1696
|
+
},
|
|
1697
|
+
placeholder: {
|
|
1698
|
+
type: String,
|
|
1699
|
+
default: "请输入内容..."
|
|
1700
|
+
},
|
|
1701
|
+
upload: {
|
|
1702
|
+
type: Function,
|
|
1703
|
+
default: void 0
|
|
1704
|
+
},
|
|
1705
|
+
readonly: {
|
|
1706
|
+
type: Boolean,
|
|
1707
|
+
default: !1
|
|
1708
|
+
}
|
|
1683
1709
|
},
|
|
1684
1710
|
emits: ["update:modelValue"],
|
|
1685
|
-
setup(t, {
|
|
1686
|
-
|
|
1687
|
-
|
|
1711
|
+
setup(t, {
|
|
1712
|
+
emit: l
|
|
1713
|
+
}) {
|
|
1714
|
+
const n = H(!1), o = H(""), u = H(null), s = H("inline"), f = V(() => t.readonly ?? !1), g = (C = {}) => {
|
|
1715
|
+
f.value || (o.value = C.latex ?? "", u.value = C.pos ?? null, s.value = C.type ?? "inline", n.value = !0);
|
|
1688
1716
|
};
|
|
1689
|
-
|
|
1690
|
-
const
|
|
1691
|
-
content:
|
|
1692
|
-
editable: !
|
|
1693
|
-
extensions: [
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
}
|
|
1744
|
-
})
|
|
1745
|
-
],
|
|
1746
|
-
onUpdate: ({ editor: a }) => {
|
|
1747
|
-
s("update:modelValue", a.getHTML());
|
|
1717
|
+
z("openMathDialog", g), z("readonly", f);
|
|
1718
|
+
const r = he({
|
|
1719
|
+
content: t.modelValue,
|
|
1720
|
+
editable: !t.readonly,
|
|
1721
|
+
extensions: [pe.configure({
|
|
1722
|
+
codeBlock: !1,
|
|
1723
|
+
link: {
|
|
1724
|
+
openOnClick: !1,
|
|
1725
|
+
enableClickSelection: !0
|
|
1726
|
+
}
|
|
1727
|
+
}), ke.configure({
|
|
1728
|
+
placeholder: t.placeholder
|
|
1729
|
+
}), xe.configure({
|
|
1730
|
+
lowlight: I1,
|
|
1731
|
+
defaultLanguage: "plaintext"
|
|
1732
|
+
}), be.configure({
|
|
1733
|
+
types: ["heading", "paragraph"]
|
|
1734
|
+
}), me, we.configure({
|
|
1735
|
+
nested: !0
|
|
1736
|
+
}), ze.configure({
|
|
1737
|
+
allowBase64: !0,
|
|
1738
|
+
resize: {
|
|
1739
|
+
enabled: !0,
|
|
1740
|
+
directions: ["top", "right", "bottom", "left", "top-right", "top-left", "bottom-right", "bottom-left"],
|
|
1741
|
+
minWidth: 50,
|
|
1742
|
+
minHeight: 50,
|
|
1743
|
+
alwaysPreserveAspectRatio: !1
|
|
1744
|
+
}
|
|
1745
|
+
}), $e.configure({
|
|
1746
|
+
...t.upload ? {
|
|
1747
|
+
upload: t.upload
|
|
1748
|
+
} : {}
|
|
1749
|
+
}), Te.configure({
|
|
1750
|
+
resizable: !0
|
|
1751
|
+
}), Ee, Fe, Ve, Ze.configure({
|
|
1752
|
+
inlineOptions: {
|
|
1753
|
+
onClick: (C, i) => g({
|
|
1754
|
+
latex: C.attrs.latex,
|
|
1755
|
+
pos: i,
|
|
1756
|
+
type: "inline"
|
|
1757
|
+
})
|
|
1758
|
+
},
|
|
1759
|
+
blockOptions: {
|
|
1760
|
+
onClick: (C, i) => g({
|
|
1761
|
+
latex: C.attrs.latex,
|
|
1762
|
+
pos: i,
|
|
1763
|
+
type: "block"
|
|
1764
|
+
})
|
|
1765
|
+
}
|
|
1766
|
+
})],
|
|
1767
|
+
onUpdate: ({
|
|
1768
|
+
editor: C
|
|
1769
|
+
}) => {
|
|
1770
|
+
l("update:modelValue", C.getHTML());
|
|
1748
1771
|
}
|
|
1749
1772
|
});
|
|
1750
|
-
return
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
}), (
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
pos: f.value,
|
|
1781
|
-
type: h.value
|
|
1782
|
-
}, null, 8, ["visible", "latex", "pos", "type"])
|
|
1783
|
-
]));
|
|
1773
|
+
return z("editor", r), D(() => t.modelValue, (C) => {
|
|
1774
|
+
r.value && C !== r.value.getHTML() && r.value.commands.setContent(C, {
|
|
1775
|
+
emitUpdate: !1
|
|
1776
|
+
});
|
|
1777
|
+
}), D(() => t.readonly, (C) => {
|
|
1778
|
+
r.value?.setEditable(!C);
|
|
1779
|
+
}), () => e("div", {
|
|
1780
|
+
class: "tiptap-editor"
|
|
1781
|
+
}, [!t.readonly && e("div", {
|
|
1782
|
+
class: "tiptap-toolbar"
|
|
1783
|
+
}, [e(qe, null, null), e("div", {
|
|
1784
|
+
class: "tiptap-separator"
|
|
1785
|
+
}, null), e(Ye, null, null), e(y1, null, null), e("div", {
|
|
1786
|
+
class: "tiptap-separator"
|
|
1787
|
+
}, null), e(i1, null, null), e("div", {
|
|
1788
|
+
class: "tiptap-separator"
|
|
1789
|
+
}, null), e(t1, null, null), e("div", {
|
|
1790
|
+
class: "tiptap-separator"
|
|
1791
|
+
}, null), e(r1, null, null), e(d1, null, null), e(h1, null, null)]), e(ge, {
|
|
1792
|
+
class: "tiptap-content",
|
|
1793
|
+
editor: r.value
|
|
1794
|
+
}, null), e(M1, null, null), e(v1, null, null), e(B1, null, null), e(g1, {
|
|
1795
|
+
visible: n.value,
|
|
1796
|
+
latex: o.value,
|
|
1797
|
+
pos: u.value,
|
|
1798
|
+
type: s.value,
|
|
1799
|
+
"onUpdate:visible": (C) => {
|
|
1800
|
+
n.value = C;
|
|
1801
|
+
}
|
|
1802
|
+
}, null)]);
|
|
1784
1803
|
}
|
|
1785
1804
|
});
|
|
1786
1805
|
export {
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1806
|
+
b as IconButton,
|
|
1807
|
+
ze as ImageWithAlign,
|
|
1808
|
+
W1 as TiptapEditor
|
|
1790
1809
|
};
|