@floegence/floe-webapp-core 0.86.31 → 0.86.33
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 +36 -0
- package/dist/components/chat/blocks/HtmlPreviewCanvas.d.ts +16 -0
- package/dist/components/chat/blocks/HtmlPreviewCanvas.js +153 -0
- package/dist/components/chat/blocks/MarkdownMedia.d.ts +17 -0
- package/dist/components/chat/blocks/MarkdownMedia.js +309 -216
- 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/styles.css +1 -1
- package/package.json +5 -1
|
@@ -1,256 +1,342 @@
|
|
|
1
|
-
import { use as
|
|
2
|
-
import { createSignal as S, onMount as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { use as z, insert as h, createComponent as i, memo as E, effect as f, setAttribute as u, className as p, template as m, delegateEvents as ee } from "solid-js/web";
|
|
2
|
+
import { createSignal as S, onMount as te, onCleanup as j, createMemo as re, createEffect as ne, on as ae, Show as y, Switch as G, Match as _ } from "solid-js";
|
|
3
|
+
import { HtmlPreviewCanvas as le } from "./HtmlPreviewCanvas.js";
|
|
4
|
+
import { FloatingWindow as J } from "../../ui/FloatingWindow.js";
|
|
5
|
+
import { Refresh as ie, FolderOpen as oe, Eye as K, ExternalLink as ce } from "../../icons/index.js";
|
|
6
|
+
import { cn as se } from "../../../utils/cn.js";
|
|
7
|
+
import { safeMarkdownMediaURL as de } from "../markdown/media.js";
|
|
8
|
+
import { SandboxedHtmlFrame as Q } from "../../html-preview/SandboxedHtmlFrame.js";
|
|
9
|
+
var ue = /* @__PURE__ */ m("<div class=chat-media-preview-content><img referrerpolicy=no-referrer class=chat-media-full-image>"), ve = /* @__PURE__ */ m("<div class=chat-media-preview-content>"), he = /* @__PURE__ */ m("<span>"), me = /* @__PURE__ */ m("<span class=chat-media-placeholder role=status>"), ge = /* @__PURE__ */ m("<span class=chat-media-placeholder role=status><span></span><button type=button class=chat-media-retry>"), be = /* @__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), we = /* @__PURE__ */ m("<video class=chat-media-video controls playsinline preload=metadata>"), fe = /* @__PURE__ */ m("<audio class=chat-media-audio controls preload=metadata>"), ke = /* @__PURE__ */ m("<span class=chat-media-viewport>"), X = /* @__PURE__ */ m("<button type=button class=chat-media-action>"), $e = /* @__PURE__ */ m("<button type=button class=chat-media-action data-chat-media-action=preview>"), ye = /* @__PURE__ */ m("<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>"), Se = /* @__PURE__ */ m('<a class=chat-media-action target=_blank rel="noopener noreferrer">');
|
|
10
|
+
async function Le(e) {
|
|
11
|
+
const k = de(e.src ?? "");
|
|
12
|
+
if (!k || e.kind === "html") throw new Error("A host resolver is required");
|
|
11
13
|
return {
|
|
12
14
|
src: k,
|
|
13
15
|
openURL: k
|
|
14
16
|
};
|
|
15
17
|
}
|
|
16
|
-
const
|
|
17
|
-
let k,
|
|
18
|
-
const [
|
|
19
|
-
|
|
18
|
+
const Re = (e) => {
|
|
19
|
+
let k, O;
|
|
20
|
+
const [Y, I] = S(!1);
|
|
21
|
+
te(() => {
|
|
20
22
|
if (typeof IntersectionObserver > "u") {
|
|
21
|
-
|
|
23
|
+
I(!0);
|
|
22
24
|
return;
|
|
23
25
|
}
|
|
24
|
-
const c = new IntersectionObserver((
|
|
25
|
-
|
|
26
|
+
const c = new IntersectionObserver((o) => {
|
|
27
|
+
o.some((r) => r.isIntersecting) && (I(!0), c.disconnect());
|
|
26
28
|
}, {
|
|
27
29
|
rootMargin: "400px"
|
|
28
30
|
});
|
|
29
|
-
c.observe(k),
|
|
31
|
+
c.observe(k), j(() => c.disconnect());
|
|
30
32
|
});
|
|
31
|
-
const [
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
33
|
+
const [g, P] = S(), [T, C] = S(), [$, L] = S("loading"), [Z, A] = S(0), [R, H] = S(!1), [q, U] = S(!1), b = () => e.source.title || e.labels[e.source.kind], F = re(() => e.source), M = () => g()?.preview?.label || (e.source.kind === "image" ? e.labels.previewImage : e.labels.previewHTMLWindow ?? "Open preview window") || e.labels.open, B = (c) => {
|
|
34
|
+
O = c.currentTarget;
|
|
35
|
+
const o = g()?.preview;
|
|
36
|
+
o ? o.onSelect() : H(!0);
|
|
37
|
+
}, W = (c) => {
|
|
38
|
+
O = c?.currentTarget ?? k.querySelector('[aria-haspopup="menu"]') ?? void 0;
|
|
39
|
+
const o = g()?.preview;
|
|
40
|
+
o ? o.onSelect() : U(!0);
|
|
41
|
+
}, D = () => {
|
|
42
|
+
const c = e.onOpenLink, o = F();
|
|
43
|
+
return c ? (r, n) => c(o, r, n) : void 0;
|
|
44
|
+
}, N = () => ({
|
|
45
|
+
linkUnavailable: e.labels.linkUnavailable ?? "Opening links is unavailable in this preview.",
|
|
46
|
+
anchorUnavailable: e.labels.anchorUnavailable ?? "The linked section was not found."
|
|
47
|
+
});
|
|
48
|
+
return ne(ae([Y, F, () => e.resolve, Z, () => e.htmlState], ([c, o, r]) => {
|
|
37
49
|
if (!c) return;
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
50
|
+
const n = r ?? Le, t = new AbortController();
|
|
51
|
+
if (j(() => t.abort()), P(void 0), C(void 0), L("loading"), U(!1), o.kind !== "html" && H(!1), o.kind === "html" && e.htmlState) {
|
|
52
|
+
C(o.html);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
(async () => {
|
|
56
|
+
if (o.kind === "html" && o.html !== void 0) {
|
|
57
|
+
if (o.html.length > 1e6) throw new Error("HTML preview is too large");
|
|
58
|
+
t.signal.aborted || C(o.html);
|
|
43
59
|
} else {
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
if (
|
|
47
|
-
if (
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
} else if (
|
|
53
|
-
|
|
60
|
+
const a = await n(o, t.signal);
|
|
61
|
+
if (t.signal.aborted) return;
|
|
62
|
+
if (o.kind === "html") {
|
|
63
|
+
if (!a.loadHTML) throw new Error("HTML loader is required");
|
|
64
|
+
const s = await a.loadHTML(t.signal);
|
|
65
|
+
if (t.signal.aborted) return;
|
|
66
|
+
if (s.length > 1e6) throw new Error("HTML preview is too large");
|
|
67
|
+
C(s);
|
|
68
|
+
} else if (!a.src) throw new Error("Media URL is required");
|
|
69
|
+
P(a);
|
|
54
70
|
}
|
|
55
|
-
|
|
71
|
+
t.signal.aborted || L("ready");
|
|
56
72
|
})().catch(() => {
|
|
57
|
-
|
|
73
|
+
t.signal.aborted || L("error");
|
|
58
74
|
});
|
|
59
75
|
})), (() => {
|
|
60
|
-
var c =
|
|
61
|
-
return typeof
|
|
76
|
+
var c = he(), o = k;
|
|
77
|
+
return typeof o == "function" ? z(o, c) : k = c, h(c, i(y, {
|
|
78
|
+
get when() {
|
|
79
|
+
return e.source.kind === "html";
|
|
80
|
+
},
|
|
81
|
+
get fallback() {
|
|
82
|
+
return [(() => {
|
|
83
|
+
var r = ke();
|
|
84
|
+
return h(r, i(G, {
|
|
85
|
+
get children() {
|
|
86
|
+
return [i(_, {
|
|
87
|
+
get when() {
|
|
88
|
+
return $() === "loading";
|
|
89
|
+
},
|
|
90
|
+
get children() {
|
|
91
|
+
var n = me();
|
|
92
|
+
return h(n, () => e.labels.loading), n;
|
|
93
|
+
}
|
|
94
|
+
}), i(_, {
|
|
95
|
+
get when() {
|
|
96
|
+
return $() === "error";
|
|
97
|
+
},
|
|
98
|
+
get children() {
|
|
99
|
+
var n = ge(), t = n.firstChild, a = t.nextSibling;
|
|
100
|
+
return h(t, () => e.labels.unavailable), a.$$click = () => A((s) => s + 1), h(a, i(ie, {}), null), h(a, () => e.labels.retry, null), n;
|
|
101
|
+
}
|
|
102
|
+
}), i(_, {
|
|
103
|
+
get when() {
|
|
104
|
+
return $() === "ready";
|
|
105
|
+
},
|
|
106
|
+
get children() {
|
|
107
|
+
return i(G, {
|
|
108
|
+
get children() {
|
|
109
|
+
return [i(_, {
|
|
110
|
+
get when() {
|
|
111
|
+
return e.source.kind === "image";
|
|
112
|
+
},
|
|
113
|
+
get children() {
|
|
114
|
+
var n = be(), t = n.firstChild;
|
|
115
|
+
return n.$$click = B, t.addEventListener("error", () => L("error")), f((a) => {
|
|
116
|
+
var s = `${M()}: ${b()}`, d = g()?.src, l = b();
|
|
117
|
+
return s !== a.e && u(n, "aria-label", a.e = s), d !== a.t && u(t, "src", a.t = d), l !== a.a && u(t, "alt", a.a = l), a;
|
|
118
|
+
}, {
|
|
119
|
+
e: void 0,
|
|
120
|
+
t: void 0,
|
|
121
|
+
a: void 0
|
|
122
|
+
}), n;
|
|
123
|
+
}
|
|
124
|
+
}), i(_, {
|
|
125
|
+
get when() {
|
|
126
|
+
return e.source.kind === "video";
|
|
127
|
+
},
|
|
128
|
+
get children() {
|
|
129
|
+
var n = we();
|
|
130
|
+
return n.addEventListener("error", () => L("error")), f((t) => {
|
|
131
|
+
var a = g()?.src, s = b();
|
|
132
|
+
return a !== t.e && u(n, "src", t.e = a), s !== t.t && u(n, "aria-label", t.t = s), t;
|
|
133
|
+
}, {
|
|
134
|
+
e: void 0,
|
|
135
|
+
t: void 0
|
|
136
|
+
}), n;
|
|
137
|
+
}
|
|
138
|
+
}), i(_, {
|
|
139
|
+
get when() {
|
|
140
|
+
return e.source.kind === "audio";
|
|
141
|
+
},
|
|
142
|
+
get children() {
|
|
143
|
+
var n = fe();
|
|
144
|
+
return n.addEventListener("error", () => L("error")), f((t) => {
|
|
145
|
+
var a = g()?.src, s = b();
|
|
146
|
+
return a !== t.e && u(n, "src", t.e = a), s !== t.t && u(n, "aria-label", t.t = s), t;
|
|
147
|
+
}, {
|
|
148
|
+
e: void 0,
|
|
149
|
+
t: void 0
|
|
150
|
+
}), n;
|
|
151
|
+
}
|
|
152
|
+
})];
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
})];
|
|
157
|
+
}
|
|
158
|
+
})), r;
|
|
159
|
+
})(), (() => {
|
|
160
|
+
var r = ye(), n = r.firstChild, t = n.firstChild, a = t.nextSibling, s = n.nextSibling;
|
|
161
|
+
return h(t, () => e.labels[e.source.kind]), h(a, b), h(s, i(y, {
|
|
162
|
+
get when() {
|
|
163
|
+
return E(() => $() === "ready")() && g()?.reveal;
|
|
164
|
+
},
|
|
165
|
+
children: (d) => (() => {
|
|
166
|
+
var l = X();
|
|
167
|
+
return l.$$click = () => d().onSelect(), h(l, i(oe, {})), f((v) => {
|
|
168
|
+
var w = d().label, x = d().label;
|
|
169
|
+
return w !== v.e && u(l, "aria-label", v.e = w), x !== v.t && u(l, "title", v.t = x), v;
|
|
170
|
+
}, {
|
|
171
|
+
e: void 0,
|
|
172
|
+
t: void 0
|
|
173
|
+
}), l;
|
|
174
|
+
})()
|
|
175
|
+
}), null), h(s, i(y, {
|
|
176
|
+
get when() {
|
|
177
|
+
return E(() => $() === "ready")() && e.source.kind === "image";
|
|
178
|
+
},
|
|
179
|
+
get children() {
|
|
180
|
+
var d = X();
|
|
181
|
+
return d.$$click = B, h(d, i(K, {})), f((l) => {
|
|
182
|
+
var v = M(), w = M();
|
|
183
|
+
return v !== l.e && u(d, "aria-label", l.e = v), w !== l.t && u(d, "title", l.t = w), l;
|
|
184
|
+
}, {
|
|
185
|
+
e: void 0,
|
|
186
|
+
t: void 0
|
|
187
|
+
}), d;
|
|
188
|
+
}
|
|
189
|
+
}), null), h(s, i(y, {
|
|
190
|
+
get when() {
|
|
191
|
+
return E(() => $() === "ready" && e.source.kind !== "image")() && g()?.preview;
|
|
192
|
+
},
|
|
193
|
+
get children() {
|
|
194
|
+
var d = $e();
|
|
195
|
+
return d.$$click = W, h(d, i(K, {})), f((l) => {
|
|
196
|
+
var v = M(), w = M();
|
|
197
|
+
return v !== l.e && u(d, "aria-label", l.e = v), w !== l.t && u(d, "title", l.t = w), l;
|
|
198
|
+
}, {
|
|
199
|
+
e: void 0,
|
|
200
|
+
t: void 0
|
|
201
|
+
}), d;
|
|
202
|
+
}
|
|
203
|
+
}), null), h(s, i(y, {
|
|
204
|
+
get when() {
|
|
205
|
+
return E(() => e.source.kind !== "image" && !g()?.reveal)() && g()?.openURL;
|
|
206
|
+
},
|
|
207
|
+
children: (d) => (() => {
|
|
208
|
+
var l = Se();
|
|
209
|
+
return h(l, i(ce, {})), f((v) => {
|
|
210
|
+
var w = d(), x = e.labels.open, V = e.labels.open;
|
|
211
|
+
return w !== v.e && u(l, "href", v.e = w), x !== v.t && u(l, "aria-label", v.t = x), V !== v.a && u(l, "title", v.a = V), v;
|
|
212
|
+
}, {
|
|
213
|
+
e: void 0,
|
|
214
|
+
t: void 0,
|
|
215
|
+
a: void 0
|
|
216
|
+
}), l;
|
|
217
|
+
})()
|
|
218
|
+
}), null), f(() => u(a, "title", b())), r;
|
|
219
|
+
})()];
|
|
220
|
+
},
|
|
62
221
|
get children() {
|
|
63
|
-
return
|
|
64
|
-
get
|
|
65
|
-
return
|
|
222
|
+
return i(le, {
|
|
223
|
+
get state() {
|
|
224
|
+
return e.htmlState ?? $();
|
|
66
225
|
},
|
|
67
|
-
get
|
|
68
|
-
|
|
69
|
-
return o(e, () => a.labels.loading), e;
|
|
70
|
-
}
|
|
71
|
-
}), i(x, {
|
|
72
|
-
get when() {
|
|
73
|
-
return y() === "error";
|
|
226
|
+
get html() {
|
|
227
|
+
return T() ?? e.source.html ?? "";
|
|
74
228
|
},
|
|
75
|
-
get
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
229
|
+
get labels() {
|
|
230
|
+
return e.labels;
|
|
231
|
+
},
|
|
232
|
+
get expanded() {
|
|
233
|
+
return R();
|
|
234
|
+
},
|
|
235
|
+
onExpand: () => H((r) => !r),
|
|
236
|
+
onRetry: () => A((r) => r + 1),
|
|
237
|
+
onPreview: () => W(),
|
|
238
|
+
get previewLabel() {
|
|
239
|
+
return M();
|
|
240
|
+
},
|
|
241
|
+
get resource() {
|
|
242
|
+
return g();
|
|
82
243
|
},
|
|
83
244
|
get children() {
|
|
84
|
-
return i(
|
|
245
|
+
return i(y, {
|
|
246
|
+
get when() {
|
|
247
|
+
return E(() => $() === "ready")() && !e.htmlState;
|
|
248
|
+
},
|
|
85
249
|
get children() {
|
|
86
|
-
return
|
|
87
|
-
|
|
88
|
-
|
|
250
|
+
return i(Q, {
|
|
251
|
+
class: "chat-media-html",
|
|
252
|
+
get title() {
|
|
253
|
+
return b();
|
|
89
254
|
},
|
|
90
|
-
get
|
|
91
|
-
|
|
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
|
-
}, {
|
|
96
|
-
e: void 0,
|
|
97
|
-
t: void 0,
|
|
98
|
-
a: void 0
|
|
99
|
-
}), e;
|
|
100
|
-
}
|
|
101
|
-
}), i(x, {
|
|
102
|
-
get when() {
|
|
103
|
-
return a.source.kind === "video";
|
|
104
|
-
},
|
|
105
|
-
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;
|
|
110
|
-
}, {
|
|
111
|
-
e: void 0,
|
|
112
|
-
t: void 0
|
|
113
|
-
}), e;
|
|
114
|
-
}
|
|
115
|
-
}), i(x, {
|
|
116
|
-
get when() {
|
|
117
|
-
return a.source.kind === "audio";
|
|
255
|
+
get html() {
|
|
256
|
+
return T() ?? "";
|
|
118
257
|
},
|
|
119
|
-
get
|
|
120
|
-
|
|
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
|
-
}, {
|
|
125
|
-
e: void 0,
|
|
126
|
-
t: void 0
|
|
127
|
-
}), e;
|
|
128
|
-
}
|
|
129
|
-
}), i(x, {
|
|
130
|
-
get when() {
|
|
131
|
-
return a.source.kind === "html";
|
|
258
|
+
get labels() {
|
|
259
|
+
return N();
|
|
132
260
|
},
|
|
133
|
-
get
|
|
134
|
-
|
|
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;
|
|
261
|
+
get onOpenLink() {
|
|
262
|
+
return D();
|
|
142
263
|
}
|
|
143
|
-
})
|
|
264
|
+
});
|
|
144
265
|
}
|
|
145
266
|
});
|
|
146
267
|
}
|
|
147
|
-
})
|
|
148
|
-
}
|
|
149
|
-
})), o(u, () => a.labels[a.source.kind]), o($, g), o(f, i(M, {
|
|
150
|
-
get when() {
|
|
151
|
-
return _(() => y() === "ready")() && v()?.reveal;
|
|
152
|
-
},
|
|
153
|
-
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;
|
|
158
|
-
}, {
|
|
159
|
-
e: void 0,
|
|
160
|
-
t: void 0
|
|
161
|
-
}), t;
|
|
162
|
-
})()
|
|
163
|
-
}), null), o(f, i(M, {
|
|
164
|
-
get when() {
|
|
165
|
-
return _(() => y() === "ready")() && a.source.kind === "image";
|
|
166
|
-
},
|
|
167
|
-
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;
|
|
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;
|
|
186
|
-
}, {
|
|
187
|
-
e: void 0,
|
|
188
|
-
t: void 0
|
|
189
|
-
}), e;
|
|
268
|
+
});
|
|
190
269
|
}
|
|
191
|
-
}), null),
|
|
270
|
+
}), null), h(c, i(y, {
|
|
192
271
|
get when() {
|
|
193
|
-
return
|
|
272
|
+
return e.source.kind === "image";
|
|
194
273
|
},
|
|
195
274
|
get children() {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
275
|
+
return i(J, {
|
|
276
|
+
get open() {
|
|
277
|
+
return R();
|
|
278
|
+
},
|
|
279
|
+
onOpenChange: (r) => {
|
|
280
|
+
H(r), r || O?.focus({
|
|
281
|
+
preventScroll: !0
|
|
282
|
+
});
|
|
283
|
+
},
|
|
284
|
+
get title() {
|
|
199
285
|
return b();
|
|
200
286
|
},
|
|
201
|
-
get
|
|
202
|
-
return
|
|
287
|
+
get labels() {
|
|
288
|
+
return {
|
|
289
|
+
close: e.labels.close,
|
|
290
|
+
maximize: e.labels.expand,
|
|
291
|
+
restore: e.labels.collapse
|
|
292
|
+
};
|
|
293
|
+
},
|
|
294
|
+
defaultSize: {
|
|
295
|
+
width: 960,
|
|
296
|
+
height: 680
|
|
297
|
+
},
|
|
298
|
+
minSize: {
|
|
299
|
+
width: 280,
|
|
300
|
+
height: 240
|
|
203
301
|
},
|
|
302
|
+
compactBelow: 640,
|
|
303
|
+
class: "chat-media-preview-window",
|
|
204
304
|
get children() {
|
|
205
|
-
|
|
305
|
+
var r = ue(), n = r.firstChild;
|
|
306
|
+
return z((t) => queueMicrotask(() => t.closest('[role="dialog"]')?.focus({
|
|
307
|
+
preventScroll: !0
|
|
308
|
+
})), r), f((t) => {
|
|
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;
|
|
311
|
+
}, {
|
|
312
|
+
e: void 0,
|
|
313
|
+
t: void 0
|
|
314
|
+
}), r;
|
|
206
315
|
}
|
|
207
|
-
})
|
|
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;
|
|
210
|
-
}, {
|
|
211
|
-
e: void 0,
|
|
212
|
-
t: void 0,
|
|
213
|
-
a: void 0,
|
|
214
|
-
o: void 0
|
|
215
|
-
}), e;
|
|
316
|
+
});
|
|
216
317
|
}
|
|
217
|
-
}), null),
|
|
218
|
-
get when() {
|
|
219
|
-
return _(() => a.source.kind !== "image" && !v()?.reveal)() && v()?.openURL;
|
|
220
|
-
},
|
|
221
|
-
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;
|
|
226
|
-
}, {
|
|
227
|
-
e: void 0,
|
|
228
|
-
t: void 0,
|
|
229
|
-
a: void 0
|
|
230
|
-
}), t;
|
|
231
|
-
})()
|
|
232
|
-
}), null), o(c, i(M, {
|
|
318
|
+
}), null), h(c, i(y, {
|
|
233
319
|
get when() {
|
|
234
|
-
return
|
|
320
|
+
return e.source.kind === "html";
|
|
235
321
|
},
|
|
236
322
|
get children() {
|
|
237
|
-
return i(
|
|
323
|
+
return i(J, {
|
|
238
324
|
get open() {
|
|
239
|
-
return
|
|
325
|
+
return q();
|
|
240
326
|
},
|
|
241
|
-
onOpenChange: (
|
|
242
|
-
|
|
327
|
+
onOpenChange: (r) => {
|
|
328
|
+
U(r), r || O?.focus({
|
|
243
329
|
preventScroll: !0
|
|
244
330
|
});
|
|
245
331
|
},
|
|
246
332
|
get title() {
|
|
247
|
-
return
|
|
333
|
+
return b();
|
|
248
334
|
},
|
|
249
335
|
get labels() {
|
|
250
336
|
return {
|
|
251
|
-
close:
|
|
252
|
-
maximize:
|
|
253
|
-
restore:
|
|
337
|
+
close: e.labels.close,
|
|
338
|
+
maximize: e.labels.expand,
|
|
339
|
+
restore: e.labels.collapse
|
|
254
340
|
};
|
|
255
341
|
},
|
|
256
342
|
defaultSize: {
|
|
@@ -264,30 +350,37 @@ const Se = (a) => {
|
|
|
264
350
|
compactBelow: 640,
|
|
265
351
|
class: "chat-media-preview-window",
|
|
266
352
|
get children() {
|
|
267
|
-
var
|
|
268
|
-
return
|
|
353
|
+
var r = ve();
|
|
354
|
+
return z((n) => queueMicrotask(() => n.closest('[role="dialog"]')?.focus({
|
|
269
355
|
preventScroll: !0
|
|
270
|
-
})),
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
356
|
+
})), r), h(r, i(Q, {
|
|
357
|
+
class: "chat-media-html",
|
|
358
|
+
get title() {
|
|
359
|
+
return b();
|
|
360
|
+
},
|
|
361
|
+
get html() {
|
|
362
|
+
return T() ?? "";
|
|
363
|
+
},
|
|
364
|
+
get labels() {
|
|
365
|
+
return N();
|
|
366
|
+
},
|
|
367
|
+
get onOpenLink() {
|
|
368
|
+
return D();
|
|
369
|
+
}
|
|
370
|
+
})), r;
|
|
277
371
|
}
|
|
278
372
|
});
|
|
279
373
|
}
|
|
280
|
-
}), null),
|
|
281
|
-
var
|
|
282
|
-
return
|
|
374
|
+
}), null), f((r) => {
|
|
375
|
+
var n = se("chat-media", R() && e.source.kind === "html" && "chat-media-expanded", e.class), t = e.source.kind;
|
|
376
|
+
return n !== r.e && p(c, r.e = n), t !== r.t && u(c, "data-media-kind", r.t = t), r;
|
|
283
377
|
}, {
|
|
284
378
|
e: void 0,
|
|
285
|
-
t: void 0
|
|
286
|
-
a: void 0
|
|
379
|
+
t: void 0
|
|
287
380
|
}), c;
|
|
288
381
|
})();
|
|
289
382
|
};
|
|
290
|
-
|
|
383
|
+
ee(["click"]);
|
|
291
384
|
export {
|
|
292
|
-
|
|
385
|
+
Re as MarkdownMedia
|
|
293
386
|
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type JSX } from 'solid-js';
|
|
2
|
+
export interface SandboxedHtmlFrameLabels {
|
|
3
|
+
linkUnavailable: string;
|
|
4
|
+
anchorUnavailable: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SandboxedHtmlFrameProps {
|
|
7
|
+
html: string;
|
|
8
|
+
title: string;
|
|
9
|
+
class?: string;
|
|
10
|
+
style?: JSX.CSSProperties;
|
|
11
|
+
inert?: boolean;
|
|
12
|
+
tabIndex?: number;
|
|
13
|
+
labels?: SandboxedHtmlFrameLabels;
|
|
14
|
+
/** An untrusted link intent. The host must resolve and authorize every target. */
|
|
15
|
+
onOpenLink?: (href: string, signal: AbortSignal) => void | Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/** A self-contained opaque document with a user-activated, host-authorized link boundary. */
|
|
18
|
+
export declare function SandboxedHtmlFrame(props: SandboxedHtmlFrameProps): JSX.Element;
|