@opentiny/tiny-robot 0.3.0-alpha.14 → 0.3.0-alpha.16

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,286 +1,438 @@
1
- import { ref as H, watch as ee, reactive as at, computed as L, nextTick as J, defineComponent as me, createElementBlock as R, openBlock as S, createCommentVNode as M, normalizeStyle as Pe, createBlock as Y, unref as C, withCtx as re, createElementVNode as z, createVNode as X, normalizeClass as te, toDisplayString as ae, useAttrs as lt, resolveComponent as rt, mergeProps as ve, Fragment as ie, renderList as ye, mergeModels as it, useModel as ut, Transition as He, withModifiers as ct, useSlots as dt, renderSlot as oe, isRef as ft, createTextVNode as Ge } from "vue";
2
- import { I as pt } from "../index6.js";
3
- import { d as ht } from "../index3.js";
4
- import { T as Ee } from "../index2.js";
5
- import { p as gt, u as vt, I as yt, x as mt, i as St, l as wt, z as _t } from "../tiny-robot-svgs.js";
6
- import { _ as Oe } from "../_plugin-vue_export-helper.js";
7
- import { t as bt } from "../utils.js";
8
- function Ct(i, c) {
9
- const a = H(i.modelValue || i.defaultValue || ""), u = H(null);
10
- ee(
11
- () => i.modelValue,
12
- (h) => {
13
- h !== void 0 && h !== a.value && (a.value = h);
1
+ import { ref as O, watch as te, reactive as $e, computed as P, nextTick as W, defineComponent as be, createElementBlock as A, openBlock as D, createCommentVNode as H, createBlock as Q, unref as E, withCtx as Y, createVNode as G, normalizeClass as ae, resolveDynamicComponent as it, createElementVNode as U, mergeModels as Fe, useModel as rt, onMounted as ut, useSlots as ct, Transition as ve, renderSlot as se, isRef as Le, createTextVNode as Oe, toDisplayString as le, normalizeStyle as Ie, Fragment as Ae, renderList as Me, withModifiers as dt } from "vue";
2
+ import { I as ft } from "../index5.js";
3
+ import { g as z, i as pt, t as mt } from "../utils.js";
4
+ import { B as fe } from "../index3.js";
5
+ import { T as Ve } from "../index4.js";
6
+ import { i as ht } from "../close.js";
7
+ import { o as gt, H as vt, g as yt, F as bt, X as Ct, s as St } from "../tiny-robot-svgs.js";
8
+ function wt(t, y) {
9
+ const h = O(t.modelValue || t.defaultValue || ""), o = O(null);
10
+ te(
11
+ () => t.modelValue,
12
+ (f) => {
13
+ f !== void 0 && f !== h.value && (h.value = f);
14
14
  }
15
- ), ee(
16
- () => a.value,
17
- (h) => {
18
- c("update:modelValue", h);
15
+ ), te(
16
+ () => h.value,
17
+ (f) => {
18
+ y("update:modelValue", f);
19
19
  }
20
20
  );
21
- const v = (h) => {
22
- a.value = h, c("update:modelValue", h);
23
- }, w = (h) => {
24
- h == null || h.preventDefault();
25
- const k = a.value;
26
- !i.disabled && !i.loading && k.trim() && c("submit", k);
27
- }, o = () => {
28
- a.value = "", c("update:modelValue", ""), c("clear");
29
- }, p = H(!1);
21
+ const x = (f) => {
22
+ h.value = f, y("update:modelValue", f);
23
+ }, u = (f) => {
24
+ f == null || f.preventDefault();
25
+ const p = h.value;
26
+ !t.disabled && !t.loading && p.trim() && y("submit", p);
27
+ }, i = () => {
28
+ h.value = "", y("update:modelValue", ""), y("clear");
29
+ }, r = O(!1);
30
30
  return {
31
- inputValue: a,
32
- inputWrapper: u,
33
- isComposing: p,
34
- handleChange: v,
35
- handleSubmit: w,
36
- handleClear: o,
31
+ inputValue: h,
32
+ inputWrapper: o,
33
+ isComposing: r,
34
+ handleChange: x,
35
+ handleSubmit: u,
36
+ handleClear: i,
37
37
  clearInput: () => {
38
- o();
38
+ i();
39
39
  }
40
40
  };
41
41
  }
42
- function kt(i, c, a, u, v, w, o, p, b, h, k, g, I, m, P, B) {
43
- const A = () => {
44
- g.value && (P != null && P.value && (B == null || B()), c("submit", a.value.trim()));
45
- }, f = (y, W) => {
46
- if (!(y.key === "Enter")) return !1;
47
- switch (W) {
42
+ const Pe = "​", ee = (t) => t.split("").every((y) => y === Pe), J = (t) => t.replace(/\u200B/g, ""), ye = () => document.createTextNode(Pe), Et = (t) => {
43
+ const y = t.textContent || "", h = J(y);
44
+ return !h || h.trim() === "";
45
+ }, Be = (t) => {
46
+ const y = t.nextSibling;
47
+ if (y && y.nodeType === Node.TEXT_NODE && ee(y.textContent || ""))
48
+ return;
49
+ const h = ye();
50
+ t.parentNode && t.parentNode.insertBefore(h, t.nextSibling);
51
+ }, _t = (t) => {
52
+ Array.from(t.childNodes).forEach((h) => {
53
+ if (h.nodeType === Node.TEXT_NODE && ee(h.textContent || "")) {
54
+ const o = h.previousSibling;
55
+ o && o.nodeType === Node.ELEMENT_NODE && o.classList.contains("template-field") || h.parentNode && h.parentNode.removeChild(h);
56
+ }
57
+ });
58
+ };
59
+ function Tt(t, y, h, o, x, u, i, r, c, f, p, a, b, L) {
60
+ const _ = (m) => !(t.disabled || t.loading || m.trim().length === 0 || a.value), v = () => {
61
+ _(h.value) && y("submit", h.value.trim());
62
+ }, R = (m, $) => {
63
+ if (!(m.key === "Enter")) return !1;
64
+ switch ($) {
48
65
  case "enter":
49
- return !y.shiftKey && !y.ctrlKey && !y.metaKey;
66
+ return !m.shiftKey && !m.ctrlKey && !m.metaKey;
50
67
  case "ctrlEnter":
51
- return (y.ctrlKey || y.metaKey) && !y.shiftKey;
68
+ return (m.ctrlKey || m.metaKey) && !m.shiftKey;
52
69
  case "shiftEnter":
53
- return y.shiftKey && !y.ctrlKey && !y.metaKey;
70
+ return m.shiftKey && !m.ctrlKey && !m.metaKey;
54
71
  default:
55
72
  return !1;
56
73
  }
57
74
  };
58
75
  return {
59
- handleKeyPress: (y) => {
60
- if (u.value) return;
61
- if (y.key === "Enter" && y.shiftKey && (I == null ? void 0 : I.value) === "single" && m) {
62
- y.preventDefault(), m();
63
- const K = y.target, q = K.selectionStart, Q = a.value;
64
- a.value = Q.substring(0, q) + `
65
- ` + Q.substring(q), setTimeout(() => {
66
- K.selectionStart = K.selectionEnd = q + 1;
76
+ handleKeyPress: (m) => {
77
+ if (o.value) return;
78
+ if (m.key === "Enter" && m.shiftKey && (b == null ? void 0 : b.value) === "single" && L) {
79
+ m.preventDefault(), L();
80
+ const V = m.target, K = V.selectionStart, C = h.value;
81
+ h.value = C.substring(0, K) + `
82
+ ` + C.substring(K), setTimeout(() => {
83
+ V.selectionStart = V.selectionEnd = K + 1;
67
84
  }, 0);
68
85
  return;
69
86
  }
70
- if (y.key === "Tab" && w.value && o.value) {
71
- y.preventDefault(), p();
87
+ if (m.key === "Tab" && u.value && i.value) {
88
+ m.preventDefault(), r();
72
89
  return;
73
90
  }
74
- if (w.value) {
75
- if (y.key === "ArrowDown") {
76
- y.preventDefault(), h("down");
91
+ if (u.value) {
92
+ if (m.key === "ArrowDown") {
93
+ m.preventDefault(), f("down");
77
94
  return;
78
95
  }
79
- if (y.key === "ArrowUp") {
80
- y.preventDefault(), h("up");
96
+ if (m.key === "ArrowUp") {
97
+ m.preventDefault(), f("up");
81
98
  return;
82
99
  }
83
- if (y.key === "Enter" && o.value) {
84
- y.preventDefault(), p();
100
+ if (m.key === "Enter" && i.value) {
101
+ m.preventDefault(), r();
85
102
  return;
86
103
  }
87
104
  }
88
- if (y.key === "Escape") {
89
- w.value ? (b(), y.preventDefault()) : v.isRecording && (k(), y.preventDefault()), c("escape-press");
105
+ if (m.key === "Escape") {
106
+ u.value ? (c(), m.preventDefault()) : x.isRecording && (p(), m.preventDefault()), y("escape-press");
90
107
  return;
91
108
  }
92
- f(y, i.submitType) && (y.preventDefault(), g.value && A());
109
+ R(m, t.submitType) && _(h.value) && (m.preventDefault(), v());
93
110
  },
94
- triggerSubmit: A
111
+ triggerSubmit: v
95
112
  };
96
113
  }
97
- function xt(i) {
98
- const c = at({
114
+ function Nt(t) {
115
+ const y = (u, i, r) => {
116
+ var L, _;
117
+ const { startOffset: c, collapsed: f } = i;
118
+ let p = i.startContainer;
119
+ if ((L = p.parentElement) != null && L.classList.contains("template-field") && (p = p.parentElement), !f) return !1;
120
+ const a = p.nodeType === Node.TEXT_NODE && c === 0 && u.key === "ArrowLeft", b = p.nodeType === Node.TEXT_NODE && c === (((_ = p.textContent) == null ? void 0 : _.length) || 0) && u.key === "ArrowRight";
121
+ if (a || b) {
122
+ let v = null, R = "inside";
123
+ if (a)
124
+ if (p.parentNode && p.parentNode.classList.contains("template-field"))
125
+ v = p.parentNode, R = "before";
126
+ else {
127
+ let w = p.previousSibling;
128
+ !w && p.parentNode && p.parentNode !== r && (w = p.parentNode.previousSibling), w && w.nodeType === Node.ELEMENT_NODE && w.classList.contains("template-field") && (v = w, R = "inside");
129
+ }
130
+ else if (b)
131
+ if (p.parentNode && p.parentNode.classList.contains("template-field"))
132
+ v = p.parentNode, R = "after";
133
+ else {
134
+ let w = p.nextSibling;
135
+ !w && p.parentNode && p.parentNode !== r && (w = p.parentNode.nextSibling), w && w.nodeType === Node.ELEMENT_NODE && w.classList.contains("template-field") && (v = w, R = "inside");
136
+ }
137
+ if (v) {
138
+ u.preventDefault();
139
+ const w = document.createRange(), m = z(r);
140
+ return m && (R === "before" ? w.setStartBefore(v) : R === "after" ? w.setStartAfter(v) : (w.selectNodeContents(v), w.collapse(u.key === "ArrowLeft")), m.removeAllRanges(), m.addRange(w)), !0;
141
+ }
142
+ }
143
+ if (p.nodeType === Node.ELEMENT_NODE && p.classList.contains("template-field")) {
144
+ const R = p.textContent || "", w = J(R);
145
+ if (!w || w.trim() === "") {
146
+ u.preventDefault();
147
+ const m = document.createRange(), $ = z(r);
148
+ if (!$) return !0;
149
+ if (u.key === "ArrowLeft")
150
+ m.setStartBefore(p);
151
+ else {
152
+ const V = p.nextSibling;
153
+ V && V.nodeType === Node.TEXT_NODE && ee(V.textContent || "") ? (m.setStart(V, 0), m.setEnd(V, 0)) : m.setStartAfter(p);
154
+ }
155
+ return m.collapse(!0), $.removeAllRanges(), $.addRange(m), !0;
156
+ }
157
+ }
158
+ if (p.nodeType === Node.TEXT_NODE && ee(p.textContent || "")) {
159
+ const v = p.previousSibling, R = p.nextSibling;
160
+ u.preventDefault();
161
+ const w = document.createRange(), m = z(r);
162
+ return m && (u.key === "ArrowLeft" ? v && v.nodeType === Node.ELEMENT_NODE && v.classList.contains("template-field") ? (w.selectNodeContents(v), w.collapse(!1)) : w.setStartBefore(p) : R ? R.nodeType === Node.ELEMENT_NODE && R.classList.contains("template-field") ? (w.selectNodeContents(R), w.collapse(!0)) : pt(r) ? (w.setStart(R, 1), w.collapse(!0)) : w.setStartAfter(p) : w.setStartAfter(p), m.removeAllRanges(), m.addRange(w)), !0;
163
+ }
164
+ return !1;
165
+ }, h = (u, i, r) => {
166
+ if (!i.collapsed) return !1;
167
+ const { startContainer: c, startOffset: f } = i;
168
+ if (c.nodeType === Node.TEXT_NODE && ee(c.textContent || "")) {
169
+ const a = c.previousSibling;
170
+ if (a && a.nodeType === Node.ELEMENT_NODE && a.classList.contains("template-field")) {
171
+ const b = a, L = b.textContent || "", _ = J(L);
172
+ if (!_ || _.trim() === "") {
173
+ u.preventDefault();
174
+ const v = b.previousSibling, R = c.nextSibling;
175
+ b.parentNode && b.parentNode.removeChild(b), c.parentNode && c.parentNode.removeChild(c);
176
+ const w = z(r);
177
+ if (w) {
178
+ const m = document.createRange();
179
+ v ? v.nodeType === Node.ELEMENT_NODE && v.classList.contains("template-field") ? (m.selectNodeContents(v), m.collapse(!1)) : v.nodeType === Node.TEXT_NODE && ee(v.textContent || "") ? (m.setStart(v, 0), m.setEnd(v, 0)) : m.setStartAfter(v) : R ? m.setStartBefore(R) : m.setStart(r, 0), m.collapse(!0), w.removeAllRanges(), w.addRange(m);
180
+ }
181
+ return t.handleInput(), !0;
182
+ } else {
183
+ u.preventDefault();
184
+ const v = z(r);
185
+ if (v) {
186
+ const R = document.createRange();
187
+ R.selectNodeContents(b), R.collapse(!1), v.removeAllRanges(), v.addRange(R);
188
+ }
189
+ return !0;
190
+ }
191
+ }
192
+ }
193
+ if (c.nodeType === Node.TEXT_NODE && c.parentNode && c.parentNode.classList.contains("template-field") && c.textContent) {
194
+ const a = c.textContent;
195
+ if (J(a).length === 1 && f === a.length) {
196
+ u.preventDefault(), c.textContent = "";
197
+ const L = c.parentNode, _ = z(r);
198
+ if (_) {
199
+ const v = document.createRange();
200
+ v.selectNodeContents(L), v.collapse(!0), _.removeAllRanges(), _.addRange(v);
201
+ }
202
+ return t.handleInput(), !0;
203
+ }
204
+ }
205
+ if (f === 0) {
206
+ let a = null;
207
+ if (c.nodeType === Node.ELEMENT_NODE && c.classList.contains("template-field") ? a = c : c.nodeType === Node.TEXT_NODE && c.parentNode && c.parentNode.classList.contains("template-field") && (a = c.parentNode), a) {
208
+ u.preventDefault();
209
+ const b = z(r);
210
+ return b && (i.setStartBefore(a), i.collapse(!0), b.removeAllRanges(), b.addRange(i)), !0;
211
+ }
212
+ }
213
+ return !1;
214
+ }, o = (u, i, r) => {
215
+ if (!i.collapsed) return !1;
216
+ const { startContainer: c, startOffset: f } = i;
217
+ if (c.nodeType === Node.TEXT_NODE && c.parentNode && c.parentNode.classList.contains("template-field") && c.textContent) {
218
+ const a = c.textContent, b = J(a);
219
+ if (f === a.length && b.length === 1) {
220
+ u.preventDefault(), c.textContent = "";
221
+ const L = c.parentNode, _ = z(r);
222
+ if (_) {
223
+ const v = document.createRange();
224
+ v.selectNodeContents(L), v.collapse(!0), _.removeAllRanges(), _.addRange(v);
225
+ }
226
+ return t.handleInput(), !0;
227
+ }
228
+ }
229
+ return !1;
230
+ };
231
+ return {
232
+ handleTemplateKeyDown: (u) => {
233
+ if (t.isComposing.value) return;
234
+ const i = t.editor.value;
235
+ if (!i) return;
236
+ const r = z(i);
237
+ if (!r || r.rangeCount === 0) return;
238
+ const c = r.getRangeAt(0);
239
+ if (u.key === "Enter") {
240
+ u.preventDefault(), t.onSubmit(t.getValueFromDOM());
241
+ return;
242
+ }
243
+ (u.key === "ArrowLeft" || u.key === "ArrowRight") && !u.shiftKey && y(u, c, i) || u.key === "Backspace" && h(u, c, i) || u.key === "Delete" && o(u, c, i);
244
+ }
245
+ };
246
+ }
247
+ function xt(t) {
248
+ const y = $e({
99
249
  isRecording: !1,
100
250
  isSupported: typeof window < "u" && "webkitSpeechRecognition" in window || "SpeechRecognition" in window,
101
251
  error: void 0
102
- }), a = c.isSupported ? new (window.webkitSpeechRecognition || window.SpeechRecognition)() : void 0;
103
- a !== void 0 && (a.continuous = i.continuous ?? !1, a.interimResults = i.interimResults ?? !0, a.lang = i.lang ?? navigator.language, a.onstart = () => {
104
- var o;
105
- c.isRecording = !0, c.error = void 0, (o = i.onStart) == null || o.call(i);
106
- }, a.onend = () => {
107
- var o;
108
- c.isRecording = !1, (o = i.onEnd) == null || o.call(i);
109
- }, a.onresult = (o) => {
110
- var b, h;
111
- const p = Array.from(o.results).map((k) => k[0].transcript).join("");
112
- o.results[0].isFinal ? (b = i.onFinal) == null || b.call(i, p) : (h = i.onInterim) == null || h.call(i, p);
113
- }, a.onerror = (o) => {
114
- var p;
115
- c.error = new Error(o.error), c.isRecording = !1, (p = i.onError) == null || p.call(i, c.error);
252
+ }), h = y.isSupported ? new (window.webkitSpeechRecognition || window.SpeechRecognition)() : void 0;
253
+ h !== void 0 && (h.continuous = t.continuous ?? !1, h.interimResults = t.interimResults ?? !0, h.lang = t.lang ?? navigator.language, h.onstart = () => {
254
+ var i;
255
+ y.isRecording = !0, y.error = void 0, (i = t.onStart) == null || i.call(t);
256
+ }, h.onend = () => {
257
+ var i;
258
+ y.isRecording = !1, (i = t.onEnd) == null || i.call(t);
259
+ }, h.onresult = (i) => {
260
+ var c, f;
261
+ const r = Array.from(i.results).map((p) => p[0].transcript).join("");
262
+ i.results[0].isFinal ? (c = t.onFinal) == null || c.call(t, r) : (f = t.onInterim) == null || f.call(t, r);
263
+ }, h.onerror = (i) => {
264
+ var r;
265
+ y.error = new Error(i.error), y.isRecording = !1, (r = t.onError) == null || r.call(t, y.error);
116
266
  });
117
- const u = () => {
118
- var o;
119
- if (!a) {
120
- const p = new Error("浏览器不支持语音识别");
121
- c.error = p, (o = i.onError) == null || o.call(i, p);
267
+ const o = () => {
268
+ var i;
269
+ if (!h) {
270
+ const r = new Error("浏览器不支持语音识别");
271
+ y.error = r, (i = t.onError) == null || i.call(t, r);
122
272
  return;
123
273
  }
124
- if (c.isRecording) {
274
+ if (y.isRecording) {
125
275
  try {
126
- a.stop(), setTimeout(() => {
276
+ h.stop(), setTimeout(() => {
127
277
  try {
128
- a.start();
129
- } catch (p) {
130
- w(p);
278
+ h.start();
279
+ } catch (r) {
280
+ u(r);
131
281
  }
132
282
  }, 100);
133
- } catch (p) {
134
- w(p);
283
+ } catch (r) {
284
+ u(r);
135
285
  }
136
286
  return;
137
287
  }
138
288
  try {
139
- a.start();
140
- } catch (p) {
141
- w(p);
289
+ h.start();
290
+ } catch (r) {
291
+ u(r);
142
292
  }
143
- }, v = () => {
144
- if (a && c.isRecording)
293
+ }, x = () => {
294
+ if (h && y.isRecording)
145
295
  try {
146
- a.stop();
147
- } catch (o) {
148
- w(o);
296
+ h.stop();
297
+ } catch (i) {
298
+ u(i);
149
299
  }
150
- }, w = (o) => {
151
- var p;
152
- c.error = o instanceof Error ? o : new Error("语音识别操作失败"), c.isRecording = !1, (p = i.onError) == null || p.call(i, c.error);
300
+ }, u = (i) => {
301
+ var r;
302
+ y.error = i instanceof Error ? i : new Error("语音识别操作失败"), y.isRecording = !1, (r = t.onError) == null || r.call(t, y.error);
153
303
  };
154
304
  return {
155
- speechState: c,
156
- start: u,
157
- stop: v
305
+ speechState: y,
306
+ start: o,
307
+ stop: x
158
308
  };
159
309
  }
160
- const It = (i, c) => {
161
- if (!c || !i)
162
- return [{ text: i, isMatch: !1 }];
163
- const a = i.toLowerCase(), u = c.toLowerCase(), v = [];
164
- let w = 0;
165
- for (; w < a.length; ) {
166
- const h = a.indexOf(u, w);
167
- if (h === -1) break;
168
- v.push({
169
- start: h,
170
- end: h + c.length
171
- }), w = h + 1;
310
+ const kt = (t, y) => {
311
+ if (!y || !t)
312
+ return [{ text: t, isMatch: !1 }];
313
+ const h = t.toLowerCase(), o = y.toLowerCase(), x = [];
314
+ let u = 0;
315
+ for (; u < h.length; ) {
316
+ const f = h.indexOf(o, u);
317
+ if (f === -1) break;
318
+ x.push({
319
+ start: f,
320
+ end: f + y.length
321
+ }), u = f + 1;
172
322
  }
173
- if (v.length === 0)
174
- return [{ text: i, isMatch: !1 }];
175
- const o = [];
176
- for (const h of v)
177
- if (o.length === 0)
178
- o.push(h);
323
+ if (x.length === 0)
324
+ return [{ text: t, isMatch: !1 }];
325
+ const i = [];
326
+ for (const f of x)
327
+ if (i.length === 0)
328
+ i.push(f);
179
329
  else {
180
- const k = o[o.length - 1];
181
- h.start <= k.end ? k.end = Math.max(k.end, h.end) : o.push(h);
330
+ const p = i[i.length - 1];
331
+ f.start <= p.end ? p.end = Math.max(p.end, f.end) : i.push(f);
182
332
  }
183
- const p = [];
184
- let b = 0;
185
- for (const h of o)
186
- b < h.start && p.push({
187
- text: i.substring(b, h.start),
333
+ const r = [];
334
+ let c = 0;
335
+ for (const f of i)
336
+ c < f.start && r.push({
337
+ text: t.substring(c, f.start),
188
338
  isMatch: !1
189
- }), p.push({
190
- text: i.substring(h.start, h.end),
339
+ }), r.push({
340
+ text: t.substring(f.start, f.end),
191
341
  isMatch: !0
192
- }), b = h.end;
193
- return b < i.length && p.push({
194
- text: i.substring(b),
342
+ }), c = f.end;
343
+ return c < t.length && r.push({
344
+ text: t.substring(c),
195
345
  isMatch: !1
196
- }), p;
346
+ }), r;
197
347
  };
198
- function Rt(i, c, a, u, v) {
199
- const w = H(!1), o = H(-1), p = H(-1), b = H(""), h = H(!1), k = H(null), g = H(!1), I = H(null), m = L(() => {
200
- if (!i.suggestions || !a.value || v.value) return [];
201
- const O = a.value.toLowerCase();
202
- return i.suggestions.filter((V) => V.toLowerCase().includes(O));
203
- }), P = L(() => {
204
- let O = -1;
205
- return I.value === "mouse" && p.value !== -1 ? O = p.value : I.value === "keyboard" && o.value !== -1 && (O = o.value), m.value[O] || null;
206
- }), B = (O) => O === o.value || O === p.value, A = (O) => {
207
- if (I.value === null) {
208
- b.value = "", h.value = !1;
348
+ function Rt(t, y, h, o) {
349
+ const x = O(!1), u = O(-1), i = O(-1), r = O(""), c = O(!1), f = O(null), p = O(!1), a = O(null), b = P(() => {
350
+ if (!t.suggestions || !h.value || t.template) return [];
351
+ const e = h.value.toLowerCase();
352
+ return t.suggestions.filter((l) => l.toLowerCase().includes(e));
353
+ }), L = P(() => {
354
+ let e = -1;
355
+ return a.value === "mouse" && i.value !== -1 ? e = i.value : a.value === "keyboard" && u.value !== -1 && (e = u.value), b.value[e] || null;
356
+ }), _ = (e) => e === u.value || e === i.value, v = (e) => {
357
+ if (a.value === null) {
358
+ r.value = "", c.value = !1;
209
359
  return;
210
360
  }
211
- const V = O || P.value;
212
- V && a.value && V.toLowerCase().startsWith(a.value.toLowerCase()) ? (b.value = V.substring(a.value.length), h.value = !0) : (b.value = "", h.value = !1);
213
- }, f = () => {
214
- w.value = !1, o.value = -1, p.value = -1, I.value = null, b.value = "", h.value = !1;
215
- }, E = () => {
216
- w.value = !0, o.value = -1, p.value = -1, I.value = null, A();
217
- }, y = () => {
218
- u.value || g.value || J(() => {
219
- a.value && i.suggestions && i.suggestions.length > 0 && !v.value && m.value.length > 0 ? E() : f();
361
+ const l = e || L.value;
362
+ l && h.value && l.toLowerCase().startsWith(h.value.toLowerCase()) ? (r.value = l.substring(h.value.length), c.value = !0) : (r.value = "", c.value = !1);
363
+ }, R = () => {
364
+ x.value = !1, u.value = -1, i.value = -1, a.value = null, r.value = "", c.value = !1;
365
+ }, w = () => {
366
+ x.value = !0, u.value = -1, i.value = -1, a.value = null, v();
367
+ }, m = () => {
368
+ o.value || p.value || W(() => {
369
+ h.value && t.suggestions && t.suggestions.length > 0 && !t.template && b.value.length > 0 ? w() : R();
220
370
  });
221
371
  };
222
- ee(a, y), ee(() => i.suggestions, y);
223
- const W = (O) => {
224
- g.value = !0, a.value = O, c("update:modelValue", O), c("suggestion-select", O), q(), J(() => {
225
- g.value = !1;
372
+ te(h, m), te(() => t.suggestions, m);
373
+ const $ = (e) => {
374
+ p.value = !0, h.value = e, y("update:modelValue", e), y("suggestion-select", e), K(), W(() => {
375
+ p.value = !1;
226
376
  });
377
+ }, V = () => {
378
+ L.value && $(L.value);
227
379
  }, K = () => {
228
- P.value && W(P.value);
229
- }, q = () => {
230
- f();
380
+ R();
231
381
  };
232
382
  return {
233
- showSuggestionsPopup: w,
234
- completionPlaceholder: b,
235
- showTabHint: h,
236
- suggestionsListRef: k,
237
- filteredSuggestions: m,
238
- activeSuggestion: P,
239
- isItemHighlighted: B,
240
- updateCompletionPlaceholder: A,
241
- updateSuggestionsState: y,
242
- selectSuggestion: W,
243
- acceptCurrentSuggestion: K,
244
- closeSuggestionsPopup: q,
245
- navigateSuggestions: (O) => {
246
- if (!w.value || m.value.length === 0) return;
247
- I.value = "keyboard", o.value === -1 ? o.value = O === "down" ? 0 : m.value.length - 1 : O === "down" ? o.value = (o.value + 1) % m.value.length : o.value = (o.value - 1 + m.value.length) % m.value.length;
248
- const V = m.value[o.value];
249
- V && A(V);
250
- const le = k.value;
251
- if (le) {
252
- const j = le.children[o.value];
253
- j && j.scrollIntoView({ block: "nearest" });
383
+ showSuggestionsPopup: x,
384
+ completionPlaceholder: r,
385
+ showTabHint: c,
386
+ suggestionsListRef: f,
387
+ filteredSuggestions: b,
388
+ activeSuggestion: L,
389
+ isItemHighlighted: _,
390
+ updateCompletionPlaceholder: v,
391
+ updateSuggestionsState: m,
392
+ selectSuggestion: $,
393
+ acceptCurrentSuggestion: V,
394
+ closeSuggestionsPopup: K,
395
+ navigateSuggestions: (e) => {
396
+ if (!x.value || b.value.length === 0) return;
397
+ a.value = "keyboard", u.value === -1 ? u.value = e === "down" ? 0 : b.value.length - 1 : e === "down" ? u.value = (u.value + 1) % b.value.length : u.value = (u.value - 1 + b.value.length) % b.value.length;
398
+ const l = b.value[u.value];
399
+ l && v(l);
400
+ const n = f.value;
401
+ if (n) {
402
+ const s = n.children[u.value];
403
+ s && s.scrollIntoView({ block: "nearest" });
254
404
  }
255
405
  },
256
- handleSuggestionItemHover: (O) => {
257
- I.value = "mouse", p.value = O, A(m.value[O]);
406
+ handleSuggestionItemHover: (e) => {
407
+ a.value = "mouse", i.value = e, v(b.value[e]);
258
408
  },
259
409
  handleSuggestionItemLeave: () => {
260
- if (p.value = -1, o.value !== -1) {
261
- I.value = "keyboard";
262
- const O = m.value[o.value];
263
- O && A(O);
410
+ if (i.value = -1, u.value !== -1) {
411
+ a.value = "keyboard";
412
+ const e = b.value[u.value];
413
+ e && v(e);
264
414
  } else
265
- I.value = null, A();
415
+ a.value = null, v();
266
416
  },
267
417
  handleClickOutside: () => {
268
- q();
418
+ K();
269
419
  },
270
- highlightSuggestionText: It
420
+ highlightSuggestionText: kt
271
421
  };
272
422
  }
273
- const Ot = { class: "action-buttons" }, Tt = { class: "action-buttons__submit-content" }, $t = {
423
+ const Dt = { class: "action-buttons" }, Ft = {
274
424
  key: 0,
275
- class: "action-buttons__cancel-text"
276
- }, Bt = /* @__PURE__ */ me({
425
+ class: "action-buttons__utility"
426
+ }, Lt = { class: "action-buttons__submit-content" }, Ot = {
427
+ key: 1,
428
+ class: "action-buttons__cancel"
429
+ }, We = /* @__PURE__ */ be({
277
430
  __name: "ActionButtons",
278
431
  props: {
279
432
  loading: { type: Boolean, default: !1 },
280
433
  disabled: { type: Boolean, default: !1 },
281
434
  showClear: { type: Boolean, default: !0 },
282
435
  hasContent: { type: Boolean, default: !1 },
283
- buttonGroup: {},
284
436
  allowSpeech: { type: Boolean, default: !1 },
285
437
  speechStatus: { default: () => ({
286
438
  isRecording: !1,
@@ -289,672 +441,617 @@ const Ot = { class: "action-buttons" }, Tt = { class: "action-buttons__submit-co
289
441
  allowFiles: { type: Boolean, default: !1 },
290
442
  submitType: { default: "enter" },
291
443
  showShortcuts: { type: Boolean },
292
- isOverLimit: { type: Boolean, default: !1 },
293
- stopText: { default: void 0 }
444
+ isOverLimit: { type: Boolean, default: !1 }
294
445
  },
295
- emits: ["clear", "toggle-speech", "submit", "cancel", "trigger-select"],
296
- setup(i, { emit: c }) {
297
- const a = i, u = c, v = L(() => {
298
- var E, y;
299
- const f = (y = (E = a.buttonGroup) == null ? void 0 : E.file) == null ? void 0 : y.tooltips;
300
- if (typeof f == "string" && f)
301
- return () => f;
302
- if (typeof f == "function")
303
- return f;
304
- }), w = L(() => {
305
- var E, y;
306
- const f = (y = (E = a.buttonGroup) == null ? void 0 : E.submit) == null ? void 0 : y.tooltips;
307
- if (typeof f == "string" && f)
308
- return () => f;
309
- if (typeof f == "function")
310
- return f;
311
- }), o = L(() => a.allowSpeech), p = L(() => a.speechStatus.isRecording), b = L(() => a.disabled), h = L(() => {
312
- var f, E;
313
- return b.value || a.isOverLimit || ((E = (f = a.buttonGroup) == null ? void 0 : f.submit) == null ? void 0 : E.disabled);
314
- }), k = L(() => a.allowFiles || a.allowSpeech || a.showClear), g = () => {
315
- b.value || u("clear");
316
- }, I = () => {
317
- if (!b.value) {
318
- const f = !a.speechStatus.isRecording;
319
- u("toggle-speech", f);
446
+ emits: ["clear", "toggle-speech", "submit", "cancel"],
447
+ setup(t, { emit: y }) {
448
+ const h = ht(), o = t, x = y, u = P(() => o.allowSpeech), i = P(() => o.speechStatus.isRecording), r = P(() => o.disabled), c = P(() => r.value || o.isOverLimit), f = P(() => o.allowFiles || o.allowSpeech || o.showClear), p = () => {
449
+ r.value || x("clear");
450
+ }, a = () => {
451
+ if (!r.value) {
452
+ const _ = !o.speechStatus.isRecording;
453
+ x("toggle-speech", _);
320
454
  }
321
- }, m = () => {
322
- h.value || u("submit");
323
- }, P = () => {
324
- b.value || u("cancel");
325
- }, B = L(() => {
326
- var f, E;
327
- return b.value || ((E = (f = a.buttonGroup) == null ? void 0 : f.file) == null ? void 0 : E.disabled);
328
- }), A = () => {
329
- B.value || u("trigger-select");
455
+ }, b = () => {
456
+ c.value || x("submit");
457
+ }, L = () => {
458
+ r.value || x("cancel");
330
459
  };
331
- return (f, E) => (S(), R("div", Ot, [
332
- k.value ? (S(), R("div", {
333
- key: 0,
334
- class: "action-buttons__utility",
335
- style: Pe({ "padding-right": f.hasContent || f.loading ? "0" : "6px" })
336
- }, [
337
- f.allowFiles && !f.loading ? (S(), Y(C(Ee), {
460
+ return (_, v) => (D(), A("div", Dt, [
461
+ f.value ? (D(), A("div", Ft, [
462
+ _.allowFiles && !_.loading ? (D(), Q(E(Ve), {
338
463
  key: 0,
339
- effect: "light",
340
- placement: "top",
341
- "render-content": v.value,
342
- "visible-arrow": !1
464
+ content: "上传文件",
465
+ placement: "top"
343
466
  }, {
344
- default: re(() => [
345
- z("div", {
346
- class: "action-buttons__button",
347
- onClick: A
348
- }, [
349
- X(C(gt), {
350
- class: te(["action-buttons__icon", "action-buttons__icon--upload", { "is-disabled": B.value }]),
351
- alt: "上传文件"
352
- }, null, 8, ["class"])
353
- ])
467
+ default: Y(() => [
468
+ G(E(fe), {
469
+ class: "action-buttons__button action-buttons__file-button",
470
+ type: "text",
471
+ disabled: r.value
472
+ }, {
473
+ default: Y(() => [
474
+ G(E(gt), {
475
+ class: "action-buttons__icon",
476
+ alt: "上传文件"
477
+ })
478
+ ]),
479
+ _: 1
480
+ }, 8, ["disabled"])
354
481
  ]),
355
482
  _: 1
356
- }, 8, ["render-content"])) : M("", !0),
357
- o.value && !f.loading ? (S(), R("div", {
483
+ })) : H("", !0),
484
+ u.value && !_.loading ? (D(), Q(E(fe), {
358
485
  key: 1,
359
- class: te(["action-buttons__button", { "is-recording": p.value }]),
360
- onClick: I
361
- }, [
362
- p.value ? (S(), Y(C(yt), {
363
- key: 1,
364
- class: "action-buttons__icon action-buttons__icon--recording",
365
- alt: "语音中"
366
- })) : (S(), Y(C(vt), {
367
- key: 0,
368
- class: "action-buttons__icon",
369
- alt: "录音"
370
- }))
371
- ], 2)) : M("", !0),
372
- f.showClear ? (S(), Y(C(Ee), {
486
+ class: ae(["action-buttons__button action-buttons__speech-button", { "is-recording": i.value }]),
487
+ type: "text",
488
+ disabled: r.value,
489
+ onClick: a
490
+ }, {
491
+ default: Y(() => [
492
+ i.value ? (D(), Q(E(yt), {
493
+ key: 1,
494
+ class: "action-buttons__icon action-buttons__icon--recording",
495
+ alt: "语音中"
496
+ })) : (D(), Q(E(vt), {
497
+ key: 0,
498
+ class: "action-buttons__icon",
499
+ alt: "录音"
500
+ }))
501
+ ]),
502
+ _: 1
503
+ }, 8, ["disabled", "class"])) : H("", !0),
504
+ _.showClear ? (D(), Q(E(Ve), {
373
505
  key: 2,
374
506
  content: "清空内容",
375
507
  placement: "top"
376
508
  }, {
377
- default: re(() => [
378
- z("div", {
379
- class: "action-buttons__button",
380
- onClick: g
381
- }, [
382
- X(C(mt), { class: "action-buttons__icon action-buttons__icon--clear" })
383
- ])
509
+ default: Y(() => [
510
+ G(E(fe), {
511
+ class: "action-buttons__button action-buttons__clear-button",
512
+ type: "text",
513
+ disabled: r.value || !_.hasContent,
514
+ onClick: p
515
+ }, {
516
+ default: Y(() => [
517
+ (D(), Q(it(E(h)), { class: "action-buttons__icon action-buttons__icon--close" }))
518
+ ]),
519
+ _: 1
520
+ }, 8, ["disabled"])
384
521
  ]),
385
522
  _: 1
386
- })) : M("", !0)
387
- ], 4)) : M("", !0),
388
- f.hasContent || f.loading ? (S(), R("div", {
523
+ })) : H("", !0)
524
+ ])) : H("", !0),
525
+ _.hasContent || _.loading ? (D(), Q(E(fe), {
389
526
  key: 1,
527
+ type: "text",
390
528
  class: "action-buttons__button action-buttons__submit",
391
- onClick: E[0] || (E[0] = (y) => f.loading ? P() : m())
392
- }, [
393
- z("div", Tt, [
394
- f.loading ? (S(), R("div", {
395
- key: 1,
396
- class: te(["action-buttons__cancel", { "action-buttons__cancel--icon-only": !f.stopText }])
397
- }, [
398
- X(C(wt), {
399
- class: "action-buttons__icon action-buttons__icon--cancel",
400
- alt: "停止"
401
- }),
402
- f.stopText ? (S(), R("span", $t, ae(f.stopText), 1)) : M("", !0)
403
- ], 2)) : (S(), Y(C(Ee), {
404
- key: 0,
405
- effect: "light",
406
- placement: "top",
407
- "render-content": w.value,
408
- "visible-arrow": !1
409
- }, {
410
- default: re(() => [
411
- X(C(St), {
412
- class: te(["action-buttons__icon", "action-buttons__icon--send", { "is-disabled": h.value }]),
413
- alt: "发送"
414
- }, null, 8, ["class"])
415
- ]),
416
- _: 1
417
- }, 8, ["render-content"]))
418
- ])
419
- ])) : M("", !0)
529
+ disabled: _.loading ? r.value : c.value,
530
+ onClick: v[0] || (v[0] = (R) => _.loading ? L() : b())
531
+ }, {
532
+ default: Y(() => [
533
+ U("div", Lt, [
534
+ _.loading ? (D(), A("div", Ot, [
535
+ G(E(Ct), {
536
+ class: "action-buttons__icon action-buttons__icon--stop",
537
+ alt: "加载中"
538
+ }),
539
+ v[1] || (v[1] = U("span", { class: "action-buttons__cancel-text" }, "停止回答", -1))
540
+ ])) : (D(), Q(E(bt), {
541
+ key: 0,
542
+ class: "action-buttons__icon action-buttons__icon--send",
543
+ alt: "发送"
544
+ }))
545
+ ])
546
+ ]),
547
+ _: 1
548
+ }, 8, ["disabled"])) : H("", !0)
420
549
  ]));
421
550
  }
422
- }), Xe = /* @__PURE__ */ Oe(Bt, [["__scopeId", "data-v-a9e0fa92"]]), Lt = ["data-id", "data-type"], Et = ["data-id", "data-type"], Dt = /* @__PURE__ */ me({
423
- inheritAttrs: !1,
424
- __name: "Block",
425
- props: {
426
- id: {},
427
- type: {},
428
- content: {},
429
- readonly: { type: Boolean },
430
- asChild: { type: Boolean }
431
- },
432
- setup(i) {
433
- const c = i, a = lt();
434
- return (u, v) => {
435
- const w = rt("Block", !0);
436
- return c.type !== "block" ? (S(), R("span", ve({
437
- key: 0,
438
- "data-id": c.id,
439
- "data-type": c.type
440
- }, C(a)), ae(c.content), 17, Lt)) : (S(), R(ie, { key: 1 }, [
441
- c.asChild ? (S(!0), R(ie, { key: 0 }, ye(c.content, (o) => (S(), Y(w, ve({
442
- key: `${o.id}-${o.type}`
443
- }, { ref_for: !0 }, o), null, 16))), 128)) : (S(), R("span", ve({
444
- key: 1,
445
- "data-id": c.id,
446
- "data-type": c.type
447
- }, C(a)), [
448
- (S(!0), R(ie, null, ye(c.content, (o) => (S(), Y(w, ve({
449
- key: `${o.id}-${o.type}`
450
- }, { ref_for: !0 }, o), null, 16))), 128))
451
- ], 16, Et))
452
- ], 64));
551
+ });
552
+ function It(t, y) {
553
+ const h = O(!1), o = $e({ ...y }), x = (e) => {
554
+ Object.assign(o, e);
555
+ }, u = (e) => {
556
+ const l = [];
557
+ let n = 0;
558
+ const s = /\[(.*?)\]/g;
559
+ let g;
560
+ for (; (g = s.exec(e)) !== null; )
561
+ g.index > n && l.push({ type: "text", content: e.substring(n, g.index) }), l.push({ type: "field", content: g[1] }), n = g.index + g[0].length;
562
+ return n < e.length && l.push({ type: "text", content: e.substring(n) }), l;
563
+ }, i = () => {
564
+ if (!t.value) return "";
565
+ let e = "";
566
+ const l = (n) => {
567
+ let s = "";
568
+ if (n.nodeType === Node.TEXT_NODE) {
569
+ const g = n.textContent || "";
570
+ s += J(g);
571
+ } else if (n.nodeType === Node.ELEMENT_NODE) {
572
+ const g = n;
573
+ if (g.classList.contains("template-field")) {
574
+ const T = g.textContent || "";
575
+ s += J(T);
576
+ } else if (g.tagName.toLowerCase() === "span") {
577
+ const T = g.textContent || "";
578
+ s += J(T);
579
+ } else if (g.tagName.toLowerCase() === "br")
580
+ s += `
581
+ `;
582
+ else
583
+ for (const T of Array.from(g.childNodes))
584
+ s += l(T);
585
+ }
586
+ return s;
453
587
  };
454
- }
455
- }), Ft = /* @__PURE__ */ Oe(Dt, [["__scopeId", "data-v-13862606"]]);
456
- function Ht(i, c = {}) {
457
- let a = [], u = [], v = i;
458
- return { commit: (k) => {
459
- var g;
460
- a.push(v), v = k, u.length && ((g = c.onRemoveHistory) == null || g.call(c, u)), u = [];
461
- }, undo: () => a.length ? (u.push(v), v = a.pop(), v) : null, redo: () => u.length ? (a.push(v), v = u.pop(), v) : null, clear: () => {
462
- var k, g;
463
- a.length && ((k = c.onRemoveHistory) == null || k.call(c, a)), u.length && ((g = c.onRemoveHistory) == null || g.call(c, u)), a = [], u = [];
464
- }, get: () => v };
465
- }
466
- const Pt = { class: "editor-container" }, De = "", Fe = "", Wt = /* @__PURE__ */ me({
467
- __name: "TemplateEditor",
468
- props: {
469
- modelValue: { default: () => [] },
470
- modelModifiers: {}
471
- },
472
- emits: /* @__PURE__ */ it(["submit"], ["update:modelValue"]),
473
- setup(i, { expose: c, emit: a }) {
474
- const u = typeof window.ShadowRoot.prototype.getSelection == "function", v = typeof window.Selection.prototype.getComposedRanges == "function";
475
- function w() {
476
- const e = navigator.userAgent;
477
- return e.includes("Safari") && !e.includes("Chrome") && !e.includes("Chromium") && !e.includes("CriOS");
478
- }
479
- const o = w(), p = () => Math.random().toString(36).substring(2, 15), b = ut(i, "modelValue"), h = a, k = H(0), g = (e) => e.map((t, s) => ({
480
- id: `id-${s}`,
481
- ...t.type === "template" ? { ...t, prefix: De, suffix: Fe } : t
482
- })), I = (e) => e.map((t) => ({ type: t.type, content: t.content })), m = H(g(b.value || [])), P = (e) => {
483
- const t = { type: "text", content: "​", id: p() };
484
- if (e.length > 0)
485
- if (o && e[e.length - 1].type === "template")
486
- m.value = e.concat([t]);
487
- else if (!o && e[0].type === "template")
488
- m.value = [t].concat(e);
489
- else {
490
- m.value = e;
491
- const s = e[0], r = e[e.length - 1];
492
- o ? r.content !== "​" && (r.content = r.content.replace(/\u200B/g, "")) : s.content !== "​" && (s.content = s.content.replace(/\u200B/g, ""));
493
- }
494
- else
495
- m.value = e;
496
- }, B = L(() => m.value.map((e) => e.type === "template" ? [
497
- { id: e.id, type: "prefix", content: e.prefix },
498
- { id: e.id, type: "template", content: e.content },
499
- { id: e.id, type: "suffix", content: e.suffix }
500
- ] : [e]).flat()), A = L(() => m.value.map((e) => e.type === "text" ? e : o ? {
501
- id: e.id,
502
- type: "block",
503
- asChild: !0,
504
- content: [
505
- { id: e.id, type: "prefix", content: e.prefix },
506
- {
507
- id: e.id,
508
- type: "block",
509
- content: [
510
- { id: e.id, type: "template", content: e.content },
511
- { id: e.id, type: "suffix", content: e.suffix }
512
- ]
513
- }
514
- ]
515
- } : {
516
- id: e.id,
517
- type: "block",
518
- asChild: !0,
519
- content: [
520
- {
521
- id: e.id,
522
- type: "block",
523
- content: [
524
- { id: e.id, type: "prefix", content: e.prefix },
525
- { id: e.id, type: "template", content: e.content }
526
- ]
527
- },
528
- { id: e.id, type: "suffix", content: e.suffix }
529
- ]
530
- })), f = H(null), E = (e) => {
531
- const t = Date.now(), s = JSON.stringify(e);
532
- return `${t}:${s}`;
533
- }, y = (e) => {
534
- const t = parseInt(e.slice(0, 13)), s = JSON.parse(e.slice(14));
535
- return {
536
- timestamp: t,
537
- data: s
538
- };
539
- }, W = /* @__PURE__ */ new Map(), K = Ht(E(m.value), {
540
- onRemoveHistory: (e) => {
541
- for (const t of e)
542
- W.delete(t);
588
+ return t.value.childNodes.forEach((n) => {
589
+ e += l(n);
590
+ }), e;
591
+ }, r = (e) => o.initialValues && typeof o.initialValues[e] == "string" ? o.initialValues[e] : "", c = (e, l) => {
592
+ const n = document.createElement("span");
593
+ return n.className = "template-field", n.setAttribute("data-placeholder", e), l && (n.textContent = l), W(() => {
594
+ f(n, l || "");
595
+ }), n;
596
+ }, f = (e, l) => {
597
+ const n = J(l);
598
+ if (!n || n.trim() === "") {
599
+ const s = e.getAttribute("data-placeholder") || "";
600
+ s ? p(e, s, !0) : (e.style.minWidth = "", e.style.width = "");
601
+ } else
602
+ p(e, n, !1);
603
+ Be(e);
604
+ }, p = (e, l, n) => {
605
+ const s = document.createElement("span");
606
+ s.className = "template-field", s.style.visibility = "hidden", s.style.position = "absolute", s.style.top = "-9999px", s.style.left = "-9999px", s.style.whiteSpace = "nowrap", s.style.padding = "3px 8px", s.style.margin = "0 2px", s.style.boxSizing = "border-box", s.textContent = l, document.body.appendChild(s);
607
+ const g = getComputedStyle(s), T = s.offsetWidth, I = parseFloat(g.fontSize);
608
+ document.body.removeChild(s);
609
+ const M = n ? 1.5 : 2, j = T / I, B = Math.max(M, Math.ceil(j));
610
+ e.style.setProperty("min-width", `${B}em`, "important");
611
+ const q = 20;
612
+ B > q ? (e.style.setProperty("max-width", `${q}em`, "important"), e.style.setProperty("white-space", "normal", "important"), e.style.setProperty("word-break", "break-word", "important")) : e.style.removeProperty("max-width");
613
+ }, a = (e) => {
614
+ const n = (e === void 0 ? i() : e).trim().length > 0;
615
+ h.value !== n && (h.value = n, o.onContentStatusChange(n));
616
+ }, b = (e, l = "inside", n = !1) => {
617
+ W(() => {
618
+ const s = z(t.value);
619
+ if (!s) return;
620
+ const g = document.createRange();
621
+ switch (l) {
622
+ case "before":
623
+ g.setStartBefore(e);
624
+ break;
625
+ case "after":
626
+ g.setStartAfter(e);
627
+ break;
628
+ case "inside":
629
+ default:
630
+ g.selectNodeContents(e), g.collapse(n);
631
+ break;
543
632
  }
633
+ s.removeAllRanges(), s.addRange(g), e.focus && e.focus();
544
634
  });
545
- ee(
546
- () => b.value,
547
- (e) => {
548
- P(g(e || [])), K.commit(E(m.value));
549
- },
550
- { deep: !0 }
551
- );
552
- const q = (e, t = document.body) => t.contains(e) ? e instanceof HTMLElement && e.dataset.id ? e : e.parentElement ? q(e.parentElement, t) : null : null, Q = (e) => e === f.value, ue = (e) => {
553
- const t = window.getSelection();
554
- if (!t)
555
- return null;
556
- const s = t.rangeCount > 0 ? t.getRangeAt(0) : null, r = e.getRootNode();
557
- if (!(r instanceof ShadowRoot))
558
- return s;
559
- if (v) {
560
- const l = t.getComposedRanges(o ? r : { shadowRoots: [r] });
561
- return (l == null ? void 0 : l[0]) ?? null;
635
+ }, L = () => {
636
+ W(() => {
637
+ const e = t.value;
638
+ if (e) {
639
+ const l = document.createRange(), n = z(e);
640
+ l.selectNodeContents(e), l.collapse(!1), n && (n.removeAllRanges(), n.addRange(l)), e.focus();
562
641
  }
563
- if (u) {
564
- const l = r.getSelection();
565
- return l.rangeCount > 0 ? l.getRangeAt(0) : null;
642
+ });
643
+ }, _ = (e, l) => {
644
+ const n = t.value;
645
+ if (!n) return null;
646
+ n.innerHTML = "";
647
+ let s = null;
648
+ if (!l || l === o.template)
649
+ e.forEach((g) => {
650
+ if (g.type === "field") {
651
+ const T = r(g.content), I = c(g.content, T);
652
+ n.appendChild(I);
653
+ const M = ye();
654
+ n.appendChild(M), s || (s = I);
655
+ } else
656
+ n.appendChild(document.createTextNode(g.content));
657
+ }), o.initialValues && Object.keys(o.initialValues).length > 0 && W(() => {
658
+ const g = i();
659
+ g !== o.value && (o.onValueChange(g), o.onInput(g));
660
+ });
661
+ else {
662
+ const g = v(e, l);
663
+ g.success ? g.elements.forEach((T) => {
664
+ if (n.appendChild(T.node), T.isField) {
665
+ const I = ye();
666
+ n.appendChild(I);
667
+ }
668
+ T.isField && !s && (s = T.node);
669
+ }) : (n.appendChild(document.createTextNode(l)), s = null);
670
+ }
671
+ return s;
672
+ }, v = (e, l) => {
673
+ const n = [];
674
+ let s = 0, g = 0, T = !0;
675
+ for (; g < e.length && s <= l.length && T; ) {
676
+ const I = e[g];
677
+ if (I.type === "text")
678
+ l.substring(s).startsWith(I.content) ? (n.push({
679
+ node: document.createTextNode(I.content),
680
+ isField: !1
681
+ }), s += I.content.length, g++) : T = !1;
682
+ else {
683
+ let M = "";
684
+ const j = e.find((B, q) => q > g && B.type === "text");
685
+ if (j) {
686
+ const B = l.substring(s), q = B.indexOf(j.content);
687
+ q !== -1 ? (M = B.substring(0, q), s += M.length) : T = !1;
688
+ } else
689
+ M = l.substring(s), s = l.length;
690
+ if (T) {
691
+ const B = c(I.content, M);
692
+ n.push({ node: B, isField: !0 }), g++;
693
+ }
566
694
  }
567
- return s;
568
- }, ce = (e, t) => {
569
- var r;
570
- if (!e.firstChild || e.firstChild.nodeType !== Node.TEXT_NODE)
571
- return console.warn("el.firstChild is not a text node. set anchor and focus to the element with offset 0", e), { node: e, offset: 0 };
572
- const s = ((r = e.firstChild.textContent) == null ? void 0 : r.length) ?? 0;
573
- return t > s && console.warn("offset is too large", { offset: t, el: e }), { node: e.firstChild, offset: Math.min(t, s) };
574
- }, G = (e, t, s, r) => {
575
- const l = window.getSelection();
576
- if (!l)
577
- return;
578
- const { node: d, offset: _ } = ce(e, t);
579
- if (!s) {
580
- l.setBaseAndExtent(d, _, d, _);
581
- return;
695
+ }
696
+ if (T && g < e.length)
697
+ for (let I = g; I < e.length; I++) {
698
+ const M = e[I];
699
+ if (M.type === "field") {
700
+ const j = !o.value || o.value === "" ? r(M.content) : "", B = c(M.content, j);
701
+ n.push({ node: B, isField: !0 });
702
+ } else
703
+ n.push({
704
+ node: document.createTextNode(M.content),
705
+ isField: !1
706
+ });
582
707
  }
583
- const { node: D, offset: T } = ce(s, r ?? 0);
584
- l.setBaseAndExtent(d, _, D, T);
585
- }, O = (e, t) => {
586
- const s = p(), r = { id: s, type: "text", content: e };
587
- if (t) {
588
- const l = m.value.findIndex((d) => d.id === t);
589
- l !== -1 ? P(
590
- m.value.slice(0, l + 1).concat(r).concat(m.value.slice(l + 1))
591
- ) : console.warn(`can not find item with id: ${t}`);
708
+ return { success: T, elements: n };
709
+ }, R = () => {
710
+ if (!t.value) return;
711
+ o.isInternalUpdate = !0;
712
+ const e = u(o.template), l = _(e, o.value);
713
+ a(), W(() => {
714
+ if (S(), l) {
715
+ const n = l.textContent || "", s = J(n);
716
+ s && s.trim() !== "" ? b(l, "inside", !1) : b(l, "inside", !0);
592
717
  } else
593
- P([r].concat(m.value));
594
- J(() => {
595
- var d;
596
- const l = (d = f.value) == null ? void 0 : d.querySelector(`[data-id="${s}"][data-type="text"]`);
597
- l && G(l, e.length);
598
- }), b.value = I(m.value);
599
- }, V = H({
600
- hasStarted: !1,
601
- range: null
602
- }), le = (e) => {
603
- var D;
604
- const t = e;
605
- e.preventDefault();
606
- const { inputType: s } = t, r = (t.data || ((D = t.dataTransfer) == null ? void 0 : D.getData("text/plain")) || "").replace(De, "").replace(Fe, ""), l = t.getTargetRanges()[0];
607
- if (!l) {
608
- console.warn("range is null", l);
609
- return;
610
- }
611
- const d = [
612
- "insertText",
613
- "insertFromPaste",
614
- "insertReplacementText",
615
- "deleteContentBackward",
616
- "deleteContentForward",
617
- "deleteWordBackward",
618
- "deleteWordForward",
619
- "deleteSoftLineBackward",
620
- "deleteSoftLineForward",
621
- "deleteByCut"
622
- ], _ = ue(f.value);
623
- if (d.includes(s)) {
624
- if (r && Q(l.startContainer) && Q(l.endContainer)) {
625
- O(r), _ && W.set(K.get(), j(_));
626
- return;
627
- }
628
- const T = j(l);
629
- T.startId && T.endId ? (Se(T, s, r), _ && W.set(K.get(), j(_))) : console.warn("range is not valid, range:", T);
630
- } else s === "insertCompositionText" && V.value.hasStarted && (V.value = { hasStarted: !1, range: j(l) });
631
- }, j = (e) => {
632
- const t = q(e.startContainer, f.value), s = q(e.endContainer, f.value);
633
- return {
634
- collapsed: e.collapsed,
635
- endContainer: e.endContainer,
636
- endId: s == null ? void 0 : s.dataset.id,
637
- endOffset: e.endOffset,
638
- endType: s == null ? void 0 : s.dataset.type,
639
- startContainer: e.startContainer,
640
- startId: t == null ? void 0 : t.dataset.id,
641
- startOffset: e.startOffset,
642
- startType: t == null ? void 0 : t.dataset.type
643
- };
644
- }, N = (e, t, s, r) => e.slice(0, s) + t + e.slice(r), ne = (e, t, s) => {
645
- if (s !== "deleteContentForward" || e.length !== 1)
646
- return e;
647
- const r = e[0], l = m.value.find((D) => D.id === r.id);
648
- if (!l || l.type !== "text" || l.content !== "​" || t.collapsed)
649
- return e;
650
- const d = B.value.findIndex((D) => D.id === r.id);
651
- if (d < 0 || d >= B.value.length - 1)
652
- return [{ ...r, startOffset: 0, endOffset: 0 }];
653
- const _ = B.value[d + 1];
654
- return [
655
- {
656
- id: _.id,
657
- type: _.type,
658
- startOffset: 0,
659
- endOffset: 0
718
+ L();
719
+ o.isInternalUpdate = !1;
720
+ });
721
+ }, w = () => {
722
+ if (o.isComposing) return;
723
+ $(), C(), m(), S();
724
+ const e = i();
725
+ e !== o.value && (o.onValueChange(e), o.onInput(e)), a(e), e === "" && t.value && Array.from(t.value.childNodes).every((n) => n.nodeType === Node.ELEMENT_NODE && n.classList.contains("template-field") ? Et(n) : !!(n.nodeType === Node.TEXT_NODE && ee(n.textContent || ""))) && $();
726
+ }, m = () => {
727
+ if (!t.value) return;
728
+ _t(t.value), t.value.querySelectorAll(".template-field").forEach((l) => {
729
+ Be(l);
730
+ });
731
+ }, $ = () => {
732
+ if (!t.value) return;
733
+ const e = [];
734
+ t.value.childNodes.forEach((l) => {
735
+ if (l.nodeType === Node.TEXT_NODE) {
736
+ const n = l.textContent || "";
737
+ if (ee(n)) {
738
+ const s = l.previousSibling;
739
+ if (s && s.nodeType === Node.ELEMENT_NODE && s.classList.contains("template-field"))
740
+ return;
660
741
  }
661
- ];
662
- }, Se = (e, t, s) => {
663
- const r = we(e);
664
- if (!Array.isArray(r) || r.length === 0)
665
- return;
666
- const l = ne(r, e, t), d = _e(l, e, t, s);
667
- if (d.some((T) => T.tag === "new")) {
668
- const { afterId: T, content: $ } = d[0];
669
- O($, T);
742
+ (n.trim() === "" || ee(n)) && e.push(l);
743
+ } else l.nodeType === Node.ELEMENT_NODE && l.tagName.toLowerCase() === "br" && e.push(l);
744
+ }), e.forEach((l) => {
745
+ l.parentNode && l.parentNode.removeChild(l);
746
+ });
747
+ }, V = (e) => {
748
+ if (!o.template || !o.initialValues)
749
+ return "字段";
750
+ for (const [l, n] of Object.entries(o.initialValues))
751
+ if (n === e)
752
+ return l;
753
+ return e.length <= 2 || /^[[\]{}()]+$/.test(e) || e.includes("[") && e.includes("]") ? e : "字段";
754
+ }, K = (e) => {
755
+ const l = e.getAttribute("data-placeholder");
756
+ if (l)
757
+ return l;
758
+ const n = e.getAttribute("title") || e.getAttribute("data-field") || e.getAttribute("data-key") || e.getAttribute("placeholder") || "";
759
+ if (n)
760
+ return n;
761
+ const s = e.textContent || "";
762
+ return V(s);
763
+ }, C = () => {
764
+ if (!t.value) return;
765
+ t.value.querySelectorAll("span").forEach((l) => {
766
+ const n = l, s = n.style, g = n.classList.contains("template-field"), T = n.hasAttribute("data-placeholder");
767
+ if (g && T)
670
768
  return;
769
+ const I = s.backgroundColor && // 标准格式
770
+ (s.backgroundColor === "rgba(0, 0, 0, 0.05)" || s.backgroundColor === "rgba(0, 0, 0, 0.08)" || // 可能的变体格式
771
+ s.backgroundColor.includes("rgba(0, 0, 0, 0.05)") || s.backgroundColor.includes("rgba(0, 0, 0, 0.08)") || // 十六进制或其他可能的格式
772
+ s.backgroundColor.toLowerCase().includes("0.05") || s.backgroundColor.toLowerCase().includes("0.08")), M = s.borderRadius === "4px" || s.padding === "3px 8px" || s.margin === "0px 2px" || s.whiteSpace === "nowrap" && s.padding && s.margin;
773
+ if (I || M || T) {
774
+ if (n.className = "template-field", !n.getAttribute("data-placeholder")) {
775
+ const B = K(n);
776
+ B && n.setAttribute("data-placeholder", B);
777
+ }
778
+ n.removeAttribute("style");
779
+ const j = n.textContent || "";
780
+ f(n, j);
671
781
  }
672
- const _ = d, D = [];
673
- for (const [T, $] of _.entries()) {
674
- const U = m.value.find((Be) => Be.id === $.id), ge = T === 0 ? s : "";
675
- U ? U.type === "text" ? U.content = N(U.content, ge, $.startOffset, $.endOffset) : U.type === "template" ? $.type === "prefix" || $.type === "suffix" ? $.startOffset === 0 && $.endOffset === 1 && ge.length === 0 ? U[$.type] = "" : console.warn(`${$.type} can not be inserted text. it only can be deleted`, $) : $.startOffset < 0 || $.endOffset > U.content.length ? D.push(U.id) : U.content = N(U.content, ge, $.startOffset, $.endOffset) : console.warn("dataItem.type is not text or template", U) : console.warn("can not find dataItem", $);
676
- }
677
- P(m.value.filter((T) => !D.includes(T.id))), P(
678
- m.value.filter((T) => {
679
- if (T.type === "text")
680
- return T.content.length > 0;
681
- const $ = T;
682
- return [$.prefix, $.suffix, $.content].join("").length > 0;
683
- })
684
- );
685
- for (const T of m.value.filter(($) => $.type === "template"))
686
- T.prefix.length === 0 && (T.prefix = De), T.suffix.length === 0 && (T.suffix = Fe);
687
- _.length > 0 && Te(_, s), b.value = I(m.value);
688
- }, Te = (e, t) => {
689
- const s = e[0], r = `[data-id="${s.id}"][data-type="${s.type}"]`, l = e.slice(1).map((d) => `[data-id="${d.id}"][data-type="${d.type}"]`);
690
- J(() => {
691
- var _, D;
692
- const d = (_ = f.value) == null ? void 0 : _.querySelector(r);
693
- if (d)
694
- G(d, s.startOffset + t.length);
695
- else if (t.length === 0)
696
- for (const T of l) {
697
- const $ = (D = f.value) == null ? void 0 : D.querySelector(T);
698
- if ($) {
699
- G($, 0);
700
- break;
701
- }
702
- }
703
- else
704
- console.warn(`can not find el with selector: ${r}`);
782
+ });
783
+ }, S = () => {
784
+ if (!t.value) return;
785
+ t.value.querySelectorAll(".template-field").forEach((l) => {
786
+ const n = l.textContent || "";
787
+ f(l, n);
788
+ });
789
+ };
790
+ return {
791
+ // 状态
792
+ hasContent: h,
793
+ // 解析和DOM操作
794
+ parseTemplateToParts: u,
795
+ getValueFromDOM: i,
796
+ getInitialContentForField: r,
797
+ createFieldElement: c,
798
+ // 光标操作
799
+ setCursorTo: b,
800
+ setCursorToEnd: L,
801
+ // DOM更新
802
+ updateEditorDOM: R,
803
+ renderTemplateToDOM: _,
804
+ // 事件处理
805
+ handleInput: w,
806
+ checkHasContent: a,
807
+ cleanupEmptyTextNodes: $,
808
+ // 推断 placeholder
809
+ inferPlaceholderForContent: V,
810
+ extractPlaceholderFromElement: K,
811
+ // 方法
812
+ resetFields: () => {
813
+ if (!t.value) return;
814
+ o.isInternalUpdate = !0;
815
+ const e = t.value;
816
+ e.innerHTML = "";
817
+ const l = u(o.template);
818
+ let n = "";
819
+ l.forEach((s) => {
820
+ if (s.type === "field") {
821
+ const g = r(s.content), T = c(s.content, g);
822
+ g && (n += g), e.appendChild(T);
823
+ } else
824
+ e.appendChild(document.createTextNode(s.content)), n += s.content;
825
+ }), o.onValueChange(n), L(), a(n), W(() => {
826
+ o.isInternalUpdate = !1;
705
827
  });
706
- }, we = (e) => {
707
- const t = B.value.findIndex((_) => _.id === e.startId && _.type === e.startType), s = B.value.findIndex((_) => _.id === e.endId && _.type === e.endType);
708
- if (t === -1 || s === -1 || t > s)
709
- return console.warn("startIndex or endIndex is -1, or startIndex > endIndex. ", { range: e }), null;
710
- const r = B.value[t], l = B.value[s];
711
- if (t === s)
712
- return [
713
- {
714
- id: r.id,
715
- type: r.type,
716
- startOffset: e.startOffset,
717
- endOffset: e.endOffset
718
- }
719
- ];
720
- const d = [
721
- {
722
- id: r.id,
723
- type: r.type,
724
- startOffset: e.startOffset,
725
- endOffset: r.content.length
828
+ },
829
+ activateFirstField: () => {
830
+ var l;
831
+ const e = (l = t.value) == null ? void 0 : l.querySelector(".template-field");
832
+ e ? b(e, "inside", !1) : L();
833
+ },
834
+ // 选项更新
835
+ updateOptions: x
836
+ };
837
+ }
838
+ const At = /* @__PURE__ */ be({
839
+ __name: "TemplateEditor",
840
+ props: /* @__PURE__ */ Fe({
841
+ value: {},
842
+ autofocus: { type: Boolean }
843
+ }, {
844
+ value: { default: "" },
845
+ valueModifiers: {}
846
+ }),
847
+ emits: /* @__PURE__ */ Fe(["input", "content-status", "submit", "focus", "blur", "empty-content"], ["update:value"]),
848
+ setup(t, { expose: y, emit: h }) {
849
+ const o = rt(t, "value"), x = t, u = h, i = O(null), r = O(""), c = O({}), f = O(!1), p = O(!1), a = It(i, {
850
+ template: r.value,
851
+ value: o.value,
852
+ initialValues: c.value,
853
+ isInternalUpdate: f,
854
+ isComposing: p,
855
+ onValueChange: (C) => {
856
+ if (o.value !== C) {
857
+ const S = f.value;
858
+ f.value = !0, o.value = C, W(() => {
859
+ f.value = S;
860
+ });
726
861
  }
727
- ];
728
- for (let _ = t + 1; _ < s; _++) {
729
- const D = B.value[_];
730
- d.push({
731
- id: D.id,
732
- type: D.type,
733
- startOffset: 0,
734
- endOffset: D.content.length
735
- });
862
+ },
863
+ onInput: (C) => {
864
+ u("input", C);
865
+ },
866
+ onContentStatusChange: (C) => u("content-status", C),
867
+ onSubmit: (C) => u("submit", C)
868
+ }), b = Nt({
869
+ editor: i,
870
+ isComposing: p,
871
+ getValueFromDOM: a.getValueFromDOM,
872
+ handleInput: a.handleInput,
873
+ onSubmit: (C) => u("submit", C)
874
+ }), L = (C, S) => {
875
+ let N = C;
876
+ return Object.entries(S).forEach(([X, e]) => {
877
+ const l = `[${X}]`;
878
+ N = N.replace(new RegExp(l.replace(/[[\]]/g, "\\$&"), "g"), e);
879
+ }), N;
880
+ }, _ = (C) => {
881
+ f.value = !0, r.value = C.template, c.value = C.initialValues || {};
882
+ const S = L(r.value, c.value);
883
+ a.updateOptions({
884
+ template: r.value,
885
+ value: S,
886
+ // 使用新生成的内容而不是旧的inputValue
887
+ initialValues: c.value
888
+ }), a.updateEditorDOM(), o.value = S, W(() => {
889
+ f.value = !1;
890
+ });
891
+ }, v = () => {
892
+ p.value = !0;
893
+ }, R = () => {
894
+ p.value = !1, a.handleInput();
895
+ }, w = (C) => {
896
+ var X;
897
+ if (!i.value) return;
898
+ const S = C.target;
899
+ let N = null;
900
+ if (S.classList.contains("template-field") ? N = S : (X = S.parentElement) != null && X.classList.contains("template-field") && (N = S.parentElement), N && (!N.textContent || N.textContent.trim() === "")) {
901
+ const e = z(i.value), l = document.createRange();
902
+ e && (l.selectNodeContents(N), l.collapse(!0), e.removeAllRanges(), e.addRange(l), N.focus(), C.preventDefault(), C.stopPropagation());
736
903
  }
737
- return d.push({
738
- id: l.id,
739
- type: l.type,
740
- startOffset: 0,
741
- endOffset: e.endOffset
742
- }), d;
743
- }, _e = (e, t, s, r) => {
744
- const l = e[0];
745
- if (l.type !== "prefix" && l.type !== "suffix")
746
- return e;
747
- if (e.length === 1) {
748
- if (t.collapsed)
749
- if (t.startOffset === 0) {
750
- const d = de(l, r);
751
- return d ? [d] : [];
752
- } else {
753
- const d = se(l, r);
754
- return d ? [d] : [];
755
- }
756
- if (s.startsWith("insert"))
757
- if (o) {
758
- const d = de(l, r);
759
- return d ? [d] : [];
760
- } else {
761
- const d = se(l, r);
762
- return d ? [d] : [];
763
- }
764
- if (s.startsWith("delete")) {
765
- if (s.includes("Backward")) {
766
- const d = de(l, r, 1);
767
- return d ? [d] : [];
768
- } else if (s.includes("Forward")) {
769
- const d = se(l, r, 1);
770
- return d ? [d] : [];
904
+ }, m = (C) => {
905
+ if (typeof ShadowRoot.prototype.getSelection != "function")
906
+ return;
907
+ C.preventDefault();
908
+ const S = C.clipboardData;
909
+ if (!S) return;
910
+ const N = S.getData("text/html"), X = S.getData("text/plain");
911
+ if (N) {
912
+ const e = document.createElement("div");
913
+ e.innerHTML = N;
914
+ const l = e.querySelectorAll("span");
915
+ let n = !1;
916
+ if (l.forEach((s) => {
917
+ const g = s, T = g.style, I = g.classList.contains("template-field"), M = g.hasAttribute("data-placeholder"), j = T.backgroundColor && // 标准格式
918
+ (T.backgroundColor === "rgba(0, 0, 0, 0.05)" || T.backgroundColor === "rgba(0, 0, 0, 0.08)" || // 可能的变体格式
919
+ T.backgroundColor.includes("rgba(0, 0, 0, 0.05)") || T.backgroundColor.includes("rgba(0, 0, 0, 0.08)") || // 十六进制或其他可能的格式
920
+ T.backgroundColor.toLowerCase().includes("0.05") || T.backgroundColor.toLowerCase().includes("0.08")), B = T.borderRadius === "4px" || T.padding === "3px 8px" || T.margin === "0px 2px" || T.whiteSpace === "nowrap";
921
+ if (I || M || j || B) {
922
+ if (n = !0, g.className = "template-field", !g.getAttribute("data-placeholder")) {
923
+ const q = a.extractPlaceholderFromElement(g);
924
+ q && g.setAttribute("data-placeholder", q);
925
+ }
926
+ g.removeAttribute("style");
771
927
  }
928
+ }), n) {
929
+ $(e);
930
+ return;
772
931
  }
773
932
  }
774
- return r.length > 0 ? e.slice(1) : e;
775
- }, de = (e, t, s = 0) => {
776
- const r = B.value.findIndex((l) => l.id === e.id && l.type === e.type);
777
- if (r > 0) {
778
- const l = B.value[r - 1], { id: d, type: _, content: D } = l;
779
- if (_ === "text" || _ === "template")
780
- return {
781
- id: d,
782
- type: _,
783
- startOffset: D.length - s,
784
- endOffset: D.length
785
- };
786
- if (t.length > 0)
787
- return { tag: "new", afterId: d, type: "text", content: t };
788
- if (console.warn("the previous item is not text or template", { current: e, previous: l }), s === 1)
789
- return { ...e, endOffset: e.startOffset };
790
- } else return t.length > 0 ? { tag: "new", type: "text", content: t } : (console.warn("the previous item of current is not found", { current: e }), null);
791
- return e;
792
- }, se = (e, t, s = 0) => {
793
- const r = B.value.findIndex((l) => l.id === e.id && l.type === e.type);
794
- if (r < B.value.length - 1) {
795
- const l = B.value[r + 1], { id: d, type: _ } = l;
796
- if (_ === "text" || _ === "template")
797
- return {
798
- id: d,
799
- type: _,
800
- startOffset: 0,
801
- endOffset: 0 + s
802
- };
803
- if (t.length > 0)
804
- return { tag: "new", afterId: e.id, type: "text", content: t };
805
- if (console.warn("the next item is not text or template", { current: e, next: l }), s === 1)
806
- return { ...e, startOffset: e.endOffset };
807
- } else return t.length > 0 ? { tag: "new", afterId: e.id, type: "text", content: t } : (console.warn("the next item of current is not found", { current: e }), null);
808
- return e;
809
- }, fe = () => {
810
- V.value = { hasStarted: !0, range: null };
811
- }, $e = (e) => {
812
- const t = V.value.range;
813
- t ? (e.data && Q(t.startContainer) && Q(t.endContainer) ? (O(e.data), W.set(K.get(), j(t))) : t.startId && t.endId ? (Se(t, "insertCompositionText", e.data), W.set(K.get(), j(t))) : console.warn("range is not valid, range:", t), k.value++) : console.warn("range is null, compositionEnd:", e), V.value = { hasStarted: !1, range: null };
814
- }, Z = (() => {
815
- const e = navigator.userAgent.toLowerCase();
816
- return /macintosh|mac os x|iphone|ipad|ipod/.test(e);
817
- })(), be = (e) => {
818
- const t = Z && e.metaKey && !e.shiftKey && e.key.toLowerCase() === "z" || // Cmd+Z
819
- !Z && e.ctrlKey && !e.shiftKey && e.key.toLowerCase() === "z", s = Z && e.metaKey && e.shiftKey && e.key.toLowerCase() === "z" || // Cmd+Shift+z
820
- !Z && e.ctrlKey && (e.key.toLowerCase() === "y" || e.shiftKey && e.key.toLowerCase() === "z"), r = e.key.toLowerCase() === "enter";
821
- if (t) {
822
- e.preventDefault();
823
- const l = ue(f.value);
824
- l && W.set(K.get(), j(l));
825
- const d = K.undo();
826
- d && pe(d);
827
- }
828
- if (s) {
829
- e.preventDefault();
830
- const l = K.redo();
831
- l && pe(l);
933
+ X && V(X);
934
+ }, $ = (C) => {
935
+ const S = z(i.value);
936
+ if (S && S.rangeCount > 0) {
937
+ const N = S.getRangeAt(0);
938
+ N.deleteContents();
939
+ const X = document.createDocumentFragment();
940
+ for (; C.firstChild; )
941
+ X.appendChild(C.firstChild);
942
+ N.insertNode(X), N.collapse(!1), S.removeAllRanges(), S.addRange(N), K();
832
943
  }
833
- r && (e.preventDefault(), h("submit"));
834
- }, pe = (e) => {
835
- const { data: t } = y(e);
836
- if (P(t), W.has(e)) {
837
- const s = W.get(e);
838
- J(() => {
839
- const r = f.value.querySelector(`[data-id="${s.startId}"][data-type="${s.startType}"]`), l = f.value.querySelector(`[data-id="${s.endId}"][data-type="${s.endType}"]`);
840
- r && G(r, s.startOffset, l, s.endOffset);
841
- });
944
+ }, V = (C) => {
945
+ const S = z(i.value);
946
+ if (S && S.rangeCount > 0) {
947
+ const N = S.getRangeAt(0);
948
+ N.deleteContents(), N.insertNode(document.createTextNode(C)), N.collapse(!1), S.removeAllRanges(), S.addRange(N), K();
842
949
  }
950
+ }, K = () => {
951
+ p.value = !1, W(() => {
952
+ a.handleInput();
953
+ const C = a.getValueFromDOM();
954
+ if (C !== o.value) {
955
+ const S = f.value;
956
+ f.value = !0, o.value = C, u("input", C), W(() => {
957
+ f.value = S;
958
+ });
959
+ }
960
+ setTimeout(() => {
961
+ const S = a.getValueFromDOM();
962
+ S !== o.value && (f.value = !0, o.value = S, u("input", S), W(() => {
963
+ f.value = !1;
964
+ }));
965
+ }, 50);
966
+ });
843
967
  };
844
- return c({
845
- clearHistory: () => {
846
- K.clear(), W.clear();
968
+ return ut(() => {
969
+ r.value && a.updateEditorDOM(), x.autofocus && i.value && a.setCursorToEnd();
970
+ }), te(
971
+ () => r.value,
972
+ () => {
973
+ f.value || (a.updateOptions({
974
+ template: r.value,
975
+ value: o.value,
976
+ initialValues: c.value
977
+ }), a.updateEditorDOM());
978
+ }
979
+ ), te(
980
+ () => c.value,
981
+ () => {
982
+ f.value || (a.updateOptions({
983
+ template: r.value,
984
+ value: o.value,
985
+ initialValues: c.value
986
+ }), a.updateEditorDOM());
847
987
  },
848
- activateFirstField: () => {
849
- if (!f.value)
850
- return;
851
- const e = m.value.find((t) => t.type === "template");
852
- e && J(() => {
853
- var s, r;
854
- const t = (s = f.value) == null ? void 0 : s.querySelector(`[data-id="${e.id}"][data-type="template"]`);
855
- if (t) {
856
- const l = ((r = t.textContent) == null ? void 0 : r.length) || 0;
857
- G(t, l);
858
- }
859
- });
988
+ { deep: !0 }
989
+ ), te(
990
+ () => o.value,
991
+ (C) => {
992
+ f.value || (a.updateOptions({
993
+ template: r.value,
994
+ value: C,
995
+ initialValues: c.value
996
+ }), a.updateEditorDOM()), (!C || C.trim() === "") && u("empty-content");
860
997
  }
861
- }), (e, t) => (S(), R("div", Pt, [
862
- (S(), R("div", {
863
- contenteditable: "true",
864
- ref_key: "editorRef",
865
- ref: f,
866
- key: k.value,
867
- class: "editor",
868
- onBeforeinput: le,
869
- onCompositionstart: fe,
870
- onCompositionend: $e,
871
- onKeydown: be
872
- }, [
873
- (S(!0), R(ie, null, ye(A.value, (s) => (S(), Y(Ft, ve({
874
- key: `${s.id}-${s.type}`
875
- }, { ref_for: !0 }, s), null, 16))), 128))
876
- ], 32))
877
- ]));
878
- }
879
- }), Kt = /* @__PURE__ */ Oe(Wt, [["__scopeId", "data-v-3ae7b00d"]]), At = ["onMouseenter", "onMousedown"], Nt = { class: "suggestion-list__text" }, Vt = /* @__PURE__ */ me({
880
- __name: "SuggestionList",
881
- props: {
882
- show: { type: Boolean },
883
- suggestions: {},
884
- popupStyle: {},
885
- isItemHighlighted: { type: Function },
886
- highlightSuggestionText: { type: Function },
887
- inputValue: {}
888
- },
889
- emits: ["item-hover", "item-leave", "select"],
890
- setup(i, { emit: c }) {
891
- const a = i, u = c, v = H(null), w = (b) => {
892
- u("item-hover", b);
893
- }, o = () => {
894
- u("item-leave");
895
- }, p = (b) => {
896
- u("select", b);
897
- };
898
- return (b, h) => (S(), Y(He, { name: "tiny-sender-slide-up" }, {
899
- default: re(() => [
900
- a.show && a.suggestions.length ? (S(), R("div", {
901
- key: 0,
902
- ref_key: "suggestionsListRef",
903
- ref: v,
904
- class: "suggestion-list",
905
- style: Pe(a.popupStyle)
906
- }, [
907
- (S(!0), R(ie, null, ye(a.suggestions, (k, g) => (S(), R("div", {
908
- key: g,
909
- class: te(["suggestion-list__item", { highlighted: a.isItemHighlighted(g) }]),
910
- onMouseenter: (I) => w(g),
911
- onMouseleave: o,
912
- onMousedown: ct((I) => p(k), ["prevent"])
913
- }, [
914
- X(C(_t), { class: "suggestion-list__icon" }),
915
- z("span", Nt, [
916
- (S(!0), R(ie, null, ye(a.highlightSuggestionText(k, a.inputValue), (I, m) => (S(), R("span", {
917
- key: m,
918
- class: te({
919
- "suggestion-list__text--match": I.isMatch,
920
- "suggestion-list__text--normal": !I.isMatch
921
- })
922
- }, ae(I.text), 3))), 128))
923
- ])
924
- ], 42, At))), 128))
925
- ], 4)) : M("", !0)
926
- ]),
927
- _: 1
928
- }));
998
+ ), y({
999
+ focus: () => {
1000
+ var C;
1001
+ (C = i.value) == null || C.focus(), a.setCursorToEnd();
1002
+ },
1003
+ resetFields: a.resetFields,
1004
+ activateFirstField: a.activateFirstField,
1005
+ getValueFromDOM: a.getValueFromDOM,
1006
+ setTemplate: _
1007
+ }), (C, S) => (D(), A("div", {
1008
+ class: "template-editor",
1009
+ ref_key: "contentEditableRef",
1010
+ ref: i,
1011
+ contenteditable: "true",
1012
+ onInput: S[0] || (S[0] = //@ts-ignore
1013
+ (...N) => E(a).handleInput && E(a).handleInput(...N)),
1014
+ onKeydown: S[1] || (S[1] = //@ts-ignore
1015
+ (...N) => E(b).handleTemplateKeyDown && E(b).handleTemplateKeyDown(...N)),
1016
+ onClick: w,
1017
+ onCompositionstart: v,
1018
+ onCompositionend: R,
1019
+ onFocus: S[2] || (S[2] = (N) => C.$emit("focus", N)),
1020
+ onBlur: S[3] || (S[3] = (N) => C.$emit("blur", N)),
1021
+ onPaste: m
1022
+ }, null, 544));
929
1023
  }
930
- }), Mt = /* @__PURE__ */ Oe(Vt, [["__scopeId", "data-v-238fcdfd"]]), zt = ["data-theme"], qt = { class: "tiny-sender__container" }, Ut = {
1024
+ }), Mt = ["data-theme"], Vt = { class: "tiny-sender__container" }, Bt = {
931
1025
  key: 0,
932
1026
  class: "tiny-sender__header-slot"
933
- }, jt = {
1027
+ }, Wt = {
934
1028
  key: 0,
935
1029
  class: "tiny-sender__prefix-slot"
936
- }, Gt = { class: "tiny-sender__content-area" }, Xt = {
1030
+ }, $t = { class: "tiny-sender__content-area" }, Pt = {
937
1031
  key: 0,
938
1032
  class: "tiny-sender__decorative-content"
939
- }, Jt = {
1033
+ }, Ht = {
940
1034
  key: 2,
941
1035
  class: "tiny-sender__input-field-wrapper"
942
- }, Qt = {
1036
+ }, Kt = {
943
1037
  key: 0,
944
1038
  class: "tiny-sender__completion-placeholder"
945
- }, Yt = { class: "user-input-mirror" }, Zt = {
1039
+ }, Xt = { class: "user-input-mirror" }, qt = {
946
1040
  key: 0,
947
1041
  class: "tiny-sender__tab-hint"
948
- }, en = {
1042
+ }, zt = {
949
1043
  key: 1,
950
1044
  class: "tiny-sender__actions-slot"
951
- }, tn = { class: "tiny-sender__footer-left" }, nn = { class: "tiny-sender__footer-right" }, sn = { class: "real-word-length" }, on = {
1045
+ }, jt = { class: "tiny-sender__footer-left" }, Ut = { class: "tiny-sender__footer-right" }, Zt = { class: "real-word-length" }, Gt = {
952
1046
  key: 1,
953
1047
  class: "tiny-sender__toolbar"
954
- }, an = { class: "tiny-sender__buttons-container" }, ln = {
1048
+ }, Jt = { class: "tiny-sender__buttons-container" }, Qt = {
955
1049
  key: 1,
956
1050
  class: "tiny-sender__footer-slot"
957
- }, Re = /* @__PURE__ */ me({
1051
+ }, Yt = ["onMouseenter", "onMousedown"], en = { class: "suggestion-item__text" }, tn = {
1052
+ key: 0,
1053
+ class: "tiny-sender__error"
1054
+ }, pe = /* @__PURE__ */ be({
958
1055
  __name: "index",
959
1056
  props: {
960
1057
  autofocus: { type: Boolean, default: !1 },
@@ -968,7 +1065,6 @@ const Pt = { class: "editor-container" }, De = "​", Fe = "​", Wt = /* @__PUR
968
1065
  modelValue: { default: "" },
969
1066
  mode: { default: "single" },
970
1067
  maxLength: { default: 1 / 0 },
971
- buttonGroup: {},
972
1068
  submitType: { default: "enter" },
973
1069
  speech: { type: [Boolean, Object] },
974
1070
  placeholder: { default: "请输入内容..." },
@@ -976,361 +1072,360 @@ const Pt = { class: "editor-container" }, De = "​", Fe = "​", Wt = /* @__PUR
976
1072
  suggestions: { default: () => [] },
977
1073
  suggestionPopupWidth: { default: 400 },
978
1074
  theme: { default: "light" },
979
- templateData: { default: () => [] },
980
- stopText: { default: "" }
1075
+ template: { default: "" },
1076
+ hasContent: { type: Boolean, default: void 0 },
1077
+ templateInitialValues: { default: () => ({}) }
981
1078
  },
982
- emits: ["update:modelValue", "update:templateData", "submit", "clear", "speech-start", "speech-end", "speech-interim", "speech-error", "suggestion-select", "focus", "blur", "escape-press", "cancel", "reset-template", "files-selected"],
983
- setup(i, { expose: c, emit: a }) {
984
- var Ne;
985
- const u = i, v = a, w = H(null), o = H(null), p = H(null), b = H(null), h = H(null), k = L(() => u.templateData && u.templateData.length > 0), { inputValue: g, isComposing: I, clearInput: m } = Ct(u, v), P = L(() => !!g.value.trim()), B = L(() => {
986
- var n, x;
987
- return !(u.disabled || u.loading || !P.value || he.value || (x = (n = u.buttonGroup) == null ? void 0 : n.submit) != null && x.disabled);
988
- }), {
989
- showSuggestionsPopup: A,
990
- completionPlaceholder: f,
991
- showTabHint: E,
992
- suggestionsListRef: y,
993
- filteredSuggestions: W,
994
- activeSuggestion: K,
995
- isItemHighlighted: q,
996
- updateSuggestionsState: Q,
997
- selectSuggestion: ue,
998
- acceptCurrentSuggestion: ce,
999
- closeSuggestionsPopup: G,
1000
- navigateSuggestions: O,
1001
- handleSuggestionItemHover: V,
1002
- handleSuggestionItemLeave: le,
1003
- highlightSuggestionText: j
1004
- } = Rt(u, v, g, I, k), N = H(u.mode), ne = H(!1), Se = () => {
1005
- N.value === "single" && (N.value = "multiple", J(() => {
1079
+ emits: ["update:modelValue", "submit", "clear", "speech-start", "speech-end", "speech-interim", "speech-error", "suggestion-select", "focus", "blur", "escape-press", "cancel", "reset-template"],
1080
+ setup(t, { expose: y, emit: h }) {
1081
+ const o = t, x = h, u = O(null), i = O(null), r = O(null), c = O(null), f = O(null), p = O(!1), { inputValue: a, isComposing: b, clearInput: L } = wt(o, x), {
1082
+ showSuggestionsPopup: _,
1083
+ completionPlaceholder: v,
1084
+ showTabHint: R,
1085
+ suggestionsListRef: w,
1086
+ filteredSuggestions: m,
1087
+ activeSuggestion: $,
1088
+ isItemHighlighted: V,
1089
+ updateSuggestionsState: K,
1090
+ selectSuggestion: C,
1091
+ acceptCurrentSuggestion: S,
1092
+ closeSuggestionsPopup: N,
1093
+ navigateSuggestions: X,
1094
+ handleSuggestionItemHover: e,
1095
+ handleSuggestionItemLeave: l,
1096
+ highlightSuggestionText: n
1097
+ } = Rt(o, x, a, b), s = O(o.mode), g = O(!1), T = () => {
1098
+ s.value === "single" && (s.value = "multiple", W(() => {
1006
1099
  setTimeout(() => {
1007
- const n = document.querySelector(".tiny-textarea__inner");
1008
- if (n) {
1009
- n.style.whiteSpace = "pre-wrap";
1010
- const x = g.value.length;
1011
- n.focus(), n.setSelectionRange(x, x);
1100
+ const d = document.querySelector(".tiny-textarea__inner");
1101
+ if (d) {
1102
+ d.style.whiteSpace = "pre-wrap";
1103
+ const k = a.value.length;
1104
+ d.focus(), d.setSelectionRange(k, k);
1012
1105
  }
1013
1106
  }, 50);
1014
1107
  }));
1015
- }, Te = (n, x) => {
1108
+ }, I = (d, k) => {
1016
1109
  const F = document.createElement("span");
1017
- F.style.visibility = "hidden", F.style.position = "absolute", F.style.whiteSpace = "nowrap", F.style.font = x, F.textContent = n, document.body.appendChild(F);
1018
- const ke = F.offsetWidth;
1019
- return document.body.removeChild(F), ke;
1020
- }, we = () => {
1021
- var xe, ze, qe;
1022
- if (u.mode !== "single" || !w.value || ne.value || !o.value || !b.value) return;
1023
- const n = o.value.querySelector(".tiny-sender__content-area");
1024
- if (!n) return;
1025
- const x = ((ze = (xe = w.value) == null ? void 0 : xe.querySelector) == null ? void 0 : ze.call(xe, ".tiny-input__inner")) || n.querySelector(".tiny-input__inner"), F = h.value || o.value.querySelector(".tiny-sender__buttons-container");
1026
- if (!x) {
1110
+ F.style.visibility = "hidden", F.style.position = "absolute", F.style.whiteSpace = "nowrap", F.style.font = k, F.textContent = d, document.body.appendChild(F);
1111
+ const ne = F.offsetWidth;
1112
+ return document.body.removeChild(F), ne;
1113
+ }, M = () => {
1114
+ var ce, xe, ke;
1115
+ if (o.mode !== "single" || !u.value || g.value || !i.value || !c.value) return;
1116
+ const d = i.value.querySelector(".tiny-sender__content-area");
1117
+ if (!d) return;
1118
+ const k = ((xe = (ce = u.value) == null ? void 0 : ce.querySelector) == null ? void 0 : xe.call(ce, ".tiny-input__inner")) || d.querySelector(".tiny-input__inner"), F = f.value || i.value.querySelector(".tiny-sender__buttons-container");
1119
+ if (!k) {
1027
1120
  console.warn("Cannot find input element for overflow check");
1028
1121
  return;
1029
1122
  }
1030
- const ke = x.getBoundingClientRect(), Le = F == null ? void 0 : F.getBoundingClientRect();
1031
- if (ke.width === 0) {
1032
- setTimeout(() => we(), 50);
1123
+ const ne = k.getBoundingClientRect(), Z = F == null ? void 0 : F.getBoundingClientRect();
1124
+ if (ne.width === 0) {
1125
+ setTimeout(() => M(), 50);
1033
1126
  return;
1034
1127
  }
1035
- const Ze = window.getComputedStyle(x).font, et = Te(g.value, Ze), Ve = (qe = o.value) == null ? void 0 : qe.classList.contains("tr-sender-compact"), tt = Ve ? 12 : 20, nt = ke.width, st = (Le == null ? void 0 : Le.width) || 0, Me = nt - st - tt, ot = Ve ? 50 : 80;
1036
- et > Me && Me > ot && N.value === "single" && (ne.value = !0, N.value = "multiple", J(() => {
1037
- w.value ? setTimeout(() => {
1038
- var Ue;
1039
- const Ie = (Ue = o.value) == null ? void 0 : Ue.querySelector(".tiny-textarea__inner");
1040
- if (Ie) {
1041
- Ie.style.whiteSpace = "pre-wrap";
1042
- const je = g.value.length;
1043
- Ie.focus(), Ie.setSelectionRange(je, je);
1128
+ const ge = window.getComputedStyle(k).font, nt = I(a.value, ge), Te = (ke = i.value) == null ? void 0 : ke.classList.contains("tr-sender-compact"), st = Te ? 12 : 20, lt = ne.width, at = (Z == null ? void 0 : Z.width) || 0, Ne = lt - at - st, ot = Te ? 50 : 80;
1129
+ nt > Ne && Ne > ot && s.value === "single" && (g.value = !0, s.value = "multiple", W(() => {
1130
+ u.value ? setTimeout(() => {
1131
+ var Re;
1132
+ const de = (Re = i.value) == null ? void 0 : Re.querySelector(".tiny-textarea__inner");
1133
+ if (de) {
1134
+ de.style.whiteSpace = "pre-wrap";
1135
+ const De = a.value.length;
1136
+ de.focus(), de.setSelectionRange(De, De);
1044
1137
  }
1045
- ne.value = !1;
1046
- }, 300) : ne.value = !1;
1138
+ g.value = !1;
1139
+ }, 300) : g.value = !1;
1047
1140
  }));
1048
- }, _e = () => {
1049
- if (k.value && p.value)
1050
- Ke();
1051
- else if (w.value)
1052
- w.value.focus();
1053
- else {
1054
- const n = document.querySelector(".tiny-input__inner");
1055
- n == null || n.focus();
1056
- }
1057
- }, de = () => {
1058
- if (w.value)
1059
- w.value.blur();
1141
+ }, j = () => {
1142
+ if (p.value && r.value)
1143
+ Ce();
1144
+ else if (u.value)
1145
+ u.value.focus();
1060
1146
  else {
1061
- const n = document.querySelector(".tiny-input__inner");
1062
- n == null || n.blur();
1147
+ const d = document.querySelector(".tiny-input__inner");
1148
+ d == null || d.focus();
1063
1149
  }
1064
- }, se = () => {
1065
- var n;
1066
- v("update:templateData", []), (n = p.value) == null || n.clearHistory(), J(() => {
1067
- g.value === "" && (N.value = u.mode || "single"), setTimeout(() => {
1068
- _e();
1150
+ }, B = () => {
1151
+ p.value = !1, x("reset-template"), W(() => {
1152
+ a.value === "" && (s.value = o.mode || "single"), setTimeout(() => {
1153
+ j();
1069
1154
  }, 50);
1070
- }), G();
1071
- }, fe = () => {
1072
- var n;
1073
- m(), k.value ? se() : (n = o.value) == null || n.focus(), J(() => {
1074
- g.value === "" && (N.value = u.mode || "single");
1075
- }), G();
1076
- }, $e = (n) => {
1077
- if (n.length === 0 || n.length === 1 && n[0].type === "text" && n[0].content === "​") {
1078
- se();
1079
- return;
1080
- }
1081
- v("update:templateData", n);
1082
- };
1083
- ee(
1084
- () => u.templateData,
1085
- () => {
1086
- g.value = u.templateData.map((n) => n.content).join("");
1087
- },
1088
- { deep: !0 }
1089
- );
1090
- const We = L(() => {
1091
- const n = typeof u.speech == "object" ? u.speech : {};
1155
+ });
1156
+ }, q = () => {
1157
+ var d;
1158
+ L(), p.value ? B() : (d = i.value) == null || d.focus(), W(() => {
1159
+ a.value === "" && (s.value = o.mode || "single");
1160
+ }), N();
1161
+ }, He = (d) => {
1162
+ x("update:modelValue", d);
1163
+ }, Ce = () => {
1164
+ r.value && r.value.activateFirstField();
1165
+ }, Ke = (d, k) => {
1166
+ p.value = !0, W(() => {
1167
+ r.value && r.value.setTemplate({ template: d, initialValues: k });
1168
+ });
1169
+ }, Xe = P(() => {
1170
+ const d = typeof o.speech == "object" ? o.speech : {};
1092
1171
  return {
1093
- ...n,
1094
- onStart: () => v("speech-start"),
1095
- onEnd: (x) => v("speech-end", x),
1096
- onInterim: (x) => v("speech-interim", x),
1097
- onFinal: (x) => {
1098
- if (n.autoReplace)
1099
- g.value = x;
1172
+ ...d,
1173
+ onStart: () => x("speech-start"),
1174
+ onEnd: (k) => x("speech-end", k),
1175
+ onInterim: (k) => x("speech-interim", k),
1176
+ onFinal: (k) => {
1177
+ if (d.autoReplace)
1178
+ a.value = k;
1100
1179
  else {
1101
- const F = g.value;
1102
- F && x && !F.endsWith(" ") && !x.startsWith(" ") && F.length > 0 ? g.value = F + " " + x : g.value = F + x;
1180
+ const F = a.value;
1181
+ F && k && !F.endsWith(" ") && !k.startsWith(" ") && F.length > 0 ? a.value = F + " " + k : a.value = F + k;
1103
1182
  }
1104
- v("speech-end", x);
1183
+ x("speech-end", k);
1105
1184
  },
1106
- onError: (x) => {
1107
- v("speech-error", x);
1185
+ onError: (k) => {
1186
+ et(k.message), x("speech-error", k);
1108
1187
  }
1109
1188
  };
1110
- }), { speechState: Z, start: be, stop: pe } = xt(We.value), Ce = () => {
1111
- Z.isRecording ? pe() : be();
1112
- }, he = L(() => u.maxLength !== 1 / 0 && g.value.length > u.maxLength), { handleKeyPress: e, triggerSubmit: t } = kt(
1113
- u,
1114
- v,
1115
- g,
1116
- I,
1117
- Z,
1118
- A,
1119
- K,
1120
- ce,
1121
- G,
1122
- O,
1123
- Ce,
1124
- B,
1189
+ }), { speechState: ie, start: Se, stop: we } = xt(Xe.value), me = () => {
1190
+ ie.isRecording ? we() : Se();
1191
+ }, re = P(() => o.maxLength !== 1 / 0 && a.value.length > o.maxLength), { handleKeyPress: qe, triggerSubmit: he } = Tt(
1192
+ o,
1193
+ x,
1194
+ a,
1195
+ b,
1196
+ ie,
1197
+ _,
1198
+ $,
1199
+ S,
1125
1200
  N,
1126
- Se,
1127
- k,
1128
- se
1129
- ), s = (n) => {
1130
- v("focus", n), g.value && W.value.length > 0 && !k.value && (A.value = !0, E.value = !0);
1131
- }, r = (n) => {
1132
- v("blur", n), G();
1133
- }, l = L(() => N.value === "multiple" ? "textarea" : "text"), d = L(
1201
+ X,
1202
+ me,
1203
+ re,
1204
+ s,
1205
+ T
1206
+ ), ze = (d) => {
1207
+ x("focus", d), a.value && m.value.length > 0 && !o.template && (_.value = !0, R.value = !0);
1208
+ }, je = (d) => {
1209
+ x("blur", d), N();
1210
+ }, Ue = P(() => s.value === "multiple" ? "textarea" : "text"), Ze = P(
1134
1211
  () => ({
1135
1212
  display: "flex",
1136
- justifyContent: u.showWordLimit && u.maxLength !== 1 / 0 ? "space-between" : "flex-end",
1213
+ justifyContent: o.showWordLimit && o.maxLength !== 1 / 0 ? "space-between" : "flex-end",
1137
1214
  alignItems: "center"
1138
1215
  })
1139
- ), _ = dt(), D = L(() => !!_.decorativeContent), T = L(() => u.disabled || D.value), $ = L(() => u.loading), U = L(() => ({
1140
- "is-disabled": T.value,
1141
- "is-loading": $.value,
1142
- "is-auto-switching": ne.value
1143
- })), ge = L(() => ({
1144
- width: bt(u.suggestionPopupWidth),
1216
+ ), Ge = ct(), Je = P(() => !!Ge.decorativeContent), ue = P(() => o.disabled || Je.value), Ee = P(() => o.loading), _e = P(() => o.hasContent !== void 0 ? o.hasContent : !!a.value), Qe = P(() => ({
1217
+ "is-disabled": ue.value,
1218
+ "is-loading": Ee.value,
1219
+ "has-error": !!oe.value,
1220
+ "is-auto-switching": g.value
1221
+ })), Ye = P(() => ({
1222
+ width: mt(o.suggestionPopupWidth),
1145
1223
  maxWidth: "100%"
1146
1224
  // 确保不超出父容器宽度
1147
- })), Be = () => {
1148
- I.value = !1, setTimeout(() => {
1149
- I.value = !1, Q();
1225
+ })), oe = O(""), et = (d) => {
1226
+ oe.value = d, setTimeout(() => oe.value = "", 5e3);
1227
+ }, tt = () => {
1228
+ b.value = !1, setTimeout(() => {
1229
+ b.value = !1, K();
1150
1230
  }, 50);
1151
1231
  };
1152
- ee(g, () => {
1153
- J(we), g.value === "" && u.mode === "single" && (N.value = "single");
1154
- }), ee(
1155
- () => k.value,
1156
- (n) => {
1157
- n && (N.value = "multiple");
1232
+ return te(a, () => {
1233
+ W(M), a.value === "" && o.mode === "single" && (s.value = "single");
1234
+ }), te(
1235
+ () => p.value,
1236
+ (d) => {
1237
+ d && (s.value = "multiple");
1158
1238
  }
1159
- );
1160
- const Ke = () => {
1161
- p.value && p.value.activateFirstField();
1162
- }, { accept: Je = "*", multiple: Qe = !0 } = ((Ne = u.buttonGroup) == null ? void 0 : Ne.file) || {}, { open: Ae, files: Ye } = ht({ accept: Je, multiple: Qe });
1163
- return ee(Ye, (n) => {
1164
- n && n.length > 0 && v("files-selected", Array.from(n));
1165
- }), c({
1166
- focus: _e,
1167
- blur: de,
1168
- clear: fe,
1169
- submit: t,
1170
- startSpeech: be,
1171
- stopSpeech: pe,
1172
- activateTemplateFirstField: Ke
1173
- }), (n, x) => (S(), R("div", {
1239
+ ), y({
1240
+ focus: j,
1241
+ blur: () => {
1242
+ if (u.value)
1243
+ u.value.blur();
1244
+ else {
1245
+ const d = document.querySelector(".tiny-input__inner");
1246
+ d == null || d.blur();
1247
+ }
1248
+ },
1249
+ clear: q,
1250
+ submit: he,
1251
+ startSpeech: Se,
1252
+ stopSpeech: we,
1253
+ activateTemplateFirstField: Ce,
1254
+ setTemplate: Ke
1255
+ }), (d, k) => (D(), A("div", {
1174
1256
  ref_key: "senderRef",
1175
- ref: o,
1176
- class: te(["tiny-sender", [U.value, `theme-${n.theme}`, `mode-${N.value}`]]),
1177
- "data-theme": n.theme
1257
+ ref: i,
1258
+ class: ae(["tiny-sender", [Qe.value, `theme-${d.theme}`, `mode-${s.value}`]]),
1259
+ "data-theme": d.theme
1178
1260
  }, [
1179
- z("div", qt, [
1180
- z("div", {
1261
+ U("div", Vt, [
1262
+ U("div", {
1181
1263
  class: "tiny-sender__input-wrapper",
1182
1264
  ref_key: "inputWrapperRef",
1183
- ref: b
1265
+ ref: c
1184
1266
  }, [
1185
- X(He, { name: "tiny-sender-slide-down" }, {
1186
- default: re(() => [
1187
- n.$slots.header ? (S(), R("div", Ut, [
1188
- oe(n.$slots, "header")
1189
- ])) : M("", !0)
1267
+ G(ve, { name: "tiny-sender-slide-down" }, {
1268
+ default: Y(() => [
1269
+ d.$slots.header ? (D(), A("div", Bt, [
1270
+ se(d.$slots, "header")
1271
+ ])) : H("", !0)
1190
1272
  ]),
1191
1273
  _: 3
1192
1274
  }),
1193
- z("div", {
1194
- class: te(["tiny-sender__input-row", { "has-prefix": n.$slots.prefix, "has-header": n.$slots.header }])
1275
+ U("div", {
1276
+ class: ae(["tiny-sender__input-row", { "has-prefix": d.$slots.prefix, "has-header": d.$slots.header }])
1195
1277
  }, [
1196
- n.$slots.prefix ? (S(), R("div", jt, [
1197
- oe(n.$slots, "prefix")
1198
- ])) : M("", !0),
1199
- z("div", Gt, [
1200
- n.$slots.decorativeContent ? (S(), R("div", Xt, [
1201
- oe(n.$slots, "decorativeContent")
1202
- ])) : M("", !0),
1203
- k.value ? (S(), Y(Kt, {
1278
+ d.$slots.prefix ? (D(), A("div", Wt, [
1279
+ se(d.$slots, "prefix")
1280
+ ])) : H("", !0),
1281
+ U("div", $t, [
1282
+ d.$slots.decorativeContent ? (D(), A("div", Pt, [
1283
+ se(d.$slots, "decorativeContent")
1284
+ ])) : H("", !0),
1285
+ p.value ? (D(), Q(At, {
1204
1286
  key: 1,
1205
1287
  ref_key: "templateEditorRef",
1206
- ref: p,
1207
- "model-value": u.templateData,
1208
- "onUpdate:modelValue": $e,
1209
- onSubmit: C(t)
1210
- }, null, 8, ["model-value", "onSubmit"])) : (S(), R("div", Jt, [
1211
- X(C(pt), {
1288
+ ref: r,
1289
+ value: E(a),
1290
+ "onUpdate:value": k[0] || (k[0] = (F) => Le(a) ? a.value = F : null),
1291
+ onInput: He,
1292
+ onEmptyContent: B
1293
+ }, null, 8, ["value"])) : (D(), A("div", Ht, [
1294
+ G(E(ft), {
1212
1295
  ref_key: "inputRef",
1213
- ref: w,
1214
- autosize: n.autoSize,
1215
- type: l.value,
1296
+ ref: u,
1297
+ autosize: d.autoSize,
1298
+ type: Ue.value,
1299
+ readonly: Ee.value,
1216
1300
  resize: "none",
1217
- modelValue: C(g),
1218
- "onUpdate:modelValue": x[0] || (x[0] = (F) => ft(g) ? g.value = F : null),
1219
- disabled: T.value,
1220
- placeholder: n.placeholder,
1221
- autofocus: n.autofocus,
1222
- onKeydown: C(e),
1223
- onCompositionstart: x[1] || (x[1] = (F) => I.value = !0),
1224
- onCompositionend: Be,
1225
- onFocus: s,
1226
- onBlur: r
1227
- }, null, 8, ["autosize", "type", "modelValue", "disabled", "placeholder", "autofocus", "onKeydown"]),
1228
- C(f) && !C(I) ? (S(), R("div", Qt, [
1229
- z("span", Yt, ae(C(g)), 1),
1230
- Ge(ae(C(f)) + " ", 1),
1231
- C(E) ? (S(), R("div", Zt, "TAB")) : M("", !0)
1232
- ])) : M("", !0)
1301
+ modelValue: E(a),
1302
+ "onUpdate:modelValue": k[1] || (k[1] = (F) => Le(a) ? a.value = F : null),
1303
+ disabled: ue.value,
1304
+ placeholder: d.placeholder,
1305
+ autofocus: d.autofocus,
1306
+ onKeydown: E(qe),
1307
+ onCompositionstart: k[2] || (k[2] = (F) => b.value = !0),
1308
+ onCompositionend: tt,
1309
+ onFocus: ze,
1310
+ onBlur: je
1311
+ }, null, 8, ["autosize", "type", "readonly", "modelValue", "disabled", "placeholder", "autofocus", "onKeydown"]),
1312
+ E(v) && !E(b) ? (D(), A("div", Kt, [
1313
+ U("span", Xt, le(E(a)), 1),
1314
+ Oe(le(E(v)) + " ", 1),
1315
+ E(R) ? (D(), A("div", qt, "TAB")) : H("", !0)
1316
+ ])) : H("", !0)
1233
1317
  ]))
1234
1318
  ]),
1235
- N.value === "single" ? (S(), R("div", en, [
1236
- z("div", {
1319
+ s.value === "single" ? (D(), A("div", zt, [
1320
+ U("div", {
1237
1321
  class: "tiny-sender__buttons-container",
1238
1322
  ref_key: "buttonsContainerRef",
1239
- ref: h
1323
+ ref: f
1240
1324
  }, [
1241
- oe(n.$slots, "actions"),
1242
- X(Xe, {
1243
- "allow-speech": n.allowSpeech,
1244
- "allow-files": n.allowFiles,
1245
- loading: n.loading,
1246
- disabled: T.value,
1247
- "show-clear": n.clearable,
1248
- "has-content": P.value,
1249
- "speech-status": C(Z),
1250
- "button-group": n.buttonGroup,
1251
- "submit-type": n.submitType,
1252
- "is-over-limit": he.value,
1253
- "stop-text": n.stopText,
1254
- onClear: fe,
1255
- onToggleSpeech: Ce,
1256
- onSubmit: C(t),
1257
- onCancel: x[2] || (x[2] = (F) => n.$emit("cancel")),
1258
- onTriggerSelect: C(Ae)
1259
- }, null, 8, ["allow-speech", "allow-files", "loading", "disabled", "show-clear", "has-content", "speech-status", "button-group", "submit-type", "is-over-limit", "stop-text", "onSubmit", "onTriggerSelect"])
1325
+ se(d.$slots, "actions"),
1326
+ G(We, {
1327
+ "allow-speech": d.allowSpeech,
1328
+ "allow-files": d.allowFiles,
1329
+ loading: d.loading,
1330
+ disabled: ue.value,
1331
+ "show-clear": d.clearable,
1332
+ "has-content": _e.value,
1333
+ "speech-status": E(ie),
1334
+ "submit-type": d.submitType,
1335
+ "is-over-limit": re.value,
1336
+ onClear: q,
1337
+ onToggleSpeech: me,
1338
+ onSubmit: E(he),
1339
+ onCancel: k[3] || (k[3] = (F) => d.$emit("cancel"))
1340
+ }, null, 8, ["allow-speech", "allow-files", "loading", "disabled", "show-clear", "has-content", "speech-status", "submit-type", "is-over-limit", "onSubmit"])
1260
1341
  ], 512)
1261
- ])) : M("", !0)
1342
+ ])) : H("", !0)
1262
1343
  ], 2),
1263
- X(He, { name: "tiny-sender-slide-up" }, {
1264
- default: re(() => [
1265
- N.value === "multiple" ? (S(), R("div", {
1344
+ G(ve, { name: "tiny-sender-slide-up" }, {
1345
+ default: Y(() => [
1346
+ s.value === "multiple" ? (D(), A("div", {
1266
1347
  key: 0,
1267
- style: Pe(d.value),
1348
+ style: Ie(Ze.value),
1268
1349
  class: "tiny-sender__footer-slot tiny-sender__bottom-row"
1269
1350
  }, [
1270
- z("div", tn, [
1271
- oe(n.$slots, "footer-left")
1351
+ U("div", jt, [
1352
+ se(d.$slots, "footer-left")
1272
1353
  ]),
1273
- z("div", nn, [
1274
- oe(n.$slots, "footer-right"),
1275
- n.showWordLimit && n.maxLength !== 1 / 0 ? (S(), R("div", {
1354
+ U("div", Ut, [
1355
+ se(d.$slots, "footer-right"),
1356
+ d.showWordLimit && d.maxLength !== 1 / 0 ? (D(), A("div", {
1276
1357
  key: 0,
1277
- class: te(["tiny-sender__word-limit", { "is-over-limit": he.value }])
1358
+ class: ae(["tiny-sender__word-limit", { "is-over-limit": re.value }])
1278
1359
  }, [
1279
- z("span", sn, ae(C(g).length), 1),
1280
- Ge("/" + ae(n.maxLength), 1)
1281
- ], 2)) : M("", !0),
1282
- N.value === "multiple" ? (S(), R("div", on, [
1283
- z("div", an, [
1284
- X(Xe, {
1285
- "allow-speech": n.allowSpeech,
1286
- "allow-files": n.allowFiles,
1287
- loading: n.loading,
1288
- disabled: T.value,
1289
- "show-clear": n.clearable,
1290
- "has-content": P.value,
1291
- "speech-status": C(Z),
1292
- "button-group": n.buttonGroup,
1293
- "submit-type": n.submitType,
1294
- "is-over-limit": he.value,
1295
- "stop-text": n.stopText,
1296
- onClear: fe,
1297
- onToggleSpeech: Ce,
1298
- onSubmit: C(t),
1299
- onCancel: x[3] || (x[3] = (F) => n.$emit("cancel")),
1300
- onTriggerSelect: C(Ae)
1301
- }, null, 8, ["allow-speech", "allow-files", "loading", "disabled", "show-clear", "has-content", "speech-status", "button-group", "submit-type", "is-over-limit", "stop-text", "onSubmit", "onTriggerSelect"])
1360
+ U("span", Zt, le(E(a).length), 1),
1361
+ Oe("/" + le(d.maxLength), 1)
1362
+ ], 2)) : H("", !0),
1363
+ s.value === "multiple" ? (D(), A("div", Gt, [
1364
+ U("div", Jt, [
1365
+ G(We, {
1366
+ "allow-speech": d.allowSpeech,
1367
+ "allow-files": d.allowFiles,
1368
+ loading: d.loading,
1369
+ disabled: ue.value,
1370
+ "show-clear": d.clearable,
1371
+ "has-content": _e.value,
1372
+ "speech-status": E(ie),
1373
+ "submit-type": d.submitType,
1374
+ "is-over-limit": re.value,
1375
+ onClear: q,
1376
+ onToggleSpeech: me,
1377
+ onSubmit: E(he),
1378
+ onCancel: k[4] || (k[4] = (F) => d.$emit("cancel"))
1379
+ }, null, 8, ["allow-speech", "allow-files", "loading", "disabled", "show-clear", "has-content", "speech-status", "submit-type", "is-over-limit", "onSubmit"])
1302
1380
  ])
1303
- ])) : M("", !0)
1381
+ ])) : H("", !0)
1304
1382
  ])
1305
- ], 4)) : n.$slots.footer ? (S(), R("div", ln, [
1306
- oe(n.$slots, "footer")
1307
- ])) : M("", !0)
1383
+ ], 4)) : d.$slots.footer ? (D(), A("div", Qt, [
1384
+ se(d.$slots, "footer")
1385
+ ])) : H("", !0)
1308
1386
  ]),
1309
1387
  _: 3
1310
1388
  })
1311
1389
  ], 512)
1312
1390
  ]),
1313
- X(Mt, {
1314
- ref_key: "suggestionsListRef",
1315
- ref: y,
1316
- show: C(A),
1317
- suggestions: C(W),
1318
- "popup-style": ge.value,
1319
- "is-item-highlighted": C(q),
1320
- "highlight-suggestion-text": C(j),
1321
- "input-value": C(g),
1322
- onItemHover: C(V),
1323
- onItemLeave: C(le),
1324
- onSelect: C(ue)
1325
- }, null, 8, ["show", "suggestions", "popup-style", "is-item-highlighted", "highlight-suggestion-text", "input-value", "onItemHover", "onItemLeave", "onSelect"])
1326
- ], 10, zt));
1391
+ G(ve, { name: "tiny-sender-slide-up" }, {
1392
+ default: Y(() => [
1393
+ E(_) && E(m).length ? (D(), A("div", {
1394
+ key: 0,
1395
+ ref_key: "suggestionsListRef",
1396
+ ref: w,
1397
+ class: "tiny-sender__suggestions",
1398
+ style: Ie(Ye.value)
1399
+ }, [
1400
+ (D(!0), A(Ae, null, Me(E(m), (F, ne) => (D(), A("div", {
1401
+ key: ne,
1402
+ class: ae(["suggestion-item", { highlighted: E(V)(ne) }]),
1403
+ onMouseenter: (Z) => E(e)(ne),
1404
+ onMouseleave: k[5] || (k[5] = //@ts-ignore
1405
+ (...Z) => E(l) && E(l)(...Z)),
1406
+ onMousedown: dt((Z) => E(C)(F), ["prevent"])
1407
+ }, [
1408
+ G(E(St), { class: "suggestion-item__icon" }),
1409
+ U("span", en, [
1410
+ (D(!0), A(Ae, null, Me(E(n)(F, E(a)), (Z, ge) => (D(), A("span", {
1411
+ key: ge,
1412
+ class: ae({ "suggestion-item__text--match": Z.isMatch, "suggestion-item__text--normal": !Z.isMatch })
1413
+ }, le(Z.text), 3))), 128))
1414
+ ])
1415
+ ], 42, Yt))), 128))
1416
+ ], 4)) : H("", !0)
1417
+ ]),
1418
+ _: 1
1419
+ }),
1420
+ oe.value ? (D(), A("div", tn, le(oe.value), 1)) : H("", !0)
1421
+ ], 10, Mt));
1327
1422
  }
1328
1423
  });
1329
- Re.name = "TrSender";
1330
- const rn = function(i) {
1331
- i.component(Re.name, Re);
1424
+ pe.name = "TrSender";
1425
+ const nn = function(t) {
1426
+ t.component(pe.name, pe);
1332
1427
  };
1333
- Re.install = rn;
1428
+ pe.install = nn;
1334
1429
  export {
1335
- Re as default
1430
+ pe as default
1336
1431
  };