@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.
@@ -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 B, insert as o, createComponent as i, effect as h, setAttribute as n, memo as _, className as Q, template as m, delegateEvents as X } from "solid-js/web";
2
- import { createSignal as S, onMount as Y, onCleanup as D, createMemo as Z, createEffect as q, on as p, Switch as N, Match as x, Show as M } from "solid-js";
3
- import { FloatingWindow as ee } from "../../ui/FloatingWindow.js";
4
- import { Refresh as te, FolderOpen as re, Eye as V, Minus as ae, Maximize as le, ExternalLink as ne } from "../../icons/index.js";
5
- import { cn as ie } from "../../../utils/cn.js";
6
- import { sandboxedMarkdownHtml as W, safeMarkdownMediaURL as oe } from "../markdown/media.js";
7
- var ce = /* @__PURE__ */ m("<span class=chat-media-placeholder role=status>"), de = /* @__PURE__ */ m("<span class=chat-media-placeholder role=status><span></span><button type=button class=chat-media-retry>"), se = /* @__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), ve = /* @__PURE__ */ m("<video class=chat-media-video controls playsinline preload=metadata>"), ue = /* @__PURE__ */ m("<audio class=chat-media-audio controls preload=metadata>"), he = /* @__PURE__ */ m("<iframe class=chat-media-html sandbox=allow-scripts referrerpolicy=no-referrer>"), z = /* @__PURE__ */ m("<button type=button class=chat-media-action>"), me = /* @__PURE__ */ m("<button type=button class=chat-media-action data-chat-media-action=preview>"), ge = /* @__PURE__ */ m("<div class=chat-media-preview-content><img referrerpolicy=no-referrer class=chat-media-full-image>"), be = /* @__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>"), fe = /* @__PURE__ */ m('<a class=chat-media-action target=_blank rel="noopener noreferrer">');
8
- async function we(a) {
9
- const k = oe(a.src ?? "");
10
- if (!k || a.kind === "html") throw new Error("A host resolver is required");
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: k,
13
- openURL: k
13
+ src: y,
14
+ openURL: y
14
15
  };
15
16
  }
16
- const Se = (a) => {
17
- let k, I;
18
- const [j, O] = S(!1);
19
- Y(() => {
17
+ const He = (a) => {
18
+ let y, _;
19
+ const [Q, A] = M(!1);
20
+ re(() => {
20
21
  if (typeof IntersectionObserver > "u") {
21
- O(!0);
22
+ A(!0);
22
23
  return;
23
24
  }
24
- const c = new IntersectionObserver((d) => {
25
- d.some((C) => C.isIntersecting) && (O(!0), c.disconnect());
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
- c.observe(k), D(() => c.disconnect());
30
+ o.observe(y), V(() => o.disconnect());
30
31
  });
31
- const [v, U] = S(), [G, H] = S(), [y, L] = S("loading"), [J, K] = S(0), [b, R] = S(!1), g = () => a.source.title || a.labels[a.source.kind], P = Z(() => a.source), E = () => v()?.preview?.label || (a.source.kind === "image" ? a.labels.previewImage : a.labels.previewHTML) || a.labels.open, A = (c) => {
32
- I = c.currentTarget;
33
- const d = v()?.preview;
34
- d ? d.onSelect() : R(!0);
35
- };
36
- return q(p([j, P, () => a.resolve, J], ([c, d, C]) => {
37
- if (!c) return;
38
- const T = C ?? we, u = new AbortController();
39
- D(() => u.abort()), U(void 0), H(void 0), L("loading"), R(!1), (async () => {
40
- if (d.kind === "html" && d.html !== void 0) {
41
- if (d.html.length > 1e6) throw new Error("HTML preview is too large");
42
- u.signal.aborted || H(W(d.html));
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 $ = await T(d, u.signal);
45
- if (u.signal.aborted) return;
46
- if (d.kind === "html") {
47
- if (!$.loadHTML) throw new Error("HTML loader is required");
48
- const f = await $.loadHTML(u.signal);
49
- if (u.signal.aborted) return;
50
- if (f.length > 1e6) throw new Error("HTML preview is too large");
51
- H(W(f));
52
- } else if (!$.src) throw new Error("Media URL is required");
53
- U($);
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
- u.signal.aborted || L("ready");
66
+ h.signal.aborted || E("ready");
56
67
  })().catch(() => {
57
- u.signal.aborted || L("error");
68
+ h.signal.aborted || E("error");
58
69
  });
59
70
  })), (() => {
60
- var c = be(), d = c.firstChild, C = d.nextSibling, T = C.firstChild, u = T.firstChild, $ = u.nextSibling, f = T.nextSibling, F = k;
61
- return typeof F == "function" ? B(F, c) : k = c, o(d, i(N, {
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 [i(x, {
74
+ return [n(S, {
64
75
  get when() {
65
- return y() === "loading";
76
+ return $() === "loading";
66
77
  },
67
78
  get children() {
68
- var e = ce();
69
- return o(e, () => a.labels.loading), e;
79
+ var e = he();
80
+ return c(e, () => a.labels.loading), e;
70
81
  }
71
- }), i(x, {
82
+ }), n(S, {
72
83
  get when() {
73
- return y() === "error";
84
+ return $() === "error";
74
85
  },
75
86
  get children() {
76
- var e = de(), t = e.firstChild, r = t.nextSibling;
77
- return o(t, () => a.labels.unavailable), r.$$click = () => K((l) => l + 1), o(r, i(te, {}), null), o(r, () => a.labels.retry, null), e;
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
- }), i(x, {
90
+ }), n(S, {
80
91
  get when() {
81
- return y() === "ready";
92
+ return $() === "ready";
82
93
  },
83
94
  get children() {
84
- return i(N, {
95
+ return n(j, {
85
96
  get children() {
86
- return [i(x, {
97
+ return [n(S, {
87
98
  get when() {
88
99
  return a.source.kind === "image";
89
100
  },
90
101
  get children() {
91
- var e = se(), t = e.firstChild;
92
- return e.$$click = A, t.addEventListener("error", () => L("error")), h((r) => {
93
- var l = `${E()}: ${g()}`, s = v()?.src, w = g();
94
- return l !== r.e && n(e, "aria-label", r.e = l), s !== r.t && n(t, "src", r.t = s), w !== r.a && n(t, "alt", r.a = w), r;
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
- }), i(x, {
112
+ }), n(S, {
102
113
  get when() {
103
114
  return a.source.kind === "video";
104
115
  },
105
116
  get children() {
106
- var e = ve();
107
- return e.addEventListener("error", () => L("error")), h((t) => {
108
- var r = v()?.src, l = g();
109
- return r !== t.e && n(e, "src", t.e = r), l !== t.t && n(e, "aria-label", t.t = l), t;
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
- }), i(x, {
126
+ }), n(S, {
116
127
  get when() {
117
128
  return a.source.kind === "audio";
118
129
  },
119
130
  get children() {
120
- var e = ue();
121
- return e.addEventListener("error", () => L("error")), h((t) => {
122
- var r = v()?.src, l = g();
123
- return r !== t.e && n(e, "src", t.e = r), l !== t.t && n(e, "aria-label", t.t = l), t;
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
- }), i(x, {
140
+ }), n(S, {
130
141
  get when() {
131
142
  return a.source.kind === "html";
132
143
  },
133
144
  get children() {
134
- var e = he();
135
- return h((t) => {
136
- var r = g(), l = G();
137
- return r !== t.e && n(e, "title", t.e = r), l !== t.t && n(e, "srcdoc", t.t = l), t;
138
- }, {
139
- e: void 0,
140
- t: void 0
141
- }), e;
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
- })), o(u, () => a.labels[a.source.kind]), o($, g), o(f, i(M, {
167
+ })), c(h, () => a.labels[a.source.kind]), c(x, v), c(w, n(k, {
150
168
  get when() {
151
- return _(() => y() === "ready")() && v()?.reveal;
169
+ return T(() => $() === "ready")() && u()?.reveal;
152
170
  },
153
171
  children: (e) => (() => {
154
- var t = z();
155
- return t.$$click = () => e().onSelect(), o(t, i(re, {})), h((r) => {
156
- var l = e().label, s = e().label;
157
- return l !== r.e && n(t, "aria-label", r.e = l), s !== r.t && n(t, "title", r.t = s), r;
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), o(f, i(M, {
181
+ }), null), c(w, n(k, {
164
182
  get when() {
165
- return _(() => y() === "ready")() && a.source.kind === "image";
183
+ return T(() => $() === "ready")() && a.source.kind === "image";
166
184
  },
167
185
  get children() {
168
- var e = z();
169
- return e.$$click = A, o(e, i(V, {})), h((t) => {
170
- var r = E(), l = E();
171
- return r !== t.e && n(e, "aria-label", t.e = r), l !== t.t && n(e, "title", t.t = l), t;
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), o(f, i(M, {
195
+ }), null), c(w, n(k, {
178
196
  get when() {
179
- return _(() => !!(y() === "ready" && v()?.preview))() && a.source.kind !== "image";
197
+ return T(() => $() === "ready" && a.source.kind !== "image")() && (a.source.kind === "html" || u()?.preview);
180
198
  },
181
199
  get children() {
182
- var e = me();
183
- return e.$$click = () => v()?.preview?.onSelect(), o(e, i(V, {})), h((t) => {
184
- var r = E(), l = E();
185
- return r !== t.e && n(e, "aria-label", t.e = r), l !== t.t && n(e, "title", t.t = l), t;
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), o(f, i(M, {
209
+ }), null), c(w, n(k, {
192
210
  get when() {
193
- return _(() => y() === "ready")() && a.source.kind === "html";
211
+ return T(() => $() === "ready")() && a.source.kind === "html";
194
212
  },
195
213
  get children() {
196
- var e = z();
197
- return e.$$click = () => R(!b()), o(e, i(M, {
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 i(le, {});
220
+ return n(se, {});
203
221
  },
204
222
  get children() {
205
- return i(ae, {});
223
+ return n(ce, {});
206
224
  }
207
- })), h((t) => {
208
- var r = b() ? "collapse" : "expand", l = b() ? a.labels.collapse : a.labels.expand, s = b() ? a.labels.collapse : a.labels.expand, w = b();
209
- return r !== t.e && n(e, "data-chat-media-action", t.e = r), l !== t.t && n(e, "aria-label", t.t = l), s !== t.a && n(e, "title", t.a = s), w !== t.o && n(e, "aria-expanded", t.o = w), t;
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), o(f, i(M, {
235
+ }), null), c(w, n(k, {
218
236
  get when() {
219
- return _(() => a.source.kind !== "image" && !v()?.reveal)() && v()?.openURL;
237
+ return T(() => a.source.kind !== "image" && !u()?.reveal)() && u()?.openURL;
220
238
  },
221
239
  children: (e) => (() => {
222
- var t = fe();
223
- return o(t, i(ne, {})), h((r) => {
224
- var l = e(), s = a.labels.open, w = a.labels.open;
225
- return l !== r.e && n(t, "href", r.e = l), s !== r.t && n(t, "aria-label", r.t = s), w !== r.a && n(t, "title", r.a = w), r;
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(c, i(M, {
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 i(ee, {
255
+ return n(G, {
238
256
  get open() {
239
257
  return b();
240
258
  },
241
259
  onOpenChange: (e) => {
242
- R(e), e || I?.focus({
260
+ H(e), e || _?.focus({
243
261
  preventScroll: !0
244
262
  });
245
263
  },
246
264
  get title() {
247
- return g();
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 = ge(), t = e.firstChild;
268
- return B((r) => queueMicrotask(() => r.closest('[role="dialog"]')?.focus({
285
+ var e = ke(), t = e.firstChild;
286
+ return U((r) => queueMicrotask(() => r.closest('[role="dialog"]')?.focus({
269
287
  preventScroll: !0
270
- })), e), h((r) => {
271
- var l = v()?.src, s = g();
272
- return l !== r.e && n(t, "src", r.e = l), s !== r.t && n(t, "alt", r.t = s), r;
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), h((e) => {
281
- var t = ie("chat-media", b() && a.source.kind === "html" && "chat-media-expanded", a.class), r = a.source.kind, l = g();
282
- return t !== e.e && Q(c, e.e = t), r !== e.t && n(c, "data-media-kind", e.t = r), l !== e.a && n($, "title", e.a = l), e;
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
- }), c;
361
+ }), o;
288
362
  })();
289
363
  };
290
- X(["click"]);
364
+ te(["click"]);
291
365
  export {
292
- Se as MarkdownMedia
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, l = !1, u = null;
4
- const c = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), m = 200;
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-D2sIOyGt.js", import.meta.url).href,
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, l = !1, u = new Promise((t) => {
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
- l = !0, t();
21
+ c = !0, t();
22
22
  return;
23
23
  }
24
- const { id: o, html: f, error: i } = e.data, s = c.get(o);
25
- s && (c.delete(o), i ? s.reject(new Error(i)) : s.resolve(f));
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 ? l ? !0 : u ? (await u, !0) : !1 : !1;
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 d(r, e), e;
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 d(r, o), o;
48
+ return f(r, o), o;
49
49
  }
50
- return new Promise((o, f) => {
50
+ return new Promise((o, d) => {
51
51
  const i = w();
52
- c.set(i, {
52
+ l.set(i, {
53
53
  resolve: (s) => {
54
- d(r, s), o(s);
54
+ f(r, s), o(s);
55
55
  },
56
- reject: f
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), l = !1, u = null, c.clear(), a.clear();
61
+ n && (n.terminate(), n = null), c = !1, u = null, l.clear(), a.clear();
62
62
  }
63
- function d(r, t) {
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 c } from "../../../node_modules/.pnpm/marked@17.0.6/node_modules/marked/lib/marked.esm.js";
2
- c.setOptions({
3
- gfm: !0,
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", a = e.text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
9
- return `<pre class="chat-md-code-block" data-language="${r}"><code>${a}</code></pre>`;
5
+ const r = e.lang || "text", c = e.text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
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
- c.use({ renderer: t });
26
- function l(e) {
27
- return c.parse(e, { async: !1 });
22
+ a.use({ renderer: t });
23
+ function i(e) {
24
+ return a.parse(e, { async: !1 });
28
25
  }
29
26
  export {
30
- l as renderMarkdownToHtml
27
+ i as renderMarkdownToHtml
31
28
  };
@@ -0,0 +1,3 @@
1
+ import { Marked, type MarkedOptions } from 'marked';
2
+ /** Create an isolated GFM parser with CJK-aware emphasis boundaries. */
3
+ export declare function createMarkdownParser(options?: MarkedOptions): Marked;