markdown-flow-ui 0.1.99 → 0.1.100-beta.0
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/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.es.js +17 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.es.js +29 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.es.js +18 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.es.js +16 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.es.js +16 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.es.js +23 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.es.js.map +1 -0
- package/dist/_virtual/index.cjs.js +1 -1
- package/dist/_virtual/index.es.js +1 -0
- package/dist/assets/markdown-flow-ui.css +1 -1
- package/dist/components/ContentRender/IframeSandbox.cjs.js +3 -3
- package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.es.js +212 -164
- package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.cjs.js +2 -2
- package/dist/components/ContentRender/SandboxApp.cjs.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.es.js +21 -21
- package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
- package/dist/components/ContentRender/index.cjs.js +1 -1
- package/dist/components/ContentRender/index.es.js +6 -5
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js +2 -2
- package/dist/components/Slide/Player.cjs.js +2 -0
- package/dist/components/Slide/Player.cjs.js.map +1 -0
- package/dist/components/Slide/Player.d.ts +19 -0
- package/dist/components/Slide/Player.es.js +327 -0
- package/dist/components/Slide/Player.es.js.map +1 -0
- package/dist/components/Slide/Slide.cjs.js +2 -0
- package/dist/components/Slide/Slide.cjs.js.map +1 -0
- package/dist/components/Slide/Slide.d.ts +12 -0
- package/dist/components/Slide/Slide.es.js +394 -0
- package/dist/components/Slide/Slide.es.js.map +1 -0
- package/dist/components/Slide/Slide.stories.d.ts +47 -0
- package/dist/components/Slide/diff-utils.cjs.js +5 -0
- package/dist/components/Slide/diff-utils.cjs.js.map +1 -0
- package/dist/components/Slide/diff-utils.d.ts +18 -0
- package/dist/components/Slide/diff-utils.es.js +113 -0
- package/dist/components/Slide/diff-utils.es.js.map +1 -0
- package/dist/components/Slide/index.d.ts +12 -0
- package/dist/components/Slide/interaction-defaults.cjs.js +2 -0
- package/dist/components/Slide/interaction-defaults.cjs.js.map +1 -0
- package/dist/components/Slide/interaction-defaults.d.ts +23 -0
- package/dist/components/Slide/interaction-defaults.es.js +85 -0
- package/dist/components/Slide/interaction-defaults.es.js.map +1 -0
- package/dist/components/Slide/types.d.ts +24 -0
- package/dist/components/Slide/useSlide.cjs.js +2 -0
- package/dist/components/Slide/useSlide.cjs.js.map +1 -0
- package/dist/components/Slide/useSlide.d.ts +21 -0
- package/dist/components/Slide/useSlide.es.js +102 -0
- package/dist/components/Slide/useSlide.es.js.map +1 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +21 -9
- package/dist/index.es.js.map +1 -1
- package/dist/lib/browserUserActivation.cjs.js +2 -0
- package/dist/lib/browserUserActivation.cjs.js.map +1 -0
- package/dist/lib/browserUserActivation.d.ts +5 -0
- package/dist/lib/browserUserActivation.es.js +13 -0
- package/dist/lib/browserUserActivation.es.js.map +1 -0
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/dist/renderer.cjs.js +1 -1
- package/dist/renderer.d.ts +3 -2
- package/dist/renderer.es.js +20 -8
- package/dist/renderer.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { j as r } from "../../_virtual/jsx-runtime.es.js";
|
|
2
|
+
import { useRef as o, useState as re, useMemo as te, useEffect as v, useCallback as a } from "react";
|
|
3
|
+
import { cn as T } from "../../lib/utils.es.js";
|
|
4
|
+
/* empty css */
|
|
5
|
+
import ne from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.es.js";
|
|
6
|
+
import se from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.es.js";
|
|
7
|
+
import le from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.es.js";
|
|
8
|
+
import ce from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.es.js";
|
|
9
|
+
import ue from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.es.js";
|
|
10
|
+
import ae from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.es.js";
|
|
11
|
+
const ie = () => /* @__PURE__ */ r.jsxs(
|
|
12
|
+
"svg",
|
|
13
|
+
{
|
|
14
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
15
|
+
width: "34",
|
|
16
|
+
height: "34",
|
|
17
|
+
viewBox: "0 0 34 34",
|
|
18
|
+
fill: "none",
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ r.jsx(
|
|
21
|
+
"path",
|
|
22
|
+
{
|
|
23
|
+
d: "M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z",
|
|
24
|
+
fill: "#0A0A0A"
|
|
25
|
+
}
|
|
26
|
+
),
|
|
27
|
+
/* @__PURE__ */ r.jsx("path", { d: "M12 10H16V24H12V10ZM18 10H22V24H18V10Z", fill: "white" })
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
), oe = () => /* @__PURE__ */ r.jsxs(
|
|
31
|
+
"svg",
|
|
32
|
+
{
|
|
33
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
34
|
+
width: "34",
|
|
35
|
+
height: "34",
|
|
36
|
+
viewBox: "0 0 34 34",
|
|
37
|
+
fill: "none",
|
|
38
|
+
children: [
|
|
39
|
+
/* @__PURE__ */ r.jsx(
|
|
40
|
+
"path",
|
|
41
|
+
{
|
|
42
|
+
d: "M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z",
|
|
43
|
+
fill: "#0A0A0A"
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
/* @__PURE__ */ r.jsx("path", { d: "M13.3333 10L23.3333 16.6667L13.3333 23.3333V10Z", fill: "white" })
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
), xe = ({
|
|
50
|
+
audioList: Z = [],
|
|
51
|
+
className: $,
|
|
52
|
+
currentAudioIndex: t = -1,
|
|
53
|
+
defaultPlaying: s = !0,
|
|
54
|
+
onPrev: H,
|
|
55
|
+
onNext: U,
|
|
56
|
+
onFullscreen: B,
|
|
57
|
+
onEnded: V,
|
|
58
|
+
onInteractionToggle: K,
|
|
59
|
+
hasInteraction: P = !1,
|
|
60
|
+
isInteractionOpen: z = !1,
|
|
61
|
+
prevDisabled: q = !1,
|
|
62
|
+
nextDisabled: G = !1,
|
|
63
|
+
showControls: J = !0,
|
|
64
|
+
...O
|
|
65
|
+
}) => {
|
|
66
|
+
const p = o(null), y = o(null), W = o(null), _ = o(0), f = o(null), k = o(void 0), C = o([]), m = o(!1), n = o(!1), i = o(null), h = o(!1), [A, l] = re(s), d = t >= 0 ? Z[t] : void 0, j = d?.audioUrl, g = te(
|
|
67
|
+
() => [...d?.audioSegments ?? []].sort(
|
|
68
|
+
(e, u) => e.segment_index - u.segment_index
|
|
69
|
+
),
|
|
70
|
+
[d?.audioSegments]
|
|
71
|
+
), M = `${t}:${d?.serialNumber ?? "none"}:${j ?? ""}`;
|
|
72
|
+
v(() => {
|
|
73
|
+
k.current = d;
|
|
74
|
+
}, [d]), v(() => {
|
|
75
|
+
C.current = g;
|
|
76
|
+
}, [g]);
|
|
77
|
+
const F = a((e) => e ? e.startsWith("data:") ? e : `data:audio/mpeg;base64,${e}` : "", []), S = a(() => {
|
|
78
|
+
const e = p.current;
|
|
79
|
+
e && (n.current = !1, i.current = null, m.current = !1, h.current = !1, e.pause(), e.removeAttribute("src"), e.load(), y.current = null, _.current = 0, f.current = null, l(!1));
|
|
80
|
+
}, [t]), b = a(
|
|
81
|
+
(e) => {
|
|
82
|
+
const u = p.current;
|
|
83
|
+
if (!u)
|
|
84
|
+
return !1;
|
|
85
|
+
const c = u.play();
|
|
86
|
+
return c && typeof c.then == "function" && c.then(() => {
|
|
87
|
+
n.current = !1, h.current = !1;
|
|
88
|
+
}).catch((w) => {
|
|
89
|
+
l(!1);
|
|
90
|
+
}), !0;
|
|
91
|
+
},
|
|
92
|
+
[t]
|
|
93
|
+
), x = a(
|
|
94
|
+
(e, u) => {
|
|
95
|
+
const c = p.current, w = C.current[e];
|
|
96
|
+
if (!c || !w)
|
|
97
|
+
return !1;
|
|
98
|
+
const N = F(w.audio_data);
|
|
99
|
+
_.current = e, f.current = null, m.current = !1, h.current = !0, n.current = s;
|
|
100
|
+
const E = y.current !== N;
|
|
101
|
+
return E && (c.pause(), c.removeAttribute("src"), c.load(), y.current = N, c.src = N, c.load()), i.current = 0, c.readyState > 0 && (c.currentTime = 0, i.current = null), s ? E ? !0 : b(`start-segment:${u}`) : (n.current = !1, h.current = !1, c.pause(), l(!1), !0);
|
|
102
|
+
},
|
|
103
|
+
[t, s, F, b]
|
|
104
|
+
), R = a(() => {
|
|
105
|
+
n.current = !1, m.current = !1, h.current = !1, l(!1), t >= 0 && V?.(t);
|
|
106
|
+
}, [t, V]), L = a(() => {
|
|
107
|
+
const e = _.current + 1, u = C.current, c = u[e], w = k.current, N = u.some((E) => E.is_final);
|
|
108
|
+
if (c) {
|
|
109
|
+
x(e, "ended");
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (w?.isAudioStreaming || !N) {
|
|
113
|
+
_.current = e, f.current = e, m.current = !0, n.current = s, l(s);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
R("segments-completed");
|
|
117
|
+
}, [
|
|
118
|
+
t,
|
|
119
|
+
s,
|
|
120
|
+
R,
|
|
121
|
+
x
|
|
122
|
+
]);
|
|
123
|
+
v(() => {
|
|
124
|
+
if (W.current === M)
|
|
125
|
+
return;
|
|
126
|
+
W.current = M, _.current = 0, f.current = null, m.current = !1, n.current = !1, h.current = !1, y.current = null;
|
|
127
|
+
const e = p.current;
|
|
128
|
+
e && (e.pause(), e.removeAttribute("src"), e.load(), l(!1));
|
|
129
|
+
}, [
|
|
130
|
+
t,
|
|
131
|
+
M,
|
|
132
|
+
g.length,
|
|
133
|
+
j
|
|
134
|
+
]), v(() => {
|
|
135
|
+
const e = p.current;
|
|
136
|
+
if (e) {
|
|
137
|
+
if (!d) {
|
|
138
|
+
S();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (j) {
|
|
142
|
+
const u = y.current !== j;
|
|
143
|
+
if (u && (e.pause(), e.removeAttribute("src"), e.load(), y.current = j, e.src = j, e.load()), i.current = 0, e.readyState > 0 && (e.currentTime = 0, i.current = null), n.current = s, m.current = !1, h.current = !1, !s) {
|
|
144
|
+
n.current = !1, e.pause(), l(!1);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
u || b("sync-url");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (f.current !== null) {
|
|
151
|
+
if (f.current < g.length) {
|
|
152
|
+
x(f.current, "wait-resume");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
m.current = !0, n.current = s, l(s);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (!g.length) {
|
|
159
|
+
if (d.isAudioStreaming) {
|
|
160
|
+
f.current = _.current, m.current = !0, n.current = s, l(s);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
S();
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (!y.current) {
|
|
167
|
+
x(
|
|
168
|
+
Math.min(
|
|
169
|
+
_.current,
|
|
170
|
+
g.length - 1
|
|
171
|
+
),
|
|
172
|
+
"effect-init"
|
|
173
|
+
);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (!s) {
|
|
177
|
+
n.current = !1, e.pause(), l(!1);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
e.paused && (n.current = !0, b("sync-paused-retry"));
|
|
181
|
+
}
|
|
182
|
+
}, [
|
|
183
|
+
d,
|
|
184
|
+
t,
|
|
185
|
+
g,
|
|
186
|
+
j,
|
|
187
|
+
s,
|
|
188
|
+
S,
|
|
189
|
+
x,
|
|
190
|
+
b
|
|
191
|
+
]), v(() => S, [S]);
|
|
192
|
+
const Q = a(() => {
|
|
193
|
+
l(!0);
|
|
194
|
+
}, [t]), X = a(() => {
|
|
195
|
+
m.current || h.current || l(!1);
|
|
196
|
+
}, [t]), Y = a(() => {
|
|
197
|
+
const e = p.current;
|
|
198
|
+
e && i.current !== null && (e.currentTime = i.current, i.current = null), !(!n.current || !s) && b("canplay");
|
|
199
|
+
}, [t, s, b]), D = a(() => {
|
|
200
|
+
const e = p.current;
|
|
201
|
+
e && i.current !== null && (e.currentTime = i.current, i.current = null);
|
|
202
|
+
}, [t]), I = a(() => {
|
|
203
|
+
if (h.current = !1, k.current?.audioUrl || C.current.length === 0) {
|
|
204
|
+
R("url-ended");
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
L();
|
|
208
|
+
}, [t, R, L]), ee = a(() => {
|
|
209
|
+
l(!1);
|
|
210
|
+
}, [t]);
|
|
211
|
+
return /* @__PURE__ */ r.jsxs("div", { className: T("slide-player", $), ...O, children: [
|
|
212
|
+
/* @__PURE__ */ r.jsx(
|
|
213
|
+
"audio",
|
|
214
|
+
{
|
|
215
|
+
ref: p,
|
|
216
|
+
preload: "metadata",
|
|
217
|
+
playsInline: !0,
|
|
218
|
+
onLoadedMetadata: D,
|
|
219
|
+
onCanPlay: Y,
|
|
220
|
+
onPlay: Q,
|
|
221
|
+
onPause: X,
|
|
222
|
+
onEnded: I,
|
|
223
|
+
onError: ee
|
|
224
|
+
}
|
|
225
|
+
),
|
|
226
|
+
J ? /* @__PURE__ */ r.jsxs("div", { className: "slide-player__controls", children: [
|
|
227
|
+
/* @__PURE__ */ r.jsxs("div", { className: "slide-player__group", children: [
|
|
228
|
+
/* @__PURE__ */ r.jsx("button", { "aria-label": "More options", className: "hidden", type: "button", children: /* @__PURE__ */ r.jsx(
|
|
229
|
+
ne,
|
|
230
|
+
{
|
|
231
|
+
className: "slide-player__icon",
|
|
232
|
+
strokeWidth: 2.25
|
|
233
|
+
}
|
|
234
|
+
) }),
|
|
235
|
+
/* @__PURE__ */ r.jsx("button", { "aria-label": "Volume", className: "hidden", type: "button", children: /* @__PURE__ */ r.jsx(se, { className: "slide-player__icon", strokeWidth: 2.25 }) }),
|
|
236
|
+
/* @__PURE__ */ r.jsx(
|
|
237
|
+
"button",
|
|
238
|
+
{
|
|
239
|
+
"aria-label": "Rewind",
|
|
240
|
+
className: "slide-player__action",
|
|
241
|
+
disabled: q,
|
|
242
|
+
onClick: H,
|
|
243
|
+
type: "button",
|
|
244
|
+
children: /* @__PURE__ */ r.jsx(le, { className: "slide-player__icon", strokeWidth: 2.25 })
|
|
245
|
+
}
|
|
246
|
+
),
|
|
247
|
+
/* @__PURE__ */ r.jsx(
|
|
248
|
+
"button",
|
|
249
|
+
{
|
|
250
|
+
"aria-label": A ? "Pause" : "Play",
|
|
251
|
+
className: "slide-player__toggle",
|
|
252
|
+
onClick: () => {
|
|
253
|
+
const e = p.current;
|
|
254
|
+
if (!(!e || !d)) {
|
|
255
|
+
if (f.current !== null) {
|
|
256
|
+
if (A) {
|
|
257
|
+
n.current = !1, f.current = null, m.current = !1, l(!1), e.pause();
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
n.current = !0, l(!0);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (!e.src && g.length > 0) {
|
|
264
|
+
x(
|
|
265
|
+
Math.min(
|
|
266
|
+
_.current,
|
|
267
|
+
g.length - 1
|
|
268
|
+
),
|
|
269
|
+
"toggle"
|
|
270
|
+
);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
if (e.paused) {
|
|
274
|
+
n.current = !0, b("toggle-resume");
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
n.current = !1, e.pause();
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
type: "button",
|
|
281
|
+
children: A ? /* @__PURE__ */ r.jsx(ie, {}) : /* @__PURE__ */ r.jsx(oe, {})
|
|
282
|
+
}
|
|
283
|
+
),
|
|
284
|
+
/* @__PURE__ */ r.jsx(
|
|
285
|
+
"button",
|
|
286
|
+
{
|
|
287
|
+
"aria-label": "Forward",
|
|
288
|
+
className: "slide-player__action",
|
|
289
|
+
disabled: G,
|
|
290
|
+
onClick: U,
|
|
291
|
+
type: "button",
|
|
292
|
+
children: /* @__PURE__ */ r.jsx(ce, { className: "slide-player__icon", strokeWidth: 2.25 })
|
|
293
|
+
}
|
|
294
|
+
),
|
|
295
|
+
/* @__PURE__ */ r.jsx(
|
|
296
|
+
"button",
|
|
297
|
+
{
|
|
298
|
+
"aria-label": "Fullscreen",
|
|
299
|
+
className: "hidden",
|
|
300
|
+
onClick: B,
|
|
301
|
+
type: "button",
|
|
302
|
+
children: /* @__PURE__ */ r.jsx(ue, { className: "slide-player__icon", strokeWidth: 2.25 })
|
|
303
|
+
}
|
|
304
|
+
)
|
|
305
|
+
] }),
|
|
306
|
+
/* @__PURE__ */ r.jsx("div", { className: "slide-player__separator" }),
|
|
307
|
+
/* @__PURE__ */ r.jsx("div", { className: "slide-player__group", children: /* @__PURE__ */ r.jsx(
|
|
308
|
+
"button",
|
|
309
|
+
{
|
|
310
|
+
"aria-label": "Notes",
|
|
311
|
+
className: T(
|
|
312
|
+
"slide-player__action",
|
|
313
|
+
z && "slide-player__action--active"
|
|
314
|
+
),
|
|
315
|
+
disabled: !P,
|
|
316
|
+
onClick: K,
|
|
317
|
+
type: "button",
|
|
318
|
+
children: /* @__PURE__ */ r.jsx(ae, { className: "slide-player__icon", strokeWidth: 2.25 })
|
|
319
|
+
}
|
|
320
|
+
) })
|
|
321
|
+
] }) : null
|
|
322
|
+
] });
|
|
323
|
+
};
|
|
324
|
+
export {
|
|
325
|
+
xe as default
|
|
326
|
+
};
|
|
327
|
+
//# sourceMappingURL=Player.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport \"./player.css\";\n\nexport type PlayerProps = React.ComponentProps<\"div\"> & {\n audioList?: SlideAudioItem[];\n currentAudioIndex?: number;\n defaultPlaying?: boolean;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n onEnded?: (audioIndex: number) => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\n};\n\nconst PauseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M12 10H16V24H12V10ZM18 10H22V24H18V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M13.3333 10L23.3333 16.6667L13.3333 23.3333V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst Player: React.FC<PlayerProps> = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n onPrev,\n onNext,\n onFullscreen,\n onEnded,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n ...props\n}) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const audioSrcRef = useRef<string | null>(null);\n const currentAudioKeyRef = useRef<string | null>(null);\n const currentSegmentIndexRef = useRef(0);\n const waitingSegmentIndexRef = useRef<number | null>(null);\n const currentAudioRef = useRef<SlideAudioItem | undefined>(undefined);\n const currentAudioSegmentsRef = useRef<\n NonNullable<SlideAudioItem[\"audioSegments\"]>\n >([]);\n const isWaitingForSegmentRef = useRef(false);\n const pendingAutoPlayRef = useRef(false);\n const pendingSeekTimeRef = useRef<number | null>(null);\n const isSwitchingSegmentRef = useRef(false);\n const [isPlaying, setIsPlaying] = useState(defaultPlaying);\n const currentAudio =\n currentAudioIndex >= 0 ? audioList[currentAudioIndex] : undefined;\n const currentAudioUrl = currentAudio?.audioUrl;\n const currentAudioSegments = useMemo(\n () =>\n [...(currentAudio?.audioSegments ?? [])].sort(\n (prevSegment, nextSegment) =>\n prevSegment.segment_index - nextSegment.segment_index\n ),\n [currentAudio?.audioSegments]\n );\n const currentAudioKey = `${currentAudioIndex}:${currentAudio?.serialNumber ?? \"none\"}:${currentAudioUrl ?? \"\"}`;\n\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\n\n useEffect(() => {\n currentAudioSegmentsRef.current = currentAudioSegments;\n }, [currentAudioSegments]);\n\n const getSegmentSrc = useCallback((audioData: string) => {\n if (!audioData) {\n return \"\";\n }\n\n if (audioData.startsWith(\"data:\")) {\n return audioData;\n }\n\n return `data:audio/mpeg;base64,${audioData}`;\n }, []);\n\n const resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n pendingAutoPlayRef.current = false;\n pendingSeekTimeRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = null;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n setIsPlaying(false);\n }, [currentAudioIndex]);\n\n const tryPlayCurrentAudio = useCallback(\n (_reason: string) => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return false;\n }\n\n const playPromise = audioElement.play();\n\n if (playPromise && typeof playPromise.then === \"function\") {\n void playPromise\n .then(() => {\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n })\n .catch((_error: unknown) => {\n setIsPlaying(false);\n });\n }\n\n return true;\n },\n [currentAudioIndex]\n );\n\n const startSegmentPlayback = useCallback(\n (segmentIndex: number, _reason: string) => {\n const audioElement = audioRef.current;\n const segment = currentAudioSegmentsRef.current[segmentIndex];\n\n if (!audioElement || !segment) {\n return false;\n }\n\n const nextAudioSrc = getSegmentSrc(segment.audio_data);\n\n currentSegmentIndexRef.current = segmentIndex;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n\n const hasNewSrc = audioSrcRef.current !== nextAudioSrc;\n\n if (hasNewSrc) {\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = nextAudioSrc;\n audioElement.src = nextAudioSrc;\n audioElement.load();\n }\n\n pendingSeekTimeRef.current = 0;\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = 0;\n pendingSeekTimeRef.current = null;\n }\n\n if (!defaultPlaying) {\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return true;\n }\n\n if (hasNewSrc) {\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [currentAudioIndex, defaultPlaying, getSegmentSrc, tryPlayCurrentAudio]\n );\n\n const finishAudioItem = useCallback(() => {\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n }, [currentAudioIndex, onEnded]);\n\n const handleSegmentEnded = useCallback(() => {\n const nextSegmentIndex = currentSegmentIndexRef.current + 1;\n const segments = currentAudioSegmentsRef.current;\n const nextSegment = segments[nextSegmentIndex];\n const activeAudio = currentAudioRef.current;\n const hasFinal = segments.some((segment) => segment.is_final);\n\n if (nextSegment) {\n startSegmentPlayback(nextSegmentIndex, \"ended\");\n return;\n }\n\n if (activeAudio?.isAudioStreaming || !hasFinal) {\n currentSegmentIndexRef.current = nextSegmentIndex;\n waitingSegmentIndexRef.current = nextSegmentIndex;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n setIsPlaying(defaultPlaying);\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [\n currentAudioIndex,\n defaultPlaying,\n finishAudioItem,\n startSegmentPlayback,\n ]);\n\n useEffect(() => {\n if (currentAudioKeyRef.current === currentAudioKey) {\n return;\n }\n\n currentAudioKeyRef.current = currentAudioKey;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioSrcRef.current = null;\n\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n setIsPlaying(false);\n }, [\n currentAudioIndex,\n currentAudioKey,\n currentAudioSegments.length,\n currentAudioUrl,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (!currentAudio) {\n resetAudio();\n return;\n }\n\n if (currentAudioUrl) {\n const hasNewSrc = audioSrcRef.current !== currentAudioUrl;\n\n if (hasNewSrc) {\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = currentAudioUrl;\n audioElement.src = currentAudioUrl;\n audioElement.load();\n }\n\n pendingSeekTimeRef.current = 0;\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = 0;\n pendingSeekTimeRef.current = null;\n }\n\n pendingAutoPlayRef.current = defaultPlaying;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n\n if (!defaultPlaying) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (!hasNewSrc) {\n tryPlayCurrentAudio(\"sync-url\");\n }\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (waitingSegmentIndexRef.current < currentAudioSegments.length) {\n startSegmentPlayback(waitingSegmentIndexRef.current, \"wait-resume\");\n return;\n }\n\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n setIsPlaying(defaultPlaying);\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n setIsPlaying(defaultPlaying);\n return;\n }\n\n resetAudio();\n return;\n }\n\n if (!audioSrcRef.current) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"effect-init\"\n );\n return;\n }\n\n if (!defaultPlaying) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"sync-paused-retry\");\n }\n }, [\n currentAudio,\n currentAudioIndex,\n currentAudioSegments,\n currentAudioUrl,\n defaultPlaying,\n resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n const handleAudioPlay = useCallback(() => {\n setIsPlaying(true);\n }, [currentAudioIndex]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n setIsPlaying(false);\n }, [currentAudioIndex]);\n\n const handleAudioCanPlay = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [currentAudioIndex, defaultPlaying, tryPlayCurrentAudio]);\n\n const handleLoadedMetadata = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n }, [currentAudioIndex]);\n\n const handleAudioEnded = useCallback(() => {\n isSwitchingSegmentRef.current = false;\n\n if (\n currentAudioRef.current?.audioUrl ||\n currentAudioSegmentsRef.current.length === 0\n ) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [currentAudioIndex, finishAudioItem, handleSegmentEnded]);\n\n const handleAudioError = useCallback(() => {\n setIsPlaying(false);\n }, [currentAudioIndex]);\n\n return (\n <div className={cn(\"slide-player\", className)} {...props}>\n <audio\n ref={audioRef}\n preload=\"metadata\"\n playsInline\n onLoadedMetadata={handleLoadedMetadata}\n onCanPlay={handleAudioCanPlay}\n onPlay={handleAudioPlay}\n onPause={handleAudioPause}\n onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <div className=\"slide-player__controls\">\n <div className=\"slide-player__group\">\n <button aria-label=\"More options\" className=\"hidden\" type=\"button\">\n <EllipsisVertical\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n <button aria-label=\"Volume\" className=\"hidden\" type=\"button\">\n <Volume2 className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label=\"Rewind\"\n className=\"slide-player__action\"\n disabled={prevDisabled}\n onClick={onPrev}\n type=\"button\"\n >\n <RotateCcw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={isPlaying ? \"Pause\" : \"Play\"}\n className=\"slide-player__toggle\"\n onClick={() => {\n const audioElement = audioRef.current;\n\n if (!audioElement || !currentAudio) {\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (isPlaying) {\n pendingAutoPlayRef.current = false;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n setIsPlaying(false);\n audioElement.pause();\n return;\n }\n\n pendingAutoPlayRef.current = true;\n setIsPlaying(true);\n return;\n }\n\n if (!audioElement.src && currentAudioSegments.length > 0) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"toggle\"\n );\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"toggle-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n }}\n type=\"button\"\n >\n {isPlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label=\"Fullscreen\"\n className=\"hidden\"\n onClick={onFullscreen}\n type=\"button\"\n >\n <Maximize className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n\n <div className=\"slide-player__separator\" />\n\n <div className=\"slide-player__group\">\n <button\n aria-label=\"Notes\"\n className={cn(\n \"slide-player__action\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default Player;\n"],"names":["PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","onPrev","onNext","onFullscreen","onEnded","onInteractionToggle","hasInteraction","isInteractionOpen","prevDisabled","nextDisabled","showControls","props","audioRef","useRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","isPlaying","setIsPlaying","useState","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","currentAudioKey","useEffect","getSegmentSrc","useCallback","audioData","resetAudio","audioElement","tryPlayCurrentAudio","_reason","playPromise","_error","startSegmentPlayback","segmentIndex","segment","nextAudioSrc","hasNewSrc","finishAudioItem","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioEnded","handleAudioError","cn","EllipsisVertical","Volume2","RotateCcw","RotateCw","Maximize","FilePenLine"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("../../_virtual/jsx-runtime.cjs.js"),t=require("react"),_e=require("../../lib/browserUserActivation.cjs.js"),I=require("../../lib/utils.cjs.js"),Te=require("../ContentRender/ContentRender.cjs.js"),oe=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const le=require("./interaction-defaults.cjs.js"),Pe=require("./Player.cjs.js"),Ae=require("./useSlide.cjs.js");;/* empty css */const Ne=1e3,ie=t.memo(({content:M,title:V,defaultButtonText:D,defaultInputText:H,defaultSelectedValues:w,onSend:L,readonly:_=!1})=>n.jsxRuntimeExports.jsxs("div",{className:"slide-player__interaction-card",children:[n.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-header",children:n.jsxRuntimeExports.jsx("p",{className:"slide-player__interaction-title",children:V})}),n.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:n.jsxRuntimeExports.jsx(Te.default,{content:M,defaultButtonText:D,defaultInputText:H,defaultSelectedValues:w,onSend:L,readonly:_,enableTypewriter:!1,sandboxMode:"content"})}),n.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-arrow"})]}));ie.displayName="InteractionOverlayCard";const ke=({elementList:M=[],showPlayer:V=!0,playerClassName:D,interactionTitle:H,playerAutoHideDelay:w=3e3,className:L,onPointerDown:_,...ue})=>{const Y=t.useRef(null),$=t.useRef(null),J=t.useRef(null),E=t.useRef(null),R=t.useRef(null),j=t.useRef(null),Q=t.useRef([]),T=t.useRef(!1),{currentElementList:o,slideElementList:K,currentIndex:W,audioList:X,currentAudioSequenceIndexes:x,currentInteractionElement:p,canGoPrev:ae,canGoNext:f,handlePrev:Z,handleNext:c}=Ae.default(M),ee=K.filter(e=>e.is_show!==!1).length===1,d=V&&(ee||X.length>0||!!p),[m,U]=t.useState(!0),[S,ce]=t.useState(!1),[de]=t.useState(()=>_e.hasBrowserUserActivation()),fe=de||S,[me,P]=t.useState(-1),[A,N]=t.useState(-1),[r,z]=t.useState(),[C,k]=t.useState(!1),h=t.useCallback(()=>{E.current!==null&&(window.clearTimeout(E.current),E.current=null)},[]),u=t.useCallback(()=>{j.current!==null&&(window.clearTimeout(j.current),j.current=null)},[]),b=t.useCallback(()=>{R.current!==null&&(window.clearTimeout(R.current),R.current=null)},[]),y=t.useCallback(()=>{b(),u(),P(-1),N(-1),z(void 0),k(!1)},[b,u]),q=t.useCallback(()=>{const e=x[0];return typeof e!="number"?!1:(N(0),P(e),!0)},[x]),F=t.useCallback(()=>{u(),k(!1),!q()&&f&&c()},[f,u,c,q]),v=t.useCallback((e=S)=>{d&&(U(!0),h(),!(!e||w<=0)&&(E.current=window.setTimeout(()=>{U(!1),E.current=null},w)))},[h,S,w,d]);t.useEffect(()=>()=>{b(),h(),u()},[b,u,h]),t.useEffect(()=>{if(!d){h(),U(!1);return}S||v(!0)},[h,S,d,v]),t.useEffect(()=>{if(y(),!(o.length===0&&!p)){if(p){z(p),k(!0);return}if(!q()&&f)return R.current=window.setTimeout(()=>{R.current=null,c()},Ne),()=>{b()}}},[f,b,o,p,c,y,q]);const te=t.useMemo(()=>r?le.getInteractionDefaultValues(typeof r.content=="string"?r.content:void 0,r.user_input):{},[r]),xe=t.useMemo(()=>{if(r)return le.getInteractionDefaultSelectedValues(typeof r.content=="string"?r.content:void 0,r.user_input)},[r]),G=!!r?.user_input?.trim(),pe=t.useCallback(e=>{const i=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");z(s=>!s||!i?s:{...s,user_input:i}),F()},[F]);t.useEffect(()=>{if(u(),!(!C||!G))return j.current=window.setTimeout(()=>{j.current=null,F()},2e3),()=>{u()}},[u,F,G,C]);const he=e=>e?e.type==="slot"?n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?n.jsxRuntimeExports.jsx(oe.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",type:"sandbox",content:e.content}):n.jsxRuntimeExports.jsx(oe.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,be=(e=[])=>{if(e.length===0)return null;const a=e.filter(s=>s.is_show!==!1).length,i=e.reduce((s,g,l)=>g.is_show!==!1?l:s,-1);return n.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((s,g)=>{const l=s.type==="html"&&s.is_show===!1;return n.jsxRuntimeExports.jsx("div",{ref:g===i?J:null,"aria-hidden":l||void 0,className:I.cn("w-full shrink-0",a===1&&s.is_show!==!1&&"slide-element--single",l?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":s.is_show===!1&&"hidden"),children:he(s)},s.serial_number??`${s.type}-${g}`)})})},ye=()=>{const e=Y.current;if(e){if(document.fullscreenElement){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},ne=t.useCallback(()=>{const e=$.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),ve=t.useCallback(()=>{T.current=!0,y(),Z()},[Z,y]),ge=t.useCallback(()=>{T.current=!0,y(),c()},[c,y]),we=t.useCallback(e=>{if(A<0||x[A]!==e)return;const a=A+1,i=x[a];if(typeof i=="number"){N(a),P(i);return}P(-1),N(-1),f&&c()},[f,x,A,c]),Ee=t.useCallback(()=>{r&&k(e=>!e)},[r]),re=t.useCallback(e=>{e.stopPropagation(),m&&v(!0)},[m,v]),se=t.useCallback(e=>{_?.(e),ce(!0),v(!0)},[_,v]),Re=!!r&&C,O=t.useMemo(()=>o.map((e,a)=>`${e.serial_number??`${e.type}-${a}`}:${e.operation??""}`),[o]),je=t.useMemo(()=>{const e=K.slice(W+1).find(i=>i.type==="html");return!e||o.some(i=>i.serial_number===e.serial_number)?o:[...o,{...e,is_show:!1}]},[o,W,K]);return t.useEffect(()=>{const e=Q.current,s=(e.length>0&&e.length<O.length&&e.every((l,B)=>l===O[B])?o.slice(e.length):[]).some(l=>l.operation==="append");if(Q.current=O,!s)return;const g=window.requestAnimationFrame(()=>{const l=$.current,B=J.current;if(!l||!B)return;const Se=l.getBoundingClientRect(),Ce=B.getBoundingClientRect(),Ie=l.scrollTop+(Ce.top-Se.top);l.scrollTo({top:Math.max(Ie,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(g)}},[o,O]),t.useEffect(()=>{if(!T.current||(T.current=!1,o.length===0))return;const e=window.requestAnimationFrame(()=>{ne()});return()=>{window.cancelAnimationFrame(e)}},[o,ne]),console.log("currentElement",o.at(-1),o,d,m,x,p,r,C),n.jsxRuntimeExports.jsxs("section",{ref:Y,className:I.cn("relative h-full w-full",L),onPointerDown:se,...ue,children:[n.jsxRuntimeExports.jsxs("div",{className:I.cn("h-full min-h-0 w-full",ee?"slide-content--single":"grid gap-4"),children:[d&&!m?n.jsxRuntimeExports.jsx("button",{"aria-label":"Show player controls",className:"slide-player-hit-area",onPointerDown:se,type:"button"}):null,o.length>0?n.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:n.jsxRuntimeExports.jsx("div",{ref:$,className:"slide-stage__layer w-full",children:be(je)})}):null]}),Re?n.jsxRuntimeExports.jsx("div",{className:I.cn("slide-interaction-overlay",m&&d?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:re,onPointerDown:re,children:n.jsxRuntimeExports.jsx(ie,{content:String(r?.content??""),defaultButtonText:te.buttonText??"",defaultInputText:te.inputText??"",defaultSelectedValues:xe,onSend:pe,readonly:G,title:H??"Submit the content below to continue."})}):null,d?n.jsxRuntimeExports.jsx(Pe.default,{audioList:X,className:I.cn("absolute left-1/2 bottom-6 z-[2] -translate-x-1/2",D,!m&&"pointer-events-none opacity-0"),currentAudioIndex:me,defaultPlaying:fe,hasInteraction:!!r,isInteractionOpen:C,nextDisabled:!f,onEnded:we,onFullscreen:ye,onInteractionToggle:Ee,onNext:ge,onPrev:ve,prevDisabled:!ae,showControls:m}):null]})};exports.default=ke;
|
|
2
|
+
//# sourceMappingURL=Slide.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slide.cjs.js","sources":["../../../src/components/Slide/Slide.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { hasBrowserUserActivation } from \"../../lib/browserUserActivation\";\nimport { cn } from \"../../lib/utils\";\nimport ContentRender from \"../ContentRender\";\nimport IframeSandbox from \"../ContentRender/IframeSandbox\";\nimport type { OnSendContentParams } from \"../types\";\nimport {\n getInteractionDefaultSelectedValues,\n getInteractionDefaultValues,\n} from \"./interaction-defaults\";\nimport Player from \"./Player\";\nimport type { Element } from \"./types\";\nimport useSlide from \"./useSlide\";\nimport \"./slide.css\";\nexport type { Element, ElementAudioSegment } from \"./types\";\n\nconst CHECKPOINT_AUTO_ADVANCE_DELAY_MS = 1000;\n\ninterface InteractionOverlayCardProps {\n content: string;\n title: string;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n onSend?: (content: OnSendContentParams) => void;\n readonly?: boolean;\n}\n\nconst InteractionOverlayCard = memo(\n ({\n content,\n title,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n onSend,\n readonly = false,\n }: InteractionOverlayCardProps) => (\n <div className=\"slide-player__interaction-card\">\n <div className=\"slide-player__interaction-header\">\n <p className=\"slide-player__interaction-title\">{title}</p>\n </div>\n <div className=\"slide-player__interaction-body\">\n <ContentRender\n content={content}\n defaultButtonText={defaultButtonText}\n defaultInputText={defaultInputText}\n defaultSelectedValues={defaultSelectedValues}\n onSend={onSend}\n readonly={readonly}\n enableTypewriter={false}\n sandboxMode=\"content\"\n />\n </div>\n <div className=\"slide-player__interaction-arrow\" />\n </div>\n )\n);\n\nInteractionOverlayCard.displayName = \"InteractionOverlayCard\";\n\nexport interface SlideProps extends React.ComponentProps<\"section\"> {\n elementList?: Element[];\n showPlayer?: boolean;\n playerClassName?: string;\n interactionTitle?: string;\n playerAutoHideDelay?: number;\n}\n\nconst Slide: React.FC<SlideProps> = ({\n elementList = [],\n showPlayer = true,\n playerClassName,\n interactionTitle,\n playerAutoHideDelay = 3000,\n className,\n onPointerDown,\n ...props\n}) => {\n const sectionRef = useRef<HTMLElement | null>(null);\n const stageLayerRef = useRef<HTMLDivElement | null>(null);\n const lastElementRef = useRef<HTMLDivElement | null>(null);\n const playerHideTimerRef = useRef<number | null>(null);\n const autoAdvanceTimerRef = useRef<number | null>(null);\n const interactionAutoCloseTimerRef = useRef<number | null>(null);\n const prevRenderElementKeysRef = useRef<string[]>([]);\n const shouldScrollToBottomRef = useRef(false);\n const {\n currentElementList,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev: goPrev,\n handleNext: goNext,\n } = useSlide(elementList);\n const visibleCheckpointCount = slideElementList.filter(\n (element) => element.is_show !== false\n ).length;\n const isSingleSlide = visibleCheckpointCount === 1;\n const shouldRenderPlayer =\n showPlayer &&\n (isSingleSlide ||\n audioList.length > 0 ||\n Boolean(currentInteractionElement));\n const [isPlayerVisible, setIsPlayerVisible] = useState(true);\n const [hasPlayerInteracted, setHasPlayerInteracted] = useState(false);\n const [shouldAutoPlay] = useState(() => hasBrowserUserActivation());\n const canAutoPlayAudio = shouldAutoPlay || hasPlayerInteracted;\n const [currentAudioIndex, setCurrentAudioIndex] = useState(-1);\n const [currentAudioSequencePosition, setCurrentAudioSequencePosition] =\n useState(-1);\n const [activeInteractionElement, setActiveInteractionElement] = useState<\n Element | undefined\n >();\n const [isInteractionOverlayOpen, setIsInteractionOverlayOpen] =\n useState(false);\n\n const clearPlayerHideTimer = useCallback(() => {\n if (playerHideTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(playerHideTimerRef.current);\n playerHideTimerRef.current = null;\n }, []);\n\n const clearInteractionAutoCloseTimer = useCallback(() => {\n if (interactionAutoCloseTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionAutoCloseTimerRef.current);\n interactionAutoCloseTimerRef.current = null;\n }, []);\n\n const clearAutoAdvanceTimer = useCallback(() => {\n if (autoAdvanceTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(autoAdvanceTimerRef.current);\n autoAdvanceTimerRef.current = null;\n }, []);\n\n const resetAudioSequence = useCallback(() => {\n clearAutoAdvanceTimer();\n clearInteractionAutoCloseTimer();\n setCurrentAudioIndex(-1);\n setCurrentAudioSequencePosition(-1);\n setActiveInteractionElement(undefined);\n setIsInteractionOverlayOpen(false);\n }, [clearAutoAdvanceTimer, clearInteractionAutoCloseTimer]);\n\n const startCurrentAudioSequence = useCallback(() => {\n const nextAudioIndex = currentAudioSequenceIndexes[0];\n\n if (typeof nextAudioIndex !== \"number\") {\n return false;\n }\n\n // Start the first audio segment for the current step immediately.\n setCurrentAudioSequencePosition(0);\n setCurrentAudioIndex(nextAudioIndex);\n return true;\n }, [currentAudioSequenceIndexes]);\n\n const continueAfterInteraction = useCallback(() => {\n clearInteractionAutoCloseTimer();\n setIsInteractionOverlayOpen(false);\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (canGoNext) {\n goNext();\n }\n }, [\n canGoNext,\n clearInteractionAutoCloseTimer,\n goNext,\n startCurrentAudioSequence,\n ]);\n\n const showPlayerControls = useCallback(\n (enableAutoHide = hasPlayerInteracted) => {\n if (!shouldRenderPlayer) {\n return;\n }\n\n setIsPlayerVisible(true);\n clearPlayerHideTimer();\n\n if (!enableAutoHide || playerAutoHideDelay <= 0) {\n return;\n }\n\n playerHideTimerRef.current = window.setTimeout(() => {\n setIsPlayerVisible(false);\n playerHideTimerRef.current = null;\n }, playerAutoHideDelay);\n },\n [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAutoHideDelay,\n shouldRenderPlayer,\n ]\n );\n\n useEffect(() => {\n return () => {\n clearAutoAdvanceTimer();\n clearPlayerHideTimer();\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearPlayerHideTimer,\n ]);\n\n useEffect(() => {\n if (!shouldRenderPlayer) {\n clearPlayerHideTimer();\n setIsPlayerVisible(false);\n return;\n }\n\n if (!hasPlayerInteracted) {\n // Keep the initial player visible briefly, then hide it automatically.\n showPlayerControls(true);\n }\n }, [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n shouldRenderPlayer,\n showPlayerControls,\n ]);\n\n useEffect(() => {\n resetAudioSequence();\n\n if (currentElementList.length === 0 && !currentInteractionElement) {\n return;\n }\n\n if (currentInteractionElement) {\n // Show the interaction gate before playing any follow-up audio.\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(true);\n return;\n }\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (!canGoNext) {\n return;\n }\n\n // Auto-advance silent checkpoint-only steps so playback flow does not stall.\n autoAdvanceTimerRef.current = window.setTimeout(() => {\n autoAdvanceTimerRef.current = null;\n goNext();\n }, CHECKPOINT_AUTO_ADVANCE_DELAY_MS);\n\n return () => {\n clearAutoAdvanceTimer();\n };\n }, [\n canGoNext,\n clearAutoAdvanceTimer,\n currentElementList,\n currentInteractionElement,\n goNext,\n resetAudioSequence,\n startCurrentAudioSequence,\n ]);\n\n const interactionDefaults = useMemo(() => {\n if (!activeInteractionElement) {\n return {};\n }\n\n return getInteractionDefaultValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input\n );\n }, [activeInteractionElement]);\n\n const interactionDefaultSelectedValues = useMemo(() => {\n if (!activeInteractionElement) {\n return undefined;\n }\n\n return getInteractionDefaultSelectedValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input\n );\n }, [activeInteractionElement]);\n\n const hasResolvedInteractionInput = Boolean(\n activeInteractionElement?.user_input?.trim()\n );\n\n const handleInteractionSend = useCallback(\n (content: OnSendContentParams) => {\n const submittedValues = [\n ...(content.selectedValues ?? []),\n content.inputText?.trim() ?? \"\",\n content.buttonText?.trim() ?? \"\",\n ].filter(Boolean);\n const resolvedUserInput = submittedValues.join(\", \");\n\n setActiveInteractionElement((prevElement) => {\n if (!prevElement || !resolvedUserInput) {\n return prevElement;\n }\n\n return {\n ...prevElement,\n user_input: resolvedUserInput,\n };\n });\n\n continueAfterInteraction();\n },\n [continueAfterInteraction]\n );\n\n useEffect(() => {\n clearInteractionAutoCloseTimer();\n\n if (!isInteractionOverlayOpen || !hasResolvedInteractionInput) {\n return;\n }\n\n interactionAutoCloseTimerRef.current = window.setTimeout(() => {\n interactionAutoCloseTimerRef.current = null;\n\n continueAfterInteraction();\n }, 2000);\n\n return () => {\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearInteractionAutoCloseTimer,\n continueAfterInteraction,\n hasResolvedInteractionInput,\n isInteractionOverlayOpen,\n ]);\n\n const renderSlideElement = (element?: Element) => {\n if (!element) {\n return null;\n }\n\n if (element.type === \"slot\") {\n return <>{element.content}</>;\n }\n\n if (element.type === \"html\") {\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n type=\"sandbox\"\n content={element.content as string}\n />\n );\n }\n\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n type=\"markdown\"\n content={element.content as string}\n />\n );\n };\n\n const renderSlideElementList = (elementList: Element[] = []) => {\n if (elementList.length === 0) {\n return null;\n }\n\n const visibleElementCount = elementList.filter(\n (element) => element.is_show !== false\n ).length;\n const lastVisibleElementIndex = elementList.reduce(\n (lastVisibleIndex, element, index) =>\n element.is_show !== false ? index : lastVisibleIndex,\n -1\n );\n\n return (\n <div className=\"slide-stage__content flex w-full flex-col gap-4\">\n {elementList.map((element, index) => {\n const isPreRenderedHtml =\n element.type === \"html\" && element.is_show === false;\n\n return (\n <div\n key={element.serial_number ?? `${element.type}-${index}`}\n ref={index === lastVisibleElementIndex ? lastElementRef : null}\n aria-hidden={isPreRenderedHtml || undefined}\n className={cn(\n \"w-full shrink-0\",\n visibleElementCount === 1 &&\n element.is_show !== false &&\n \"slide-element--single\",\n isPreRenderedHtml\n ? \"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0\"\n : element.is_show === false && \"hidden\"\n )}\n >\n {renderSlideElement(element)}\n </div>\n );\n })}\n </div>\n );\n };\n\n const handleFullscreen = () => {\n const target = sectionRef.current;\n if (!target) return;\n\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n\n target.requestFullscreen?.().catch(() => {});\n };\n\n const scrollStageToBottom = useCallback(() => {\n const stageLayerElement = stageLayerRef.current;\n\n if (!stageLayerElement) {\n return;\n }\n\n // Keep the latest content visible after manual player navigation.\n stageLayerElement.scrollTo({\n top: stageLayerElement.scrollHeight,\n behavior: \"smooth\",\n });\n }, []);\n\n const handlePrev = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n resetAudioSequence();\n goPrev();\n }, [goPrev, resetAudioSequence]);\n\n const handleNext = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n resetAudioSequence();\n goNext();\n }, [goNext, resetAudioSequence]);\n\n const handlePlayerEnded = useCallback(\n (audioIndex: number) => {\n if (currentAudioSequencePosition < 0) {\n return;\n }\n\n if (\n currentAudioSequenceIndexes[currentAudioSequencePosition] !== audioIndex\n ) {\n return;\n }\n\n const nextSequencePosition = currentAudioSequencePosition + 1;\n const nextAudioIndex = currentAudioSequenceIndexes[nextSequencePosition];\n\n if (typeof nextAudioIndex === \"number\") {\n setCurrentAudioSequencePosition(nextSequencePosition);\n setCurrentAudioIndex(nextAudioIndex);\n return;\n }\n\n setCurrentAudioIndex(-1);\n setCurrentAudioSequencePosition(-1);\n\n if (canGoNext) {\n goNext();\n }\n },\n [\n canGoNext,\n currentAudioSequenceIndexes,\n currentAudioSequencePosition,\n goNext,\n ]\n );\n\n const handleInteractionToggle = useCallback(() => {\n if (!activeInteractionElement) {\n return;\n }\n\n setIsInteractionOverlayOpen((prevOpen) => !prevOpen);\n }, [activeInteractionElement]);\n\n const stopOverlayPropagation = useCallback(\n (\n event:\n | React.PointerEvent<HTMLDivElement>\n | React.MouseEvent<HTMLDivElement>\n ) => {\n event.stopPropagation();\n\n // Keep the player visible a bit longer when users interact with the overlay.\n if (isPlayerVisible) {\n showPlayerControls(true);\n }\n },\n [isPlayerVisible, showPlayerControls]\n );\n\n const handleSurfacePointerDown = useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n onPointerDown?.(event);\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n [onPointerDown, showPlayerControls]\n );\n\n const shouldShowInteractionOverlay =\n Boolean(activeInteractionElement) && isInteractionOverlayOpen;\n\n const currentRenderElementKeys = useMemo(\n () =>\n currentElementList.map(\n (element, index) =>\n `${element.serial_number ?? `${element.type}-${index}`}:${element.operation ?? \"\"}`\n ),\n [currentElementList]\n );\n\n const renderElementList = useMemo(() => {\n const nextHtmlElement = slideElementList\n .slice(currentIndex + 1)\n .find((element) => element.type === \"html\");\n\n if (!nextHtmlElement) {\n return currentElementList;\n }\n\n const hasMountedNextHtml = currentElementList.some(\n (element) => element.serial_number === nextHtmlElement.serial_number\n );\n\n if (hasMountedNextHtml) {\n return currentElementList;\n }\n\n // Keep the next html sandbox mounted offscreen so it is ready when revealed.\n return [...currentElementList, { ...nextHtmlElement, is_show: false }];\n }, [currentElementList, currentIndex, slideElementList]);\n\n useEffect(() => {\n const prevKeys = prevRenderElementKeysRef.current;\n const hasStablePrefix =\n prevKeys.length > 0 &&\n prevKeys.length < currentRenderElementKeys.length &&\n prevKeys.every((key, index) => key === currentRenderElementKeys[index]);\n const appendedElements = hasStablePrefix\n ? currentElementList.slice(prevKeys.length)\n : [];\n const shouldAutoScrollToAppend = appendedElements.some(\n (element) => element.operation === \"append\"\n );\n\n prevRenderElementKeysRef.current = currentRenderElementKeys;\n\n if (!shouldAutoScrollToAppend) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n const stageLayerElement = stageLayerRef.current;\n const targetElement = lastElementRef.current;\n\n if (!stageLayerElement || !targetElement) {\n return;\n }\n\n const stageLayerRect = stageLayerElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const nextScrollTop =\n stageLayerElement.scrollTop + (targetRect.top - stageLayerRect.top);\n\n // Keep newly appended content visible when the current slide grows downward.\n stageLayerElement.scrollTo({\n top: Math.max(nextScrollTop, 0),\n behavior: \"smooth\",\n });\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, currentRenderElementKeys]);\n\n useEffect(() => {\n if (!shouldScrollToBottomRef.current) {\n return;\n }\n\n shouldScrollToBottomRef.current = false;\n\n if (currentElementList.length === 0) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n scrollStageToBottom();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, scrollStageToBottom]);\n\n console.log(\n \"currentElement\",\n currentElementList.at(-1),\n currentElementList,\n shouldRenderPlayer,\n isPlayerVisible,\n currentAudioSequenceIndexes,\n currentInteractionElement,\n activeInteractionElement,\n isInteractionOverlayOpen\n );\n\n return (\n <section\n ref={sectionRef}\n className={cn(\"relative h-full w-full\", className)}\n onPointerDown={handleSurfacePointerDown}\n {...props}\n >\n <div\n className={cn(\n \"h-full min-h-0 w-full\",\n isSingleSlide ? \"slide-content--single\" : \"grid gap-4\"\n )}\n >\n {shouldRenderPlayer && !isPlayerVisible ? (\n <button\n aria-label=\"Show player controls\"\n className=\"slide-player-hit-area\"\n onPointerDown={handleSurfacePointerDown}\n type=\"button\"\n />\n ) : null}\n {currentElementList.length > 0 ? (\n <div className=\"slide-stage\">\n <div ref={stageLayerRef} className=\"slide-stage__layer w-full\">\n {renderSlideElementList(renderElementList)}\n </div>\n </div>\n ) : null}\n </div>\n\n {shouldShowInteractionOverlay ? (\n <div\n className={cn(\n \"slide-interaction-overlay\",\n isPlayerVisible && shouldRenderPlayer\n ? \"slide-interaction-overlay--with-player\"\n : \"slide-interaction-overlay--standalone\"\n )}\n onClick={stopOverlayPropagation}\n onPointerDown={stopOverlayPropagation}\n >\n <InteractionOverlayCard\n content={String(activeInteractionElement?.content ?? \"\")}\n defaultButtonText={interactionDefaults.buttonText ?? \"\"}\n defaultInputText={interactionDefaults.inputText ?? \"\"}\n defaultSelectedValues={interactionDefaultSelectedValues}\n onSend={handleInteractionSend}\n readonly={hasResolvedInteractionInput}\n title={interactionTitle ?? \"Submit the content below to continue.\"}\n />\n </div>\n ) : null}\n\n {shouldRenderPlayer ? (\n <Player\n audioList={audioList}\n className={cn(\n \"absolute left-1/2 bottom-6 z-[2] -translate-x-1/2\",\n playerClassName,\n !isPlayerVisible && \"pointer-events-none opacity-0\"\n )}\n currentAudioIndex={currentAudioIndex}\n defaultPlaying={canAutoPlayAudio}\n hasInteraction={Boolean(activeInteractionElement)}\n isInteractionOpen={isInteractionOverlayOpen}\n nextDisabled={!canGoNext}\n onEnded={handlePlayerEnded}\n onFullscreen={handleFullscreen}\n onInteractionToggle={handleInteractionToggle}\n onNext={handleNext}\n onPrev={handlePrev}\n prevDisabled={!canGoPrev}\n showControls={isPlayerVisible}\n />\n ) : null}\n </section>\n );\n};\n\nexport default Slide;\n"],"names":["CHECKPOINT_AUTO_ADVANCE_DELAY_MS","InteractionOverlayCard","memo","content","title","defaultButtonText","defaultInputText","defaultSelectedValues","onSend","readonly","jsxs","jsx","ContentRender","Slide","elementList","showPlayer","playerClassName","interactionTitle","playerAutoHideDelay","className","onPointerDown","props","sectionRef","useRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","prevRenderElementKeysRef","shouldScrollToBottomRef","currentElementList","slideElementList","currentIndex","audioList","currentAudioSequenceIndexes","currentInteractionElement","canGoPrev","canGoNext","goPrev","goNext","useSlide","isSingleSlide","element","shouldRenderPlayer","isPlayerVisible","setIsPlayerVisible","useState","hasPlayerInteracted","setHasPlayerInteracted","shouldAutoPlay","hasBrowserUserActivation","canAutoPlayAudio","currentAudioIndex","setCurrentAudioIndex","currentAudioSequencePosition","setCurrentAudioSequencePosition","activeInteractionElement","setActiveInteractionElement","isInteractionOverlayOpen","setIsInteractionOverlayOpen","clearPlayerHideTimer","useCallback","clearInteractionAutoCloseTimer","clearAutoAdvanceTimer","resetAudioSequence","startCurrentAudioSequence","nextAudioIndex","continueAfterInteraction","showPlayerControls","enableAutoHide","useEffect","interactionDefaults","useMemo","getInteractionDefaultValues","interactionDefaultSelectedValues","getInteractionDefaultSelectedValues","hasResolvedInteractionInput","handleInteractionSend","resolvedUserInput","prevElement","renderSlideElement","Fragment","IframeSandbox","renderSlideElementList","visibleElementCount","lastVisibleElementIndex","lastVisibleIndex","index","isPreRenderedHtml","cn","handleFullscreen","target","scrollStageToBottom","stageLayerElement","handlePrev","handleNext","handlePlayerEnded","audioIndex","nextSequencePosition","handleInteractionToggle","prevOpen","stopOverlayPropagation","event","handleSurfacePointerDown","shouldShowInteractionOverlay","currentRenderElementKeys","renderElementList","nextHtmlElement","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","Player"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { Element } from './types';
|
|
3
|
+
export type { Element, ElementAudioSegment } from './types';
|
|
4
|
+
export interface SlideProps extends React.ComponentProps<"section"> {
|
|
5
|
+
elementList?: Element[];
|
|
6
|
+
showPlayer?: boolean;
|
|
7
|
+
playerClassName?: string;
|
|
8
|
+
interactionTitle?: string;
|
|
9
|
+
playerAutoHideDelay?: number;
|
|
10
|
+
}
|
|
11
|
+
declare const Slide: React.FC<SlideProps>;
|
|
12
|
+
export default Slide;
|