@floegence/floe-webapp-core 0.86.55 → 0.86.57
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 +12 -8
- package/dist/components/chat/blocks/HtmlPreviewCanvas.d.ts +1 -1
- package/dist/components/chat/blocks/HtmlPreviewCanvas.js +75 -72
- package/dist/components/chat/blocks/MarkdownMedia.js +1 -1
- package/dist/components/chat/blocks/SvgBlock.js +1 -1
- package/dist/node_modules/.pnpm/dompurify@3.4.17/node_modules/dompurify/dist/purify.es.js +1520 -0
- package/dist/pptx.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
- package/dist/node_modules/.pnpm/dompurify@3.4.16/node_modules/dompurify/dist/purify.es.js +0 -1480
package/dist/chat.css
CHANGED
|
@@ -1918,7 +1918,7 @@ pre.chat-md-code-block *::selection,
|
|
|
1918
1918
|
/* Images and HTML retain one quiet, bounded canvas throughout their lifecycle. */
|
|
1919
1919
|
@layer components {
|
|
1920
1920
|
.chat-html-canvas, .chat-media[data-media-kind="image"] .chat-media-viewport { position: relative; isolation: isolate; display: block; width: 100%; overflow: hidden; border: 1px solid color-mix(in srgb, var(--border) 65%, transparent); border-radius: 1rem; background: color-mix(in srgb, var(--muted) 38%, var(--background)); }
|
|
1921
|
-
.chat-html-canvas { --canvas-inset:
|
|
1921
|
+
.chat-html-canvas { --canvas-inset: .625rem; --canvas-control-size: 2.125rem; height: 28rem; }
|
|
1922
1922
|
.chat-media[data-media-kind="image"] .chat-media-viewport { min-height: 14rem; padding: 3.5rem clamp(1rem, 5%, 2rem) 1.5rem; border: 0; }
|
|
1923
1923
|
.chat-media[data-media-kind="image"] .chat-media-viewport::before { content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none; border-radius: inherit; }
|
|
1924
1924
|
.chat-media[data-media-kind="image"] .chat-media-placeholder { padding: 0; border-radius: 0; background: transparent; }
|
|
@@ -1929,7 +1929,7 @@ pre.chat-md-code-block *::selection,
|
|
|
1929
1929
|
.chat-html-dots, .chat-media[data-media-kind="image"] .chat-media-viewport::before { background-image: radial-gradient(circle, color-mix(in srgb, var(--muted-foreground) 24%, transparent) .75px, transparent .9px); background-size: 20px 20px; background-position: 9px 9px; }
|
|
1930
1930
|
.chat-html-sheen { opacity: 0; background: linear-gradient(115deg, transparent 25%, color-mix(in srgb, var(--foreground) 20%, transparent) 49%, transparent 73%); background-size: 250% 100%; mask-image: radial-gradient(circle, black .9px, transparent 1.1px); mask-size: 20px 20px; mask-position: 9px 9px; }
|
|
1931
1931
|
.chat-html-canvas:is([data-state="generating"], [data-state="loading"]) .chat-html-sheen { opacity: 1; animation: chat-html-sweep 3.4s ease-in-out infinite; }
|
|
1932
|
-
.chat-html-sheet, .chat-html-source { position: absolute; inset:
|
|
1932
|
+
.chat-html-sheet, .chat-html-source { position: absolute; inset: calc(var(--canvas-control-size) + 1rem) var(--canvas-inset) var(--canvas-inset); display: flex; min-width: 0; min-height: 0; overflow: hidden; border: 1px solid color-mix(in srgb, var(--border) 75%, transparent); border-radius: .625rem; box-shadow: 0 14px 40px rgb(0 0 0 / .06), 0 2px 6px rgb(0 0 0 / .03); background: var(--background); }
|
|
1933
1933
|
.chat-html-sheet { transition: opacity 280ms ease; }
|
|
1934
1934
|
.chat-html-sheet-hidden { opacity: 0; visibility: hidden; pointer-events: none; }
|
|
1935
1935
|
.chat-html-sheet .chat-media-html { height: 100%; border-radius: 0; }
|
|
@@ -1937,17 +1937,21 @@ pre.chat-md-code-block *::selection,
|
|
|
1937
1937
|
.chat-html-source code { padding: 0; color: inherit; background: none; font: inherit; }
|
|
1938
1938
|
.chat-html-loading { position: absolute; inset: 3.5rem var(--canvas-inset); display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 1rem; text-align: center; color: var(--muted-foreground); font-size: .75rem; }
|
|
1939
1939
|
.chat-html-orb, .chat-media[data-media-kind="image"] .chat-media-action { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 2.125rem; height: 2.125rem; padding: 0; border: 1px solid color-mix(in srgb, var(--border) 80%, transparent); border-radius: 50%; color: var(--muted-foreground); background: color-mix(in srgb, var(--background) 88%, transparent); box-shadow: 0 2px 5px rgb(0 0 0 / .035); backdrop-filter: blur(12px); cursor: pointer; transition: color 140ms, background 140ms, transform 140ms; }
|
|
1940
|
-
.chat-html-orb:hover, .chat-media[data-media-kind="image"] .chat-media-action:hover { color: var(--foreground); background: var(--background); transform: translateY(-1px); }
|
|
1940
|
+
.chat-html-orb:hover:not(:disabled), .chat-media[data-media-kind="image"] .chat-media-action:hover { color: var(--foreground); background: var(--background); transform: translateY(-1px); }
|
|
1941
|
+
.chat-html-orb { width: var(--canvas-control-size); height: var(--canvas-control-size); }
|
|
1942
|
+
.chat-html-orb:disabled { opacity: .45; cursor: not-allowed; }
|
|
1941
1943
|
.chat-html-orb[aria-pressed="true"] { color: var(--foreground); background: var(--muted); }
|
|
1942
1944
|
.chat-html-orb:focus-visible, .chat-html-source:focus-visible, .chat-media[data-media-kind="image"] .chat-media-action:focus-visible { outline: 2px solid var(--ring); outline-offset: 3px; }
|
|
1943
1945
|
.chat-html-orb svg { width: .9375rem; height: .9375rem; }
|
|
1944
|
-
.chat-html-
|
|
1945
|
-
.chat-html-controls {
|
|
1946
|
-
.chat-html-
|
|
1946
|
+
.chat-html-toolbar { position: absolute; top: .5rem; right: var(--canvas-inset); left: var(--canvas-inset); height: var(--canvas-control-size); display: flex; align-items: center; gap: .5rem; }
|
|
1947
|
+
.chat-html-controls, .chat-html-window-actions { display: flex; flex-shrink: 0; align-items: center; gap: .5rem; }
|
|
1948
|
+
.chat-html-window-actions { margin-left: auto; }
|
|
1949
|
+
.chat-html-feedback { min-width: 0; display: flex; align-items: center; gap: .4rem; font-size: .6875rem; line-height: 1.5; color: var(--muted-foreground); }
|
|
1950
|
+
.chat-html-feedback > span { min-width: 0; max-height: var(--canvas-control-size); overflow: auto; }
|
|
1947
1951
|
.chat-html-feedback svg { width: .875rem; height: .875rem; flex-shrink: 0; }
|
|
1948
1952
|
@keyframes chat-html-sweep { from { background-position: 120% 0; } to { background-position: -80% 0; } }
|
|
1949
|
-
@media (max-width: 480px) { .chat-html-canvas { height: 25rem;
|
|
1950
|
-
@media (pointer: coarse) { .chat-html-
|
|
1953
|
+
@media (max-width: 480px) { .chat-html-canvas { height: 25rem; } }
|
|
1954
|
+
@media (pointer: coarse) { .chat-html-canvas { --canvas-control-size: 2.625rem; } .chat-media[data-media-kind="image"] .chat-media-action { width: 2.625rem; height: 2.625rem; } .chat-media[data-media-kind="image"] .chat-media-viewport { padding-top: 4rem; } }
|
|
1951
1955
|
@media (prefers-reduced-motion: reduce) { .chat-html-sheen { animation: none !important; background-position: 50% 0; } .chat-html-orb, .chat-html-sheet, .chat-media[data-media-kind="image"] .chat-media-action { transition: none; } }
|
|
1952
1956
|
@media (forced-colors: active) { .chat-html-orb, .chat-html-source, .chat-html-canvas, .chat-media[data-media-kind="image"] .chat-media-action { border-color: CanvasText; } .chat-html-sheen { display: none; } }
|
|
1953
1957
|
}
|
|
@@ -7,7 +7,7 @@ export interface HtmlPreviewCanvasProps {
|
|
|
7
7
|
expanded: boolean;
|
|
8
8
|
onExpand: () => void;
|
|
9
9
|
onRetry: () => void;
|
|
10
|
-
onPreview: () => void;
|
|
10
|
+
onPreview: (event?: MouseEvent) => void;
|
|
11
11
|
previewLabel: string;
|
|
12
12
|
resource?: ResolvedMarkdownMedia;
|
|
13
13
|
children: JSX.Element;
|
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
import { createComponent as a, insert as l, effect as
|
|
2
|
-
import { createSignal as
|
|
3
|
-
import { Copy as
|
|
4
|
-
import { Dropdown as
|
|
5
|
-
var
|
|
6
|
-
const
|
|
7
|
-
const [
|
|
8
|
-
let
|
|
9
|
-
const
|
|
10
|
-
clearTimeout(
|
|
1
|
+
import { createComponent as a, insert as l, effect as $, setAttribute as n, memo as Q, template as b, use as W, delegateEvents as X } from "solid-js/web";
|
|
2
|
+
import { createSignal as N, onCleanup as Y, createMemo as Z, Show as u } from "solid-js";
|
|
3
|
+
import { Copy as p, Eye as O, Refresh as j, ExternalLink as B, FolderOpen as ee, Code as te, MoreHorizontal as ae, Check as le, Minus as ne, Maximize as ie } from "../../icons/index.js";
|
|
4
|
+
import { Dropdown as re } from "../../ui/Dropdown.js";
|
|
5
|
+
var ce = /* @__PURE__ */ b("<pre class=chat-html-source tabindex=0><code>"), oe = /* @__PURE__ */ b("<button type=button class=chat-media-retry>"), se = /* @__PURE__ */ b("<span class=chat-html-loading role=status><span>"), de = /* @__PURE__ */ b("<span class=chat-html-feedback role=status><span>"), ue = /* @__PURE__ */ b('<span class=chat-html-canvas><span class=chat-html-dots aria-hidden=true></span><span class=chat-html-sheen aria-hidden=true></span><span class=chat-html-sheet></span><span class=chat-html-toolbar><span class=chat-html-controls><button type=button class=chat-html-orb data-chat-media-action=source></button></span><span class=chat-html-window-actions><button type=button class=chat-html-orb data-chat-media-action=preview></button><button type=button class="chat-html-orb chat-html-expand">');
|
|
6
|
+
const ge = (e) => {
|
|
7
|
+
const [o, k] = N(!1), [C, L] = N("");
|
|
8
|
+
let v, m = !1, x;
|
|
9
|
+
const M = (i) => {
|
|
10
|
+
clearTimeout(x), L(i), x = setTimeout(() => L(""), 2400);
|
|
11
11
|
};
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
Y(() => {
|
|
13
|
+
m = !0, clearTimeout(x);
|
|
14
14
|
});
|
|
15
|
-
const
|
|
15
|
+
const I = async () => {
|
|
16
16
|
try {
|
|
17
|
-
if (await navigator.clipboard.writeText(e.html),
|
|
18
|
-
|
|
17
|
+
if (await navigator.clipboard.writeText(e.html), m) return;
|
|
18
|
+
M(e.labels.copied ?? "Copied");
|
|
19
19
|
} catch {
|
|
20
|
-
if (
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
if (
|
|
24
|
-
|
|
20
|
+
if (m) return;
|
|
21
|
+
const i = e.labels.copyFailed ?? "Select and copy the source.";
|
|
22
|
+
k(!0), queueMicrotask(() => {
|
|
23
|
+
if (m) return;
|
|
24
|
+
v.focus({
|
|
25
25
|
preventScroll: !0
|
|
26
26
|
});
|
|
27
27
|
const g = document.createRange();
|
|
28
|
-
g.selectNodeContents(
|
|
29
|
-
const
|
|
30
|
-
|
|
28
|
+
g.selectNodeContents(v);
|
|
29
|
+
const w = window.getSelection();
|
|
30
|
+
w?.removeAllRanges(), w?.addRange(g), M(i);
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
|
-
},
|
|
33
|
+
}, J = Z(() => [{
|
|
34
34
|
id: "copy",
|
|
35
35
|
label: e.labels.copyHTML ?? "Copy HTML",
|
|
36
|
-
icon: () => a(
|
|
36
|
+
icon: () => a(p, {}),
|
|
37
37
|
disabled: !e.html
|
|
38
38
|
}, ...e.state === "ready" ? [{
|
|
39
39
|
id: "preview",
|
|
40
40
|
label: e.previewLabel,
|
|
41
|
-
icon: () => a(
|
|
41
|
+
icon: () => a(O, {})
|
|
42
42
|
}, {
|
|
43
43
|
id: "replay",
|
|
44
44
|
label: e.labels.replay ?? "Reload preview",
|
|
45
|
-
icon: () => a(
|
|
45
|
+
icon: () => a(j, {})
|
|
46
46
|
}] : [], ...e.resource?.openURL && !e.resource.reveal ? [{
|
|
47
47
|
id: "open",
|
|
48
48
|
label: e.labels.open,
|
|
49
|
-
icon: () => a(
|
|
49
|
+
icon: () => a(B, {})
|
|
50
50
|
}] : [], ...e.resource?.reveal ? [{
|
|
51
51
|
id: "reveal",
|
|
52
52
|
label: e.resource.reveal.label,
|
|
53
|
-
icon: () => a(
|
|
54
|
-
}] : []]),
|
|
53
|
+
icon: () => a(ee, {})
|
|
54
|
+
}] : []]), K = () => e.state === "generating" ? e.labels.generating ?? e.labels.loading : e.state === "incomplete" ? e.labels.incomplete ?? "Generation interrupted. Source is available." : e.state === "error" ? e.labels.unavailable : e.labels.loading;
|
|
55
55
|
return (() => {
|
|
56
|
-
var
|
|
57
|
-
return
|
|
56
|
+
var i = ue(), g = i.firstChild, w = g.nextSibling, f = w.nextSibling, y = f.nextSibling, S = y.firstChild, h = S.firstChild, R = S.nextSibling, s = R.firstChild, d = s.nextSibling;
|
|
57
|
+
return i.$$keydown = (t) => {
|
|
58
58
|
t.key === "Escape" && e.expanded && !t.defaultPrevented && (t.preventDefault(), e.onExpand());
|
|
59
|
-
}, l(
|
|
59
|
+
}, l(f, () => e.children), l(i, a(u, {
|
|
60
60
|
get when() {
|
|
61
|
-
return
|
|
61
|
+
return o();
|
|
62
62
|
},
|
|
63
63
|
get children() {
|
|
64
|
-
var t =
|
|
65
|
-
return typeof
|
|
64
|
+
var t = ce(), r = t.firstChild, c = v;
|
|
65
|
+
return typeof c == "function" ? W(c, t) : v = t, l(r, () => e.html), $(() => n(t, "aria-label", e.labels.showSource ?? "HTML source")), t;
|
|
66
66
|
}
|
|
67
|
-
}),
|
|
67
|
+
}), y), l(i, a(u, {
|
|
68
68
|
get when() {
|
|
69
|
-
return
|
|
69
|
+
return Q(() => !o())() && e.state !== "ready";
|
|
70
70
|
},
|
|
71
71
|
get children() {
|
|
72
|
-
var t =
|
|
73
|
-
return l(
|
|
72
|
+
var t = se(), r = t.firstChild;
|
|
73
|
+
return l(r, K), l(t, a(u, {
|
|
74
74
|
get when() {
|
|
75
75
|
return e.state === "error";
|
|
76
76
|
},
|
|
77
77
|
get children() {
|
|
78
|
-
var
|
|
79
|
-
return
|
|
78
|
+
var c = oe();
|
|
79
|
+
return c.$$click = () => e.onRetry(), l(c, a(j, {}), null), l(c, () => e.labels.retry, null), c;
|
|
80
80
|
}
|
|
81
|
-
}), null),
|
|
81
|
+
}), null), $(() => n(r, "data-floe-progress-shimmer", e.state === "loading" || e.state === "generating" ? "text" : void 0)), t;
|
|
82
82
|
}
|
|
83
|
-
}),
|
|
83
|
+
}), y), h.$$click = () => k((t) => !t), l(h, a(u, {
|
|
84
84
|
get when() {
|
|
85
|
-
return
|
|
86
|
-
},
|
|
87
|
-
get fallback() {
|
|
88
|
-
return a(X, {});
|
|
89
|
-
},
|
|
90
|
-
get children() {
|
|
91
|
-
return a(W, {});
|
|
92
|
-
}
|
|
93
|
-
})), u.$$click = () => x((t) => !t), l(u, a(d, {
|
|
94
|
-
get when() {
|
|
95
|
-
return c();
|
|
85
|
+
return o();
|
|
96
86
|
},
|
|
97
87
|
get fallback() {
|
|
98
|
-
return a(
|
|
88
|
+
return a(te, {});
|
|
99
89
|
},
|
|
100
90
|
get children() {
|
|
101
|
-
return a(
|
|
91
|
+
return a(O, {});
|
|
102
92
|
}
|
|
103
|
-
})), l(
|
|
93
|
+
})), l(S, a(re, {
|
|
104
94
|
get trigger() {
|
|
105
|
-
return a(
|
|
95
|
+
return a(ae, {});
|
|
106
96
|
},
|
|
107
97
|
triggerClass: "chat-html-orb",
|
|
108
98
|
get triggerAriaLabel() {
|
|
109
99
|
return e.labels.more ?? "More actions";
|
|
110
100
|
},
|
|
111
|
-
items:
|
|
101
|
+
items: J,
|
|
112
102
|
align: "start",
|
|
113
103
|
onSelect: (t) => {
|
|
114
|
-
t === "copy" ?
|
|
104
|
+
t === "copy" ? I() : t === "preview" ? e.onPreview() : t === "replay" ? e.onRetry() : t === "reveal" ? e.resource?.reveal?.onSelect() : t === "open" && e.resource?.openURL && window.open(e.resource.openURL, "_blank", "noopener,noreferrer");
|
|
115
105
|
}
|
|
116
|
-
}), null), l(
|
|
106
|
+
}), null), l(y, a(u, {
|
|
117
107
|
get when() {
|
|
118
|
-
return
|
|
108
|
+
return C();
|
|
109
|
+
},
|
|
110
|
+
get children() {
|
|
111
|
+
var t = de(), r = t.firstChild;
|
|
112
|
+
return l(t, a(le, {}), r), l(r, C), t;
|
|
113
|
+
}
|
|
114
|
+
}), R), s.$$click = (t) => e.onPreview(t), l(s, a(B, {})), d.$$click = () => e.onExpand(), l(d, a(u, {
|
|
115
|
+
get when() {
|
|
116
|
+
return e.expanded;
|
|
117
|
+
},
|
|
118
|
+
get fallback() {
|
|
119
|
+
return a(ie, {});
|
|
119
120
|
},
|
|
120
121
|
get children() {
|
|
121
|
-
|
|
122
|
-
return l(t, a(p, {}), null), l(t, S, null), t;
|
|
122
|
+
return a(ne, {});
|
|
123
123
|
}
|
|
124
|
-
})
|
|
125
|
-
var
|
|
126
|
-
return
|
|
124
|
+
})), $((t) => {
|
|
125
|
+
var r = e.state, c = o() ? "source" : "preview", T = e.state === "generating" || e.state === "loading", _ = !!(o() || e.state !== "ready"), H = o() || e.state !== "ready", E = o(), P = o() ? e.labels.showPreview ?? "Show preview" : e.labels.showSource ?? "Show HTML source", A = o() ? e.labels.showPreview ?? "Show preview" : e.labels.showSource ?? "Show HTML source", F = e.state !== "ready", U = e.previewLabel, z = e.previewLabel, D = e.expanded ? "collapse" : "expand", V = e.expanded, q = e.expanded ? e.labels.collapse : e.labels.expand, G = e.expanded ? e.labels.collapse : e.labels.expand;
|
|
126
|
+
return r !== t.e && n(i, "data-state", t.e = r), c !== t.t && n(i, "data-view", t.t = c), T !== t.a && n(i, "aria-busy", t.a = T), _ !== t.o && f.classList.toggle("chat-html-sheet-hidden", t.o = _), H !== t.i && (f.inert = t.i = H), E !== t.n && n(h, "aria-pressed", t.n = E), P !== t.s && n(h, "aria-label", t.s = P), A !== t.h && n(h, "title", t.h = A), F !== t.r && (s.disabled = t.r = F), U !== t.d && n(s, "aria-label", t.d = U), z !== t.l && n(s, "title", t.l = z), D !== t.u && n(d, "data-chat-media-action", t.u = D), V !== t.c && n(d, "aria-expanded", t.c = V), q !== t.w && n(d, "aria-label", t.w = q), G !== t.m && n(d, "title", t.m = G), t;
|
|
127
127
|
}, {
|
|
128
128
|
e: void 0,
|
|
129
129
|
t: void 0,
|
|
@@ -136,11 +136,14 @@ const de = (e) => {
|
|
|
136
136
|
r: void 0,
|
|
137
137
|
d: void 0,
|
|
138
138
|
l: void 0,
|
|
139
|
-
u: void 0
|
|
140
|
-
|
|
139
|
+
u: void 0,
|
|
140
|
+
c: void 0,
|
|
141
|
+
w: void 0,
|
|
142
|
+
m: void 0
|
|
143
|
+
}), i;
|
|
141
144
|
})();
|
|
142
145
|
};
|
|
143
|
-
|
|
146
|
+
X(["keydown", "click"]);
|
|
144
147
|
export {
|
|
145
|
-
|
|
148
|
+
ge as HtmlPreviewCanvas
|
|
146
149
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { effect as s, className as a, template as c } from "solid-js/web";
|
|
2
2
|
import "solid-js";
|
|
3
|
-
import v from "../../../node_modules/.pnpm/dompurify@3.4.
|
|
3
|
+
import v from "../../../node_modules/.pnpm/dompurify@3.4.17/node_modules/dompurify/dist/purify.es.js";
|
|
4
4
|
import { cn as m } from "../../../utils/cn.js";
|
|
5
5
|
var l = /* @__PURE__ */ c("<div>");
|
|
6
6
|
const S = (r) => {
|