@floegence/floe-webapp-core 0.86.46 → 0.86.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/chat/blocks/MarkdownMedia.d.ts +2 -0
- package/dist/components/chat/blocks/MarkdownMedia.js +187 -171
- package/dist/components/chat/markdown/incremental.d.ts +43 -0
- package/dist/components/chat/markdown/incremental.js +245 -0
- package/dist/markdown.d.ts +2 -0
- package/dist/markdown.js +2 -0
- package/package.json +1 -1
|
@@ -54,6 +54,8 @@ export interface MarkdownMediaProps {
|
|
|
54
54
|
labels: MarkdownMediaLabels;
|
|
55
55
|
/** Replace this callback when its authorization or resource context changes. Reads inside it do not trigger reloads. */
|
|
56
56
|
resolve?: (source: MarkdownMediaSource, signal: AbortSignal) => Promise<ResolvedMarkdownMedia>;
|
|
57
|
+
/** Positive finite deadline shared by resolution and HTML loading. Omit for no deadline. */
|
|
58
|
+
loadTimeoutMs?: number;
|
|
57
59
|
/** Resolve and authorize a user-activated HTML link using the source's host context. */
|
|
58
60
|
onOpenLink?: (source: MarkdownMediaSource, href: string, signal: AbortSignal) => void | Promise<void>;
|
|
59
61
|
class?: string;
|
|
@@ -1,153 +1,181 @@
|
|
|
1
|
-
import { use as
|
|
2
|
-
import { createSignal as
|
|
3
|
-
import { HtmlPreviewCanvas as
|
|
4
|
-
import { FloatingWindow as
|
|
5
|
-
import { Refresh as
|
|
6
|
-
import { cn as
|
|
7
|
-
import { safeMarkdownMediaURL as
|
|
8
|
-
import { SandboxedHtmlFrame as
|
|
9
|
-
var
|
|
10
|
-
async function
|
|
11
|
-
const
|
|
12
|
-
if (!
|
|
1
|
+
import { use as F, insert as h, createComponent as c, memo as H, effect as k, setAttribute as v, className as ne, template as g, delegateEvents as ae } from "solid-js/web";
|
|
2
|
+
import { createSignal as L, onMount as le, onCleanup as K, createMemo as ie, createEffect as oe, on as ce, Show as y, Switch as Q, Match as E } from "solid-js";
|
|
3
|
+
import { HtmlPreviewCanvas as se } from "./HtmlPreviewCanvas.js";
|
|
4
|
+
import { FloatingWindow as X } from "../../ui/FloatingWindow.js";
|
|
5
|
+
import { Refresh as de, FolderOpen as ue, Eye as Y, ExternalLink as ve } from "../../icons/index.js";
|
|
6
|
+
import { cn as he } from "../../../utils/cn.js";
|
|
7
|
+
import { safeMarkdownMediaURL as me } from "../markdown/media.js";
|
|
8
|
+
import { SandboxedHtmlFrame as Z } from "../../html-preview/SandboxedHtmlFrame.js";
|
|
9
|
+
var ge = /* @__PURE__ */ g("<div class=chat-media-preview-content><img referrerpolicy=no-referrer class=chat-media-full-image>"), fe = /* @__PURE__ */ g("<div class=chat-media-preview-content>"), we = /* @__PURE__ */ g("<span>"), be = /* @__PURE__ */ g("<span class=chat-media-placeholder role=status>"), ke = /* @__PURE__ */ g("<span class=chat-media-placeholder role=status><span></span><button type=button class=chat-media-retry>"), $e = /* @__PURE__ */ g("<button type=button class=chat-media-image-button><img class=chat-media-image loading=lazy decoding=async referrerpolicy=no-referrer>", !0, !1, !1), ye = /* @__PURE__ */ g("<video class=chat-media-video controls playsinline preload=metadata>"), Le = /* @__PURE__ */ g("<audio class=chat-media-audio controls preload=metadata>"), Se = /* @__PURE__ */ g("<span class=chat-media-viewport>"), p = /* @__PURE__ */ g("<button type=button class=chat-media-action>"), Me = /* @__PURE__ */ g("<button type=button class=chat-media-action data-chat-media-action=preview>"), Ee = /* @__PURE__ */ g("<span class=chat-media-header><span class=chat-media-heading><span class=chat-media-kind></span><span class=chat-media-title></span></span><span class=chat-media-actions>"), _e = /* @__PURE__ */ g('<a class=chat-media-action target=_blank rel="noopener noreferrer">');
|
|
10
|
+
async function Te(e) {
|
|
11
|
+
const b = me(e.src ?? "");
|
|
12
|
+
if (!b || e.kind === "html") throw new Error("A host resolver is required");
|
|
13
13
|
return {
|
|
14
|
-
src:
|
|
15
|
-
openURL:
|
|
14
|
+
src: b,
|
|
15
|
+
openURL: b
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
const
|
|
19
|
-
let
|
|
20
|
-
const [
|
|
21
|
-
|
|
18
|
+
const Fe = (e) => {
|
|
19
|
+
let b, _, I;
|
|
20
|
+
const [ee, A] = L(!1);
|
|
21
|
+
le(() => {
|
|
22
22
|
if (typeof IntersectionObserver > "u") {
|
|
23
|
-
|
|
23
|
+
A(!0);
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
|
-
const
|
|
27
|
-
|
|
26
|
+
const a = new IntersectionObserver((i) => {
|
|
27
|
+
i.some((r) => r.isIntersecting) && (A(!0), a.disconnect());
|
|
28
28
|
}, {
|
|
29
29
|
rootMargin: "400px"
|
|
30
30
|
});
|
|
31
|
-
|
|
31
|
+
a.observe(b), K(() => a.disconnect());
|
|
32
32
|
});
|
|
33
|
-
const [
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
const [f, R] = L(), [U, T] = L(), [$, z] = L("loading"), [te, D] = L(0), [P, S] = L(!1), [re, C] = L(!1), w = () => e.source.title || e.labels[e.source.kind], B = ie(() => e.source, void 0, {
|
|
34
|
+
equals: (a, i) => a.kind === i.kind && a.src === i.src && a.html === i.html && a.title === i.title
|
|
35
|
+
});
|
|
36
|
+
let x = () => {
|
|
37
|
+
};
|
|
38
|
+
const N = (a) => {
|
|
39
|
+
const i = b.ownerDocument.activeElement, r = i instanceof Element && I?.closest("[role=dialog]")?.contains(i) && _?.isConnected;
|
|
40
|
+
a(!1), r && _?.focus({
|
|
41
|
+
preventScroll: !0
|
|
42
|
+
});
|
|
43
|
+
}, W = (a) => {
|
|
44
|
+
I = a, queueMicrotask(() => {
|
|
45
|
+
a.isConnected && b.ownerDocument.activeElement === _ && a.closest('[role="dialog"]')?.focus({
|
|
46
|
+
preventScroll: !0
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}, M = () => f()?.preview?.label || (e.source.kind === "image" ? e.labels.previewImage : e.labels.previewHTMLWindow ?? "Open preview window") || e.labels.open, V = (a) => {
|
|
50
|
+
_ = a.currentTarget;
|
|
51
|
+
const i = f()?.preview;
|
|
52
|
+
i ? i.onSelect() : S(!0);
|
|
53
|
+
}, j = (a) => {
|
|
54
|
+
_ = a?.currentTarget ?? b.querySelector('[aria-haspopup="menu"]') ?? void 0;
|
|
55
|
+
const i = f()?.preview;
|
|
56
|
+
i ? i.onSelect() : C(!0);
|
|
57
|
+
}, q = () => {
|
|
58
|
+
const a = e.onOpenLink, i = B();
|
|
59
|
+
return a ? (r, t) => a(i, r, t) : void 0;
|
|
60
|
+
}, G = () => ({
|
|
45
61
|
linkUnavailable: e.labels.linkUnavailable ?? "Opening links is unavailable in this preview.",
|
|
46
62
|
anchorUnavailable: e.labels.anchorUnavailable ?? "The linked section was not found."
|
|
47
63
|
});
|
|
48
|
-
return
|
|
49
|
-
if (!
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
64
|
+
return oe(ce([ee, B, () => e.resolve, te, () => e.htmlState, () => e.loadTimeoutMs], ([a, i, r, , , t]) => {
|
|
65
|
+
if (!a) return;
|
|
66
|
+
const l = r ?? Te, n = new AbortController();
|
|
67
|
+
let u;
|
|
68
|
+
const s = () => {
|
|
69
|
+
u !== void 0 && (clearTimeout(u), u = void 0);
|
|
70
|
+
};
|
|
71
|
+
K(() => {
|
|
72
|
+
s(), n.abort();
|
|
73
|
+
}), x = () => {
|
|
74
|
+
n.signal.aborted || (s(), z("error"), S(!1), C(!1), R(void 0), T(void 0), n.abort());
|
|
75
|
+
};
|
|
76
|
+
const o = x;
|
|
77
|
+
if (R(void 0), T(void 0), z("loading"), C(!1), i.kind !== "html" && S(!1), t !== void 0 && (!Number.isFinite(t) || t <= 0)) {
|
|
78
|
+
o();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (i.kind === "html" && e.htmlState) {
|
|
82
|
+
T(i.html);
|
|
53
83
|
return;
|
|
54
84
|
}
|
|
55
|
-
(async () => {
|
|
56
|
-
if (
|
|
57
|
-
if (
|
|
58
|
-
|
|
85
|
+
t !== void 0 && (u = setTimeout(o, t)), (async () => {
|
|
86
|
+
if (i.kind === "html" && i.html !== void 0) {
|
|
87
|
+
if (i.html.length > 1e6) throw new Error("HTML preview is too large");
|
|
88
|
+
n.signal.aborted || T(i.html);
|
|
59
89
|
} else {
|
|
60
|
-
const
|
|
61
|
-
if (
|
|
62
|
-
if (
|
|
63
|
-
if (!
|
|
64
|
-
const
|
|
65
|
-
if (
|
|
66
|
-
if (
|
|
67
|
-
|
|
68
|
-
} else if (!
|
|
69
|
-
|
|
90
|
+
const d = await l(i, n.signal);
|
|
91
|
+
if (n.signal.aborted) return;
|
|
92
|
+
if (i.kind === "html") {
|
|
93
|
+
if (!d.loadHTML) throw new Error("HTML loader is required");
|
|
94
|
+
const m = await d.loadHTML(n.signal);
|
|
95
|
+
if (n.signal.aborted) return;
|
|
96
|
+
if (m.length > 1e6) throw new Error("HTML preview is too large");
|
|
97
|
+
T(m);
|
|
98
|
+
} else if (!d.src) throw new Error("Media URL is required");
|
|
99
|
+
R(d);
|
|
70
100
|
}
|
|
71
|
-
|
|
72
|
-
})().catch(()
|
|
73
|
-
t.signal.aborted || L("error");
|
|
74
|
-
});
|
|
101
|
+
n.signal.aborted || z("ready");
|
|
102
|
+
})().catch(o).finally(s);
|
|
75
103
|
})), (() => {
|
|
76
|
-
var
|
|
77
|
-
return typeof
|
|
104
|
+
var a = we(), i = b;
|
|
105
|
+
return typeof i == "function" ? F(i, a) : b = a, h(a, c(y, {
|
|
78
106
|
get when() {
|
|
79
107
|
return e.source.kind === "html";
|
|
80
108
|
},
|
|
81
109
|
get fallback() {
|
|
82
110
|
return [(() => {
|
|
83
|
-
var r =
|
|
84
|
-
return h(r,
|
|
111
|
+
var r = Se();
|
|
112
|
+
return h(r, c(Q, {
|
|
85
113
|
get children() {
|
|
86
|
-
return [
|
|
114
|
+
return [c(E, {
|
|
87
115
|
get when() {
|
|
88
116
|
return $() === "loading";
|
|
89
117
|
},
|
|
90
118
|
get children() {
|
|
91
|
-
var
|
|
92
|
-
return h(
|
|
119
|
+
var t = be();
|
|
120
|
+
return h(t, () => e.labels.loading), t;
|
|
93
121
|
}
|
|
94
|
-
}),
|
|
122
|
+
}), c(E, {
|
|
95
123
|
get when() {
|
|
96
124
|
return $() === "error";
|
|
97
125
|
},
|
|
98
126
|
get children() {
|
|
99
|
-
var
|
|
100
|
-
return h(
|
|
127
|
+
var t = ke(), l = t.firstChild, n = l.nextSibling;
|
|
128
|
+
return h(l, () => e.labels.unavailable), n.$$click = () => D((u) => u + 1), h(n, c(de, {}), null), h(n, () => e.labels.retry, null), t;
|
|
101
129
|
}
|
|
102
|
-
}),
|
|
130
|
+
}), c(E, {
|
|
103
131
|
get when() {
|
|
104
132
|
return $() === "ready";
|
|
105
133
|
},
|
|
106
134
|
get children() {
|
|
107
|
-
return
|
|
135
|
+
return c(Q, {
|
|
108
136
|
get children() {
|
|
109
|
-
return [
|
|
137
|
+
return [c(E, {
|
|
110
138
|
get when() {
|
|
111
139
|
return e.source.kind === "image";
|
|
112
140
|
},
|
|
113
141
|
get children() {
|
|
114
|
-
var
|
|
115
|
-
return
|
|
116
|
-
var
|
|
117
|
-
return
|
|
142
|
+
var t = $e(), l = t.firstChild;
|
|
143
|
+
return t.$$click = V, l.addEventListener("error", () => x()), k((n) => {
|
|
144
|
+
var u = `${M()}: ${w()}`, s = f()?.src, o = w();
|
|
145
|
+
return u !== n.e && v(t, "aria-label", n.e = u), s !== n.t && v(l, "src", n.t = s), o !== n.a && v(l, "alt", n.a = o), n;
|
|
118
146
|
}, {
|
|
119
147
|
e: void 0,
|
|
120
148
|
t: void 0,
|
|
121
149
|
a: void 0
|
|
122
|
-
}),
|
|
150
|
+
}), t;
|
|
123
151
|
}
|
|
124
|
-
}),
|
|
152
|
+
}), c(E, {
|
|
125
153
|
get when() {
|
|
126
154
|
return e.source.kind === "video";
|
|
127
155
|
},
|
|
128
156
|
get children() {
|
|
129
|
-
var
|
|
130
|
-
return
|
|
131
|
-
var
|
|
132
|
-
return
|
|
157
|
+
var t = ye();
|
|
158
|
+
return t.addEventListener("error", () => x()), k((l) => {
|
|
159
|
+
var n = f()?.src, u = w();
|
|
160
|
+
return n !== l.e && v(t, "src", l.e = n), u !== l.t && v(t, "aria-label", l.t = u), l;
|
|
133
161
|
}, {
|
|
134
162
|
e: void 0,
|
|
135
163
|
t: void 0
|
|
136
|
-
}),
|
|
164
|
+
}), t;
|
|
137
165
|
}
|
|
138
|
-
}),
|
|
166
|
+
}), c(E, {
|
|
139
167
|
get when() {
|
|
140
168
|
return e.source.kind === "audio";
|
|
141
169
|
},
|
|
142
170
|
get children() {
|
|
143
|
-
var
|
|
144
|
-
return
|
|
145
|
-
var
|
|
146
|
-
return
|
|
171
|
+
var t = Le();
|
|
172
|
+
return t.addEventListener("error", () => x()), k((l) => {
|
|
173
|
+
var n = f()?.src, u = w();
|
|
174
|
+
return n !== l.e && v(t, "src", l.e = n), u !== l.t && v(t, "aria-label", l.t = u), l;
|
|
147
175
|
}, {
|
|
148
176
|
e: void 0,
|
|
149
177
|
t: void 0
|
|
150
|
-
}),
|
|
178
|
+
}), t;
|
|
151
179
|
}
|
|
152
180
|
})];
|
|
153
181
|
}
|
|
@@ -157,109 +185,109 @@ const Re = (e) => {
|
|
|
157
185
|
}
|
|
158
186
|
})), r;
|
|
159
187
|
})(), (() => {
|
|
160
|
-
var r =
|
|
161
|
-
return h(
|
|
188
|
+
var r = Ee(), t = r.firstChild, l = t.firstChild, n = l.nextSibling, u = t.nextSibling;
|
|
189
|
+
return h(l, () => e.labels[e.source.kind]), h(n, w), h(u, c(y, {
|
|
162
190
|
get when() {
|
|
163
|
-
return
|
|
191
|
+
return H(() => $() === "ready")() && f()?.reveal;
|
|
164
192
|
},
|
|
165
|
-
children: (
|
|
166
|
-
var
|
|
167
|
-
return
|
|
168
|
-
var
|
|
169
|
-
return
|
|
193
|
+
children: (s) => (() => {
|
|
194
|
+
var o = p();
|
|
195
|
+
return o.$$click = () => s().onSelect(), h(o, c(ue, {})), k((d) => {
|
|
196
|
+
var m = s().label, O = s().label;
|
|
197
|
+
return m !== d.e && v(o, "aria-label", d.e = m), O !== d.t && v(o, "title", d.t = O), d;
|
|
170
198
|
}, {
|
|
171
199
|
e: void 0,
|
|
172
200
|
t: void 0
|
|
173
|
-
}),
|
|
201
|
+
}), o;
|
|
174
202
|
})()
|
|
175
|
-
}), null), h(
|
|
203
|
+
}), null), h(u, c(y, {
|
|
176
204
|
get when() {
|
|
177
|
-
return
|
|
205
|
+
return H(() => $() === "ready")() && e.source.kind === "image";
|
|
178
206
|
},
|
|
179
207
|
get children() {
|
|
180
|
-
var
|
|
181
|
-
return
|
|
182
|
-
var
|
|
183
|
-
return
|
|
208
|
+
var s = p();
|
|
209
|
+
return s.$$click = V, h(s, c(Y, {})), k((o) => {
|
|
210
|
+
var d = M(), m = M();
|
|
211
|
+
return d !== o.e && v(s, "aria-label", o.e = d), m !== o.t && v(s, "title", o.t = m), o;
|
|
184
212
|
}, {
|
|
185
213
|
e: void 0,
|
|
186
214
|
t: void 0
|
|
187
|
-
}),
|
|
215
|
+
}), s;
|
|
188
216
|
}
|
|
189
|
-
}), null), h(
|
|
217
|
+
}), null), h(u, c(y, {
|
|
190
218
|
get when() {
|
|
191
|
-
return
|
|
219
|
+
return H(() => $() === "ready" && e.source.kind !== "image")() && f()?.preview;
|
|
192
220
|
},
|
|
193
221
|
get children() {
|
|
194
|
-
var
|
|
195
|
-
return
|
|
196
|
-
var
|
|
197
|
-
return
|
|
222
|
+
var s = Me();
|
|
223
|
+
return s.$$click = j, h(s, c(Y, {})), k((o) => {
|
|
224
|
+
var d = M(), m = M();
|
|
225
|
+
return d !== o.e && v(s, "aria-label", o.e = d), m !== o.t && v(s, "title", o.t = m), o;
|
|
198
226
|
}, {
|
|
199
227
|
e: void 0,
|
|
200
228
|
t: void 0
|
|
201
|
-
}),
|
|
229
|
+
}), s;
|
|
202
230
|
}
|
|
203
|
-
}), null), h(
|
|
231
|
+
}), null), h(u, c(y, {
|
|
204
232
|
get when() {
|
|
205
|
-
return
|
|
233
|
+
return H(() => e.source.kind !== "image" && !f()?.reveal)() && f()?.openURL;
|
|
206
234
|
},
|
|
207
|
-
children: (
|
|
208
|
-
var
|
|
209
|
-
return h(
|
|
210
|
-
var
|
|
211
|
-
return
|
|
235
|
+
children: (s) => (() => {
|
|
236
|
+
var o = _e();
|
|
237
|
+
return h(o, c(ve, {})), k((d) => {
|
|
238
|
+
var m = s(), O = e.labels.open, J = e.labels.open;
|
|
239
|
+
return m !== d.e && v(o, "href", d.e = m), O !== d.t && v(o, "aria-label", d.t = O), J !== d.a && v(o, "title", d.a = J), d;
|
|
212
240
|
}, {
|
|
213
241
|
e: void 0,
|
|
214
242
|
t: void 0,
|
|
215
243
|
a: void 0
|
|
216
|
-
}),
|
|
244
|
+
}), o;
|
|
217
245
|
})()
|
|
218
|
-
}), null),
|
|
246
|
+
}), null), k(() => v(n, "title", w())), r;
|
|
219
247
|
})()];
|
|
220
248
|
},
|
|
221
249
|
get children() {
|
|
222
|
-
return
|
|
250
|
+
return c(se, {
|
|
223
251
|
get state() {
|
|
224
252
|
return e.htmlState ?? $();
|
|
225
253
|
},
|
|
226
254
|
get html() {
|
|
227
|
-
return
|
|
255
|
+
return U() ?? e.source.html ?? "";
|
|
228
256
|
},
|
|
229
257
|
get labels() {
|
|
230
258
|
return e.labels;
|
|
231
259
|
},
|
|
232
260
|
get expanded() {
|
|
233
|
-
return
|
|
261
|
+
return P();
|
|
234
262
|
},
|
|
235
|
-
onExpand: () =>
|
|
236
|
-
onRetry: () =>
|
|
237
|
-
onPreview: () =>
|
|
263
|
+
onExpand: () => S((r) => !r),
|
|
264
|
+
onRetry: () => D((r) => r + 1),
|
|
265
|
+
onPreview: () => j(),
|
|
238
266
|
get previewLabel() {
|
|
239
267
|
return M();
|
|
240
268
|
},
|
|
241
269
|
get resource() {
|
|
242
|
-
return
|
|
270
|
+
return f();
|
|
243
271
|
},
|
|
244
272
|
get children() {
|
|
245
|
-
return
|
|
273
|
+
return c(y, {
|
|
246
274
|
get when() {
|
|
247
|
-
return
|
|
275
|
+
return H(() => $() === "ready")() && !e.htmlState;
|
|
248
276
|
},
|
|
249
277
|
get children() {
|
|
250
|
-
return
|
|
278
|
+
return c(Z, {
|
|
251
279
|
class: "chat-media-html",
|
|
252
280
|
get title() {
|
|
253
|
-
return
|
|
281
|
+
return w();
|
|
254
282
|
},
|
|
255
283
|
get html() {
|
|
256
|
-
return
|
|
284
|
+
return U() ?? "";
|
|
257
285
|
},
|
|
258
286
|
get labels() {
|
|
259
|
-
return
|
|
287
|
+
return G();
|
|
260
288
|
},
|
|
261
289
|
get onOpenLink() {
|
|
262
|
-
return
|
|
290
|
+
return q();
|
|
263
291
|
}
|
|
264
292
|
});
|
|
265
293
|
}
|
|
@@ -267,22 +295,18 @@ const Re = (e) => {
|
|
|
267
295
|
}
|
|
268
296
|
});
|
|
269
297
|
}
|
|
270
|
-
}), null), h(
|
|
298
|
+
}), null), h(a, c(y, {
|
|
271
299
|
get when() {
|
|
272
300
|
return e.source.kind === "image";
|
|
273
301
|
},
|
|
274
302
|
get children() {
|
|
275
|
-
return
|
|
303
|
+
return c(X, {
|
|
276
304
|
get open() {
|
|
277
|
-
return
|
|
278
|
-
},
|
|
279
|
-
onOpenChange: (r) => {
|
|
280
|
-
H(r), r || O?.focus({
|
|
281
|
-
preventScroll: !0
|
|
282
|
-
});
|
|
305
|
+
return P();
|
|
283
306
|
},
|
|
307
|
+
onOpenChange: (r) => r ? S(!0) : N(S),
|
|
284
308
|
get title() {
|
|
285
|
-
return
|
|
309
|
+
return w();
|
|
286
310
|
},
|
|
287
311
|
get labels() {
|
|
288
312
|
return {
|
|
@@ -302,12 +326,10 @@ const Re = (e) => {
|
|
|
302
326
|
compactBelow: 640,
|
|
303
327
|
class: "chat-media-preview-window",
|
|
304
328
|
get children() {
|
|
305
|
-
var r =
|
|
306
|
-
return
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
var a = g()?.src, s = b();
|
|
310
|
-
return a !== t.e && u(n, "src", t.e = a), s !== t.t && u(n, "alt", t.t = s), t;
|
|
329
|
+
var r = ge(), t = r.firstChild;
|
|
330
|
+
return F(W, r), k((l) => {
|
|
331
|
+
var n = f()?.src, u = w();
|
|
332
|
+
return n !== l.e && v(t, "src", l.e = n), u !== l.t && v(t, "alt", l.t = u), l;
|
|
311
333
|
}, {
|
|
312
334
|
e: void 0,
|
|
313
335
|
t: void 0
|
|
@@ -315,22 +337,18 @@ const Re = (e) => {
|
|
|
315
337
|
}
|
|
316
338
|
});
|
|
317
339
|
}
|
|
318
|
-
}), null), h(
|
|
340
|
+
}), null), h(a, c(y, {
|
|
319
341
|
get when() {
|
|
320
342
|
return e.source.kind === "html";
|
|
321
343
|
},
|
|
322
344
|
get children() {
|
|
323
|
-
return
|
|
345
|
+
return c(X, {
|
|
324
346
|
get open() {
|
|
325
|
-
return
|
|
326
|
-
},
|
|
327
|
-
onOpenChange: (r) => {
|
|
328
|
-
U(r), r || O?.focus({
|
|
329
|
-
preventScroll: !0
|
|
330
|
-
});
|
|
347
|
+
return re();
|
|
331
348
|
},
|
|
349
|
+
onOpenChange: (r) => r ? C(!0) : N(C),
|
|
332
350
|
get title() {
|
|
333
|
-
return
|
|
351
|
+
return w();
|
|
334
352
|
},
|
|
335
353
|
get labels() {
|
|
336
354
|
return {
|
|
@@ -350,37 +368,35 @@ const Re = (e) => {
|
|
|
350
368
|
compactBelow: 640,
|
|
351
369
|
class: "chat-media-preview-window",
|
|
352
370
|
get children() {
|
|
353
|
-
var r =
|
|
354
|
-
return
|
|
355
|
-
preventScroll: !0
|
|
356
|
-
})), r), h(r, i(Q, {
|
|
371
|
+
var r = fe();
|
|
372
|
+
return F(W, r), h(r, c(Z, {
|
|
357
373
|
class: "chat-media-html",
|
|
358
374
|
get title() {
|
|
359
|
-
return
|
|
375
|
+
return w();
|
|
360
376
|
},
|
|
361
377
|
get html() {
|
|
362
|
-
return
|
|
378
|
+
return U() ?? "";
|
|
363
379
|
},
|
|
364
380
|
get labels() {
|
|
365
|
-
return
|
|
381
|
+
return G();
|
|
366
382
|
},
|
|
367
383
|
get onOpenLink() {
|
|
368
|
-
return
|
|
384
|
+
return q();
|
|
369
385
|
}
|
|
370
386
|
})), r;
|
|
371
387
|
}
|
|
372
388
|
});
|
|
373
389
|
}
|
|
374
|
-
}), null),
|
|
375
|
-
var
|
|
376
|
-
return
|
|
390
|
+
}), null), k((r) => {
|
|
391
|
+
var t = he("chat-media", P() && e.source.kind === "html" && "chat-media-expanded", e.class), l = e.source.kind;
|
|
392
|
+
return t !== r.e && ne(a, r.e = t), l !== r.t && v(a, "data-media-kind", r.t = l), r;
|
|
377
393
|
}, {
|
|
378
394
|
e: void 0,
|
|
379
395
|
t: void 0
|
|
380
|
-
}),
|
|
396
|
+
}), a;
|
|
381
397
|
})();
|
|
382
398
|
};
|
|
383
|
-
|
|
399
|
+
ae(["click"]);
|
|
384
400
|
export {
|
|
385
|
-
|
|
401
|
+
Fe as MarkdownMedia
|
|
386
402
|
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Links, Marked, Token, TokensList } from 'marked';
|
|
2
|
+
export type MarkdownBlock = Readonly<{
|
|
3
|
+
id: number;
|
|
4
|
+
start: number;
|
|
5
|
+
token: Token;
|
|
6
|
+
}>;
|
|
7
|
+
export type MarkdownBlockChange = Readonly<{
|
|
8
|
+
kind: 'replace';
|
|
9
|
+
block: MarkdownBlock;
|
|
10
|
+
}> | Readonly<{
|
|
11
|
+
kind: 'remove';
|
|
12
|
+
id: number;
|
|
13
|
+
}> | Readonly<{
|
|
14
|
+
kind: 'append_text';
|
|
15
|
+
id: number;
|
|
16
|
+
text: string;
|
|
17
|
+
code: boolean;
|
|
18
|
+
inlineIndex?: number;
|
|
19
|
+
}> | Readonly<{
|
|
20
|
+
kind: 'inline';
|
|
21
|
+
id: number;
|
|
22
|
+
from: number;
|
|
23
|
+
deleteCount: number;
|
|
24
|
+
tokens: readonly Token[];
|
|
25
|
+
}>;
|
|
26
|
+
export type MarkdownUpdate = Readonly<{
|
|
27
|
+
changes: readonly MarkdownBlockChange[];
|
|
28
|
+
links: Links;
|
|
29
|
+
sourceLength: number;
|
|
30
|
+
}>;
|
|
31
|
+
/** One append-only source, Marked semantics, and explicit changed blocks. */
|
|
32
|
+
export declare function createIncrementalMarkdownParser(markdown: Marked<string, string>): {
|
|
33
|
+
append: (delta: string) => MarkdownUpdate;
|
|
34
|
+
reset: (text?: string) => MarkdownUpdate;
|
|
35
|
+
finish: () => MarkdownUpdate;
|
|
36
|
+
snapshot: () => TokensList;
|
|
37
|
+
readonly sourceLength: number;
|
|
38
|
+
diagnostics: () => {
|
|
39
|
+
fullParses: number;
|
|
40
|
+
parsedCharacters: number;
|
|
41
|
+
blocks: number;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
function V(O) {
|
|
2
|
+
let L = 0, b = [], C = 0, I = !1, l = [], d = /* @__PURE__ */ Object.create(null), y = /* @__PURE__ */ Object.create(null), D = 1, o = 0, g, v, M = !1, S = 0, W = 0;
|
|
3
|
+
const x = /* @__PURE__ */ new Map();
|
|
4
|
+
function R(e) {
|
|
5
|
+
let t = 0, n = b.length;
|
|
6
|
+
for (; t < n; ) {
|
|
7
|
+
const s = t + n >>> 1;
|
|
8
|
+
b[s].start <= e ? t = s + 1 : n = s;
|
|
9
|
+
}
|
|
10
|
+
const r = Math.max(0, t - 1);
|
|
11
|
+
return b.slice(r).map((s, a) => a === 0 ? s.text.slice(e - s.start) : s.text).join("");
|
|
12
|
+
}
|
|
13
|
+
function F(e, t) {
|
|
14
|
+
W += e.length;
|
|
15
|
+
const n = new O.Lexer({ ...O.defaults });
|
|
16
|
+
return n.tokens.links = { ...t }, n.lex(e);
|
|
17
|
+
}
|
|
18
|
+
function m(e) {
|
|
19
|
+
return { changes: e, links: d, sourceLength: C };
|
|
20
|
+
}
|
|
21
|
+
function $(e) {
|
|
22
|
+
return { id: e.id, start: e.start, token: structuredClone(e.token) };
|
|
23
|
+
}
|
|
24
|
+
function U(e) {
|
|
25
|
+
for (const t of e.token.raw.matchAll(/\[((?:\\[^\n]|[^\]\n\\])+)\]/g)) {
|
|
26
|
+
const n = t[1].toLowerCase().replace(/\s+/g, " ");
|
|
27
|
+
e.references.add(n);
|
|
28
|
+
let r = x.get(n);
|
|
29
|
+
r || x.set(n, r = /* @__PURE__ */ new Set()), r.add(e);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function q(e) {
|
|
33
|
+
for (const t of e.references) {
|
|
34
|
+
const n = x.get(t);
|
|
35
|
+
n?.delete(e), n?.size || x.delete(t);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function E(e, t) {
|
|
39
|
+
for (const n of e)
|
|
40
|
+
if (n === `
|
|
41
|
+
`) {
|
|
42
|
+
if (t.candidate && t.count >= t.minimum) return !0;
|
|
43
|
+
t.count = 0, t.indent = 0, t.candidate = !0;
|
|
44
|
+
} else t.candidate && (n === t.mark && t.indent <= 3 ? t.count++ : n === " " && t.count === 0 && t.indent < 3 ? t.indent++ : (n !== " " && n !== " " || t.count === 0) && (t.candidate = !1));
|
|
45
|
+
return t.candidate && t.count >= t.minimum;
|
|
46
|
+
}
|
|
47
|
+
function z(e, t = 0) {
|
|
48
|
+
const n = e.tokens;
|
|
49
|
+
let r = -1;
|
|
50
|
+
for (let f = t; f < n.length; f++) {
|
|
51
|
+
const u = n[f];
|
|
52
|
+
if (u.type === "text" && /[\\\x60*_[<~]/u.test(u.raw)) {
|
|
53
|
+
r = f;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
let s = r >= 0 ? r : Math.max(t, n.length - 1);
|
|
58
|
+
s > t && n[s]?.type === "text" && !/\s/u.test(n[s].raw) && n[s - 1]?.type === "link" && s--;
|
|
59
|
+
const a = n[s];
|
|
60
|
+
if (r < 0 && a?.type === "text" && a.raw === a.text) {
|
|
61
|
+
const f = a.raw.lastIndexOf(" ");
|
|
62
|
+
if (f > 0) {
|
|
63
|
+
const u = a;
|
|
64
|
+
n.splice(
|
|
65
|
+
s,
|
|
66
|
+
1,
|
|
67
|
+
{ ...u, raw: u.raw.slice(0, f), text: u.text.slice(0, f) },
|
|
68
|
+
{ ...u, raw: u.raw.slice(f), text: u.text.slice(f) }
|
|
69
|
+
), s++;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const p = n.slice(s).map((f) => f.raw).join("");
|
|
73
|
+
v = {
|
|
74
|
+
from: s,
|
|
75
|
+
source: p,
|
|
76
|
+
unresolved: r >= 0,
|
|
77
|
+
lastChar: p.slice(-1)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function B() {
|
|
81
|
+
g = void 0, v = void 0, M = !1;
|
|
82
|
+
const e = l.at(-1)?.token;
|
|
83
|
+
if (e?.type === "paragraph") {
|
|
84
|
+
z(e);
|
|
85
|
+
const a = e.raw.lastIndexOf(`
|
|
86
|
+
`) + 1, p = e.raw.slice(a, a + 32);
|
|
87
|
+
M = !e.raw.endsWith(`
|
|
88
|
+
`) && !/^(?: {0,3}(?:[-+*_]+|[0-9]{1,9}[.)]?)[ \t]*$| {0,3}[[<\x60~#|=])/u.test(p);
|
|
89
|
+
}
|
|
90
|
+
if (e?.type !== "code") return;
|
|
91
|
+
const t = /^(\x60{3,}|~{3,})[^\n]*\n/.exec(e.raw);
|
|
92
|
+
if (!t) return;
|
|
93
|
+
const n = t[1], r = e.raw.slice(t[0].length), s = {
|
|
94
|
+
mark: n[0],
|
|
95
|
+
minimum: n.length,
|
|
96
|
+
count: 0,
|
|
97
|
+
indent: 0,
|
|
98
|
+
candidate: !0,
|
|
99
|
+
pendingNewline: r.endsWith(`
|
|
100
|
+
`)
|
|
101
|
+
};
|
|
102
|
+
E(r, s) || (g = s);
|
|
103
|
+
}
|
|
104
|
+
function _(e = !1) {
|
|
105
|
+
const t = l[o]?.start ?? 0, n = l.splice(o);
|
|
106
|
+
for (const i of n) q(i);
|
|
107
|
+
const r = F(R(t), y), s = d;
|
|
108
|
+
d = Object.freeze(
|
|
109
|
+
Object.fromEntries(
|
|
110
|
+
Object.entries(r.links).map(([i, c]) => [i, Object.freeze({ ...c })])
|
|
111
|
+
)
|
|
112
|
+
);
|
|
113
|
+
const a = [];
|
|
114
|
+
let p = t;
|
|
115
|
+
for (let i = 0; i < r.length; i++) {
|
|
116
|
+
const c = r[i], h = n[i], k = {
|
|
117
|
+
id: h?.start === p ? h.id : D++,
|
|
118
|
+
start: p,
|
|
119
|
+
token: c,
|
|
120
|
+
references: /* @__PURE__ */ new Set()
|
|
121
|
+
};
|
|
122
|
+
l.push(k), U(k), i === r.length - 1 && c.type === "paragraph" && z(c), (!e || !h || JSON.stringify(h.token) !== JSON.stringify(c)) && a.push({ kind: "replace", block: $(k) }), p += c.raw.length;
|
|
123
|
+
}
|
|
124
|
+
const f = new Set(l.slice(o).map((i) => i.id));
|
|
125
|
+
for (const i of n)
|
|
126
|
+
f.has(i.id) || a.push({ kind: "remove", id: i.id });
|
|
127
|
+
const u = /* @__PURE__ */ new Set();
|
|
128
|
+
for (const i of /* @__PURE__ */ new Set([...Object.keys(s), ...Object.keys(d)]))
|
|
129
|
+
if (!(s[i]?.href === d[i]?.href && s[i]?.title === d[i]?.title))
|
|
130
|
+
for (const c of x.get(i) ?? [])
|
|
131
|
+
c.start < t && u.add(c);
|
|
132
|
+
for (const i of u) {
|
|
133
|
+
const c = F(i.token.raw, d);
|
|
134
|
+
c.length === 1 && (i.token = c[0], a.push({ kind: "replace", block: $(i) }));
|
|
135
|
+
}
|
|
136
|
+
const N = o;
|
|
137
|
+
o = Math.max(0, l.length - 1), l[o]?.token.type === "space" ? o = Math.max(0, o - 1) : o > 0 && !l[o - 1].token.raw.endsWith(`
|
|
138
|
+
|
|
139
|
+
`) && (l[o - 1]?.token.type !== "space" ? o-- : /\n[ \t]*\n/u.test(l[o - 1].token.raw) || (o = Math.max(0, o - 2)));
|
|
140
|
+
const w = l.at(-1)?.token;
|
|
141
|
+
o > 1 && l[o - 1]?.token.type === "space" && l[o - 2]?.token.type === "list" && (w?.type === "list" || w?.type === "paragraph" && /^ {0,3}(?:[0-9]{1,9}[.)]?|[-+*])[ \t]*$/u.test(w.raw)) && (o -= 2);
|
|
142
|
+
for (let i = N; i < o; i++) {
|
|
143
|
+
const c = l[i].token;
|
|
144
|
+
c.type === "def" && !y[c.tag] && (y[c.tag] = { href: c.href, title: c.title });
|
|
145
|
+
}
|
|
146
|
+
return B(), m(a);
|
|
147
|
+
}
|
|
148
|
+
function J(e) {
|
|
149
|
+
const t = I && e.startsWith(`
|
|
150
|
+
`);
|
|
151
|
+
return I = e.endsWith("\r"), (t ? e.slice(1) : e).replace(/\r\n?/g, `
|
|
152
|
+
`);
|
|
153
|
+
}
|
|
154
|
+
function G(e) {
|
|
155
|
+
if (!e) return m([]);
|
|
156
|
+
if (C += e.length, e = J(e), !e) return m([]);
|
|
157
|
+
b.push({ start: L, text: e }), L += e.length;
|
|
158
|
+
const t = l.at(-1), n = t?.token;
|
|
159
|
+
if (t && o === l.length - 1 && n?.type === "code" && g && !e.includes("\r") && !E(e, g)) {
|
|
160
|
+
const s = (g.pendingNewline ? `
|
|
161
|
+
` : "") + (e.endsWith(`
|
|
162
|
+
`) ? e.slice(0, -1) : e);
|
|
163
|
+
return g.pendingNewline = e.endsWith(`
|
|
164
|
+
`), n.raw += e, n.text += s, m(s ? [{ kind: "append_text", id: t.id, text: s, code: !0 }] : []);
|
|
165
|
+
}
|
|
166
|
+
const r = n?.type === "paragraph" ? n : void 0;
|
|
167
|
+
if (t && o === l.length - 1 && r && v && M && !/[\n\r]/u.test(e)) {
|
|
168
|
+
const s = v, a = r.tokens.at(-1), p = a?.type === "text" && s.from === r.tokens.length - 1 && !/[\\\x60*_[\]<>~&:/.@;|="'()-]/u.test(e) && !/[\\\x60*_[\]<>~&:/.@;|="'()-]$/u.test(s.lastChar);
|
|
169
|
+
if (r.raw += e, r.text += e, p) {
|
|
170
|
+
const c = a, h = s.unresolved ? -1 : e.lastIndexOf(" "), k = h > 0 ? e.slice(0, h) : h === 0 ? "" : e, T = [], A = r.tokens.length - 1;
|
|
171
|
+
if (k && (c.raw += k, c.text += k, T.push({
|
|
172
|
+
kind: "append_text",
|
|
173
|
+
id: t.id,
|
|
174
|
+
text: k,
|
|
175
|
+
code: !1,
|
|
176
|
+
inlineIndex: A
|
|
177
|
+
})), h >= 0) {
|
|
178
|
+
const j = e.slice(h), P = { type: "text", raw: j, text: j };
|
|
179
|
+
r.tokens.push(P), T.push({
|
|
180
|
+
kind: "inline",
|
|
181
|
+
id: t.id,
|
|
182
|
+
from: A + 1,
|
|
183
|
+
deleteCount: 0,
|
|
184
|
+
tokens: [structuredClone(P)]
|
|
185
|
+
}), v = {
|
|
186
|
+
from: A + 1,
|
|
187
|
+
source: j,
|
|
188
|
+
unresolved: !1,
|
|
189
|
+
lastChar: j.slice(-1)
|
|
190
|
+
};
|
|
191
|
+
} else
|
|
192
|
+
s.source += e, s.lastChar = e.slice(-1);
|
|
193
|
+
return m(T);
|
|
194
|
+
}
|
|
195
|
+
const f = new O.Lexer({ ...O.defaults });
|
|
196
|
+
f.tokens.links = d;
|
|
197
|
+
const u = s.source + e;
|
|
198
|
+
W += u.length;
|
|
199
|
+
const N = f.inlineTokens(u), w = r.tokens.length - s.from;
|
|
200
|
+
r.tokens.splice(s.from, w, ...N), z(r, s.from);
|
|
201
|
+
const i = r.tokens.slice(s.from);
|
|
202
|
+
return m([
|
|
203
|
+
{
|
|
204
|
+
kind: "inline",
|
|
205
|
+
id: t.id,
|
|
206
|
+
from: s.from,
|
|
207
|
+
deleteCount: w,
|
|
208
|
+
tokens: structuredClone(i)
|
|
209
|
+
}
|
|
210
|
+
]);
|
|
211
|
+
}
|
|
212
|
+
return _();
|
|
213
|
+
}
|
|
214
|
+
function H(e = "") {
|
|
215
|
+
const t = l.map((s) => ({
|
|
216
|
+
kind: "remove",
|
|
217
|
+
id: s.id
|
|
218
|
+
}));
|
|
219
|
+
C = e.length, I = !1;
|
|
220
|
+
const n = J(e);
|
|
221
|
+
L = n.length, b = n ? [{ start: 0, text: n }] : [], l = [], d = /* @__PURE__ */ Object.create(null), y = /* @__PURE__ */ Object.create(null), x.clear(), o = 0, g = void 0, S++;
|
|
222
|
+
const r = _();
|
|
223
|
+
return { ...r, changes: [...t, ...r.changes] };
|
|
224
|
+
}
|
|
225
|
+
function K() {
|
|
226
|
+
const e = l.map((t) => structuredClone(t.token));
|
|
227
|
+
return e.links = { ...d }, e;
|
|
228
|
+
}
|
|
229
|
+
function Q() {
|
|
230
|
+
return S++, o = 0, y = /* @__PURE__ */ Object.create(null), _(!0);
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
append: G,
|
|
234
|
+
reset: H,
|
|
235
|
+
finish: Q,
|
|
236
|
+
snapshot: K,
|
|
237
|
+
get sourceLength() {
|
|
238
|
+
return C;
|
|
239
|
+
},
|
|
240
|
+
diagnostics: () => ({ fullParses: S, parsedCharacters: W, blocks: l.length })
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
export {
|
|
244
|
+
V as createIncrementalMarkdownParser
|
|
245
|
+
};
|
package/dist/markdown.d.ts
CHANGED
|
@@ -1 +1,3 @@
|
|
|
1
1
|
export { createMarkdownParser } from './components/chat/markdown/parser';
|
|
2
|
+
export { createIncrementalMarkdownParser } from './components/chat/markdown/incremental';
|
|
3
|
+
export type { MarkdownBlock, MarkdownBlockChange, MarkdownUpdate, } from './components/chat/markdown/incremental';
|
package/dist/markdown.js
CHANGED