@juit/vue-tiny-editor 1.0.68 → 1.0.73

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.js CHANGED
@@ -1,666 +1,633 @@
1
- import { openBlock as w, createElementBlock as y, createElementVNode as b, defineComponent as Ge, useModel as Xe, watch as N, shallowRef as q, ref as T, computed as _, onMounted as Je, nextTick as Oe, onUnmounted as Qe, normalizeClass as j, Fragment as Ye, renderList as Ze, createTextVNode as et, toDisplayString as z, createCommentVNode as me, createVNode as H, unref as $, withDirectives as je, vModelText as Le, createBlock as tt, mergeModels as nt } from "vue";
2
- function ie(t, e) {
3
- return t instanceof Node && (t = F(t)), t.isPointInRange(e.startContainer, e.startOffset) && t.isPointInRange(e.endContainer, e.endOffset) ? e : null;
1
+ import { Fragment as e, computed as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, createVNode as s, defineComponent as c, mergeModels as l, nextTick as u, normalizeClass as d, onMounted as f, onUnmounted as ee, openBlock as p, ref as m, renderList as h, shallowRef as g, toDisplayString as _, unref as v, useModel as y, vModelText as b, watch as x, withDirectives as S } from "vue";
2
+ //#region lib/range.ts
3
+ function C(e, t) {
4
+ return e instanceof Node && (e = T(e)), e.isPointInRange(t.startContainer, t.startOffset) && e.isPointInRange(t.endContainer, t.endOffset) ? t : null;
4
5
  }
5
- function ot(t) {
6
- const e = document.createRange();
7
- return e.selectNode(t), e;
6
+ function w(e) {
7
+ let t = document.createRange();
8
+ return t.selectNode(e), t;
8
9
  }
9
- function F(t) {
10
- const e = document.createRange();
11
- return e.selectNodeContents(t), e;
10
+ function T(e) {
11
+ let t = document.createRange();
12
+ return t.selectNodeContents(e), t;
12
13
  }
13
- function Ce(t, e, l) {
14
- if (!F(t).isPointInRange(e, l))
15
- throw new Error("Range out of bounds");
16
- const o = document.createRange();
17
- return o.setStart(t, 0), o.setEnd(e, l), o.toString();
14
+ function te(e, t, n) {
15
+ if (!T(e).isPointInRange(t, n)) throw Error("Range out of bounds");
16
+ let r = document.createRange();
17
+ return r.setStart(e, 0), r.setEnd(t, n), r.toString();
18
18
  }
19
- function U(t, e) {
20
- const l = { start: 0, end: 0, backwards: e.backwards };
21
- return l.start = l.end = Ce(t, e.startContainer, e.startOffset).length, e.collapsed || (l.end = Ce(t, e.endContainer, e.endOffset).length), l;
19
+ function E(e, t) {
20
+ let n = {
21
+ start: 0,
22
+ end: 0,
23
+ backwards: t.backwards
24
+ };
25
+ return n.start = n.end = te(e, t.startContainer, t.startOffset).length, t.collapsed || (n.end = te(e, t.endContainer, t.endOffset).length), n;
22
26
  }
23
- function V(t, e) {
24
- const l = F(t);
25
- e.backwards && (l.backwards = !0);
26
- let { start: s, end: o } = e, i = null, a = null, f = !1, c = !1;
27
- const m = document.createNodeIterator(t, NodeFilter.SHOW_TEXT);
28
- for (let p = m.nextNode(); p && (s >= 0 || o > 0); p = m.nextNode()) {
29
- i || (i = p), a = p;
30
- const d = p.nodeValue.length;
31
- if (s >= 0 && s < d && (f = !0, l.setStart(p, s), s === o))
32
- return l.setEnd(p, o), l;
33
- if (o > 0 && o <= d && (c = !0, l.setEnd(p, o), o === s))
34
- return l.setStart(p, s), l;
35
- s -= d, o -= d;
36
- }
37
- return !f && i && l.setStart(i, 0), !c && a && l.setEnd(a, a.length), l;
27
+ function D(e, t) {
28
+ let n = T(e);
29
+ t.backwards && (n.backwards = !0);
30
+ let { start: r, end: i } = t, a = null, o = null, s = !1, c = !1, l = document.createNodeIterator(e, NodeFilter.SHOW_TEXT);
31
+ for (let e = l.nextNode(); e && (r >= 0 || i > 0); e = l.nextNode()) {
32
+ a ||= e, o = e;
33
+ let t = e.nodeValue.length;
34
+ if (r >= 0 && r < t && (s = !0, n.setStart(e, r), r === i)) return n.setEnd(e, i), n;
35
+ if (i > 0 && i <= t && (c = !0, n.setEnd(e, i), i === r)) return n.setStart(e, r), n;
36
+ r -= t, i -= t;
37
+ }
38
+ return !s && a && n.setStart(a, 0), !c && o && n.setEnd(o, o.length), n;
38
39
  }
39
- const rt = /* @__PURE__ */ new Set([
40
- "button",
41
- "embed",
42
- "form",
43
- "iframe",
44
- "input",
45
- "object",
46
- "script",
47
- "select",
48
- "style",
49
- "textarea"
40
+ //#endregion
41
+ //#region lib/sanitize.ts
42
+ var O = new Set([
43
+ "button",
44
+ "embed",
45
+ "form",
46
+ "iframe",
47
+ "input",
48
+ "object",
49
+ "script",
50
+ "select",
51
+ "style",
52
+ "textarea"
50
53
  ]);
51
- function Me(t) {
52
- if (!t || !t.match(/^https?:\/\/[^\s]+$/)) return null;
53
- try {
54
- return new URL(t).href;
55
- } catch {
56
- return null;
57
- }
54
+ function k(e) {
55
+ if (!e || !e.match(/^https?:\/\/[^\s]+$/)) return null;
56
+ try {
57
+ return new URL(e).href;
58
+ } catch {
59
+ return null;
60
+ }
58
61
  }
59
- function De(t, e, l = !1) {
60
- if (l) return t;
61
- const s = document.createElement(e);
62
- return s.append(t), s;
62
+ function A(e, t, n = !1) {
63
+ if (n) return e;
64
+ let r = document.createElement(t);
65
+ return r.append(e), r;
63
66
  }
64
- function Y(t, e = {}) {
65
- const l = document.createDocumentFragment();
66
- for (const s of t.childNodes)
67
- if (s.nodeType === Node.TEXT_NODE)
68
- s.nodeValue && l.append(s.cloneNode());
69
- else if (s.nodeType === Node.ELEMENT_NODE) {
70
- const o = s, i = o.tagName.toLowerCase();
71
- if (rt.has(i)) continue;
72
- const a = l.lastChild?.nodeType === Node.ELEMENT_NODE ? {
73
- element: l.lastChild,
74
- tagName: l.lastChild.tagName.toLowerCase()
75
- } : null, f = document.createDocumentFragment();
76
- if (i === "b" || i === "strong") {
77
- const c = Y(o, { ...e, bold: !0 });
78
- if (!c.hasChildNodes()) continue;
79
- a?.tagName === "b" ? a.element.append(c) : f.append(De(c, "b", e.bold));
80
- } else if (i === "i" || i === "em") {
81
- const c = Y(o, { ...e, italic: !0 });
82
- if (!c.hasChildNodes()) continue;
83
- a?.tagName === "i" ? a.element.append(c) : f.append(De(c, "i", e.italic));
84
- } else if (i === "br")
85
- f.append(document.createElement("br"));
86
- else if (i === "div" || i === "p" || i === "pre" || i === "h1" || i === "h2" || i === "h3" || i === "h4" || i === "h5" || i === "h6" || i === "ul" || i === "ol" || i === "li") {
87
- f.append(document.createElement("br"));
88
- const c = Y(o, e);
89
- c.hasChildNodes() && (f.append(c), f.append(document.createElement("br")));
90
- } else if (i === "link") {
91
- if (o.getAttribute("rel") !== "mention") continue;
92
- const m = o.getAttribute("name"), p = o.getAttribute("title");
93
- if (!(m && p)) continue;
94
- const d = document.createElement("link");
95
- d.setAttribute("rel", "mention"), d.setAttribute("title", p), d.setAttribute("name", m), f.append(d);
96
- } else
97
- f.append(Y(o, e));
98
- f.hasChildNodes() && l.append(f);
99
- }
100
- return l;
67
+ function j(e, t = {}) {
68
+ let n = document.createDocumentFragment();
69
+ for (let r of e.childNodes) if (r.nodeType === Node.TEXT_NODE) r.nodeValue && n.append(r.cloneNode());
70
+ else if (r.nodeType === Node.ELEMENT_NODE) {
71
+ let e = r, i = e.tagName.toLowerCase();
72
+ if (O.has(i)) continue;
73
+ let a = n.lastChild?.nodeType === Node.ELEMENT_NODE ? {
74
+ element: n.lastChild,
75
+ tagName: n.lastChild.tagName.toLowerCase()
76
+ } : null, o = document.createDocumentFragment();
77
+ if (i === "b" || i === "strong") {
78
+ let n = j(e, {
79
+ ...t,
80
+ bold: !0
81
+ });
82
+ if (!n.hasChildNodes()) continue;
83
+ a?.tagName === "b" ? a.element.append(n) : o.append(A(n, "b", t.bold));
84
+ } else if (i === "i" || i === "em") {
85
+ let n = j(e, {
86
+ ...t,
87
+ italic: !0
88
+ });
89
+ if (!n.hasChildNodes()) continue;
90
+ a?.tagName === "i" ? a.element.append(n) : o.append(A(n, "i", t.italic));
91
+ } else if (i === "br") o.append(document.createElement("br"));
92
+ else if (i === "div" || i === "p" || i === "pre" || i === "h1" || i === "h2" || i === "h3" || i === "h4" || i === "h5" || i === "h6" || i === "ul" || i === "ol" || i === "li") {
93
+ o.append(document.createElement("br"));
94
+ let n = j(e, t);
95
+ n.hasChildNodes() && (o.append(n), o.append(document.createElement("br")));
96
+ } else if (i === "link") {
97
+ if (e.getAttribute("rel") !== "mention") continue;
98
+ let t = e.getAttribute("name"), n = e.getAttribute("title");
99
+ if (!(t && n)) continue;
100
+ let r = document.createElement("link");
101
+ r.setAttribute("rel", "mention"), r.setAttribute("title", n), r.setAttribute("name", t), o.append(r);
102
+ } else o.append(j(e, t));
103
+ o.hasChildNodes() && n.append(o);
104
+ }
105
+ return n;
101
106
  }
102
- function lt(t) {
103
- const e = t.map((s, o) => ({ ...s, index: o }));
104
- e.sort((s, o) => s.start < o.start ? -1 : s.start > o.start || s.end < o.end ? 1 : s.end > o.end || /* v8 ignore next 3 */
105
- s.index < o.index ? -1 : s.index > o.index ? 1 : 0);
106
- const l = /* @__PURE__ */ new Set();
107
- for (let s = 0; s < e.length; s++) {
108
- const o = e[s];
109
- for (let i = s + 1; i < e.length; i++) {
110
- const a = e[i];
111
- l.has(a) || (a.start === a.end || a.start >= o.start && a.start < o.end || a.end >= o.start && a.end < o.end) && l.add(a);
112
- }
113
- }
114
- return e.filter((s) => !l.has(s)).filter((s, o, i) => {
115
- const a = i[o - 1];
116
- return a?.end === s.start && a.href === s.href ? (a.end = s.end, !1) : !0;
117
- });
107
+ function M(e) {
108
+ let t = e.map((e, t) => ({
109
+ ...e,
110
+ index: t
111
+ }));
112
+ t.sort((e, t) => e.start < t.start ? -1 : e.start > t.start || e.end < t.end ? 1 : e.end > t.end || e.index < t.index ? -1 : +(e.index > t.index));
113
+ let n = /* @__PURE__ */ new Set();
114
+ for (let e = 0; e < t.length; e++) {
115
+ let r = t[e];
116
+ for (let i = e + 1; i < t.length; i++) {
117
+ let e = t[i];
118
+ n.has(e) || (e.start === e.end || e.start >= r.start && e.start < r.end || e.end >= r.start && e.end < r.end) && n.add(e);
119
+ }
120
+ }
121
+ return t.filter((e) => !n.has(e)).filter((e, t, n) => {
122
+ let r = n[t - 1];
123
+ return r?.end === e.start && r.href === e.href ? (r.end = e.end, !1) : !0;
124
+ });
118
125
  }
119
- function st(t) {
120
- const e = [], l = /(https?:\/\/[^\s]+)/gm, s = t.textContent;
121
- for (let a = l.exec(s); a; a = l.exec(s)) {
122
- const f = a[1], c = Me(f);
123
- c && e.push({ start: a.index, end: a.index + f.length, href: c });
124
- }
125
- const o = [], i = document.createNodeIterator(t, NodeFilter.SHOW_ELEMENT, (a) => a.nodeName.toLowerCase() === "a" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP);
126
- for (let a = i.nextNode(); a; a = i.nextNode()) {
127
- const f = a, c = Me(f.getAttribute("href"));
128
- if (c) {
129
- const m = F(f);
130
- o.push({ ...U(t, m), href: c });
131
- }
132
- }
133
- return lt([...e, ...o]);
126
+ function N(e) {
127
+ let t = [], n = /(https?:\/\/[^\s]+)/gm, r = e.textContent;
128
+ for (let e = n.exec(r); e; e = n.exec(r)) {
129
+ let n = e[1], r = k(n);
130
+ r && t.push({
131
+ start: e.index,
132
+ end: e.index + n.length,
133
+ href: r
134
+ });
135
+ }
136
+ let i = [], a = document.createNodeIterator(e, NodeFilter.SHOW_ELEMENT, (e) => e.nodeName.toLowerCase() === "a" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP);
137
+ for (let t = a.nextNode(); t; t = a.nextNode()) {
138
+ let n = t, r = k(n.getAttribute("href"));
139
+ if (r) {
140
+ let t = T(n);
141
+ i.push({
142
+ ...E(e, t),
143
+ href: r
144
+ });
145
+ }
146
+ }
147
+ return M([...t, ...i]);
134
148
  }
135
- function at(t) {
136
- t.normalize();
137
- const e = document.createNodeIterator(t, NodeFilter.SHOW_ELEMENT);
138
- for (let l = e.nextNode(); l; l = e.nextNode())
139
- l !== t && l.nodeName.toLowerCase() !== "link" && (l.hasChildNodes() || (l.nodeName.toLowerCase() === "br" && l.parentNode.replaceChild(document.createTextNode(`
140
- `), l), l.parentNode?.removeChild(l)));
141
- t.normalize(), t.hasChildNodes() || t.append(document.createElement("br"));
149
+ function P(e) {
150
+ e.normalize();
151
+ let t = document.createNodeIterator(e, NodeFilter.SHOW_ELEMENT);
152
+ for (let n = t.nextNode(); n; n = t.nextNode()) n !== e && n.nodeName.toLowerCase() !== "link" && (n.hasChildNodes() || (n.nodeName.toLowerCase() === "br" && n.parentNode.replaceChild(document.createTextNode("\n"), n), n.parentNode?.removeChild(n)));
153
+ e.normalize(), e.hasChildNodes() || e.append(document.createElement("br"));
142
154
  }
143
- function Z(t) {
144
- if (t.innerHTML === "<br>") return t;
145
- t.normalize();
146
- const e = st(t), l = Y(t);
147
- return l.lastChild?.nodeName.toLowerCase() === "link" && l.append(document.createTextNode(" ")), t.replaceChildren(l), e.forEach((s) => {
148
- const o = V(t, s), i = o.extractContents(), a = document.createElement("a");
149
- a.setAttribute("href", s.href), a.append(i), o.insertNode(a);
150
- }), at(t), t;
155
+ function F(e) {
156
+ if (e.innerHTML === "<br>") return e;
157
+ e.normalize();
158
+ let t = N(e), n = j(e);
159
+ return n.lastChild?.nodeName.toLowerCase() === "link" && n.append(document.createTextNode(" ")), e.replaceChildren(n), t.forEach((t) => {
160
+ let n = D(e, t), r = n.extractContents(), i = document.createElement("a");
161
+ i.setAttribute("href", t.href), i.append(r), n.insertNode(i);
162
+ }), P(e), e;
151
163
  }
152
- function he(t, e, l) {
153
- if (typeof l == "string") {
154
- if (!ie(t, e)) throw new Error("Range out of bounds");
155
- const d = new DOMParser().parseFromString(l, "text/html").body;
156
- l = document.createDocumentFragment(), l.append(...d.childNodes);
157
- }
158
- const s = U(t, e), o = t.textContent?.length || 0, i = F(t), a = document.createRange();
159
- a.setStart(i.startContainer, i.startOffset), a.setEnd(e.startContainer, e.startOffset);
160
- const f = document.createRange();
161
- f.setStart(e.endContainer, e.endOffset), f.setEnd(i.endContainer, i.endOffset);
162
- const c = a.extractContents(), m = f.extractContents();
163
- t.replaceChildren(), t.append(c, l, m), Z(t);
164
- const p = t.textContent?.length || 0;
165
- return { ...s, end: s.end + p - o };
164
+ //#endregion
165
+ //#region lib/replace.ts
166
+ function ne(e, t, n) {
167
+ if (typeof n == "string") {
168
+ if (!C(e, t)) throw Error("Range out of bounds");
169
+ let r = new DOMParser().parseFromString(n, "text/html").body;
170
+ n = document.createDocumentFragment(), n.append(...r.childNodes);
171
+ }
172
+ let r = E(e, t), i = e.textContent?.length || 0, a = T(e), o = document.createRange();
173
+ o.setStart(a.startContainer, a.startOffset), o.setEnd(t.startContainer, t.startOffset);
174
+ let s = document.createRange();
175
+ s.setStart(t.endContainer, t.endOffset), s.setEnd(a.endContainer, a.endOffset);
176
+ let c = o.extractContents(), l = s.extractContents();
177
+ e.replaceChildren(), e.append(c, n, l), F(e);
178
+ let u = e.textContent?.length || 0;
179
+ return {
180
+ ...r,
181
+ end: r.end + u - i
182
+ };
166
183
  }
167
- function xe(t) {
168
- const e = document.getSelection();
169
- if (!e?.rangeCount) return null;
170
- const l = e.getRangeAt(0);
171
- if (!ie(t, l)) return null;
172
- const s = e.isCollapsed ? !1 : e.anchorNode === e.focusNode ? e.anchorOffset > e.focusOffset : e.anchorNode.compareDocumentPosition(e.focusNode) === Node.DOCUMENT_POSITION_PRECEDING;
173
- return Object.assign(l, { backwards: s });
184
+ //#endregion
185
+ //#region lib/selection.ts
186
+ function re(e) {
187
+ let t = document.getSelection();
188
+ if (!t?.rangeCount) return null;
189
+ let n = t.getRangeAt(0);
190
+ if (!C(e, n)) return null;
191
+ let r = t.isCollapsed ? !1 : t.anchorNode === t.focusNode ? t.anchorOffset > t.focusOffset : t.anchorNode.compareDocumentPosition(t.focusNode) === Node.DOCUMENT_POSITION_PRECEDING;
192
+ return Object.assign(n, { backwards: r });
174
193
  }
175
- function ge(t) {
176
- const e = xe(t);
177
- return e ? U(t, e) : null;
194
+ function ie(e) {
195
+ let t = re(e);
196
+ return t ? E(e, t) : null;
178
197
  }
179
- function be(t, e, l = !1) {
180
- l && (e = { start: e.end, end: e.end });
181
- const s = V(t, e), { startContainer: o, startOffset: i, endContainer: a, endOffset: f, backwards: c } = s, m = document.getSelection();
182
- return m && (c ? m.setBaseAndExtent(a, f, o, i) : m.setBaseAndExtent(o, i, a, f)), s;
198
+ function ae(e, t, n = !1) {
199
+ n && (t = {
200
+ start: t.end,
201
+ end: t.end
202
+ });
203
+ let r = D(e, t), { startContainer: i, startOffset: a, endContainer: o, endOffset: s, backwards: c } = r, l = document.getSelection();
204
+ return l && (c ? l.setBaseAndExtent(o, s, i, a) : l.setBaseAndExtent(i, a, o, s)), r;
183
205
  }
184
- function ae(t, e, l) {
185
- const s = F(t);
186
- if (!ie(t, e)) return null;
187
- let o = e.commonAncestorContainer;
188
- for (; o && s.intersectsNode(o); ) {
189
- if (o.nodeType === Node.ELEMENT_NODE && o.nodeName.toLowerCase() === l)
190
- return o;
191
- o = o.parentNode;
192
- }
193
- return null;
206
+ //#endregion
207
+ //#region lib/tags.ts
208
+ function I(e, t, n) {
209
+ let r = T(e);
210
+ if (!C(e, t)) return null;
211
+ let i = t.commonAncestorContainer;
212
+ for (; i && r.intersectsNode(i);) {
213
+ if (i.nodeType === Node.ELEMENT_NODE && i.nodeName.toLowerCase() === n) return i;
214
+ i = i.parentNode;
215
+ }
216
+ return null;
194
217
  }
195
- function Be(t, e, l, s = {}) {
196
- if (e.collapsed || !ie(t, e)) return;
197
- const o = ae(t, e, l), i = o ? ot(o) : F(e.commonAncestorContainer), a = document.createRange();
198
- a.setStart(i.startContainer, i.startOffset), a.setEnd(e.startContainer, e.startOffset);
199
- const f = document.createRange();
200
- f.setStart(e.endContainer, e.endOffset), f.setEnd(i.endContainer, i.endOffset);
201
- const c = f.extractContents(), m = e.extractContents(), p = a.extractContents();
202
- i.deleteContents();
203
- const d = document.createDocumentFragment();
204
- if (d.append(p), o)
205
- d.append(m);
206
- else {
207
- const k = document.createElement(l);
208
- Object.entries(s).forEach((ee) => k.setAttribute(...ee)), k.append(m), d.append(k);
209
- }
210
- d.append(c), i.insertNode(d), Z(t);
218
+ function oe(e, t, n, r = {}) {
219
+ if (t.collapsed || !C(e, t)) return;
220
+ let i = I(e, t, n), a = i ? w(i) : T(t.commonAncestorContainer), o = document.createRange();
221
+ o.setStart(a.startContainer, a.startOffset), o.setEnd(t.startContainer, t.startOffset);
222
+ let s = document.createRange();
223
+ s.setStart(t.endContainer, t.endOffset), s.setEnd(a.endContainer, a.endOffset);
224
+ let c = s.extractContents(), l = t.extractContents(), u = o.extractContents();
225
+ a.deleteContents();
226
+ let d = document.createDocumentFragment();
227
+ if (d.append(u), i) d.append(l);
228
+ else {
229
+ let e = document.createElement(n);
230
+ Object.entries(r).forEach((t) => e.setAttribute(...t)), e.append(l), d.append(e);
231
+ }
232
+ d.append(c), a.insertNode(d), F(e);
211
233
  }
212
- const it = {
213
- xmlns: "http://www.w3.org/2000/svg",
214
- fill: "currentColor",
215
- viewBox: "0 -960 960 960"
234
+ //#endregion
235
+ //#region lib/svg/bold.svg
236
+ var L = {
237
+ xmlns: "http://www.w3.org/2000/svg",
238
+ fill: "currentColor",
239
+ viewBox: "0 -960 960 960"
216
240
  };
217
- function ut(t, e) {
218
- return w(), y("svg", it, [...e[0] || (e[0] = [
219
- b("path", { d: "M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200zm121-112h104q48 0 58.5-24.5T566-372t-10.5-35.5T494-432H393zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95z" }, null, -1)
220
- ])]);
241
+ function se(e, t) {
242
+ return p(), i("svg", L, [...t[0] ||= [a("path", { d: "M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200zm121-112h104q48 0 58.5-24.5T566-372t-10.5-35.5T494-432H393zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95z" }, null, -1)]]);
221
243
  }
222
- const ct = { render: ut }, dt = {
223
- xmlns: "http://www.w3.org/2000/svg",
224
- fill: "currentColor",
225
- viewBox: "0 -960 960 960"
244
+ var ce = { render: se }, R = {
245
+ xmlns: "http://www.w3.org/2000/svg",
246
+ fill: "currentColor",
247
+ viewBox: "0 -960 960 960"
226
248
  };
227
- function ft(t, e) {
228
- return w(), y("svg", dt, [...e[0] || (e[0] = [
229
- b("path", { d: "M200-200v-100h160l120-360H320v-100h400v100H580L460-300h140v100z" }, null, -1)
230
- ])]);
249
+ function z(e, t) {
250
+ return p(), i("svg", R, [...t[0] ||= [a("path", { d: "M200-200v-100h160l120-360H320v-100h400v100H580L460-300h140v100z" }, null, -1)]]);
231
251
  }
232
- const pt = { render: ft }, vt = {
233
- xmlns: "http://www.w3.org/2000/svg",
234
- fill: "currentColor",
235
- viewBox: "0 -960 960 960"
252
+ var le = { render: z }, B = {
253
+ xmlns: "http://www.w3.org/2000/svg",
254
+ fill: "currentColor",
255
+ viewBox: "0 -960 960 960"
236
256
  };
237
- function mt(t, e) {
238
- return w(), y("svg", vt, [...e[0] || (e[0] = [
239
- b("path", { d: "M440-280H280q-83 0-141.5-58.5T80-480t58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85 35 85 85 35h160zM320-440v-80h320v80zm200 160v-80h160q50 0 85-35t35-85-35-85-85-35H520v-80h160q83 0 141.5 58.5T880-480t-58.5 141.5T680-280z" }, null, -1)
240
- ])]);
257
+ function V(e, t) {
258
+ return p(), i("svg", B, [...t[0] ||= [a("path", { d: "M440-280H280q-83 0-141.5-58.5T80-480t58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85 35 85 85 35h160zM320-440v-80h320v80zm200 160v-80h160q50 0 85-35t35-85-35-85-85-35H520v-80h160q83 0 141.5 58.5T880-480t-58.5 141.5T680-280z" }, null, -1)]]);
241
259
  }
242
- const qe = { render: mt }, ht = {
243
- xmlns: "http://www.w3.org/2000/svg",
244
- fill: "currentColor",
245
- viewBox: "0 -960 960 960"
260
+ var ue = { render: V }, H = {
261
+ xmlns: "http://www.w3.org/2000/svg",
262
+ fill: "currentColor",
263
+ viewBox: "0 -960 960 960"
246
264
  };
247
- function gt(t, e) {
248
- return w(), y("svg", ht, [...e[0] || (e[0] = [
249
- b("path", { d: "M480-80q-83 0-156-31.5T197-197t-85.5-127T80-480t31.5-156T197-763t127-85.5T480-880t156 31.5T763-763t85.5 127T880-480v58q0 59-40.5 100.5T740-280q-35 0-66-15t-52-43q-29 29-65.5 43.5T480-280q-83 0-141.5-58.5T280-480t58.5-141.5T480-680t141.5 58.5T680-480v58q0 26 17 44t43 18 43-18 17-44v-58q0-134-93-227t-227-93-227 93-93 227 93 227 227 93h200v80zm0-280q50 0 85-35t35-85-35-85-85-35-85 35-35 85 35 85 85 35" }, null, -1)
250
- ])]);
265
+ function U(e, t) {
266
+ return p(), i("svg", H, [...t[0] ||= [a("path", { d: "M480-80q-83 0-156-31.5T197-197t-85.5-127T80-480t31.5-156T197-763t127-85.5T480-880t156 31.5T763-763t85.5 127T880-480v58q0 59-40.5 100.5T740-280q-35 0-66-15t-52-43q-29 29-65.5 43.5T480-280q-83 0-141.5-58.5T280-480t58.5-141.5T480-680t141.5 58.5T680-480v58q0 26 17 44t43 18 43-18 17-44v-58q0-134-93-227t-227-93-227 93-93 227 93 227 227 93h200v80zm0-280q50 0 85-35t35-85-35-85-85-35-85 35-35 85 35 85 85 35" }, null, -1)]]);
251
267
  }
252
- const bt = { render: gt }, Ct = {
253
- xmlns: "http://www.w3.org/2000/svg",
254
- fill: "currentColor",
255
- viewBox: "0 -960 960 960"
268
+ var de = { render: U }, W = {
269
+ xmlns: "http://www.w3.org/2000/svg",
270
+ fill: "currentColor",
271
+ viewBox: "0 -960 960 960"
256
272
  };
257
- function xt(t, e) {
258
- return w(), y("svg", Ct, [...e[0] || (e[0] = [
259
- b("path", { d: "M792-443 176-183q-20 8-38-3.5T120-220v-520q0-22 18-33.5t38-3.5l616 260q25 11 25 37t-25 37M200-280l474-200-474-200v140l240 60-240 60zm0 0v-400z" }, null, -1)
260
- ])]);
273
+ function fe(e, t) {
274
+ return p(), i("svg", W, [...t[0] ||= [a("path", { d: "M792-443 176-183q-20 8-38-3.5T120-220v-520q0-22 18-33.5t38-3.5l616 260q25 11 25 37t-25 37M200-280l474-200-474-200v140l240 60-240 60zm0 0v-400z" }, null, -1)]]);
261
275
  }
262
- const wt = { render: xt }, yt = {
263
- xmlns: "http://www.w3.org/2000/svg",
264
- fill: "currentColor",
265
- viewBox: "0 -960 960 960"
276
+ var pe = { render: fe }, G = {
277
+ xmlns: "http://www.w3.org/2000/svg",
278
+ fill: "currentColor",
279
+ viewBox: "0 -960 960 960"
266
280
  };
267
- function Nt(t, e) {
268
- return w(), y("svg", yt, [...e[0] || (e[0] = [
269
- b("path", { d: "M280-160v-520H80v-120h520v120H400v520zm360 0v-320H520v-120h360v120H760v320z" }, null, -1)
270
- ])]);
281
+ function K(e, t) {
282
+ return p(), i("svg", G, [...t[0] ||= [a("path", { d: "M280-160v-520H80v-120h520v120H400v520zm360 0v-320H520v-120h360v120H760v320z" }, null, -1)]]);
271
283
  }
272
- const Tt = { render: Nt }, Et = ["onMousedown"], kt = { class: "-jte-mentions-entry" }, Rt = { class: "-jte-mentions-ref" }, St = {
273
- key: 0,
274
- class: "-jte-mentions-waiting"
275
- }, Ot = {
276
- key: 1,
277
- class: "-jte-mentions-none"
278
- }, jt = {
279
- key: 0,
280
- class: "-jte-placeholder"
281
- }, Lt = ["contenteditable"], Mt = { class: "-jte-toolbox" }, Bt = /* @__PURE__ */ Ge({
282
- name: "JuitTinyEditor",
283
- __name: "editor",
284
- props: /* @__PURE__ */ nt({
285
- /** A flag indicating if content can be edited (default: `true`) */
286
- editable: {
287
- type: Boolean,
288
- required: !1,
289
- default: !0
290
- },
291
- /** A flag indicating whether dark mode is enabled or not */
292
- dark: {
293
- type: Boolean,
294
- required: !1,
295
- default: !1
296
- },
297
- /** A placeholder for when no text is available */
298
- placeholder: {
299
- type: String,
300
- required: !1,
301
- default: ""
302
- },
303
- /** A list of mentions to be used in the editor */
304
- mentions: {
305
- type: Object,
306
- required: !1,
307
- default: () => ({})
308
- },
309
- /** Used as `@mention="..."`, notify the current mention text (`@abc...`) */
310
- onMention: {
311
- type: Function,
312
- required: !1,
313
- default: void 0
314
- },
315
- /** Used as `@submit="..."`, will display the send button and emit HTML */
316
- onSubmit: {
317
- type: Function,
318
- required: !1,
319
- default: void 0
320
- }
321
- }, {
322
- modelValue: {
323
- type: String,
324
- required: !1,
325
- default: ""
326
- },
327
- modelModifiers: {}
328
- }),
329
- emits: ["update:modelValue"],
330
- setup(t) {
331
- const e = Xe(t, "modelValue"), l = t;
332
- N(() => l.dark, (r) => {
333
- s.value?.style.setProperty("color-scheme", r ? "dark light" : "light dark");
334
- });
335
- const s = q(null), o = q(null), i = q(null), a = q(null), f = q(null), c = q(null), m = T(""), p = T(0), d = q(null), k = _(() => d.value?.toString() || ""), ee = _(() => !!l.mentions), L = _(() => {
336
- const r = k.value.substring(1).toLowerCase();
337
- return l.mentions ? Object.entries(l.mentions).filter(([n, u]) => u.toLowerCase().startsWith(r)).sort(([n, u], [h, g]) => u.localeCompare(g)).map(([n, u]) => ({ name: n, value: u })) : [];
338
- }), W = T(null), K = T(null), te = T(null), P = _(() => W.value || K.value);
339
- N(W, (r) => r && (te.value = r));
340
- const ne = T(""), R = T(""), $e = _(() => {
341
- if (!R.value) return !0;
342
- try {
343
- return new URL(R.value), !0;
344
- } catch {
345
- return !1;
346
- }
347
- });
348
- N([ne, R], ([r, n]) => {
349
- P.value && (P.value.textContent = r, P.value.setAttribute("href", n), D());
350
- });
351
- const ue = T(null), ce = T(null), oe = T(0), Fe = _(() => "." + ".".repeat(oe.value % 5));
352
- let G = null;
353
- const M = T("");
354
- N(c, (r, n) => {
355
- n !== null && r !== null && (n.startContainer == r.startContainer && n.startOffset == r.startOffset && n.endContainer == r.endContainer && n.endOffset == r.endOffset && n?.backwards == r?.backwards || (M.value = ""));
356
- });
357
- const A = [];
358
- function de(r, n) {
359
- return c.value ? n ? r && M.value === n ? "" : r || M.value === n ? "-jte-active" : "" : r ? "-jte-active" : c.value.collapsed ? "-jte-disabled" : "" : "-jte-disabled";
360
- }
361
- function D() {
362
- if (!o.value) return void (m.value = "");
363
- const r = o.value.innerHTML;
364
- m.value = r === "<br>" ? "" : (
365
- // edge case: empty editor
366
- r.replaceAll("&nbsp;", " ").trimEnd()
367
- );
368
- }
369
- function fe() {
370
- if (o.value && A[A.length - 1]?.content !== m.value) {
371
- const r = ge(o.value) || { start: 0, end: 0 };
372
- A.push({ ...r, content: m.value }), A.length > 100 && A.shift();
373
- }
374
- }
375
- function Pe() {
376
- if (!o.value || !c.value) return;
377
- const r = A.pop();
378
- if (!r) return;
379
- const n = new DOMParser().parseFromString(r.content, "text/html").body;
380
- o.value.replaceChildren(...n.childNodes), be(o.value, r);
381
- }
382
- function we() {
383
- if (d.value && c.value?.collapsed) {
384
- const r = d.value.cloneRange();
385
- if (r.setEnd(c.value.startContainer, c.value.startOffset), r.toString().match(/^@[^\r\n]*$/)) {
386
- d.value = r;
387
- return;
388
- }
389
- }
390
- d.value = null;
391
- }
392
- function ye(r, n) {
393
- if (!o.value || !d.value) return;
394
- const u = o.value;
395
- fe();
396
- const h = document.createDocumentFragment(), g = document.createElement("link");
397
- g.setAttribute("rel", "mention"), g.setAttribute("name", r), g.setAttribute("title", n), h.append(g, " ");
398
- const v = he(u, d.value, h);
399
- I(v, !0), d.value = null, D();
400
- }
401
- function X(r, n = {}) {
402
- if (!o.value || !c.value) return;
403
- const u = o.value;
404
- if (c.value.collapsed) {
405
- M.value = r, u.focus();
406
- return;
407
- }
408
- fe();
409
- const h = U(u, c.value);
410
- Be(u, c.value, r, n), I(h), D();
411
- }
412
- function Ae() {
413
- if (!o.value || !c.value?.collapsed) return;
414
- const r = o.value, n = U(r, c.value), u = document.createTextNode("@");
415
- c.value.insertNode(u), n.end += 1, d.value = V(r, n), n.start += 1, I(n);
416
- }
417
- function I(r, n) {
418
- if (!o.value) return;
419
- const u = o.value;
420
- c.value = be(u, r, n), u.focus();
421
- }
422
- function Ie() {
423
- m.value && l.onSubmit?.(m.value);
424
- }
425
- function _e(r) {
426
- if (r.metaKey || r.ctrlKey)
427
- switch (r.key) {
428
- case "b":
429
- X("b"), r.preventDefault();
430
- break;
431
- case "i":
432
- X("i"), r.preventDefault();
433
- break;
434
- case "z":
435
- Pe(), r.preventDefault();
436
- break;
437
- }
438
- else if (d.value)
439
- switch (r.key) {
440
- case "Home":
441
- p.value = 0, r.preventDefault();
442
- break;
443
- case "ArrowUp":
444
- p.value = Math.max(p.value - 1, 0), r.preventDefault();
445
- break;
446
- case "PageUp":
447
- p.value = Math.max(p.value - 4, 0), r.preventDefault();
448
- break;
449
- case "ArrowDown":
450
- p.value = Math.min(p.value + 1, L.value.length - 1), r.preventDefault();
451
- break;
452
- case "PageDown":
453
- p.value = Math.min(p.value + 4, L.value.length - 1), r.preventDefault();
454
- break;
455
- case "End":
456
- p.value = L.value.length - 1, r.preventDefault();
457
- break;
458
- case "Escape":
459
- d.value = null, r.preventDefault();
460
- break;
461
- case "Enter": {
462
- const n = L.value[p.value];
463
- n && ye(n.name, n.value), r.preventDefault();
464
- break;
465
- }
466
- }
467
- }
468
- function ze(r) {
469
- if (r.preventDefault(), !o.value || !c.value) return;
470
- const n = r.clipboardData;
471
- if (!n) return;
472
- const u = n.getData("text/html") || n.getData("text/plain");
473
- if (!u) return;
474
- const h = he(o.value, c.value, u);
475
- I(h, !0), D();
476
- }
477
- function He(r) {
478
- if (o.value && c.value && (fe(), !c.value.collapsed && (r.inputType === "deleteContentBackward" || r.inputType === "deleteContentForward"))) {
479
- r.preventDefault(), r.stopPropagation();
480
- const n = he(o.value, c.value, "");
481
- I(n, !0), D();
482
- }
483
- }
484
- function Ve(r) {
485
- const n = o.value;
486
- if (!n) return;
487
- const u = d.value ? U(n, d.value) : null, h = ge(n);
488
- if (M.value && h && h.start === h.end && r.inputType === "insertText" && r.data !== "@" && !d.value) {
489
- const g = V(n, { start: h.start - 1, end: h.end });
490
- Be(n, g, M.value);
491
- }
492
- if (M.value = "", Z(n), u && (d.value = V(n, u)), h && (n.innerHTML === "<br>" ? (document.getSelection()?.setBaseAndExtent(n, 0, n, 0), n.focus()) : I(h)), !P.value && !d.value && r.data === "@" && r.inputType === "insertText") {
493
- const g = document.getSelection();
494
- if (!g?.anchorNode) return;
495
- const v = Ce(n, g.anchorNode, g.anchorOffset);
496
- if (v.match(/(\s|^)@$/)) {
497
- const C = v.length === 1 ? 0 : v.length - 1, x = v.length, S = { start: C, end: x };
498
- d.value = V(n, S);
499
- }
500
- } else
501
- we();
502
- D();
503
- }
504
- function Ne(r) {
505
- s.value && xe(s.value) || (W.value = null, te.value = null, K.value = null), c.value = o.value ? xe(o.value) : null, we();
506
- }
507
- return N(k, (r) => r && l.onMention?.(r)), Je(() => {
508
- if (document.addEventListener("selectionchange", Ne), !s.value) throw new Error("Root not referenced");
509
- if (!o.value) throw new Error("Editor not referenced");
510
- if (!i.value) throw new Error("Popup not referenced");
511
- if (!a.value) throw new Error("List not referenced");
512
- if (!f.value) throw new Error("Popup not referenced");
513
- const r = s.value, n = o.value, u = i.value, h = a.value, g = f.value;
514
- N(m, (v) => {
515
- v !== e.value && (e.value = v);
516
- }), N(e, (v) => {
517
- if (v === m.value) return;
518
- const C = `<html><body>${v}</body></html>`, x = new DOMParser().parseFromString(C, "text/html").body;
519
- Z(x), n.replaceChildren(...x.childNodes), D();
520
- }, { immediate: !0 }), N(ee, (v) => {
521
- oe.value = 0, v ? G && clearInterval(G) : G = setInterval(() => oe.value = oe.value + 1, 200);
522
- }, { immediate: !0 }), N(P, (v) => {
523
- if (ne.value = v?.textContent || "", R.value = v?.getAttribute("href") || "", R.value === "http://__placeholder__/" && (v?.setAttribute("href", ""), R.value = ""), !v) {
524
- const C = ge(n);
525
- Z(n), C && be(n, C), g.style.display = "none", g.style.top = "0", g.style.left = "0";
526
- return;
527
- }
528
- Oe(() => {
529
- g.style.display = "flex";
530
- const C = r.getBoundingClientRect(), x = v.getBoundingClientRect(), S = n.getBoundingClientRect(), B = getComputedStyle(g), E = parseInt(B.width), O = parseInt(B.height), re = x.top - O - 6 > S.top, le = x.bottom + O + 3 < S.bottom, J = x.left + E < S.right;
531
- g.style.top = !le && re ? `${x.top - O - C.top - 6}px` : (
532
- // over the link
533
- `${x.bottom - C.top + 3}px`
534
- ), g.style.left = J ? `${x.left - C.left}px` : (
535
- // right of the link
536
- `${S.right - E - C.left}px`
537
- );
538
- });
539
- }, { immediate: !0 }), N([p, d, L], ([v, C, x], [S = -1]) => {
540
- if (v >= x.length && (v = Math.max(x.length - 1, 0)), p.value = v, !!u && h) {
541
- if (!C) {
542
- p.value = 0, u.style.display = "none", u.style.top = "0", u.style.left = "0", h.scrollTop = 0;
543
- return;
544
- }
545
- Oe(() => {
546
- u.style.display = "block";
547
- const B = r.getBoundingClientRect(), E = C.getBoundingClientRect(), O = n.getBoundingClientRect(), re = getComputedStyle(u), le = parseInt(re.width), J = parseInt(re.height), Ue = E.top - J - 6 > O.top, We = E.bottom + J + 3 < O.bottom, Ke = E.left + le < O.right;
548
- u.style.top = !We && Ue ? `${E.top - J - B.top - 6}px` : (
549
- // over the link
550
- `${E.bottom - B.top + 3}px`
551
- ), u.style.left = Ke ? `${E.left - B.left}px` : (
552
- // right of the link
553
- `${O.right - le - B.left}px`
554
- );
555
- const pe = h.querySelectorAll("li")[p.value];
556
- if (!pe) return;
557
- const Te = getComputedStyle(pe), Ee = parseFloat(Te.getPropertyValue("border-top-width")) || 0, ke = parseFloat(Te.getPropertyValue("border-bottom-width")) || 0, Q = h.getBoundingClientRect(), ve = pe.getBoundingClientRect(), se = ve.top - Q.top, Re = ve.bottom - Q.bottom, Se = ve.bottom - Q.top;
558
- v > S ? Se > Q.height ? h.scrollTop += Re - ke : se < 0 && (h.scrollTop += se + Ee) : se < 0 ? h.scrollTop += se + Ee : Re > 0 && (h.scrollTop += Se - Q.height - ke);
559
- });
560
- }
561
- }, { immediate: !0 }), N(c, (v) => {
562
- v ? (W.value = ae(n, v, "a"), ue.value = ae(n, v, "b"), ce.value = ae(n, v, "i")) : (W.value = null, ue.value = null, ce.value = null);
563
- }, { immediate: !0 });
564
- }), Qe(() => {
565
- document.removeEventListener("selectionchange", Ne), G && clearInterval(G);
566
- }), (r, n) => (w(), y("div", {
567
- class: j(["juit-tiny-edit", { "-jte-editable": t.editable, "-jte-dark": t.dark }])
568
- }, [
569
- b("div", {
570
- ref_key: "rootRef",
571
- ref: s,
572
- class: "-jte-root"
573
- }, [
574
- b("div", {
575
- ref_key: "mentionsPopupRef",
576
- ref: i,
577
- class: "-jte-mentions-popup"
578
- }, [
579
- b("ul", {
580
- ref_key: "mentionsListRef",
581
- ref: a
582
- }, [
583
- (w(!0), y(Ye, null, Ze(L.value, (u, h) => (w(), y("li", {
584
- key: h,
585
- class: j({ "-jte-mentions-selected": p.value === h }),
586
- onMousedown: (g) => ye(u.name, u.value)
587
- }, [
588
- b("div", kt, [
589
- et(z(u.value) + " ", 1),
590
- b("span", Rt, z(u.name), 1)
591
- ])
592
- ], 42, Et))), 128))
593
- ], 512),
594
- ee.value ? L.value.length ? me("", !0) : (w(), y("div", Ot, z(k.value), 1)) : (w(), y("div", St, z(k.value) + z(Fe.value), 1))
595
- ], 512),
596
- b("div", {
597
- ref_key: "linksPopupRef",
598
- ref: f,
599
- class: "-jte-links-popup",
600
- onClick: n[2] || (n[2] = (u) => K.value = te.value),
601
- onFocusin: n[3] || (n[3] = (u) => K.value = te.value)
602
- }, [
603
- b("div", null, [
604
- H($(Tt), { class: "-jte-icon" }),
605
- je(b("input", {
606
- "onUpdate:modelValue": n[0] || (n[0] = (u) => ne.value = u),
607
- type: "text"
608
- }, null, 512), [
609
- [Le, ne.value]
610
- ])
611
- ]),
612
- b("div", {
613
- class: j({ "-jte-error": !$e.value })
614
- }, [
615
- H($(qe), { class: "-jte-icon" }),
616
- je(b("input", {
617
- "onUpdate:modelValue": n[1] || (n[1] = (u) => R.value = u),
618
- type: "text"
619
- }, null, 512), [
620
- [Le, R.value]
621
- ])
622
- ], 2)
623
- ], 544),
624
- t.placeholder && !m.value ? (w(), y("div", jt, z(t.placeholder), 1)) : me("", !0),
625
- b("div", {
626
- ref_key: "editorRef",
627
- ref: o,
628
- class: "-jte-editor",
629
- contenteditable: t.editable ? "plaintext-only" : "false",
630
- onBeforeinput: n[4] || (n[4] = (u) => He(u)),
631
- onInput: n[5] || (n[5] = (u) => Ve(u)),
632
- onKeydown: n[6] || (n[6] = (u) => _e(u)),
633
- onPaste: n[7] || (n[7] = (u) => ze(u)),
634
- onFocusin: n[8] || (n[8] = (u) => K.value = null)
635
- }, null, 40, Lt),
636
- b("div", Mt, [
637
- H($(bt), {
638
- class: j(["-jte-icon -jte-icon-mention", { "-jte-disabled": !c.value?.collapsed }]),
639
- onClick: Ae
640
- }, null, 8, ["class"]),
641
- H($(ct), {
642
- class: j(["-jte-icon -jte-icon-bold", de(ue.value, "b")]),
643
- onClick: n[9] || (n[9] = (u) => X("b"))
644
- }, null, 8, ["class"]),
645
- H($(pt), {
646
- class: j(["-jte-icon -jte-icon-italic", de(ce.value, "i")]),
647
- onClick: n[10] || (n[10] = (u) => X("i"))
648
- }, null, 8, ["class"]),
649
- H($(qe), {
650
- class: j(["-jte-icon -jte-icon-href", de(P.value)]),
651
- onClick: n[11] || (n[11] = (u) => X("a", { href: "http://__placeholder__/" }))
652
- }, null, 8, ["class"]),
653
- t.onSubmit ? (w(), tt($(wt), {
654
- key: 0,
655
- class: j(["-jte-icon -jte-icon-send", { "-jte-disabled": !m.value, "-jte-active": !!m.value }]),
656
- onClick: Ie
657
- }, null, 8, ["class"])) : me("", !0)
658
- ])
659
- ], 512)
660
- ], 2));
661
- }
284
+ var me = { render: K }, he = ["onMousedown"], ge = { class: "-jte-mentions-entry" }, _e = { class: "-jte-mentions-ref" }, ve = {
285
+ key: 0,
286
+ class: "-jte-mentions-waiting"
287
+ }, ye = {
288
+ key: 1,
289
+ class: "-jte-mentions-none"
290
+ }, be = {
291
+ key: 0,
292
+ class: "-jte-placeholder"
293
+ }, xe = ["contenteditable"], Se = { class: "-jte-toolbox" }, q = /* @__PURE__ */ c({
294
+ name: "JuitTinyEditor",
295
+ __name: "editor",
296
+ props: /*@__PURE__*/ l({
297
+ editable: {
298
+ type: Boolean,
299
+ required: !1,
300
+ default: !0
301
+ },
302
+ dark: {
303
+ type: Boolean,
304
+ required: !1,
305
+ default: !1
306
+ },
307
+ placeholder: {
308
+ type: String,
309
+ required: !1,
310
+ default: ""
311
+ },
312
+ mentions: {
313
+ type: Object,
314
+ required: !1,
315
+ default: () => ({})
316
+ },
317
+ onMention: {
318
+ type: Function,
319
+ required: !1,
320
+ default: void 0
321
+ },
322
+ onSubmit: {
323
+ type: Function,
324
+ required: !1,
325
+ default: void 0
326
+ }
327
+ }, {
328
+ modelValue: {
329
+ type: String,
330
+ required: !1,
331
+ default: ""
332
+ },
333
+ modelModifiers: {}
334
+ }),
335
+ emits: ["update:modelValue"],
336
+ setup(c) {
337
+ let l = y(c, "modelValue"), C = c;
338
+ x(() => C.dark, (e) => {
339
+ w.value?.style.setProperty("color-scheme", e ? "dark light" : "light dark");
340
+ });
341
+ let w = g(null), T = g(null), O = g(null), k = g(null), A = g(null), j = g(null), M = m(""), N = m(0), P = g(null), L = t(() => P.value?.toString() || ""), se = t(() => !!C.mentions), R = t(() => {
342
+ let e = L.value.substring(1).toLowerCase();
343
+ return C.mentions ? Object.entries(C.mentions).filter(([t, n]) => n.toLowerCase().startsWith(e)).sort(([e, t], [n, r]) => t.localeCompare(r)).map(([e, t]) => ({
344
+ name: e,
345
+ value: t
346
+ })) : [];
347
+ }), z = m(null), B = m(null), V = m(null), H = t(() => z.value || B.value);
348
+ x(z, (e) => e && (V.value = e));
349
+ let U = m(""), W = m(""), fe = t(() => {
350
+ if (!W.value) return !0;
351
+ try {
352
+ return new URL(W.value), !0;
353
+ } catch {
354
+ return !1;
355
+ }
356
+ });
357
+ x([U, W], ([e, t]) => {
358
+ H.value && (H.value.textContent = e, H.value.setAttribute("href", t), Z());
359
+ });
360
+ let G = m(null), K = m(null), q = m(0), Ce = t(() => "." + ".".repeat(q.value % 5)), J = null, Y = m("");
361
+ x(j, (e, t) => {
362
+ t !== null && e !== null && (t.startContainer == e.startContainer && t.startOffset == e.startOffset && t.endContainer == e.endContainer && t.endOffset == e.endOffset && t?.backwards == e?.backwards || (Y.value = ""));
363
+ });
364
+ let X = [];
365
+ function we(e, t) {
366
+ return j.value ? t ? e && Y.value === t ? "" : e || Y.value === t ? "-jte-active" : "" : e ? "-jte-active" : j.value.collapsed ? "-jte-disabled" : "" : "-jte-disabled";
367
+ }
368
+ function Z() {
369
+ if (!T.value) return void (M.value = "");
370
+ let e = T.value.innerHTML;
371
+ M.value = e === "<br>" ? "" : e.replaceAll("&nbsp;", " ").trimEnd();
372
+ }
373
+ function Te() {
374
+ if (T.value && X[X.length - 1]?.content !== M.value) {
375
+ let e = ie(T.value) || {
376
+ start: 0,
377
+ end: 0
378
+ };
379
+ X.push({
380
+ ...e,
381
+ content: M.value
382
+ }), X.length > 100 && X.shift();
383
+ }
384
+ }
385
+ function Ee() {
386
+ if (!T.value || !j.value) return;
387
+ let e = X.pop();
388
+ if (!e) return;
389
+ let t = new DOMParser().parseFromString(e.content, "text/html").body;
390
+ T.value.replaceChildren(...t.childNodes), ae(T.value, e);
391
+ }
392
+ function De() {
393
+ if (P.value && j.value?.collapsed) {
394
+ let e = P.value.cloneRange();
395
+ if (e.setEnd(j.value.startContainer, j.value.startOffset), e.toString().match(/^@[^\r\n]*$/)) {
396
+ P.value = e;
397
+ return;
398
+ }
399
+ }
400
+ P.value = null;
401
+ }
402
+ function Oe(e, t) {
403
+ if (!T.value || !P.value) return;
404
+ let n = T.value;
405
+ Te();
406
+ let r = document.createDocumentFragment(), i = document.createElement("link");
407
+ i.setAttribute("rel", "mention"), i.setAttribute("name", e), i.setAttribute("title", t), r.append(i, " "), $(ne(n, P.value, r), !0), P.value = null, Z();
408
+ }
409
+ function Q(e, t = {}) {
410
+ if (!T.value || !j.value) return;
411
+ let n = T.value;
412
+ if (j.value.collapsed) {
413
+ Y.value = e, n.focus();
414
+ return;
415
+ }
416
+ Te();
417
+ let r = E(n, j.value);
418
+ oe(n, j.value, e, t), $(r), Z();
419
+ }
420
+ function ke() {
421
+ if (!T.value || !j.value?.collapsed) return;
422
+ let e = T.value, t = E(e, j.value), n = document.createTextNode("@");
423
+ j.value.insertNode(n), t.end += 1, P.value = D(e, t), t.start += 1, $(t);
424
+ }
425
+ function $(e, t) {
426
+ if (!T.value) return;
427
+ let n = T.value;
428
+ j.value = ae(n, e, t), n.focus();
429
+ }
430
+ function Ae() {
431
+ M.value && C.onSubmit?.(M.value);
432
+ }
433
+ function je(e) {
434
+ if (e.metaKey || e.ctrlKey) switch (e.key) {
435
+ case "b":
436
+ Q("b"), e.preventDefault();
437
+ break;
438
+ case "i":
439
+ Q("i"), e.preventDefault();
440
+ break;
441
+ case "z":
442
+ Ee(), e.preventDefault();
443
+ break;
444
+ }
445
+ else if (P.value) switch (e.key) {
446
+ case "Home":
447
+ N.value = 0, e.preventDefault();
448
+ break;
449
+ case "ArrowUp":
450
+ N.value = Math.max(N.value - 1, 0), e.preventDefault();
451
+ break;
452
+ case "PageUp":
453
+ N.value = Math.max(N.value - 4, 0), e.preventDefault();
454
+ break;
455
+ case "ArrowDown":
456
+ N.value = Math.min(N.value + 1, R.value.length - 1), e.preventDefault();
457
+ break;
458
+ case "PageDown":
459
+ N.value = Math.min(N.value + 4, R.value.length - 1), e.preventDefault();
460
+ break;
461
+ case "End":
462
+ N.value = R.value.length - 1, e.preventDefault();
463
+ break;
464
+ case "Escape":
465
+ P.value = null, e.preventDefault();
466
+ break;
467
+ case "Enter": {
468
+ let t = R.value[N.value];
469
+ t && Oe(t.name, t.value), e.preventDefault();
470
+ break;
471
+ }
472
+ }
473
+ }
474
+ function Me(e) {
475
+ if (e.preventDefault(), !T.value || !j.value) return;
476
+ let t = e.clipboardData;
477
+ if (!t) return;
478
+ let n = t.getData("text/html") || t.getData("text/plain");
479
+ n && ($(ne(T.value, j.value, n), !0), Z());
480
+ }
481
+ function Ne(e) {
482
+ T.value && j.value && (Te(), !j.value.collapsed && (e.inputType === "deleteContentBackward" || e.inputType === "deleteContentForward") && (e.preventDefault(), e.stopPropagation(), $(ne(T.value, j.value, ""), !0), Z()));
483
+ }
484
+ function Pe(e) {
485
+ let t = T.value;
486
+ if (!t) return;
487
+ let n = P.value ? E(t, P.value) : null, r = ie(t);
488
+ if (Y.value && r && r.start === r.end && e.inputType === "insertText" && e.data !== "@" && !P.value && oe(t, D(t, {
489
+ start: r.start - 1,
490
+ end: r.end
491
+ }), Y.value), Y.value = "", F(t), n && (P.value = D(t, n)), r && (t.innerHTML === "<br>" ? (document.getSelection()?.setBaseAndExtent(t, 0, t, 0), t.focus()) : $(r)), !H.value && !P.value && e.data === "@" && e.inputType === "insertText") {
492
+ let e = document.getSelection();
493
+ if (!e?.anchorNode) return;
494
+ let n = te(t, e.anchorNode, e.anchorOffset);
495
+ n.match(/(\s|^)@$/) && (P.value = D(t, {
496
+ start: n.length === 1 ? 0 : n.length - 1,
497
+ end: n.length
498
+ }));
499
+ } else De();
500
+ Z();
501
+ }
502
+ function Fe(e) {
503
+ w.value && re(w.value) || (z.value = null, V.value = null, B.value = null), j.value = T.value ? re(T.value) : null, De();
504
+ }
505
+ return x(L, (e) => e && C.onMention?.(e)), f(() => {
506
+ if (document.addEventListener("selectionchange", Fe), !w.value) throw Error("Root not referenced");
507
+ if (!T.value) throw Error("Editor not referenced");
508
+ if (!O.value) throw Error("Popup not referenced");
509
+ if (!k.value) throw Error("List not referenced");
510
+ if (!A.value) throw Error("Popup not referenced");
511
+ let e = w.value, t = T.value, n = O.value, r = k.value, i = A.value;
512
+ x(M, (e) => {
513
+ e !== l.value && (l.value = e);
514
+ }), x(l, (e) => {
515
+ if (e === M.value) return;
516
+ let n = `<html><body>${e}</body></html>`, r = new DOMParser().parseFromString(n, "text/html").body;
517
+ F(r), t.replaceChildren(...r.childNodes), Z();
518
+ }, { immediate: !0 }), x(se, (e) => {
519
+ q.value = 0, e ? J && clearInterval(J) : J = setInterval(() => q.value += 1, 200);
520
+ }, { immediate: !0 }), x(H, (n) => {
521
+ if (U.value = n?.textContent || "", W.value = n?.getAttribute("href") || "", W.value === "http://__placeholder__/" && (n?.setAttribute("href", ""), W.value = ""), !n) {
522
+ let e = ie(t);
523
+ F(t), e && ae(t, e), i.style.display = "none", i.style.top = "0", i.style.left = "0";
524
+ return;
525
+ }
526
+ u(() => {
527
+ i.style.display = "flex";
528
+ let r = e.getBoundingClientRect(), a = n.getBoundingClientRect(), o = t.getBoundingClientRect(), s = getComputedStyle(i), c = parseInt(s.width), l = parseInt(s.height), u = a.top - l - 6 > o.top, d = a.bottom + l + 3 < o.bottom, f = a.left + c < o.right;
529
+ i.style.top = !d && u ? `${a.top - l - r.top - 6}px` : `${a.bottom - r.top + 3}px`, i.style.left = f ? `${a.left - r.left}px` : `${o.right - c - r.left}px`;
530
+ });
531
+ }, { immediate: !0 }), x([
532
+ N,
533
+ P,
534
+ R
535
+ ], ([i, a, o], [s = -1]) => {
536
+ if (i >= o.length && (i = Math.max(o.length - 1, 0)), N.value = i, n && r) {
537
+ if (!a) {
538
+ N.value = 0, n.style.display = "none", n.style.top = "0", n.style.left = "0", r.scrollTop = 0;
539
+ return;
540
+ }
541
+ u(() => {
542
+ n.style.display = "block";
543
+ let o = e.getBoundingClientRect(), c = a.getBoundingClientRect(), l = t.getBoundingClientRect(), u = getComputedStyle(n), d = parseInt(u.width), f = parseInt(u.height), ee = c.top - f - 6 > l.top, p = c.bottom + f + 3 < l.bottom, m = c.left + d < l.right;
544
+ n.style.top = !p && ee ? `${c.top - f - o.top - 6}px` : `${c.bottom - o.top + 3}px`, n.style.left = m ? `${c.left - o.left}px` : `${l.right - d - o.left}px`;
545
+ let h = r.querySelectorAll("li")[N.value];
546
+ if (!h) return;
547
+ let g = getComputedStyle(h), _ = parseFloat(g.getPropertyValue("border-top-width")) || 0, v = parseFloat(g.getPropertyValue("border-bottom-width")) || 0, y = r.getBoundingClientRect(), b = h.getBoundingClientRect(), x = b.top - y.top, S = b.bottom - y.bottom, C = b.bottom - y.top;
548
+ i > s ? C > y.height ? r.scrollTop += S - v : x < 0 && (r.scrollTop += x + _) : x < 0 ? r.scrollTop += x + _ : S > 0 && (r.scrollTop += C - y.height - v);
549
+ });
550
+ }
551
+ }, { immediate: !0 }), x(j, (e) => {
552
+ e ? (z.value = I(t, e, "a"), G.value = I(t, e, "b"), K.value = I(t, e, "i")) : (z.value = null, G.value = null, K.value = null);
553
+ }, { immediate: !0 });
554
+ }), ee(() => {
555
+ document.removeEventListener("selectionchange", Fe), J && clearInterval(J);
556
+ }), (t, l) => (p(), i("div", { class: d(["juit-tiny-edit", {
557
+ "-jte-editable": c.editable,
558
+ "-jte-dark": c.dark
559
+ }]) }, [a("div", {
560
+ ref_key: "rootRef",
561
+ ref: w,
562
+ class: "-jte-root"
563
+ }, [
564
+ a("div", {
565
+ ref_key: "mentionsPopupRef",
566
+ ref: O,
567
+ class: "-jte-mentions-popup"
568
+ }, [a("ul", {
569
+ ref_key: "mentionsListRef",
570
+ ref: k
571
+ }, [(p(!0), i(e, null, h(R.value, (e, t) => (p(), i("li", {
572
+ key: t,
573
+ class: d({ "-jte-mentions-selected": N.value === t }),
574
+ onMousedown: (t) => Oe(e.name, e.value)
575
+ }, [a("div", ge, [o(_(e.value) + " ", 1), a("span", _e, _(e.name), 1)])], 42, he))), 128))], 512), se.value ? R.value.length ? r("", !0) : (p(), i("div", ye, _(L.value), 1)) : (p(), i("div", ve, _(L.value) + _(Ce.value), 1))], 512),
576
+ a("div", {
577
+ ref_key: "linksPopupRef",
578
+ ref: A,
579
+ class: "-jte-links-popup",
580
+ onClick: l[2] ||= (e) => B.value = V.value,
581
+ onFocusin: l[3] ||= (e) => B.value = V.value
582
+ }, [a("div", null, [s(v(me), { class: "-jte-icon" }), S(a("input", {
583
+ "onUpdate:modelValue": l[0] ||= (e) => U.value = e,
584
+ type: "text"
585
+ }, null, 512), [[b, U.value]])]), a("div", { class: d({ "-jte-error": !fe.value }) }, [s(v(ue), { class: "-jte-icon" }), S(a("input", {
586
+ "onUpdate:modelValue": l[1] ||= (e) => W.value = e,
587
+ type: "text"
588
+ }, null, 512), [[b, W.value]])], 2)], 544),
589
+ c.placeholder && !M.value ? (p(), i("div", be, _(c.placeholder), 1)) : r("", !0),
590
+ a("div", {
591
+ ref_key: "editorRef",
592
+ ref: T,
593
+ class: "-jte-editor",
594
+ contenteditable: c.editable ? "plaintext-only" : "false",
595
+ onBeforeinput: l[4] ||= (e) => Ne(e),
596
+ onInput: l[5] ||= (e) => Pe(e),
597
+ onKeydown: l[6] ||= (e) => je(e),
598
+ onPaste: l[7] ||= (e) => Me(e),
599
+ onFocusin: l[8] ||= (e) => B.value = null
600
+ }, null, 40, xe),
601
+ a("div", Se, [
602
+ s(v(de), {
603
+ class: d(["-jte-icon -jte-icon-mention", { "-jte-disabled": !j.value?.collapsed }]),
604
+ onClick: ke
605
+ }, null, 8, ["class"]),
606
+ s(v(ce), {
607
+ class: d(["-jte-icon -jte-icon-bold", we(G.value, "b")]),
608
+ onClick: l[9] ||= (e) => Q("b")
609
+ }, null, 8, ["class"]),
610
+ s(v(le), {
611
+ class: d(["-jte-icon -jte-icon-italic", we(K.value, "i")]),
612
+ onClick: l[10] ||= (e) => Q("i")
613
+ }, null, 8, ["class"]),
614
+ s(v(ue), {
615
+ class: d(["-jte-icon -jte-icon-href", we(H.value)]),
616
+ onClick: l[11] ||= (e) => Q("a", { href: "http://__placeholder__/" })
617
+ }, null, 8, ["class"]),
618
+ c.onSubmit ? (p(), n(v(pe), {
619
+ key: 0,
620
+ class: d(["-jte-icon -jte-icon-send", {
621
+ "-jte-disabled": !M.value,
622
+ "-jte-active": !!M.value
623
+ }]),
624
+ onClick: Ae
625
+ }, null, 8, ["class"])) : r("", !0)
626
+ ])
627
+ ], 512)], 2));
628
+ }
662
629
  });
663
- export {
664
- Bt as default
665
- };
666
- //# sourceMappingURL=index.js.map
630
+ //#endregion
631
+ export { q as default };
632
+
633
+ //# sourceMappingURL=index.js.map