@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.
@@ -1,21 +1,21 @@
1
- import { defineComponent as d, computed as S, ref as B, openBlock as Z, createBlock as le, unref as g, withCtx as D, createElementBlock as R, normalizeClass as ne, createElementVNode as L, createTextVNode as H, toDisplayString as N, Fragment as be, renderList as xe, normalizeStyle as He, createCommentVNode as oe, withModifiers as X, createVNode as e, mergeProps as k, inject as M, watch as z, nextTick as W, watchEffect as ie, provide as K } from "vue";
2
- import ye from "@tiptap/starter-kit";
3
- import { nodeViewProps as Be, NodeViewWrapper as Me, VueNodeViewRenderer as Ae, useEditor as Le, EditorContent as Ie } from "@tiptap/vue-3";
4
- import { TaskList as Ee, TaskItem as Ve } from "@tiptap/extension-list";
5
- import { TextAlign as Te } from "@tiptap/extension-text-align";
6
- import { Placeholder as Ze } from "@tiptap/extension-placeholder";
7
- import { CodeBlockLowlight as Fe } from "@tiptap/extension-code-block-lowlight";
8
- import { createLowlight as Re, common as _e } from "lowlight";
9
- import { Image as De } from "@tiptap/extension-image";
10
- import { Plugin as Se, NodeSelection as Ue } from "@tiptap/pm/state";
11
- import { Decoration as $e, DecorationSet as ze } from "@tiptap/pm/view";
12
- import { TableRow as Oe, TableHeader as Pe, TableCell as Ne, Table as je } from "@tiptap/extension-table";
13
- import { Mathematics as We } from "@tiptap/extension-mathematics";
14
- import { Node as Ke, mergeAttributes as qe } from "@tiptap/core";
15
- import { ElTooltip as $, ElButton as U, ElPopover as re, ElInput as ue, ElDropdown as Q, ElDropdownMenu as Y, ElDropdownItem as F, ElDialog as Ge, ElRadioGroup as Je, ElRadioButton as ee } from "element-plus";
16
- import Xe from "katex";
17
- import { BubbleMenu as Qe } from "@tiptap/vue-3/menus";
18
- const Ye = De.extend({
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 Se({
32
+ new ye({
33
33
  props: {
34
34
  decorations(l) {
35
35
  const n = [];
36
- return l.doc.descendants((r, s) => {
37
- r.type.name === t && r.attrs.align && n.push(
38
- $e.node(s, s + r.nodeSize, {
39
- "data-align": r.attrs.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
- }), ze.create(l.doc, n);
42
+ }), Le.create(l.doc, n);
43
43
  }
44
44
  }
45
45
  })
46
46
  ];
47
47
  }
48
- }), e1 = { class: "tiptap-image-upload-content" }, t1 = { class: "tiptap-image-upload-subtext" }, l1 = {
49
- key: 1,
50
- class: "tiptap-image-upload-previews"
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 = t, n = S(() => l.node.attrs.accept), r = S(() => l.node.attrs.limit), s = S(() => l.node.attrs.maxSize), u = B([]), v = B(), f = B(!1), h = async (c) => {
56
- if (s.value > 0 && c.size > s.value)
57
- return l.extension.options.onError?.(
58
- new Error(`文件大小超出限制 ${s.value / 1024 / 1024}MB`)
59
- ), null;
60
- const p = crypto.randomUUID();
61
- u.value.push({ id: p, file: c, progress: 0, status: "uploading" });
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 C = l.extension.options.upload;
64
- if (!C) throw new Error("未配置 upload 函数");
65
- const x = await C(c);
66
- if (!x) throw new Error("上传失败:未返回 URL");
67
- const I = u.value.find((E) => E.id === p);
68
- return I && (I.status = "success", I.progress = 100), l.extension.options.onSuccess?.(x), x;
69
- } catch (C) {
70
- const x = u.value.find((I) => I.id === p);
71
- return x && (x.status = "error", x.progress = 0), l.extension.options.onError?.(C instanceof Error ? C : new Error("上传失败")), null;
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
- }, y = async (c) => {
74
- if (!c.length) return;
75
- if (c.length > r.value) {
76
- l.extension.options.onError?.(new Error(`最多上传 ${r.value} 个文件`));
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 p = (await Promise.all(c.map(h))).filter((C) => !!C);
80
- if (p.length > 0) {
81
- const C = l.getPos();
82
- if (typeof C != "number") return;
83
- const x = p.map((I) => ({ type: "image", attrs: { src: I } }));
84
- l.editor.chain().focus().deleteRange({ from: C, to: C + l.node.nodeSize }).insertContentAt(C, x).run();
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
- }, o = () => {
87
- u.value.length === 0 && v.value && (v.value.value = "", v.value.click());
88
- }, i = (c) => {
89
- const p = c.target.files;
90
- p && y(Array.from(p));
91
- }, a = (c) => {
92
- c.preventDefault(), f.value = !0;
93
- }, m = (c) => {
94
- c.currentTarget.contains(c.relatedTarget) || (f.value = !1);
95
- }, b = (c) => {
96
- c.preventDefault(), f.value = !1;
97
- const p = Array.from(c.dataTransfer?.files ?? []);
98
- p.length && y(p);
99
- }, A = (c) => {
100
- u.value = u.value.filter((p) => p.id !== c);
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 (c, p) => (Z(), le(g(Me), {
103
- class: "tiptap-image-upload",
104
- onClick: o
110
+ return () => e(ve, {
111
+ class: "tiptap-image-upload"
105
112
  }, {
106
- default: D(() => [
107
- u.value.length ? (Z(), R("div", l1, [
108
- (Z(!0), R(be, null, xe(u.value, (C) => (Z(), R("div", {
109
- key: C.id,
110
- class: "tiptap-image-upload-preview"
111
- }, [
112
- C.status === "uploading" ? (Z(), R("div", {
113
- key: 0,
114
- class: "tiptap-image-upload-progress",
115
- style: He({ width: `${C.progress}%` })
116
- }, null, 4)) : oe("", !0),
117
- L("div", n1, [
118
- L("span", o1, N(C.file.name), 1),
119
- L("span", i1, N(C.status === "uploading" ? `${C.progress}%` : C.status === "error" ? "上传失败" : "上传成功"), 1),
120
- L("button", {
121
- class: "tiptap-image-upload-remove",
122
- onClick: X((x) => A(C.id), ["stop"])
123
- }, "×", 8, r1)
124
- ])
125
- ]))), 128))
126
- ])) : (Z(), R("div", {
127
- key: 0,
128
- class: ne(["tiptap-image-upload-drag-area", { "drag-active": f.value }]),
129
- onDragover: a,
130
- onDragleave: m,
131
- onDrop: b
132
- }, [
133
- L("div", e1, [
134
- p[1] || (p[1] = L("span", { class: "tiptap-image-upload-text" }, [
135
- L("em", null, "点击上传"),
136
- H(" 或拖拽图片到此处")
137
- ], -1)),
138
- L("span", t1, " 最多 " + N(r.value) + " 个文件" + N(s.value ? `,每个不超过 ${s.value / 1024 / 1024}MB` : ""), 1)
139
- ])
140
- ], 34)),
141
- L("input", {
142
- ref_key: "inputRef",
143
- ref: v,
144
- type: "file",
145
- accept: n.value,
146
- multiple: r.value > 1,
147
- onChange: i,
148
- onClick: p[0] || (p[0] = X(() => {
149
- }, ["stop"]))
150
- }, null, 40, u1)
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
- }), s1 = Ke.create({
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", qe({
201
+ return ["div", De({
198
202
  "data-type": "image-upload"
199
203
  }, t)];
200
204
  },
201
205
  addNodeView() {
202
- return Ae(a1);
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 r = t.view.nodeDOM(l.$from.pos);
225
- if (r instanceof HTMLElement) {
226
- const s = r.firstChild;
227
- if (s instanceof HTMLElement)
228
- return s.click(), !0;
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
- }), c1 = {
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
- }, w = /* @__PURE__ */ d({
258
+ }, b = /* @__PURE__ */ c({
255
259
  name: "IconButton",
256
- props: c1,
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(U, {
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
- }), d1 = /* @__PURE__ */ d({
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
- }), p1 = /* @__PURE__ */ d({
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
- }), C1 = /* @__PURE__ */ d({
314
+ }), qe = /* @__PURE__ */ c({
311
315
  name: "UndoRedoButton",
312
316
  setup() {
313
- const t = M("editor"), l = S(() => t?.value?.can().undo() ?? !1), n = S(() => t?.value?.can().redo() ?? !1);
314
- return () => e("div", null, [e(w, {
315
- icon: d1,
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(w, {
320
- icon: p1,
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
- }), v1 = /* @__PURE__ */ d({
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
- }), f1 = /* @__PURE__ */ d({
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
- }), h1 = /* @__PURE__ */ d({
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
- }), m1 = /* @__PURE__ */ d({
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
- }), g1 = /* @__PURE__ */ d({
417
+ }), Qe = /* @__PURE__ */ c({
414
418
  name: "LinkPopover",
415
419
  setup() {
416
- const t = M("editor"), l = B(!1), n = B("");
417
- let r = !1;
418
- z(() => t?.value?.isActive("link"), (o) => {
419
- r || o && (n.value = t?.value?.getAttributes("link").href ?? "", W(() => {
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 s = () => {
424
- const o = t?.value;
425
- if (!o || !n.value) return;
426
- r = !0;
427
+ const u = () => {
428
+ const i = t?.value;
429
+ if (!i || !n.value) return;
430
+ o = !0;
427
431
  const {
428
- empty: i
429
- } = o.state.selection;
430
- let a = o.chain().focus().extendMarkRange("link").setLink({
432
+ empty: p
433
+ } = i.state.selection;
434
+ let w = i.chain().focus().extendMarkRange("link").setLink({
431
435
  href: n.value
432
436
  });
433
- i && (a = a.insertContent({
437
+ p && (w = w.insertContent({
434
438
  type: "text",
435
439
  text: n.value
436
- })), a.run(), l.value = !1, W(() => {
437
- r = !1;
440
+ })), w.run(), l.value = !1, P(() => {
441
+ o = !1;
438
442
  });
439
- }, u = () => {
440
- const o = t?.value;
441
- o && (r = !0, o.chain().focus().extendMarkRange("link").unsetLink().run(), n.value = "", l.value = !1, W(() => {
442
- r = !1;
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
- }, v = () => {
445
- const o = t?.value?.getAttributes("link").href;
446
- o && window.open(o, "_blank", "noopener,noreferrer");
447
- }, f = (o) => {
448
- o.key === "Enter" && (o.preventDefault(), s());
449
- }, h = (o) => {
450
- o && (n.value = t?.value?.getAttributes("link").href ?? ""), l.value = o;
451
- }, y = (o) => {
452
- n.value = o;
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 o = t?.value?.isActive("link") ?? !1;
456
- return e(re, {
459
+ const i = t?.value?.isActive("link") ?? !1;
460
+ return e(J, {
457
461
  visible: l.value,
458
- "onUpdate:visible": h,
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(w, {
470
+ reference: () => e("span", null, [e(b, {
467
471
  tooltip: "链接",
468
- icon: v1,
472
+ icon: Ke,
469
473
  class: ["tiptap-button", {
470
- "is-active": o
474
+ "is-active": i
471
475
  }]
472
476
  }, null)]),
473
477
  default: () => e("div", {
474
478
  class: "link-popover-inner"
475
- }, [e(ue, {
479
+ }, [e(X, {
476
480
  modelValue: n.value,
477
- "onUpdate:modelValue": y,
481
+ "onUpdate:modelValue": C,
478
482
  type: "url",
479
483
  placeholder: "请输入链接...",
480
484
  size: "small",
481
485
  autofocus: !0,
482
- onKeydown: f
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(U, {
494
+ default: () => [e(Z, {
491
495
  text: !0,
492
- icon: f1,
496
+ icon: Ge,
493
497
  disabled: !n.value,
494
- onClick: s
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(U, {
505
+ default: () => [e(Z, {
502
506
  text: !0,
503
- icon: h1,
504
- disabled: !n.value && !o,
505
- onClick: v
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(U, {
516
+ default: () => [e(Z, {
513
517
  text: !0,
514
- icon: m1,
515
- disabled: !o,
516
- onClick: u
518
+ icon: Xe,
519
+ disabled: !i,
520
+ onClick: s
517
521
  }, null)]
518
522
  })])])
519
523
  });
520
524
  };
521
525
  }
522
- }), ae = /* @__PURE__ */ d({
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
- }), se = /* @__PURE__ */ d({
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
- }), ce = /* @__PURE__ */ d({
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
- }), de = /* @__PURE__ */ d({
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
- }), w1 = /* @__PURE__ */ d({
597
+ }), Ye = /* @__PURE__ */ c({
594
598
  name: "TextStyleButton",
595
599
  setup() {
596
- const t = M("editor");
597
- return () => e("div", null, [e(w, {
598
- icon: ae,
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(w, {
603
- icon: se,
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(w, {
608
- icon: ce,
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(w, {
613
- icon: de,
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(g1, null, null)]);
621
+ }, null), e(Qe, null, null)]);
618
622
  }
619
- }), pe = /* @__PURE__ */ d({
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
- }), Ce = /* @__PURE__ */ d({
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
- }), ve = /* @__PURE__ */ d({
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
- }), k1 = /* @__PURE__ */ d({
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
- }), b1 = /* @__PURE__ */ d({
735
+ }), t1 = /* @__PURE__ */ c({
732
736
  name: "TextAlignButton",
733
737
  setup() {
734
- const t = M("editor");
735
- return () => e("div", null, [e(w, {
736
- icon: pe,
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(w, {
743
- icon: Ce,
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(w, {
750
- icon: ve,
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(w, {
757
- icon: k1,
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
- }), x1 = /* @__PURE__ */ d({
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
- }), H1 = /* @__PURE__ */ d({
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
- }), y1 = /* @__PURE__ */ d({
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
- }), B1 = /* @__PURE__ */ d({
893
+ }), i1 = /* @__PURE__ */ c({
890
894
  name: "ListButton",
891
895
  setup() {
892
- const t = M("editor");
893
- return () => e("div", null, [e(w, {
894
- icon: x1,
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(w, {
899
- icon: H1,
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(w, {
904
- icon: y1,
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
- }), M1 = /* @__PURE__ */ d({
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
- }), A1 = /* @__PURE__ */ d({
932
+ }), r1 = /* @__PURE__ */ c({
929
933
  name: "ImageButton",
930
934
  setup() {
931
- const t = M("editor");
932
- return () => e("div", null, [e(w, {
933
- icon: M1,
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
- }), L1 = /* @__PURE__ */ d({
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
- }), I1 = 8, E1 = 8, V1 = /* @__PURE__ */ d({
960
+ }), s1 = 8, c1 = 8, d1 = /* @__PURE__ */ c({
957
961
  name: "TableButton",
958
962
  setup() {
959
- const t = M("editor"), l = B(!1), n = B(0), r = B(0), s = (f, h) => {
960
- n.value = f, r.value = h;
961
- }, u = () => {
962
- n.value = 0, r.value = 0;
963
- }, v = (f, h) => {
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: h,
966
- cols: f,
969
+ rows: r,
970
+ cols: g,
967
971
  withHeaderRow: !0
968
972
  }).run(), l.value = !1;
969
973
  };
970
- return () => e(re, {
974
+ return () => e(J, {
971
975
  visible: l.value,
972
- "onUpdate:visible": (f) => l.value = f,
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(U, {
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(L1, {
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: u
1004
+ onMouseleave: s
1001
1005
  }, [Array.from({
1002
- length: E1
1003
- }, (f, h) => e("div", {
1004
- key: h,
1006
+ length: c1
1007
+ }, (g, r) => e("div", {
1008
+ key: r,
1005
1009
  class: "table-picker-row"
1006
1010
  }, [Array.from({
1007
- length: I1
1008
- }, (y, o) => e("div", {
1009
- key: o,
1011
+ length: s1
1012
+ }, (C, i) => e("div", {
1013
+ key: i,
1010
1014
  class: ["table-picker-cell", {
1011
- "is-active": o < n.value && h < r.value
1015
+ "is-active": i < n.value && r < o.value
1012
1016
  }],
1013
- onMouseenter: () => s(o + 1, h + 1),
1014
- onClick: () => v(o + 1, h + 1)
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, [H("列")]), e("span", null, [n.value || 1])]), e("span", {
1023
+ }, [e("span", null, [m("列")]), e("span", null, [n.value || 1])]), e("span", {
1020
1024
  class: "table-picker-x"
1021
- }, [H("x")]), e("div", {
1025
+ }, [m("x")]), e("div", {
1022
1026
  class: "table-picker-counter"
1023
- }, [e("span", null, [H("行")]), e("span", null, [r.value || 1])])])])
1027
+ }, [e("span", null, [m("行")]), e("span", null, [o.value || 1])])])])
1024
1028
  });
1025
1029
  }
1026
1030
  });
1027
- function T1(t) {
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 Z1(t) {
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 = T1(l);
1043
+ } = t.view.domAtPos(t.state.selection.from), n = p1(l);
1040
1044
  if (!n) return null;
1041
- const r = n.parentElement, s = r.parentElement, u = n.closest("table");
1042
- if (!u) return null;
1043
- const v = Array.from(r.children).indexOf(n), f = Array.from(s.children).indexOf(r), h = r.children.length, y = s.children.length, o = n.getBoundingClientRect(), i = u.getBoundingClientRect(), a = t.view.dom.closest(".tiptap-editor").getBoundingClientRect();
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: v,
1047
- rowIndex: f,
1048
- totalCols: h,
1049
- totalRows: y,
1050
- cellRect: o,
1051
- tableRect: i,
1052
- editorRect: a
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 te(t) {
1059
+ function K(t) {
1056
1060
  const {
1057
1061
  state: l
1058
1062
  } = t, n = l.selection.from;
1059
- let r = null;
1060
- return l.doc.nodesBetween(0, l.doc.content.size, (s, u) => {
1061
- if (s.type.name === "table" && u <= n && n <= u + s.nodeSize)
1062
- return r = {
1063
- node: s,
1064
- pos: u
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
- }), r;
1070
+ }), o;
1067
1071
  }
1068
- const F1 = /* @__PURE__ */ d({
1072
+ const v1 = /* @__PURE__ */ c({
1069
1073
  name: "TableControls",
1070
1074
  setup() {
1071
- const t = M("editor"), l = M("readonly"), n = B(null), r = B(null);
1072
- function s() {
1073
- const o = t?.value;
1074
- if (r.value && (r.value.classList.remove("tcc-cell-focused"), r.value = null), !o) {
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 i = Z1(o);
1079
- n.value = i, i && (i.cell.classList.add("tcc-cell-focused"), r.value = i.cell);
1082
+ const p = C1(i);
1083
+ n.value = p, p && (p.cell.classList.add("tcc-cell-focused"), o.value = p.cell);
1080
1084
  }
1081
- ie((o) => {
1082
- const i = t?.value;
1083
- i && (i.on("selectionUpdate", s), i.on("transaction", s), o(() => {
1084
- i.off("selectionUpdate", s), i.off("transaction", s), r.value && (r.value.classList.remove("tcc-cell-focused"), r.value = null);
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 u(o) {
1088
- const i = t?.value;
1089
- if (!i || !n.value) return;
1091
+ function s(i) {
1092
+ const p = t?.value;
1093
+ if (!p || !n.value) return;
1090
1094
  const {
1091
- colIndex: a,
1092
- totalCols: m
1093
- } = n.value, b = o === "left" ? a - 1 : a + 1;
1094
- if (b < 0 || b >= m) return;
1095
- const A = te(i);
1096
- if (!A) return;
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: c,
1099
- pos: p
1100
- } = A, C = [];
1101
- c.forEach((E) => {
1102
- if (E.type.name !== "tableRow") {
1103
- C.push(E);
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 V = [];
1107
- E.forEach((P) => V.push(P));
1108
- const O = V[a];
1109
- V[a] = V[b], V[b] = O, C.push(E.type.create(E.attrs, V, E.marks));
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 x = c.type.create(c.attrs, C, c.marks), I = i.state.tr.replaceWith(p, p + c.nodeSize, x);
1112
- i.view.dispatch(I);
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 v(o) {
1115
- const i = t?.value;
1116
- if (!i || !n.value) return;
1118
+ function f(i) {
1119
+ const p = t?.value;
1120
+ if (!p || !n.value) return;
1117
1121
  const {
1118
- rowIndex: a,
1119
- totalRows: m
1120
- } = n.value, b = o === "up" ? a - 1 : a + 1;
1121
- if (b < 0 || b >= m) return;
1122
- const A = te(i);
1123
- if (!A) return;
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: c,
1126
- pos: p
1127
- } = A, C = [];
1128
- c.forEach((V) => C.push(V));
1129
- const x = C[a];
1130
- C[a] = C[b], C[b] = x;
1131
- const I = c.type.create(c.attrs, C, c.marks), E = i.state.tr.replaceWith(p, p + c.nodeSize, I);
1132
- i.view.dispatch(E);
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 f = () => e("svg", {
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)]), h = () => e("svg", {
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)]), y = () => e("svg", {
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 o = n.value;
1182
- if (!o) return null;
1185
+ const i = n.value;
1186
+ if (!i) return null;
1183
1187
  const {
1184
- colIndex: i,
1185
- rowIndex: a,
1186
- totalCols: m,
1187
- totalRows: b,
1188
- cellRect: A,
1189
- tableRect: c,
1190
- editorRect: p
1191
- } = o, C = c.top - p.top, x = c.left - p.left, I = c.right - p.left, E = c.bottom - p.top, V = A.left - p.left, O = A.top - p.top, P = A.width, q = A.height, fe = {
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: `${C - 20}px`,
1194
- left: `${V + P / 2 - 18}px`
1195
- }, he = {
1197
+ top: `${h - 20}px`,
1198
+ left: `${y + U / 2 - 18}px`
1199
+ }, ue = {
1196
1200
  position: "absolute",
1197
- top: `${O + q / 2 - 18}px`,
1198
- left: `${x - 20}px`
1199
- }, me = {
1201
+ top: `${S + O / 2 - 18}px`,
1202
+ left: `${A - 20}px`
1203
+ }, re = {
1200
1204
  position: "absolute",
1201
- top: `${O + q / 2 - 12}px`,
1202
- left: `${I + 6}px`
1203
- }, ge = {
1205
+ top: `${S + O / 2 - 12}px`,
1206
+ left: `${T + 6}px`
1207
+ }, ae = {
1204
1208
  position: "absolute",
1205
- top: `${E + 6}px`,
1206
- left: `${V + P / 2 - 12}px`
1207
- }, we = i === 0, G = i === m - 1, ke = a === 0, J = a === b - 1, _ = t?.value;
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(Q, {
1214
+ }, [e(j, {
1211
1215
  trigger: "click",
1212
1216
  placement: "bottom",
1213
- style: fe,
1214
- onCommand: (T) => {
1215
- T === "move-left" ? u("left") : T === "move-right" ? u("right") : T === "insert-left" ? _?.chain().focus().addColumnBefore().run() : T === "insert-right" ? _?.chain().focus().addColumnAfter().run() : T === "delete" && _?.chain().focus().deleteColumn().run();
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(f, null, null)])],
1221
- dropdown: () => e(Y, null, {
1222
- default: () => [e(F, {
1224
+ }, [e(g, null, null)])],
1225
+ dropdown: () => e(W, null, {
1226
+ default: () => [e(E, {
1223
1227
  command: "move-left",
1224
- disabled: we
1228
+ disabled: se
1225
1229
  }, {
1226
- default: () => [H("移动列到左侧")]
1227
- }), e(F, {
1230
+ default: () => [m("移动列到左侧")]
1231
+ }), e(E, {
1228
1232
  command: "move-right",
1229
- disabled: G
1233
+ disabled: $
1230
1234
  }, {
1231
- default: () => [H("移动列到右侧")]
1232
- }), e(F, {
1235
+ default: () => [m("移动列到右侧")]
1236
+ }), e(E, {
1233
1237
  command: "insert-left"
1234
1238
  }, {
1235
- default: () => [H("在左侧插入一列")]
1236
- }), e(F, {
1239
+ default: () => [m("在左侧插入一列")]
1240
+ }), e(E, {
1237
1241
  command: "insert-right"
1238
1242
  }, {
1239
- default: () => [H("在右侧插入一列")]
1240
- }), e(F, {
1243
+ default: () => [m("在右侧插入一列")]
1244
+ }), e(E, {
1241
1245
  command: "delete",
1242
1246
  divided: !0
1243
1247
  }, {
1244
- default: () => [H("删除列")]
1248
+ default: () => [m("删除列")]
1245
1249
  })]
1246
1250
  })
1247
- }), e(Q, {
1251
+ }), e(j, {
1248
1252
  trigger: "click",
1249
1253
  placement: "right",
1250
- style: he,
1251
- onCommand: (T) => {
1252
- T === "move-up" ? v("up") : T === "move-down" ? v("down") : T === "insert-above" ? _?.chain().focus().addRowBefore().run() : T === "insert-below" ? _?.chain().focus().addRowAfter().run() : T === "delete" && _?.chain().focus().deleteRow().run();
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(h, null, null)])],
1258
- dropdown: () => e(Y, null, {
1259
- default: () => [e(F, {
1261
+ }, [e(r, null, null)])],
1262
+ dropdown: () => e(W, null, {
1263
+ default: () => [e(E, {
1260
1264
  command: "move-up",
1261
- disabled: ke
1265
+ disabled: ce
1262
1266
  }, {
1263
- default: () => [H("上移")]
1264
- }), e(F, {
1267
+ default: () => [m("上移")]
1268
+ }), e(E, {
1265
1269
  command: "move-down",
1266
- disabled: J
1270
+ disabled: N
1267
1271
  }, {
1268
- default: () => [H("下移")]
1269
- }), e(F, {
1272
+ default: () => [m("下移")]
1273
+ }), e(E, {
1270
1274
  command: "insert-above"
1271
1275
  }, {
1272
- default: () => [H("在上方插入一行")]
1273
- }), e(F, {
1276
+ default: () => [m("在上方插入一行")]
1277
+ }), e(E, {
1274
1278
  command: "insert-below"
1275
1279
  }, {
1276
- default: () => [H("在下方插入一行")]
1277
- }), e(F, {
1280
+ default: () => [m("在下方插入一行")]
1281
+ }), e(E, {
1278
1282
  command: "delete",
1279
1283
  divided: !0
1280
1284
  }, {
1281
- default: () => [H("删除行")]
1285
+ default: () => [m("删除行")]
1282
1286
  })]
1283
1287
  })
1284
- }), G && e("button", {
1288
+ }), $ && e("button", {
1285
1289
  class: "tcc-btn tcc-btn--add",
1286
- style: me,
1287
- onClick: () => _?.chain().focus().addColumnAfter().run()
1288
- }, [e(y, null, null)]), J && e("button", {
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: ge,
1291
- onClick: () => _?.chain().focus().addRowAfter().run()
1292
- }, [e(y, null, null)])]);
1294
+ style: ae,
1295
+ onClick: () => F?.chain().focus().addRowAfter().run()
1296
+ }, [e(C, null, null)])]);
1293
1297
  };
1294
1298
  }
1295
- }), R1 = /* @__PURE__ */ d({
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
- }), _1 = /* @__PURE__ */ d({
1317
+ }), h1 = /* @__PURE__ */ c({
1314
1318
  name: "MathButton",
1315
1319
  setup() {
1316
- const t = M("editor"), l = M("openMathDialog");
1317
- return () => e(w, {
1318
- icon: R1,
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
- }), D1 = { class: "math-dialog" }, S1 = {
1325
- key: 0,
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: { type: Boolean },
1331
- latex: {},
1332
- pos: {},
1333
- type: {}
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, { emit: l }) {
1337
- const n = t, r = l, s = M("editor"), u = B(""), v = B("inline");
1338
- z(() => n.latex, (o) => {
1339
- u.value = o;
1340
- }, { immediate: !0 }), z(() => n.type, (o) => {
1341
- v.value = o;
1342
- }, { immediate: !0 });
1343
- const f = S(() => n.pos === null), h = S(() => u.value.trim() ? Xe.renderToString(u.value, {
1344
- displayMode: v.value === "block",
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
- }) : ""), y = () => {
1347
- const o = s?.value;
1348
- if (!(!o || !u.value.trim())) {
1349
- if (f.value)
1350
- v.value === "inline" ? o.chain().focus().insertInlineMath({ latex: u.value }).run() : o.chain().focus().insertBlockMath({ latex: u.value }).run();
1351
- else if (v.value === n.type)
1352
- n.type === "inline" ? o.commands.updateInlineMath({ latex: u.value, pos: n.pos }) : o.commands.updateBlockMath({ latex: u.value, pos: n.pos });
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 i = n.pos;
1355
- n.type === "inline" ? o.chain().focus().deleteInlineMath({ pos: i }).insertBlockMath({ latex: u.value }).run() : o.chain().focus().deleteBlockMath({ pos: i }).insertInlineMath({ latex: u.value }).run();
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
- r("update:visible", !1);
1394
+ l("update:visible", !1);
1358
1395
  }
1359
1396
  };
1360
- return (o, i) => (Z(), le(g(Ge), {
1361
- "model-value": t.visible,
1362
- title: f.value ? "插入数学公式" : "编辑数学公式",
1397
+ return () => e(Se, {
1398
+ modelValue: t.visible,
1399
+ title: s.value ? "插入数学公式" : "编辑数学公式",
1363
1400
  width: "520px",
1364
- "onUpdate:modelValue": i[3] || (i[3] = (a) => r("update:visible", a))
1401
+ "onUpdate:modelValue": (r) => l("update:visible", r)
1365
1402
  }, {
1366
- footer: D(() => [
1367
- e(g(U), {
1368
- onClick: i[2] || (i[2] = (a) => r("update:visible", !1))
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: D(() => [...i[6] || (i[6] = [
1371
- H("取消", -1)
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: D(() => [...i[7] || (i[7] = [
1381
- H("确认", -1)
1382
- ])]),
1383
- _: 1
1384
- }, 8, ["disabled"])
1385
- ]),
1386
- default: D(() => [
1387
- L("div", D1, [
1388
- e(g(Je), {
1389
- modelValue: v.value,
1390
- "onUpdate:modelValue": i[0] || (i[0] = (a) => v.value = a)
1391
- }, {
1392
- default: D(() => [
1393
- e(g(ee), { value: "inline" }, {
1394
- default: D(() => [...i[4] || (i[4] = [
1395
- H("行内公式", -1)
1396
- ])]),
1397
- _: 1
1398
- }),
1399
- e(g(ee), { value: "block" }, {
1400
- default: D(() => [...i[5] || (i[5] = [
1401
- H("块级公式", -1)
1402
- ])]),
1403
- _: 1
1404
- })
1405
- ]),
1406
- _: 1
1407
- }, 8, ["modelValue"]),
1408
- e(g(ue), {
1409
- modelValue: u.value,
1410
- "onUpdate:modelValue": i[1] || (i[1] = (a) => u.value = a),
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
- }), z1 = (t, l) => {
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: pe
1453
+ Icon: le
1437
1454
  }, {
1438
1455
  value: "center",
1439
1456
  title: "居中",
1440
- Icon: Ce
1457
+ Icon: ne
1441
1458
  }, {
1442
1459
  value: "right",
1443
1460
  title: "居右",
1444
- Icon: ve
1445
- }], j = (t) => t.preventDefault();
1446
- function N1(t) {
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 Ue) || l.node.type.name !== "image") return null;
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 j1(t) {
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 W1 = () => e("svg", {
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)]), K1 = () => e("svg", {
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)]), q1 = () => e("svg", {
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)]), G1 = /* @__PURE__ */ d({
1529
+ }, null)]), B1 = /* @__PURE__ */ c({
1513
1530
  name: "ImageControls",
1514
1531
  setup() {
1515
- const t = M("editor"), l = M("readonly"), n = B(null);
1516
- function r() {
1517
- const s = t?.value;
1518
- if (!s) {
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 = N1(s);
1539
+ n.value = w1(u);
1523
1540
  }
1524
- return ie((s) => {
1525
- const u = t?.value;
1526
- u && (u.on("transaction", r), s(() => {
1527
- u.off("transaction", r);
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 s = n.value;
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: v,
1536
- nodeSize: f,
1537
- src: h,
1538
- align: y
1539
- } = s, o = l?.value ?? !1, i = u.view.nodeDOM(v);
1540
- if (!i || !(i instanceof HTMLElement)) return null;
1541
- const a = i.querySelector("[data-resize-wrapper]") ?? i, m = u.view.dom.closest(".tiptap-editor");
1542
- if (!m) return null;
1543
- const b = a.getBoundingClientRect(), A = m.getBoundingClientRect(), c = {
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: `${b.top - A.top}px`,
1546
- left: `${b.left - A.left + b.width / 2}px`,
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: c
1553
- }, [!o && P1.map(({
1554
- value: p,
1555
- title: C,
1556
- Icon: x
1569
+ style: d
1570
+ }, [!i && m1.map(({
1571
+ value: v,
1572
+ title: h,
1573
+ Icon: A
1557
1574
  }) => e("button", {
1558
- key: p,
1559
- class: ["image-controls-btn", y === p && "is-active"],
1560
- title: C,
1561
- onMousedown: j,
1562
- onClick: () => u.chain().focus().updateAttributes("image", {
1563
- align: p
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(x, null, null)])), !o && e("span", {
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: j,
1571
- onClick: () => j1(h)
1572
- }, [e(W1, null, null)]), !o && e("button", {
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: j,
1576
- onClick: () => u.chain().focus().deleteRange({
1577
- from: v,
1578
- to: v + f
1579
- }).insertContentAt(v, {
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(K1, null, null)]), !o && e("button", {
1599
+ }, [e(x1, null, null)]), !i && e("button", {
1583
1600
  class: "image-controls-btn",
1584
1601
  title: "删除",
1585
- onMousedown: j,
1586
- onClick: () => u.chain().focus().deleteRange({
1587
- from: v,
1588
- to: v + f
1602
+ onMousedown: _,
1603
+ onClick: () => s.chain().focus().deleteRange({
1604
+ from: f,
1605
+ to: f + g
1589
1606
  }).run()
1590
- }, [e(q1, null, null)])]);
1607
+ }, [e(H1, null, null)])]);
1591
1608
  };
1592
1609
  }
1593
- }), J1 = /* @__PURE__ */ d({
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
- }), X1 = /* @__PURE__ */ d({
1631
+ }), y1 = /* @__PURE__ */ c({
1615
1632
  name: "CodeBlockButton",
1616
1633
  setup() {
1617
- const t = M("editor");
1618
- return () => e(w, {
1619
- icon: J1,
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
- }), Q1 = /* @__PURE__ */ d({
1642
+ }), M1 = /* @__PURE__ */ c({
1626
1643
  name: "BubbleMenuBar",
1627
1644
  setup() {
1628
- const t = M("editor"), l = M("readonly");
1629
- return () => t?.value ? e(Qe, {
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: r,
1642
- from: s,
1643
- to: u
1658
+ editor: o,
1659
+ from: u,
1660
+ to: s
1644
1661
  } = n;
1645
- return !(s === u || r.isActive("image") || r.isActive("table"));
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(w, {
1651
- icon: ae,
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(w, {
1656
- icon: se,
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(w, {
1661
- icon: ce,
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(w, {
1666
- icon: de,
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
- }), Y1 = { class: "tiptap-editor" }, et = {
1674
- key: 0,
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: { default: "" },
1680
- placeholder: { default: "请输入内容..." },
1681
- upload: {},
1682
- readonly: { type: Boolean, default: !1 }
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, { emit: l }) {
1686
- const n = Re(_e), r = t, s = l, u = B(!1), v = B(""), f = B(null), h = B("inline"), y = S(() => r.readonly ?? !1), o = (a = {}) => {
1687
- y.value || (v.value = a.latex ?? "", f.value = a.pos ?? null, h.value = a.type ?? "inline", u.value = !0);
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
- K("openMathDialog", o), K("readonly", y);
1690
- const i = Le({
1691
- content: r.modelValue,
1692
- editable: !r.readonly,
1693
- extensions: [
1694
- ye.configure({
1695
- codeBlock: !1,
1696
- link: {
1697
- openOnClick: !1,
1698
- enableClickSelection: !0
1699
- }
1700
- }),
1701
- Ze.configure({
1702
- placeholder: r.placeholder
1703
- }),
1704
- Fe.configure({
1705
- lowlight: n,
1706
- defaultLanguage: "plaintext"
1707
- }),
1708
- Te.configure({ types: ["heading", "paragraph"] }),
1709
- Ee,
1710
- Ve.configure({ nested: !0 }),
1711
- Ye.configure({
1712
- allowBase64: !0,
1713
- resize: {
1714
- enabled: !0,
1715
- directions: [
1716
- "top",
1717
- "right",
1718
- "bottom",
1719
- "left",
1720
- "top-right",
1721
- "top-left",
1722
- "bottom-right",
1723
- "bottom-left"
1724
- ],
1725
- minWidth: 50,
1726
- minHeight: 50,
1727
- alwaysPreserveAspectRatio: !1
1728
- }
1729
- }),
1730
- s1.configure({
1731
- ...r.upload ? { upload: r.upload } : {}
1732
- }),
1733
- je.configure({ resizable: !0 }),
1734
- Oe,
1735
- Pe,
1736
- Ne,
1737
- We.configure({
1738
- inlineOptions: {
1739
- onClick: (a, m) => o({ latex: a.attrs.latex, pos: m, type: "inline" })
1740
- },
1741
- blockOptions: {
1742
- onClick: (a, m) => o({ latex: a.attrs.latex, pos: m, type: "block" })
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 K("editor", i), z(() => r.modelValue, (a) => {
1751
- i.value && a !== i.value.getHTML() && i.value.commands.setContent(a, { emitUpdate: !1 });
1752
- }), z(() => r.readonly, (a) => {
1753
- i.value?.setEditable(!a);
1754
- }), (a, m) => (Z(), R("div", Y1, [
1755
- t.readonly ? oe("", !0) : (Z(), R("div", et, [
1756
- e(g(C1)),
1757
- m[1] || (m[1] = L("div", { class: "tiptap-separator" }, null, -1)),
1758
- e(g(w1)),
1759
- e(g(X1)),
1760
- m[2] || (m[2] = L("div", { class: "tiptap-separator" }, null, -1)),
1761
- e(g(B1)),
1762
- m[3] || (m[3] = L("div", { class: "tiptap-separator" }, null, -1)),
1763
- e(g(b1)),
1764
- m[4] || (m[4] = L("div", { class: "tiptap-separator" }, null, -1)),
1765
- e(g(A1)),
1766
- e(g(V1)),
1767
- e(g(_1))
1768
- ])),
1769
- e(g(Ie), {
1770
- class: "tiptap-content",
1771
- editor: g(i)
1772
- }, null, 8, ["editor"]),
1773
- e(g(Q1)),
1774
- e(g(F1)),
1775
- e(g(G1)),
1776
- e(O1, {
1777
- visible: u.value,
1778
- "onUpdate:visible": m[0] || (m[0] = (b) => u.value = b),
1779
- latex: v.value,
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
- w as IconButton,
1788
- Ye as ImageWithAlign,
1789
- gt as TiptapEditor
1806
+ b as IconButton,
1807
+ ze as ImageWithAlign,
1808
+ W1 as TiptapEditor
1790
1809
  };