@floegence/floe-webapp-core 0.86.27 → 0.86.31

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/chat.css CHANGED
@@ -1860,11 +1860,14 @@ pre.chat-md-code-block *::selection,
1860
1860
  .chat-media-heading { min-width: 0; }
1861
1861
  .chat-media-kind { display: none; }
1862
1862
  .chat-media-title { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .6875rem; line-height: 1.5; color: var(--muted-foreground); }
1863
- .chat-media-actions { position: absolute; top: .5rem; right: .5rem; display: flex; align-items: center; gap: .125rem; padding: .25rem; border-radius: .625rem; background: rgb(24 24 24 / .72); backdrop-filter: blur(8px); color: white; opacity: 0; transform: translateY(-2px); transition: opacity 120ms ease, transform 120ms ease; }
1863
+ .chat-media-actions { position: absolute; top: .5rem; right: .5rem; display: flex; align-items: center; gap: .2rem; padding: .25rem; border: 1px solid rgb(255 255 255 / .18); border-radius: .7rem; background: rgb(24 24 24 / .78); box-shadow: 0 .45rem 1.25rem rgb(0 0 0 / .2); backdrop-filter: blur(12px); color: white; opacity: 0; transform: translateY(-2px); transition: opacity 140ms ease, transform 140ms ease; }
1864
1864
  .chat-media-actions:empty { display: none; }
1865
1865
  .chat-media:hover .chat-media-actions, .chat-media:focus-within .chat-media-actions { opacity: 1; transform: none; }
1866
- .chat-media-action { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; border: 0; padding: 0; border-radius: .35rem; background: transparent; color: inherit; cursor: pointer; }
1867
- .chat-media-action:hover { background: rgb(255 255 255 / .16); }
1866
+ .chat-media-action { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; border: 0; padding: 0; border-radius: .45rem; background: transparent; color: inherit; cursor: pointer; transition: background 120ms ease, color 120ms ease, transform 120ms ease; }
1867
+ .chat-media-action:hover { background: rgb(255 255 255 / .16); transform: translateY(-1px); }
1868
+ .chat-media-action[data-chat-media-action="preview"] { background: rgb(255 255 255 / .12); }
1869
+ .chat-media-action[data-chat-media-action="preview"]:hover { background: var(--primary); color: var(--primary-foreground); }
1870
+ .chat-media-action[data-chat-media-action="collapse"] { background: rgb(255 255 255 / .2); }
1868
1871
  .chat-media-action svg, .chat-media-retry svg { width: .95rem; height: .95rem; }
1869
1872
  .chat-media-action:focus-visible { outline: 2px solid white; outline-offset: -2px; }
1870
1873
  .chat-media-image-button:focus-visible, .chat-media-retry:focus-visible { outline: 2px solid var(--ring); outline-offset: 3px; }
@@ -1881,6 +1884,6 @@ pre.chat-md-code-block *::selection,
1881
1884
  .chat-media-preview-content { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; min-height: 0; padding: .5rem; }
1882
1885
  .chat-media-full-image { display: block; width: 100%; height: 100%; min-height: 0; object-fit: contain; }
1883
1886
  @media (hover: none) { .chat-media-actions { opacity: 1; transform: none; } }
1884
- @media (prefers-reduced-motion: reduce) { .chat-media-actions { transition: none; } }
1887
+ @media (prefers-reduced-motion: reduce) { .chat-media-actions, .chat-media-action { transition: none; } }
1885
1888
  @media (max-width: 480px) { .chat-media[data-media-kind="html"] .chat-media-viewport, .chat-media-html { height: 18rem; } .chat-media-expanded[data-media-kind="html"] .chat-media-viewport { height: min(70vh, 48rem); } }
1886
1889
  }
@@ -7,6 +7,8 @@ export interface MarkdownMediaLabels {
7
7
  video: string;
8
8
  audio: string;
9
9
  html: string;
10
+ /** Label for opening an HTML file in the host's file preview surface. */
11
+ previewHTML?: string;
10
12
  loading: string;
11
13
  unavailable: string;
12
14
  retry: string;
@@ -21,7 +23,7 @@ export interface ResolvedMarkdownMedia {
21
23
  /** Optional host-authorized source link. */
22
24
  openURL?: string;
23
25
  loadHTML?: (signal: AbortSignal) => Promise<string>;
24
- /** Open the image in the host's existing preview surface. */
26
+ /** Open the media in the host's existing preview surface. */
25
27
  preview?: {
26
28
  label: string;
27
29
  onSelect: () => void;
@@ -1,140 +1,140 @@
1
- import { use as B, insert as o, createComponent as i, effect as u, setAttribute as n, memo as R, className as P, template as h, delegateEvents as Q } from "solid-js/web";
2
- import { createSignal as M, onMount as X, onCleanup as D, createMemo as Y, createEffect as Z, on as q, Switch as N, Match as k, Show as E } from "solid-js";
3
- import { FloatingWindow as p } from "../../ui/FloatingWindow.js";
4
- import { Refresh as ee, FolderOpen as re, Eye as te, Maximize as ae, ExternalLink as le } from "../../icons/index.js";
5
- import { cn as ne } from "../../../utils/cn.js";
6
- import { sandboxedMarkdownHtml as V, safeMarkdownMediaURL as ie } from "../markdown/media.js";
7
- var oe = /* @__PURE__ */ h("<span class=chat-media-placeholder role=status>"), se = /* @__PURE__ */ h("<span class=chat-media-placeholder role=status><span></span><button type=button class=chat-media-retry>"), ce = /* @__PURE__ */ h("<button type=button class=chat-media-image-button><img class=chat-media-image loading=lazy decoding=async referrerpolicy=no-referrer>", !0, !1, !1), de = /* @__PURE__ */ h("<video class=chat-media-video controls playsinline preload=metadata>"), ve = /* @__PURE__ */ h("<audio class=chat-media-audio controls preload=metadata>"), ue = /* @__PURE__ */ h("<iframe class=chat-media-html sandbox=allow-scripts referrerpolicy=no-referrer>"), z = /* @__PURE__ */ h("<button type=button class=chat-media-action>"), he = /* @__PURE__ */ h("<div class=chat-media-preview-content><img referrerpolicy=no-referrer class=chat-media-full-image>"), me = /* @__PURE__ */ h("<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>"), ge = /* @__PURE__ */ h('<a class=chat-media-action target=_blank rel="noopener noreferrer">');
8
- async function fe(a) {
9
- const f = ie(a.src ?? "");
10
- if (!f || a.kind === "html") throw new Error("A host resolver is required");
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");
11
11
  return {
12
- src: f,
13
- openURL: f
12
+ src: k,
13
+ openURL: k
14
14
  };
15
15
  }
16
- const Me = (a) => {
17
- let f, I;
18
- const [W, O] = M(!1);
19
- X(() => {
16
+ const Se = (a) => {
17
+ let k, I;
18
+ const [j, O] = S(!1);
19
+ Y(() => {
20
20
  if (typeof IntersectionObserver > "u") {
21
21
  O(!0);
22
22
  return;
23
23
  }
24
- const s = new IntersectionObserver((c) => {
25
- c.some((L) => L.isIntersecting) && (O(!0), s.disconnect());
24
+ const c = new IntersectionObserver((d) => {
25
+ d.some((C) => C.isIntersecting) && (O(!0), c.disconnect());
26
26
  }, {
27
27
  rootMargin: "400px"
28
28
  });
29
- s.observe(f), D(() => s.disconnect());
29
+ c.observe(k), D(() => c.disconnect());
30
30
  });
31
- const [m, U] = M(), [j, T] = M(), [y, $] = M("loading"), [G, J] = M(0), [x, C] = M(!1), g = () => a.source.title || a.labels[a.source.kind], K = Y(() => a.source), H = () => m()?.preview?.label || a.labels.previewImage || a.labels.expand, A = (s) => {
32
- I = s.currentTarget;
33
- const c = m()?.preview;
34
- c ? c.onSelect() : C(!0);
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
35
  };
36
- return Z(q([W, K, () => a.resolve, G], ([s, c, L]) => {
37
- if (!s) return;
38
- const _ = L ?? fe, v = new AbortController();
39
- D(() => v.abort()), U(void 0), T(void 0), $("loading"), C(!1), (async () => {
40
- if (c.kind === "html" && c.html !== void 0) {
41
- if (c.html.length > 1e6) throw new Error("HTML preview is too large");
42
- v.signal.aborted || T(V(c.html));
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));
43
43
  } else {
44
- const b = await _(c, v.signal);
45
- if (v.signal.aborted) return;
46
- if (c.kind === "html") {
47
- if (!b.loadHTML) throw new Error("HTML loader is required");
48
- const w = await b.loadHTML(v.signal);
49
- if (v.signal.aborted) return;
50
- if (w.length > 1e6) throw new Error("HTML preview is too large");
51
- T(V(w));
52
- } else if (!b.src) throw new Error("Media URL is required");
53
- U(b);
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($);
54
54
  }
55
- v.signal.aborted || $("ready");
55
+ u.signal.aborted || L("ready");
56
56
  })().catch(() => {
57
- v.signal.aborted || $("error");
57
+ u.signal.aborted || L("error");
58
58
  });
59
59
  })), (() => {
60
- var s = me(), c = s.firstChild, L = c.nextSibling, _ = L.firstChild, v = _.firstChild, b = v.nextSibling, w = _.nextSibling, F = f;
61
- return typeof F == "function" ? B(F, s) : f = s, o(c, i(N, {
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, {
62
62
  get children() {
63
- return [i(k, {
63
+ return [i(x, {
64
64
  get when() {
65
65
  return y() === "loading";
66
66
  },
67
67
  get children() {
68
- var e = oe();
68
+ var e = ce();
69
69
  return o(e, () => a.labels.loading), e;
70
70
  }
71
- }), i(k, {
71
+ }), i(x, {
72
72
  get when() {
73
73
  return y() === "error";
74
74
  },
75
75
  get children() {
76
- var e = se(), r = e.firstChild, t = r.nextSibling;
77
- return o(r, () => a.labels.unavailable), t.$$click = () => J((l) => l + 1), o(t, i(ee, {}), null), o(t, () => a.labels.retry, null), e;
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;
78
78
  }
79
- }), i(k, {
79
+ }), i(x, {
80
80
  get when() {
81
81
  return y() === "ready";
82
82
  },
83
83
  get children() {
84
84
  return i(N, {
85
85
  get children() {
86
- return [i(k, {
86
+ return [i(x, {
87
87
  get when() {
88
88
  return a.source.kind === "image";
89
89
  },
90
90
  get children() {
91
- var e = ce(), r = e.firstChild;
92
- return e.$$click = A, r.addEventListener("error", () => $("error")), u((t) => {
93
- var l = `${H()}: ${g()}`, d = m()?.src, S = g();
94
- return l !== t.e && n(e, "aria-label", t.e = l), d !== t.t && n(r, "src", t.t = d), S !== t.a && n(r, "alt", t.a = S), t;
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;
95
95
  }, {
96
96
  e: void 0,
97
97
  t: void 0,
98
98
  a: void 0
99
99
  }), e;
100
100
  }
101
- }), i(k, {
101
+ }), i(x, {
102
102
  get when() {
103
103
  return a.source.kind === "video";
104
104
  },
105
105
  get children() {
106
- var e = de();
107
- return e.addEventListener("error", () => $("error")), u((r) => {
108
- var t = m()?.src, l = g();
109
- return t !== r.e && n(e, "src", r.e = t), l !== r.t && n(e, "aria-label", r.t = l), r;
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;
110
110
  }, {
111
111
  e: void 0,
112
112
  t: void 0
113
113
  }), e;
114
114
  }
115
- }), i(k, {
115
+ }), i(x, {
116
116
  get when() {
117
117
  return a.source.kind === "audio";
118
118
  },
119
119
  get children() {
120
- var e = ve();
121
- return e.addEventListener("error", () => $("error")), u((r) => {
122
- var t = m()?.src, l = g();
123
- return t !== r.e && n(e, "src", r.e = t), l !== r.t && n(e, "aria-label", r.t = l), r;
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;
124
124
  }, {
125
125
  e: void 0,
126
126
  t: void 0
127
127
  }), e;
128
128
  }
129
- }), i(k, {
129
+ }), i(x, {
130
130
  get when() {
131
131
  return a.source.kind === "html";
132
132
  },
133
133
  get children() {
134
- var e = ue();
135
- return u((r) => {
136
- var t = g(), l = j();
137
- return t !== r.e && n(e, "title", r.e = t), l !== r.t && n(e, "srcdoc", r.t = l), r;
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
138
  }, {
139
139
  e: void 0,
140
140
  t: void 0
@@ -146,75 +146,100 @@ const Me = (a) => {
146
146
  }
147
147
  })];
148
148
  }
149
- })), o(v, () => a.labels[a.source.kind]), o(b, g), o(w, i(E, {
149
+ })), o(u, () => a.labels[a.source.kind]), o($, g), o(f, i(M, {
150
150
  get when() {
151
- return R(() => y() === "ready")() && m()?.reveal;
151
+ return _(() => y() === "ready")() && v()?.reveal;
152
152
  },
153
153
  children: (e) => (() => {
154
- var r = z();
155
- return r.$$click = () => e().onSelect(), o(r, i(re, {})), u((t) => {
156
- var l = e().label, d = e().label;
157
- return l !== t.e && n(r, "aria-label", t.e = l), d !== t.t && n(r, "title", t.t = d), t;
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;
158
158
  }, {
159
159
  e: void 0,
160
160
  t: void 0
161
- }), r;
161
+ }), t;
162
162
  })()
163
- }), null), o(w, i(E, {
163
+ }), null), o(f, i(M, {
164
164
  get when() {
165
- return R(() => y() === "ready")() && a.source.kind === "image";
165
+ return _(() => y() === "ready")() && a.source.kind === "image";
166
166
  },
167
167
  get children() {
168
168
  var e = z();
169
- return e.$$click = A, o(e, i(te, {})), u((r) => {
170
- var t = H(), l = H();
171
- return t !== r.e && n(e, "aria-label", r.e = t), l !== r.t && n(e, "title", r.t = l), r;
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;
172
+ }, {
173
+ e: void 0,
174
+ t: void 0
175
+ }), e;
176
+ }
177
+ }), null), o(f, i(M, {
178
+ get when() {
179
+ return _(() => !!(y() === "ready" && v()?.preview))() && a.source.kind !== "image";
180
+ },
181
+ 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;
172
186
  }, {
173
187
  e: void 0,
174
188
  t: void 0
175
189
  }), e;
176
190
  }
177
- }), null), o(w, i(E, {
191
+ }), null), o(f, i(M, {
178
192
  get when() {
179
- return R(() => y() === "ready")() && a.source.kind === "html";
193
+ return _(() => y() === "ready")() && a.source.kind === "html";
180
194
  },
181
195
  get children() {
182
196
  var e = z();
183
- return e.$$click = () => C(!x()), o(e, i(ae, {})), u((r) => {
184
- var t = x() ? a.labels.collapse : a.labels.expand, l = x() ? a.labels.collapse : a.labels.expand, d = x();
185
- return t !== r.e && n(e, "aria-label", r.e = t), l !== r.t && n(e, "title", r.t = l), d !== r.a && n(e, "aria-expanded", r.a = d), r;
197
+ return e.$$click = () => R(!b()), o(e, i(M, {
198
+ get when() {
199
+ return b();
200
+ },
201
+ get fallback() {
202
+ return i(le, {});
203
+ },
204
+ get children() {
205
+ return i(ae, {});
206
+ }
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;
186
210
  }, {
187
211
  e: void 0,
188
212
  t: void 0,
189
- a: void 0
213
+ a: void 0,
214
+ o: void 0
190
215
  }), e;
191
216
  }
192
- }), null), o(w, i(E, {
217
+ }), null), o(f, i(M, {
193
218
  get when() {
194
- return R(() => a.source.kind !== "image" && !m()?.reveal)() && m()?.openURL;
219
+ return _(() => a.source.kind !== "image" && !v()?.reveal)() && v()?.openURL;
195
220
  },
196
221
  children: (e) => (() => {
197
- var r = ge();
198
- return o(r, i(le, {})), u((t) => {
199
- var l = e(), d = a.labels.open, S = a.labels.open;
200
- return l !== t.e && n(r, "href", t.e = l), d !== t.t && n(r, "aria-label", t.t = d), S !== t.a && n(r, "title", t.a = S), t;
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;
201
226
  }, {
202
227
  e: void 0,
203
228
  t: void 0,
204
229
  a: void 0
205
- }), r;
230
+ }), t;
206
231
  })()
207
- }), null), o(s, i(E, {
232
+ }), null), o(c, i(M, {
208
233
  get when() {
209
234
  return a.source.kind === "image";
210
235
  },
211
236
  get children() {
212
- return i(p, {
237
+ return i(ee, {
213
238
  get open() {
214
- return x();
239
+ return b();
215
240
  },
216
241
  onOpenChange: (e) => {
217
- C(e), e || I?.focus({
242
+ R(e), e || I?.focus({
218
243
  preventScroll: !0
219
244
  });
220
245
  },
@@ -239,12 +264,12 @@ const Me = (a) => {
239
264
  compactBelow: 640,
240
265
  class: "chat-media-preview-window",
241
266
  get children() {
242
- var e = he(), r = e.firstChild;
243
- return B((t) => queueMicrotask(() => t.closest('[role="dialog"]')?.focus({
267
+ var e = ge(), t = e.firstChild;
268
+ return B((r) => queueMicrotask(() => r.closest('[role="dialog"]')?.focus({
244
269
  preventScroll: !0
245
- })), e), u((t) => {
246
- var l = m()?.src, d = g();
247
- return l !== t.e && n(r, "src", t.e = l), d !== t.t && n(r, "alt", t.t = d), t;
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;
248
273
  }, {
249
274
  e: void 0,
250
275
  t: void 0
@@ -252,17 +277,17 @@ const Me = (a) => {
252
277
  }
253
278
  });
254
279
  }
255
- }), null), u((e) => {
256
- var r = ne("chat-media", x() && a.source.kind === "html" && "chat-media-expanded", a.class), t = a.source.kind, l = g();
257
- return r !== e.e && P(s, e.e = r), t !== e.t && n(s, "data-media-kind", e.t = t), l !== e.a && n(b, "title", e.a = l), e;
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;
258
283
  }, {
259
284
  e: void 0,
260
285
  t: void 0,
261
286
  a: void 0
262
- }), s;
287
+ }), c;
263
288
  })();
264
289
  };
265
- Q(["click"]);
290
+ X(["click"]);
266
291
  export {
267
- Me as MarkdownMedia
292
+ Se as MarkdownMedia
268
293
  };
@@ -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;
@@ -0,0 +1,14 @@
1
+ import { Marked as a } from "../../../node_modules/.pnpm/marked@17.0.6/node_modules/marked/lib/marked.esm.js";
2
+ import i from "../../../node_modules/.pnpm/marked-cjk-friendly@0.1.2_marked@17.0.6/node_modules/marked-cjk-friendly/dist/index.js";
3
+ function u(r = {}) {
4
+ const t = i().tokenizer.emStrong;
5
+ return new a({ tokenizer: {
6
+ emStrong(n, o, s) {
7
+ const e = t.call(this, n, o, s);
8
+ return e && /^\s|\s$/u.test(e.text) ? !1 : e;
9
+ }
10
+ } }).setOptions({ gfm: !0, breaks: !0, ...r });
11
+ }
12
+ export {
13
+ u as createMarkdownParser
14
+ };
@@ -0,0 +1 @@
1
+ export { createMarkdownParser } from './components/chat/markdown/parser';
@@ -0,0 +1,4 @@
1
+ import { createMarkdownParser as a } from "./components/chat/markdown/parser.js";
2
+ export {
3
+ a as createMarkdownParser
4
+ };