@floegence/floe-webapp-core 0.86.28 → 0.86.32
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/assets/markdown.worker-CcdiAiK-.js +1303 -0
- package/dist/components/chat/blocks/MarkdownMedia.d.ts +6 -0
- package/dist/components/chat/blocks/MarkdownMedia.js +203 -129
- package/dist/components/chat/hooks/useMarkdown.js +16 -16
- package/dist/components/chat/markdown/markdown.js +9 -12
- package/dist/components/chat/markdown/parser.d.ts +3 -0
- package/dist/components/chat/markdown/parser.js +14 -0
- package/dist/components/html-preview/SandboxedHtmlFrame.d.ts +18 -0
- package/dist/components/html-preview/SandboxedHtmlFrame.js +118 -0
- package/dist/html-preview.d.ts +1 -0
- package/dist/html-preview.js +4 -0
- package/dist/markdown.d.ts +1 -0
- package/dist/markdown.js +4 -0
- package/dist/node_modules/.pnpm/marked-cjk-friendly@0.1.2_marked@17.0.6/node_modules/marked-cjk-friendly/dist/index.js +130 -0
- package/dist/styles.css +1 -1
- package/package.json +10 -1
- package/dist/assets/markdown.worker-D2sIOyGt.js +0 -1171
|
@@ -9,6 +9,10 @@ export interface MarkdownMediaLabels {
|
|
|
9
9
|
html: string;
|
|
10
10
|
/** Label for opening an HTML file in the host's file preview surface. */
|
|
11
11
|
previewHTML?: string;
|
|
12
|
+
/** Label for an independent floating preview of inline HTML. */
|
|
13
|
+
previewHTMLWindow?: string;
|
|
14
|
+
linkUnavailable?: string;
|
|
15
|
+
anchorUnavailable?: string;
|
|
12
16
|
loading: string;
|
|
13
17
|
unavailable: string;
|
|
14
18
|
retry: string;
|
|
@@ -39,6 +43,8 @@ export interface MarkdownMediaProps {
|
|
|
39
43
|
labels: MarkdownMediaLabels;
|
|
40
44
|
/** Replace this callback when its authorization or resource context changes. Reads inside it do not trigger reloads. */
|
|
41
45
|
resolve?: (source: MarkdownMediaSource, signal: AbortSignal) => Promise<ResolvedMarkdownMedia>;
|
|
46
|
+
/** Resolve and authorize a user-activated HTML link using the source's host context. */
|
|
47
|
+
onOpenLink?: (source: MarkdownMediaSource, href: string, signal: AbortSignal) => void | Promise<void>;
|
|
42
48
|
class?: string;
|
|
43
49
|
}
|
|
44
50
|
/** Stable inline media with host-owned resource resolution and an isolated HTML document. */
|
|
@@ -1,144 +1,162 @@
|
|
|
1
|
-
import { use as
|
|
2
|
-
import { createSignal as
|
|
3
|
-
import { FloatingWindow as
|
|
4
|
-
import { Refresh as
|
|
5
|
-
import { cn as
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
async
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { use as U, insert as c, createComponent as n, effect as g, setAttribute as i, memo as T, className as ee, template as m, delegateEvents as te } from "solid-js/web";
|
|
2
|
+
import { createSignal as M, onMount as re, onCleanup as V, createMemo as ae, createEffect as le, on as ne, Switch as j, Match as S, Show as k } from "solid-js";
|
|
3
|
+
import { FloatingWindow as G } from "../../ui/FloatingWindow.js";
|
|
4
|
+
import { Refresh as ie, FolderOpen as oe, Eye as J, Minus as ce, Maximize as se, ExternalLink as de } from "../../icons/index.js";
|
|
5
|
+
import { cn as ue } from "../../../utils/cn.js";
|
|
6
|
+
import { safeMarkdownMediaURL as ve } from "../markdown/media.js";
|
|
7
|
+
import { SandboxedHtmlFrame as K } from "../../html-preview/SandboxedHtmlFrame.js";
|
|
8
|
+
var he = /* @__PURE__ */ m("<span class=chat-media-placeholder role=status>"), me = /* @__PURE__ */ m("<span class=chat-media-placeholder role=status><span></span><button type=button class=chat-media-retry>"), ge = /* @__PURE__ */ m("<button type=button class=chat-media-image-button><img class=chat-media-image loading=lazy decoding=async referrerpolicy=no-referrer>", !0, !1, !1), be = /* @__PURE__ */ m("<video class=chat-media-video controls playsinline preload=metadata>"), we = /* @__PURE__ */ m("<audio class=chat-media-audio controls preload=metadata>"), I = /* @__PURE__ */ m("<button type=button class=chat-media-action>"), fe = /* @__PURE__ */ m("<button type=button class=chat-media-action data-chat-media-action=preview>"), ke = /* @__PURE__ */ m("<div class=chat-media-preview-content><img referrerpolicy=no-referrer class=chat-media-full-image>"), ye = /* @__PURE__ */ m("<div class=chat-media-preview-content>"), $e = /* @__PURE__ */ m("<span><span class=chat-media-viewport></span><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>"), Le = /* @__PURE__ */ m('<a class=chat-media-action target=_blank rel="noopener noreferrer">');
|
|
9
|
+
async function xe(a) {
|
|
10
|
+
const y = ve(a.src ?? "");
|
|
11
|
+
if (!y || a.kind === "html") throw new Error("A host resolver is required");
|
|
11
12
|
return {
|
|
12
|
-
src:
|
|
13
|
-
openURL:
|
|
13
|
+
src: y,
|
|
14
|
+
openURL: y
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
|
-
const
|
|
17
|
-
let
|
|
18
|
-
const [
|
|
19
|
-
|
|
17
|
+
const He = (a) => {
|
|
18
|
+
let y, _;
|
|
19
|
+
const [Q, A] = M(!1);
|
|
20
|
+
re(() => {
|
|
20
21
|
if (typeof IntersectionObserver > "u") {
|
|
21
|
-
|
|
22
|
+
A(!0);
|
|
22
23
|
return;
|
|
23
24
|
}
|
|
24
|
-
const
|
|
25
|
-
|
|
25
|
+
const o = new IntersectionObserver((s) => {
|
|
26
|
+
s.some((L) => L.isIntersecting) && (A(!0), o.disconnect());
|
|
26
27
|
}, {
|
|
27
28
|
rootMargin: "400px"
|
|
28
29
|
});
|
|
29
|
-
|
|
30
|
+
o.observe(y), V(() => o.disconnect());
|
|
30
31
|
});
|
|
31
|
-
const [
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
32
|
+
const [u, F] = M(), [B, z] = M(), [$, E] = M("loading"), [X, Y] = M(0), [b, H] = M(!1), [Z, R] = M(!1), v = () => a.source.title || a.labels[a.source.kind], P = ae(() => a.source), C = () => u()?.preview?.label || (a.source.kind === "image" ? a.labels.previewImage : a.labels.previewHTMLWindow ?? "Open preview window") || a.labels.open, W = (o) => {
|
|
33
|
+
_ = o.currentTarget;
|
|
34
|
+
const s = u()?.preview;
|
|
35
|
+
s ? s.onSelect() : H(!0);
|
|
36
|
+
}, p = (o) => {
|
|
37
|
+
_ = o.currentTarget;
|
|
38
|
+
const s = u()?.preview;
|
|
39
|
+
s ? s.onSelect() : R(!0);
|
|
40
|
+
}, q = () => {
|
|
41
|
+
const o = a.onOpenLink, s = P();
|
|
42
|
+
return o ? (L, O) => o(s, L, O) : void 0;
|
|
43
|
+
}, D = () => ({
|
|
44
|
+
linkUnavailable: a.labels.linkUnavailable ?? "Opening links is unavailable in this preview.",
|
|
45
|
+
anchorUnavailable: a.labels.anchorUnavailable ?? "The linked section was not found."
|
|
46
|
+
});
|
|
47
|
+
return le(ne([Q, P, () => a.resolve, X], ([o, s, L]) => {
|
|
48
|
+
if (!o) return;
|
|
49
|
+
const O = L ?? xe, h = new AbortController();
|
|
50
|
+
V(() => h.abort()), F(void 0), z(void 0), E("loading"), H(!1), R(!1), (async () => {
|
|
51
|
+
if (s.kind === "html" && s.html !== void 0) {
|
|
52
|
+
if (s.html.length > 1e6) throw new Error("HTML preview is too large");
|
|
53
|
+
h.signal.aborted || z(s.html);
|
|
43
54
|
} else {
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
if (
|
|
47
|
-
if (
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
} else if (
|
|
53
|
-
|
|
55
|
+
const x = await O(s, h.signal);
|
|
56
|
+
if (h.signal.aborted) return;
|
|
57
|
+
if (s.kind === "html") {
|
|
58
|
+
if (!x.loadHTML) throw new Error("HTML loader is required");
|
|
59
|
+
const w = await x.loadHTML(h.signal);
|
|
60
|
+
if (h.signal.aborted) return;
|
|
61
|
+
if (w.length > 1e6) throw new Error("HTML preview is too large");
|
|
62
|
+
z(w);
|
|
63
|
+
} else if (!x.src) throw new Error("Media URL is required");
|
|
64
|
+
F(x);
|
|
54
65
|
}
|
|
55
|
-
|
|
66
|
+
h.signal.aborted || E("ready");
|
|
56
67
|
})().catch(() => {
|
|
57
|
-
|
|
68
|
+
h.signal.aborted || E("error");
|
|
58
69
|
});
|
|
59
70
|
})), (() => {
|
|
60
|
-
var
|
|
61
|
-
return typeof
|
|
71
|
+
var o = $e(), s = o.firstChild, L = s.nextSibling, O = L.firstChild, h = O.firstChild, x = h.nextSibling, w = O.nextSibling, N = y;
|
|
72
|
+
return typeof N == "function" ? U(N, o) : y = o, c(s, n(j, {
|
|
62
73
|
get children() {
|
|
63
|
-
return [
|
|
74
|
+
return [n(S, {
|
|
64
75
|
get when() {
|
|
65
|
-
return
|
|
76
|
+
return $() === "loading";
|
|
66
77
|
},
|
|
67
78
|
get children() {
|
|
68
|
-
var e =
|
|
69
|
-
return
|
|
79
|
+
var e = he();
|
|
80
|
+
return c(e, () => a.labels.loading), e;
|
|
70
81
|
}
|
|
71
|
-
}),
|
|
82
|
+
}), n(S, {
|
|
72
83
|
get when() {
|
|
73
|
-
return
|
|
84
|
+
return $() === "error";
|
|
74
85
|
},
|
|
75
86
|
get children() {
|
|
76
|
-
var e =
|
|
77
|
-
return
|
|
87
|
+
var e = me(), t = e.firstChild, r = t.nextSibling;
|
|
88
|
+
return c(t, () => a.labels.unavailable), r.$$click = () => Y((l) => l + 1), c(r, n(ie, {}), null), c(r, () => a.labels.retry, null), e;
|
|
78
89
|
}
|
|
79
|
-
}),
|
|
90
|
+
}), n(S, {
|
|
80
91
|
get when() {
|
|
81
|
-
return
|
|
92
|
+
return $() === "ready";
|
|
82
93
|
},
|
|
83
94
|
get children() {
|
|
84
|
-
return
|
|
95
|
+
return n(j, {
|
|
85
96
|
get children() {
|
|
86
|
-
return [
|
|
97
|
+
return [n(S, {
|
|
87
98
|
get when() {
|
|
88
99
|
return a.source.kind === "image";
|
|
89
100
|
},
|
|
90
101
|
get children() {
|
|
91
|
-
var e =
|
|
92
|
-
return e.$$click =
|
|
93
|
-
var l = `${
|
|
94
|
-
return l !== r.e &&
|
|
102
|
+
var e = ge(), t = e.firstChild;
|
|
103
|
+
return e.$$click = W, t.addEventListener("error", () => E("error")), g((r) => {
|
|
104
|
+
var l = `${C()}: ${v()}`, d = u()?.src, f = v();
|
|
105
|
+
return l !== r.e && i(e, "aria-label", r.e = l), d !== r.t && i(t, "src", r.t = d), f !== r.a && i(t, "alt", r.a = f), r;
|
|
95
106
|
}, {
|
|
96
107
|
e: void 0,
|
|
97
108
|
t: void 0,
|
|
98
109
|
a: void 0
|
|
99
110
|
}), e;
|
|
100
111
|
}
|
|
101
|
-
}),
|
|
112
|
+
}), n(S, {
|
|
102
113
|
get when() {
|
|
103
114
|
return a.source.kind === "video";
|
|
104
115
|
},
|
|
105
116
|
get children() {
|
|
106
|
-
var e =
|
|
107
|
-
return e.addEventListener("error", () =>
|
|
108
|
-
var r =
|
|
109
|
-
return r !== t.e &&
|
|
117
|
+
var e = be();
|
|
118
|
+
return e.addEventListener("error", () => E("error")), g((t) => {
|
|
119
|
+
var r = u()?.src, l = v();
|
|
120
|
+
return r !== t.e && i(e, "src", t.e = r), l !== t.t && i(e, "aria-label", t.t = l), t;
|
|
110
121
|
}, {
|
|
111
122
|
e: void 0,
|
|
112
123
|
t: void 0
|
|
113
124
|
}), e;
|
|
114
125
|
}
|
|
115
|
-
}),
|
|
126
|
+
}), n(S, {
|
|
116
127
|
get when() {
|
|
117
128
|
return a.source.kind === "audio";
|
|
118
129
|
},
|
|
119
130
|
get children() {
|
|
120
|
-
var e =
|
|
121
|
-
return e.addEventListener("error", () =>
|
|
122
|
-
var r =
|
|
123
|
-
return r !== t.e &&
|
|
131
|
+
var e = we();
|
|
132
|
+
return e.addEventListener("error", () => E("error")), g((t) => {
|
|
133
|
+
var r = u()?.src, l = v();
|
|
134
|
+
return r !== t.e && i(e, "src", t.e = r), l !== t.t && i(e, "aria-label", t.t = l), t;
|
|
124
135
|
}, {
|
|
125
136
|
e: void 0,
|
|
126
137
|
t: void 0
|
|
127
138
|
}), e;
|
|
128
139
|
}
|
|
129
|
-
}),
|
|
140
|
+
}), n(S, {
|
|
130
141
|
get when() {
|
|
131
142
|
return a.source.kind === "html";
|
|
132
143
|
},
|
|
133
144
|
get children() {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
145
|
+
return n(K, {
|
|
146
|
+
class: "chat-media-html",
|
|
147
|
+
get title() {
|
|
148
|
+
return v();
|
|
149
|
+
},
|
|
150
|
+
get html() {
|
|
151
|
+
return B() ?? "";
|
|
152
|
+
},
|
|
153
|
+
get labels() {
|
|
154
|
+
return D();
|
|
155
|
+
},
|
|
156
|
+
get onOpenLink() {
|
|
157
|
+
return q();
|
|
158
|
+
}
|
|
159
|
+
});
|
|
142
160
|
}
|
|
143
161
|
})];
|
|
144
162
|
}
|
|
@@ -146,67 +164,67 @@ const Se = (a) => {
|
|
|
146
164
|
}
|
|
147
165
|
})];
|
|
148
166
|
}
|
|
149
|
-
})),
|
|
167
|
+
})), c(h, () => a.labels[a.source.kind]), c(x, v), c(w, n(k, {
|
|
150
168
|
get when() {
|
|
151
|
-
return
|
|
169
|
+
return T(() => $() === "ready")() && u()?.reveal;
|
|
152
170
|
},
|
|
153
171
|
children: (e) => (() => {
|
|
154
|
-
var t =
|
|
155
|
-
return t.$$click = () => e().onSelect(),
|
|
156
|
-
var l = e().label,
|
|
157
|
-
return l !== r.e &&
|
|
172
|
+
var t = I();
|
|
173
|
+
return t.$$click = () => e().onSelect(), c(t, n(oe, {})), g((r) => {
|
|
174
|
+
var l = e().label, d = e().label;
|
|
175
|
+
return l !== r.e && i(t, "aria-label", r.e = l), d !== r.t && i(t, "title", r.t = d), r;
|
|
158
176
|
}, {
|
|
159
177
|
e: void 0,
|
|
160
178
|
t: void 0
|
|
161
179
|
}), t;
|
|
162
180
|
})()
|
|
163
|
-
}), null),
|
|
181
|
+
}), null), c(w, n(k, {
|
|
164
182
|
get when() {
|
|
165
|
-
return
|
|
183
|
+
return T(() => $() === "ready")() && a.source.kind === "image";
|
|
166
184
|
},
|
|
167
185
|
get children() {
|
|
168
|
-
var e =
|
|
169
|
-
return e.$$click =
|
|
170
|
-
var r =
|
|
171
|
-
return r !== t.e &&
|
|
186
|
+
var e = I();
|
|
187
|
+
return e.$$click = W, c(e, n(J, {})), g((t) => {
|
|
188
|
+
var r = C(), l = C();
|
|
189
|
+
return r !== t.e && i(e, "aria-label", t.e = r), l !== t.t && i(e, "title", t.t = l), t;
|
|
172
190
|
}, {
|
|
173
191
|
e: void 0,
|
|
174
192
|
t: void 0
|
|
175
193
|
}), e;
|
|
176
194
|
}
|
|
177
|
-
}), null),
|
|
195
|
+
}), null), c(w, n(k, {
|
|
178
196
|
get when() {
|
|
179
|
-
return
|
|
197
|
+
return T(() => $() === "ready" && a.source.kind !== "image")() && (a.source.kind === "html" || u()?.preview);
|
|
180
198
|
},
|
|
181
199
|
get children() {
|
|
182
|
-
var e =
|
|
183
|
-
return e.$$click =
|
|
184
|
-
var r =
|
|
185
|
-
return r !== t.e &&
|
|
200
|
+
var e = fe();
|
|
201
|
+
return e.$$click = p, c(e, n(J, {})), g((t) => {
|
|
202
|
+
var r = C(), l = C();
|
|
203
|
+
return r !== t.e && i(e, "aria-label", t.e = r), l !== t.t && i(e, "title", t.t = l), t;
|
|
186
204
|
}, {
|
|
187
205
|
e: void 0,
|
|
188
206
|
t: void 0
|
|
189
207
|
}), e;
|
|
190
208
|
}
|
|
191
|
-
}), null),
|
|
209
|
+
}), null), c(w, n(k, {
|
|
192
210
|
get when() {
|
|
193
|
-
return
|
|
211
|
+
return T(() => $() === "ready")() && a.source.kind === "html";
|
|
194
212
|
},
|
|
195
213
|
get children() {
|
|
196
|
-
var e =
|
|
197
|
-
return e.$$click = () =>
|
|
214
|
+
var e = I();
|
|
215
|
+
return e.$$click = () => H(!b()), c(e, n(k, {
|
|
198
216
|
get when() {
|
|
199
217
|
return b();
|
|
200
218
|
},
|
|
201
219
|
get fallback() {
|
|
202
|
-
return
|
|
220
|
+
return n(se, {});
|
|
203
221
|
},
|
|
204
222
|
get children() {
|
|
205
|
-
return
|
|
223
|
+
return n(ce, {});
|
|
206
224
|
}
|
|
207
|
-
})),
|
|
208
|
-
var r = b() ? "collapse" : "expand", l = b() ? a.labels.collapse : a.labels.expand,
|
|
209
|
-
return r !== t.e &&
|
|
225
|
+
})), g((t) => {
|
|
226
|
+
var r = b() ? "collapse" : "expand", l = b() ? a.labels.collapse : a.labels.expand, d = b() ? a.labels.collapse : a.labels.expand, f = b();
|
|
227
|
+
return r !== t.e && i(e, "data-chat-media-action", t.e = r), l !== t.t && i(e, "aria-label", t.t = l), d !== t.a && i(e, "title", t.a = d), f !== t.o && i(e, "aria-expanded", t.o = f), t;
|
|
210
228
|
}, {
|
|
211
229
|
e: void 0,
|
|
212
230
|
t: void 0,
|
|
@@ -214,37 +232,37 @@ const Se = (a) => {
|
|
|
214
232
|
o: void 0
|
|
215
233
|
}), e;
|
|
216
234
|
}
|
|
217
|
-
}), null),
|
|
235
|
+
}), null), c(w, n(k, {
|
|
218
236
|
get when() {
|
|
219
|
-
return
|
|
237
|
+
return T(() => a.source.kind !== "image" && !u()?.reveal)() && u()?.openURL;
|
|
220
238
|
},
|
|
221
239
|
children: (e) => (() => {
|
|
222
|
-
var t =
|
|
223
|
-
return
|
|
224
|
-
var l = e(),
|
|
225
|
-
return l !== r.e &&
|
|
240
|
+
var t = Le();
|
|
241
|
+
return c(t, n(de, {})), g((r) => {
|
|
242
|
+
var l = e(), d = a.labels.open, f = a.labels.open;
|
|
243
|
+
return l !== r.e && i(t, "href", r.e = l), d !== r.t && i(t, "aria-label", r.t = d), f !== r.a && i(t, "title", r.a = f), r;
|
|
226
244
|
}, {
|
|
227
245
|
e: void 0,
|
|
228
246
|
t: void 0,
|
|
229
247
|
a: void 0
|
|
230
248
|
}), t;
|
|
231
249
|
})()
|
|
232
|
-
}), null), o
|
|
250
|
+
}), null), c(o, n(k, {
|
|
233
251
|
get when() {
|
|
234
252
|
return a.source.kind === "image";
|
|
235
253
|
},
|
|
236
254
|
get children() {
|
|
237
|
-
return
|
|
255
|
+
return n(G, {
|
|
238
256
|
get open() {
|
|
239
257
|
return b();
|
|
240
258
|
},
|
|
241
259
|
onOpenChange: (e) => {
|
|
242
|
-
|
|
260
|
+
H(e), e || _?.focus({
|
|
243
261
|
preventScroll: !0
|
|
244
262
|
});
|
|
245
263
|
},
|
|
246
264
|
get title() {
|
|
247
|
-
return
|
|
265
|
+
return v();
|
|
248
266
|
},
|
|
249
267
|
get labels() {
|
|
250
268
|
return {
|
|
@@ -264,12 +282,12 @@ const Se = (a) => {
|
|
|
264
282
|
compactBelow: 640,
|
|
265
283
|
class: "chat-media-preview-window",
|
|
266
284
|
get children() {
|
|
267
|
-
var e =
|
|
268
|
-
return
|
|
285
|
+
var e = ke(), t = e.firstChild;
|
|
286
|
+
return U((r) => queueMicrotask(() => r.closest('[role="dialog"]')?.focus({
|
|
269
287
|
preventScroll: !0
|
|
270
|
-
})), e),
|
|
271
|
-
var l =
|
|
272
|
-
return l !== r.e &&
|
|
288
|
+
})), e), g((r) => {
|
|
289
|
+
var l = u()?.src, d = v();
|
|
290
|
+
return l !== r.e && i(t, "src", r.e = l), d !== r.t && i(t, "alt", r.t = d), r;
|
|
273
291
|
}, {
|
|
274
292
|
e: void 0,
|
|
275
293
|
t: void 0
|
|
@@ -277,17 +295,73 @@ const Se = (a) => {
|
|
|
277
295
|
}
|
|
278
296
|
});
|
|
279
297
|
}
|
|
280
|
-
}), null),
|
|
281
|
-
|
|
282
|
-
|
|
298
|
+
}), null), c(o, n(k, {
|
|
299
|
+
get when() {
|
|
300
|
+
return a.source.kind === "html";
|
|
301
|
+
},
|
|
302
|
+
get children() {
|
|
303
|
+
return n(G, {
|
|
304
|
+
get open() {
|
|
305
|
+
return Z();
|
|
306
|
+
},
|
|
307
|
+
onOpenChange: (e) => {
|
|
308
|
+
R(e), e || _?.focus({
|
|
309
|
+
preventScroll: !0
|
|
310
|
+
});
|
|
311
|
+
},
|
|
312
|
+
get title() {
|
|
313
|
+
return v();
|
|
314
|
+
},
|
|
315
|
+
get labels() {
|
|
316
|
+
return {
|
|
317
|
+
close: a.labels.close,
|
|
318
|
+
maximize: a.labels.expand,
|
|
319
|
+
restore: a.labels.collapse
|
|
320
|
+
};
|
|
321
|
+
},
|
|
322
|
+
defaultSize: {
|
|
323
|
+
width: 960,
|
|
324
|
+
height: 680
|
|
325
|
+
},
|
|
326
|
+
minSize: {
|
|
327
|
+
width: 280,
|
|
328
|
+
height: 240
|
|
329
|
+
},
|
|
330
|
+
compactBelow: 640,
|
|
331
|
+
class: "chat-media-preview-window",
|
|
332
|
+
get children() {
|
|
333
|
+
var e = ye();
|
|
334
|
+
return U((t) => queueMicrotask(() => t.closest('[role="dialog"]')?.focus({
|
|
335
|
+
preventScroll: !0
|
|
336
|
+
})), e), c(e, n(K, {
|
|
337
|
+
class: "chat-media-html",
|
|
338
|
+
get title() {
|
|
339
|
+
return v();
|
|
340
|
+
},
|
|
341
|
+
get html() {
|
|
342
|
+
return B() ?? "";
|
|
343
|
+
},
|
|
344
|
+
get labels() {
|
|
345
|
+
return D();
|
|
346
|
+
},
|
|
347
|
+
get onOpenLink() {
|
|
348
|
+
return q();
|
|
349
|
+
}
|
|
350
|
+
})), e;
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}), null), g((e) => {
|
|
355
|
+
var t = ue("chat-media", b() && a.source.kind === "html" && "chat-media-expanded", a.class), r = a.source.kind, l = v();
|
|
356
|
+
return t !== e.e && ee(o, e.e = t), r !== e.t && i(o, "data-media-kind", e.t = r), l !== e.a && i(x, "title", e.a = l), e;
|
|
283
357
|
}, {
|
|
284
358
|
e: void 0,
|
|
285
359
|
t: void 0,
|
|
286
360
|
a: void 0
|
|
287
|
-
}),
|
|
361
|
+
}), o;
|
|
288
362
|
})();
|
|
289
363
|
};
|
|
290
|
-
|
|
364
|
+
te(["click"]);
|
|
291
365
|
export {
|
|
292
|
-
|
|
366
|
+
He as MarkdownMedia
|
|
293
367
|
};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { secureRandomUUID as w } from "../../../utils/secureRandom.js";
|
|
2
2
|
import { renderMarkdownToHtml as k } from "../markdown/markdown.js";
|
|
3
|
-
let n = null,
|
|
4
|
-
const
|
|
3
|
+
let n = null, c = !1, u = null;
|
|
4
|
+
const l = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), m = 200;
|
|
5
5
|
function h() {
|
|
6
6
|
if (typeof Worker > "u") return null;
|
|
7
7
|
try {
|
|
8
8
|
return new Worker(new URL(
|
|
9
9
|
/* @vite-ignore */
|
|
10
|
-
"" + new URL("../../../assets/markdown.worker-
|
|
10
|
+
"" + new URL("../../../assets/markdown.worker-CcdiAiK-.js", import.meta.url).href,
|
|
11
11
|
import.meta.url
|
|
12
12
|
), { type: "module" });
|
|
13
13
|
} catch {
|
|
@@ -15,14 +15,14 @@ function h() {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
function W(r) {
|
|
18
|
-
return n = r,
|
|
18
|
+
return n = r, c = !1, u = new Promise((t) => {
|
|
19
19
|
n.onmessage = (e) => {
|
|
20
20
|
if ("type" in e.data && e.data.type === "ready") {
|
|
21
|
-
|
|
21
|
+
c = !0, t();
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
|
-
const { id: o, html:
|
|
25
|
-
s && (
|
|
24
|
+
const { id: o, html: d, error: i } = e.data, s = l.get(o);
|
|
25
|
+
s && (l.delete(o), i ? s.reject(new Error(i)) : s.resolve(d));
|
|
26
26
|
}, n.onerror = (e) => {
|
|
27
27
|
console.error("Markdown worker error:", e);
|
|
28
28
|
};
|
|
@@ -32,35 +32,35 @@ function g() {
|
|
|
32
32
|
return !!n;
|
|
33
33
|
}
|
|
34
34
|
async function p() {
|
|
35
|
-
return n ?
|
|
35
|
+
return n ? c ? !0 : u ? (await u, !0) : !1 : !1;
|
|
36
36
|
}
|
|
37
37
|
function R(r) {
|
|
38
38
|
const t = a.get(r);
|
|
39
39
|
if (t) return t;
|
|
40
40
|
const e = k(r);
|
|
41
|
-
return
|
|
41
|
+
return f(r, e), e;
|
|
42
42
|
}
|
|
43
43
|
async function U(r) {
|
|
44
44
|
const t = a.get(r);
|
|
45
45
|
if (t) return t;
|
|
46
46
|
if (!await p() || !n) {
|
|
47
47
|
const o = k(r);
|
|
48
|
-
return
|
|
48
|
+
return f(r, o), o;
|
|
49
49
|
}
|
|
50
|
-
return new Promise((o,
|
|
50
|
+
return new Promise((o, d) => {
|
|
51
51
|
const i = w();
|
|
52
|
-
|
|
52
|
+
l.set(i, {
|
|
53
53
|
resolve: (s) => {
|
|
54
|
-
|
|
54
|
+
f(r, s), o(s);
|
|
55
55
|
},
|
|
56
|
-
reject:
|
|
56
|
+
reject: d
|
|
57
57
|
}), n.postMessage({ id: i, content: r });
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
function v() {
|
|
61
|
-
n && (n.terminate(), n = null),
|
|
61
|
+
n && (n.terminate(), n = null), c = !1, u = null, l.clear(), a.clear();
|
|
62
62
|
}
|
|
63
|
-
function
|
|
63
|
+
function f(r, t) {
|
|
64
64
|
if (a.size >= m) {
|
|
65
65
|
const e = a.keys().next().value;
|
|
66
66
|
e && a.delete(e);
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import { marked as
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
breaks: !0
|
|
5
|
-
});
|
|
6
|
-
const t = new c.Renderer();
|
|
1
|
+
import { marked as n } from "../../../node_modules/.pnpm/marked@17.0.6/node_modules/marked/lib/marked.esm.js";
|
|
2
|
+
import { createMarkdownParser as l } from "./parser.js";
|
|
3
|
+
const a = l(), t = new n.Renderer();
|
|
7
4
|
t.code = function(e) {
|
|
8
|
-
const r = e.lang || "text",
|
|
9
|
-
return `<pre class="chat-md-code-block" data-language="${r}"><code>${
|
|
5
|
+
const r = e.lang || "text", c = e.text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
6
|
+
return `<pre class="chat-md-code-block" data-language="${r}"><code>${c}</code></pre>`;
|
|
10
7
|
};
|
|
11
8
|
t.codespan = function(e) {
|
|
12
9
|
return `<code class="chat-md-inline-code">${e.text}</code>`;
|
|
@@ -22,10 +19,10 @@ t.image = function(e) {
|
|
|
22
19
|
t.blockquote = function(e) {
|
|
23
20
|
return `<blockquote class="chat-md-blockquote">${e.text}</blockquote>`;
|
|
24
21
|
};
|
|
25
|
-
|
|
26
|
-
function
|
|
27
|
-
return
|
|
22
|
+
a.use({ renderer: t });
|
|
23
|
+
function i(e) {
|
|
24
|
+
return a.parse(e, { async: !1 });
|
|
28
25
|
}
|
|
29
26
|
export {
|
|
30
|
-
|
|
27
|
+
i as renderMarkdownToHtml
|
|
31
28
|
};
|