@linktr.ee/messaging-react 1.27.0 → 1.28.0-rc-1776231821
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/Creator-BFpHsh2u.js +318 -0
- package/dist/Creator-BFpHsh2u.js.map +1 -0
- package/dist/MediaPlayer-DXz4IBLx.js +313 -0
- package/dist/MediaPlayer-DXz4IBLx.js.map +1 -0
- package/dist/Visitor-C1Fcrgd6.js +199 -0
- package/dist/Visitor-C1Fcrgd6.js.map +1 -0
- package/dist/assets/index.css +1 -1
- package/dist/index.d.ts +13 -16
- package/dist/index.js +27 -35
- package/dist/index.js.map +1 -1
- package/package.json +1 -2
- package/src/components/CustomMessage/CustomMessage.stories.tsx +1 -1
- package/src/components/CustomMessage/index.tsx +0 -1
- package/src/components/LockedAttachment/LockedAttachment.stories.tsx +143 -49
- package/src/components/LockedAttachment/components/Creator.tsx +406 -114
- package/src/components/LockedAttachment/components/MediaPlayer.tsx +162 -80
- package/src/components/LockedAttachment/components/Visitor.tsx +205 -145
- package/src/components/LockedAttachment/index.tsx +7 -7
- package/src/components/LockedAttachment/types.ts +1 -5
- package/src/components/LockedAttachment/utils/icons.ts +2 -1
- package/src/components/LockedAttachment/utils/mimeType.test.ts +29 -7
- package/src/components/LockedAttachment/utils/mimeType.ts +3 -1
- package/src/types.ts +0 -1
- package/dist/Creator-B6M8dB0U.js +0 -87
- package/dist/Creator-B6M8dB0U.js.map +0 -1
- package/dist/MediaPlayer-DsjlYGGH.js +0 -539
- package/dist/MediaPlayer-DsjlYGGH.js.map +0 -1
- package/dist/Preview-DqAv16NS.js +0 -87
- package/dist/Preview-DqAv16NS.js.map +0 -1
- package/dist/Visitor-CpmFZRGO.js +0 -175
- package/dist/Visitor-CpmFZRGO.js.map +0 -1
- package/dist/dash.all.min-Duv4lvGS.js +0 -18858
- package/dist/dash.all.min-Duv4lvGS.js.map +0 -1
- package/dist/hls-Bogc7CBn.js +0 -21710
- package/dist/hls-Bogc7CBn.js.map +0 -1
- package/dist/index-Da-xN4Yq.js +0 -16142
- package/dist/index-Da-xN4Yq.js.map +0 -1
- package/dist/index-Dj9rqWcU.js +0 -69
- package/dist/index-Dj9rqWcU.js.map +0 -1
- package/dist/mixin-B6jYfIcp.js +0 -808
- package/dist/mixin-B6jYfIcp.js.map +0 -1
- package/dist/react-BxlQMOfz.js +0 -419
- package/dist/react-BxlQMOfz.js.map +0 -1
- package/dist/react-COAP-MIW.js +0 -377
- package/dist/react-COAP-MIW.js.map +0 -1
- package/dist/react-Cn4WlMcl.js +0 -3108
- package/dist/react-Cn4WlMcl.js.map +0 -1
- package/dist/react-CwTJArKY.js +0 -459
- package/dist/react-CwTJArKY.js.map +0 -1
- package/dist/react-DkfS_atT.js +0 -373
- package/dist/react-DkfS_atT.js.map +0 -1
- package/dist/react-Pea5fum1.js +0 -286
- package/dist/react-Pea5fum1.js.map +0 -1
- package/dist/react-RiBbsUDd.js +0 -534
- package/dist/react-RiBbsUDd.js.map +0 -1
- package/dist/react-dS1WBxxz.js +0 -238
- package/dist/react-dS1WBxxz.js.map +0 -1
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { jsxs as f, jsx as e, Fragment as j } from "react/jsx-runtime";
|
|
2
|
+
import { XIcon as F, CheckCircleIcon as R, PauseIcon as S, PlayIcon as X, EyeSlashIcon as M, EyeIcon as D } from "@phosphor-icons/react";
|
|
3
|
+
import N from "classnames";
|
|
4
|
+
import { useState as C, useRef as P, useEffect as x, useCallback as E } from "react";
|
|
5
|
+
import { g as q, r as z, M as B } from "./MediaPlayer-DXz4IBLx.js";
|
|
6
|
+
const L = (u) => {
|
|
7
|
+
const { onClose: n } = u;
|
|
8
|
+
return /* @__PURE__ */ e(
|
|
9
|
+
"button",
|
|
10
|
+
{
|
|
11
|
+
type: "button",
|
|
12
|
+
onClick: n,
|
|
13
|
+
className: "absolute left-3 top-3 z-40 flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
|
|
14
|
+
"aria-label": "Close preview",
|
|
15
|
+
children: /* @__PURE__ */ e(D, { className: "size-4", weight: "fill" })
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
}, T = (u) => {
|
|
19
|
+
const { thumbnail: n, mimeType: s, overlayIcon: o, onClick: l } = u;
|
|
20
|
+
return /* @__PURE__ */ f(
|
|
21
|
+
"button",
|
|
22
|
+
{
|
|
23
|
+
type: "button",
|
|
24
|
+
disabled: !l,
|
|
25
|
+
className: N(
|
|
26
|
+
"relative aspect-video block w-full overflow-hidden border-0 bg-black/5 p-0 text-left appearance-none",
|
|
27
|
+
{ "cursor-pointer": !!l, "cursor-default": !l }
|
|
28
|
+
),
|
|
29
|
+
onClick: l,
|
|
30
|
+
"aria-label": o ? "Toggle preview" : void 0,
|
|
31
|
+
children: [
|
|
32
|
+
n ? /* @__PURE__ */ e(
|
|
33
|
+
"img",
|
|
34
|
+
{
|
|
35
|
+
src: n,
|
|
36
|
+
alt: "",
|
|
37
|
+
className: "absolute inset-0 h-full w-full object-cover"
|
|
38
|
+
}
|
|
39
|
+
) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: z(s, {
|
|
40
|
+
className: "size-12 text-black/20",
|
|
41
|
+
weight: "regular"
|
|
42
|
+
}) }),
|
|
43
|
+
o && /* @__PURE__ */ e("div", { className: "pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white", children: /* @__PURE__ */ e(o, { className: "size-4", weight: "fill" }) })
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}, K = (u) => {
|
|
48
|
+
const { source: n, thumbnail: s, mimeType: o } = u, [l, r] = C(!1), [i, d] = C(0), [h, g] = C(!1), b = P(null), w = P(null), m = P(null);
|
|
49
|
+
x(() => {
|
|
50
|
+
const t = b.current;
|
|
51
|
+
t && (l ? t.play().catch(() => r(!1)) : t.pause());
|
|
52
|
+
}, [l]), x(() => {
|
|
53
|
+
if (!l) {
|
|
54
|
+
m.current !== null && cancelAnimationFrame(m.current);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const t = () => {
|
|
58
|
+
const a = b.current;
|
|
59
|
+
a && a.duration && !h && d(a.currentTime / a.duration), m.current = requestAnimationFrame(t);
|
|
60
|
+
};
|
|
61
|
+
return m.current = requestAnimationFrame(t), () => {
|
|
62
|
+
m.current !== null && cancelAnimationFrame(m.current);
|
|
63
|
+
};
|
|
64
|
+
}, [l, h]), x(() => {
|
|
65
|
+
r(!1), d(0);
|
|
66
|
+
}, [n]);
|
|
67
|
+
const p = E(
|
|
68
|
+
(t) => {
|
|
69
|
+
var I, A;
|
|
70
|
+
const a = w.current;
|
|
71
|
+
if (!a) return 0;
|
|
72
|
+
const k = "touches" in t ? ((I = t.touches[0]) == null ? void 0 : I.clientX) ?? ((A = t.changedTouches[0]) == null ? void 0 : A.clientX) ?? 0 : t.clientX, y = a.getBoundingClientRect();
|
|
73
|
+
return Math.max(0, Math.min(1, (k - y.left) / y.width));
|
|
74
|
+
},
|
|
75
|
+
[]
|
|
76
|
+
), c = E((t) => {
|
|
77
|
+
const a = b.current;
|
|
78
|
+
a && a.duration && (a.currentTime = t * a.duration);
|
|
79
|
+
}, []);
|
|
80
|
+
x(() => {
|
|
81
|
+
if (!h) return;
|
|
82
|
+
const t = (k) => {
|
|
83
|
+
const y = p(k);
|
|
84
|
+
d(y), c(y);
|
|
85
|
+
}, a = (k) => {
|
|
86
|
+
g(!1), c(p(k));
|
|
87
|
+
};
|
|
88
|
+
return window.addEventListener("mousemove", t), window.addEventListener("mouseup", a), window.addEventListener("touchmove", t, { passive: !0 }), window.addEventListener("touchend", a), () => {
|
|
89
|
+
window.removeEventListener("mousemove", t), window.removeEventListener("mouseup", a), window.removeEventListener("touchmove", t), window.removeEventListener("touchend", a);
|
|
90
|
+
};
|
|
91
|
+
}, [h, p, c]);
|
|
92
|
+
const v = E(() => r((t) => !t), []);
|
|
93
|
+
return /* @__PURE__ */ f("div", { className: "relative", children: [
|
|
94
|
+
n && /* @__PURE__ */ e(
|
|
95
|
+
"audio",
|
|
96
|
+
{
|
|
97
|
+
ref: b,
|
|
98
|
+
src: n,
|
|
99
|
+
loop: !0,
|
|
100
|
+
onEnded: () => {
|
|
101
|
+
r(!1), d(0);
|
|
102
|
+
},
|
|
103
|
+
children: /* @__PURE__ */ e("track", { kind: "captions" })
|
|
104
|
+
}
|
|
105
|
+
),
|
|
106
|
+
/* @__PURE__ */ e(
|
|
107
|
+
T,
|
|
108
|
+
{
|
|
109
|
+
thumbnail: s,
|
|
110
|
+
mimeType: o,
|
|
111
|
+
overlayIcon: n ? l ? S : X : void 0,
|
|
112
|
+
onClick: n ? v : void 0
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
n && /* @__PURE__ */ e("div", { className: "absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent", children: /* @__PURE__ */ e(
|
|
116
|
+
"div",
|
|
117
|
+
{
|
|
118
|
+
ref: w,
|
|
119
|
+
role: "slider",
|
|
120
|
+
"aria-label": "Playback position",
|
|
121
|
+
"aria-valuenow": Math.round(i * 100),
|
|
122
|
+
"aria-valuemin": 0,
|
|
123
|
+
"aria-valuemax": 100,
|
|
124
|
+
tabIndex: 0,
|
|
125
|
+
className: "relative flex h-4 w-full cursor-pointer items-center",
|
|
126
|
+
onMouseDown: (t) => {
|
|
127
|
+
t.stopPropagation(), g(!0);
|
|
128
|
+
const a = p(t);
|
|
129
|
+
d(a), c(a);
|
|
130
|
+
},
|
|
131
|
+
onTouchStart: (t) => {
|
|
132
|
+
t.stopPropagation(), g(!0);
|
|
133
|
+
const a = p(t);
|
|
134
|
+
d(a), c(a);
|
|
135
|
+
},
|
|
136
|
+
onClick: (t) => t.stopPropagation(),
|
|
137
|
+
onKeyDown: (t) => {
|
|
138
|
+
t.key === "ArrowRight" && c(Math.min(1, i + 0.05)), t.key === "ArrowLeft" && c(Math.max(0, i - 0.05));
|
|
139
|
+
},
|
|
140
|
+
children: /* @__PURE__ */ e("div", { className: "w-full overflow-hidden rounded-full bg-white/30 h-1", children: /* @__PURE__ */ e(
|
|
141
|
+
"div",
|
|
142
|
+
{
|
|
143
|
+
className: "h-full rounded-full bg-white",
|
|
144
|
+
style: { width: `${Math.round(i * 100)}%` }
|
|
145
|
+
}
|
|
146
|
+
) })
|
|
147
|
+
}
|
|
148
|
+
) })
|
|
149
|
+
] });
|
|
150
|
+
}, O = (u) => {
|
|
151
|
+
const { source: n, thumbnail: s, mimeType: o } = u, [l, r] = C(!1), i = () => r(!1);
|
|
152
|
+
return x(() => {
|
|
153
|
+
r(!1);
|
|
154
|
+
}, [n]), n ? /* @__PURE__ */ f(
|
|
155
|
+
"div",
|
|
156
|
+
{
|
|
157
|
+
className: N("relative overflow-hidden", {
|
|
158
|
+
"aspect-video": !l
|
|
159
|
+
}),
|
|
160
|
+
children: [
|
|
161
|
+
/* @__PURE__ */ e(
|
|
162
|
+
B,
|
|
163
|
+
{
|
|
164
|
+
source: n,
|
|
165
|
+
mimeType: o,
|
|
166
|
+
poster: s,
|
|
167
|
+
playing: l,
|
|
168
|
+
loop: !0,
|
|
169
|
+
controls: !1,
|
|
170
|
+
showProgress: !0,
|
|
171
|
+
onContainerClick: i,
|
|
172
|
+
muted: !0
|
|
173
|
+
}
|
|
174
|
+
),
|
|
175
|
+
!l && /* @__PURE__ */ f(
|
|
176
|
+
"button",
|
|
177
|
+
{
|
|
178
|
+
type: "button",
|
|
179
|
+
className: "absolute inset-0 block cursor-pointer border-0 p-0 text-left appearance-none",
|
|
180
|
+
onClick: () => r(!0),
|
|
181
|
+
"aria-label": "Expand video preview",
|
|
182
|
+
children: [
|
|
183
|
+
s ? /* @__PURE__ */ e(
|
|
184
|
+
"img",
|
|
185
|
+
{
|
|
186
|
+
src: s,
|
|
187
|
+
alt: "",
|
|
188
|
+
className: "absolute inset-0 h-full w-full object-cover"
|
|
189
|
+
}
|
|
190
|
+
) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: z(o, {
|
|
191
|
+
className: "size-12 text-black/20",
|
|
192
|
+
weight: "regular"
|
|
193
|
+
}) }),
|
|
194
|
+
/* @__PURE__ */ e("div", { className: "pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white", children: /* @__PURE__ */ e(M, { className: "size-4", weight: "fill" }) })
|
|
195
|
+
]
|
|
196
|
+
}
|
|
197
|
+
),
|
|
198
|
+
l && /* @__PURE__ */ e(L, { onClose: i })
|
|
199
|
+
]
|
|
200
|
+
}
|
|
201
|
+
) : /* @__PURE__ */ e(T, { thumbnail: s, mimeType: o });
|
|
202
|
+
}, U = (u) => {
|
|
203
|
+
const { source: n, thumbnail: s, mimeType: o, title: l } = u, [r, i] = C(!1), d = () => i(!1);
|
|
204
|
+
return x(() => {
|
|
205
|
+
i(!1);
|
|
206
|
+
}, [n]), r && n ? /* @__PURE__ */ f("div", { className: "relative", children: [
|
|
207
|
+
/* @__PURE__ */ e(
|
|
208
|
+
"button",
|
|
209
|
+
{
|
|
210
|
+
type: "button",
|
|
211
|
+
className: "block w-full cursor-pointer border-0 p-0 text-left appearance-none",
|
|
212
|
+
onClick: d,
|
|
213
|
+
"aria-label": "Close preview",
|
|
214
|
+
children: /* @__PURE__ */ e("img", { src: n, alt: l ?? "", className: "block w-full" })
|
|
215
|
+
}
|
|
216
|
+
),
|
|
217
|
+
/* @__PURE__ */ e(L, { onClose: d })
|
|
218
|
+
] }) : /* @__PURE__ */ e(
|
|
219
|
+
T,
|
|
220
|
+
{
|
|
221
|
+
thumbnail: s,
|
|
222
|
+
mimeType: o,
|
|
223
|
+
overlayIcon: n ? M : void 0,
|
|
224
|
+
onClick: n ? () => i(!0) : void 0
|
|
225
|
+
}
|
|
226
|
+
);
|
|
227
|
+
}, Q = (u) => {
|
|
228
|
+
const {
|
|
229
|
+
title: n,
|
|
230
|
+
mimeType: s = "application/octet-stream",
|
|
231
|
+
thumbnail: o,
|
|
232
|
+
source: l,
|
|
233
|
+
detail: r,
|
|
234
|
+
amountText: i,
|
|
235
|
+
placeholderTitle: d = "Attachment title",
|
|
236
|
+
placeholderAmountText: h,
|
|
237
|
+
paymentStatus: g,
|
|
238
|
+
onDismiss: b,
|
|
239
|
+
isPreview: w = !1
|
|
240
|
+
} = u, m = q(s), p = i ?? h, c = !i && !!h;
|
|
241
|
+
let v;
|
|
242
|
+
return w && m === "audio" ? v = /* @__PURE__ */ e(K, { source: l, thumbnail: o, mimeType: s }) : w && m === "video" ? v = /* @__PURE__ */ e(O, { source: l, thumbnail: o, mimeType: s }) : w && m === "image" ? v = /* @__PURE__ */ e(
|
|
243
|
+
U,
|
|
244
|
+
{
|
|
245
|
+
source: l,
|
|
246
|
+
thumbnail: o,
|
|
247
|
+
mimeType: s,
|
|
248
|
+
title: n
|
|
249
|
+
}
|
|
250
|
+
) : v = /* @__PURE__ */ e(T, { thumbnail: o, mimeType: s }), /* @__PURE__ */ f("div", { className: "relative w-[280px] select-none overflow-hidden rounded-3xl bg-white shadow-card", children: [
|
|
251
|
+
b && /* @__PURE__ */ e(
|
|
252
|
+
"button",
|
|
253
|
+
{
|
|
254
|
+
type: "button",
|
|
255
|
+
onClick: b,
|
|
256
|
+
className: "absolute right-3 top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
|
|
257
|
+
"aria-label": "Dismiss attachment",
|
|
258
|
+
children: /* @__PURE__ */ e(F, { className: "size-4", weight: "bold" })
|
|
259
|
+
}
|
|
260
|
+
),
|
|
261
|
+
v,
|
|
262
|
+
/* @__PURE__ */ f("div", { className: "px-4 pb-3 pt-3", children: [
|
|
263
|
+
/* @__PURE__ */ e(
|
|
264
|
+
"p",
|
|
265
|
+
{
|
|
266
|
+
className: N("mb-1.5 truncate text-base font-medium", {
|
|
267
|
+
"text-black/30": !n,
|
|
268
|
+
"text-black": !!n
|
|
269
|
+
}),
|
|
270
|
+
children: n || d
|
|
271
|
+
}
|
|
272
|
+
),
|
|
273
|
+
/* @__PURE__ */ f("div", { className: "flex items-center gap-1", children: [
|
|
274
|
+
z(s, {
|
|
275
|
+
className: "size-5 shrink-0 text-black/55",
|
|
276
|
+
weight: "regular"
|
|
277
|
+
}),
|
|
278
|
+
r && /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: r }),
|
|
279
|
+
g === "paid" ? /* @__PURE__ */ f(j, { children: [
|
|
280
|
+
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
|
|
281
|
+
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-[#008236]", children: "Purchased" }),
|
|
282
|
+
/* @__PURE__ */ e(
|
|
283
|
+
R,
|
|
284
|
+
{
|
|
285
|
+
className: "size-4 text-[#008236]",
|
|
286
|
+
weight: "bold"
|
|
287
|
+
}
|
|
288
|
+
)
|
|
289
|
+
] }) : p && /* @__PURE__ */ f(j, { children: [
|
|
290
|
+
/* @__PURE__ */ e(
|
|
291
|
+
"span",
|
|
292
|
+
{
|
|
293
|
+
className: N("text-xs font-medium", {
|
|
294
|
+
"text-black/30": c,
|
|
295
|
+
"text-black/55": !c
|
|
296
|
+
}),
|
|
297
|
+
children: "•"
|
|
298
|
+
}
|
|
299
|
+
),
|
|
300
|
+
/* @__PURE__ */ e(
|
|
301
|
+
"span",
|
|
302
|
+
{
|
|
303
|
+
className: N("text-xs font-medium", {
|
|
304
|
+
"text-black/30": c,
|
|
305
|
+
"text-black/55": !c
|
|
306
|
+
}),
|
|
307
|
+
children: p
|
|
308
|
+
}
|
|
309
|
+
)
|
|
310
|
+
] })
|
|
311
|
+
] })
|
|
312
|
+
] })
|
|
313
|
+
] });
|
|
314
|
+
};
|
|
315
|
+
export {
|
|
316
|
+
Q as default
|
|
317
|
+
};
|
|
318
|
+
//# sourceMappingURL=Creator-BFpHsh2u.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Creator-BFpHsh2u.js","sources":["../src/components/LockedAttachment/components/Creator.tsx"],"sourcesContent":["import {\n CheckCircleIcon,\n EyeIcon,\n EyeSlashIcon,\n PauseIcon,\n PlayIcon,\n XIcon,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { LockedAttachmentBaseProps } from '../types'\nimport { renderTypeIcon } from '../utils/icons'\nimport { getSourceType } from '../utils/mimeType'\n\nimport MediaPlayer from './MediaPlayer'\n\nexport interface CreatorCardProps extends LockedAttachmentBaseProps {\n isPreview?: boolean\n placeholderTitle?: string\n placeholderAmountText?: string\n onDismiss?: () => void\n}\n\ninterface CloseButtonProps {\n onClose: () => void\n}\n\nconst CloseButton: React.FC<CloseButtonProps> = (props) => {\n const { onClose } = props\n return (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"absolute left-3 top-3 z-40 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\"\n aria-label=\"Close preview\"\n >\n <EyeIcon className=\"size-4\" weight=\"fill\" />\n </button>\n )\n}\n\ninterface CollapsedThumbnailProps {\n thumbnail?: string\n mimeType: string\n overlayIcon?: React.ElementType\n onClick?: () => void\n}\n\nconst CollapsedThumbnail: React.FC<CollapsedThumbnailProps> = (props) => {\n const { thumbnail, mimeType, overlayIcon: OverlayIcon, onClick } = props\n return (\n <button\n type=\"button\"\n disabled={!onClick}\n className={classNames(\n 'relative aspect-video block w-full overflow-hidden border-0 bg-black/5 p-0 text-left appearance-none',\n { 'cursor-pointer': !!onClick, 'cursor-default': !onClick }\n )}\n onClick={onClick}\n aria-label={OverlayIcon ? 'Toggle preview' : undefined}\n >\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n {OverlayIcon && (\n <div className=\"pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\">\n <OverlayIcon className=\"size-4\" weight=\"fill\" />\n </div>\n )}\n </button>\n )\n}\n\n\ninterface AudioPreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n}\n\nconst AudioPreview: React.FC<AudioPreviewProps> = (props) => {\n const { source, thumbnail, mimeType } = props\n const [playing, setPlaying] = useState(false)\n const [played, setPlayed] = useState(0)\n const [seeking, setSeeking] = useState(false)\n const audioRef = useRef<HTMLAudioElement>(null)\n const trackRef = useRef<HTMLDivElement>(null)\n const rafRef = useRef<number | null>(null)\n\n useEffect(() => {\n const el = audioRef.current\n if (!el) return\n if (playing) {\n void el.play().catch(() => setPlaying(false))\n } else {\n el.pause()\n }\n }, [playing])\n\n useEffect(() => {\n if (!playing) {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n return\n }\n const tick = () => {\n const el = audioRef.current\n if (el && el.duration && !seeking) setPlayed(el.currentTime / el.duration)\n rafRef.current = requestAnimationFrame(tick)\n }\n rafRef.current = requestAnimationFrame(tick)\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n }\n }, [playing, seeking])\n\n useEffect(() => {\n setPlaying(false)\n setPlayed(0)\n }, [source])\n\n const getFraction = useCallback(\n (e: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent) => {\n const track = trackRef.current\n if (!track) return 0\n const clientX =\n 'touches' in e\n ? (e.touches[0]?.clientX ?? e.changedTouches[0]?.clientX ?? 0)\n : e.clientX\n const rect = track.getBoundingClientRect()\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n },\n []\n )\n\n const seekTo = useCallback((fraction: number) => {\n const el = audioRef.current\n if (el && el.duration) el.currentTime = fraction * el.duration\n }, [])\n\n useEffect(() => {\n if (!seeking) return\n const onMove = (e: MouseEvent | TouchEvent) => {\n const f = getFraction(e)\n setPlayed(f)\n seekTo(f)\n }\n const onUp = (e: MouseEvent | TouchEvent) => {\n setSeeking(false)\n seekTo(getFraction(e))\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n window.addEventListener('touchmove', onMove, { passive: true })\n window.addEventListener('touchend', onUp)\n return () => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n window.removeEventListener('touchmove', onMove)\n window.removeEventListener('touchend', onUp)\n }\n }, [seeking, getFraction, seekTo])\n\n const toggle = useCallback(() => setPlaying((p) => !p), [])\n\n return (\n <div className=\"relative\">\n {source && (\n <audio\n ref={audioRef}\n src={source}\n loop\n onEnded={() => {\n setPlaying(false)\n setPlayed(0)\n }}\n >\n <track kind=\"captions\" />\n </audio>\n )}\n <CollapsedThumbnail\n thumbnail={thumbnail}\n mimeType={mimeType}\n overlayIcon={source ? (playing ? PauseIcon : PlayIcon) : undefined}\n onClick={source ? toggle : undefined}\n />\n {source && (\n <div className=\"absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent\">\n <div\n ref={trackRef}\n role=\"slider\"\n aria-label=\"Playback position\"\n aria-valuenow={Math.round(played * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n className=\"relative flex h-4 w-full cursor-pointer items-center\"\n onMouseDown={(e) => {\n e.stopPropagation()\n setSeeking(true)\n const f = getFraction(e)\n setPlayed(f)\n seekTo(f)\n }}\n onTouchStart={(e) => {\n e.stopPropagation()\n setSeeking(true)\n const f = getFraction(e)\n setPlayed(f)\n seekTo(f)\n }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') seekTo(Math.min(1, played + 0.05))\n if (e.key === 'ArrowLeft') seekTo(Math.max(0, played - 0.05))\n }}\n >\n <div className=\"w-full overflow-hidden rounded-full bg-white/30 h-1\">\n <div\n className=\"h-full rounded-full bg-white\"\n style={{ width: `${Math.round(played * 100)}%` }}\n />\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\ninterface VideoPreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n}\n\nconst VideoPreview: React.FC<VideoPreviewProps> = (props) => {\n const { source, thumbnail, mimeType } = props\n const [expanded, setExpanded] = useState(false)\n const collapse = () => setExpanded(false)\n\n useEffect(() => {\n setExpanded(false)\n }, [source])\n\n if (!source) {\n return <CollapsedThumbnail thumbnail={thumbnail} mimeType={mimeType} />\n }\n\n return (\n <div\n className={classNames('relative overflow-hidden', {\n 'aspect-video': !expanded,\n })}\n >\n <MediaPlayer\n source={source}\n mimeType={mimeType}\n poster={thumbnail}\n playing={expanded}\n loop\n controls={false}\n showProgress\n onContainerClick={collapse}\n muted\n />\n {!expanded && (\n <button\n type=\"button\"\n className=\"absolute inset-0 block cursor-pointer border-0 p-0 text-left appearance-none\"\n onClick={() => setExpanded(true)}\n aria-label=\"Expand video preview\"\n >\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n <div className=\"pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\">\n <EyeSlashIcon className=\"size-4\" weight=\"fill\" />\n </div>\n </button>\n )}\n {expanded && <CloseButton onClose={collapse} />}\n </div>\n )\n}\n\ninterface ImagePreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n title?: string\n}\n\nconst ImagePreview: React.FC<ImagePreviewProps> = (props) => {\n const { source, thumbnail, mimeType, title } = props\n const [expanded, setExpanded] = useState(false)\n const collapse = () => setExpanded(false)\n\n useEffect(() => {\n setExpanded(false)\n }, [source])\n\n if (expanded && source) {\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"block w-full cursor-pointer border-0 p-0 text-left appearance-none\"\n onClick={collapse}\n aria-label=\"Close preview\"\n >\n <img src={source} alt={title ?? ''} className=\"block w-full\" />\n </button>\n <CloseButton onClose={collapse} />\n </div>\n )\n }\n\n return (\n <CollapsedThumbnail\n thumbnail={thumbnail}\n mimeType={mimeType}\n overlayIcon={source ? EyeSlashIcon : undefined}\n onClick={source ? () => setExpanded(true) : undefined}\n />\n )\n}\n\n\nconst CreatorCard: React.FC<CreatorCardProps> = (props) => {\n const {\n title,\n mimeType = 'application/octet-stream',\n thumbnail,\n source,\n detail,\n amountText,\n placeholderTitle = 'Attachment title',\n placeholderAmountText,\n paymentStatus,\n onDismiss,\n isPreview = false,\n } = props\n const sourceType = getSourceType(mimeType)\n const displayAmountText = amountText ?? placeholderAmountText\n const isPlaceholderAmount = !amountText && !!placeholderAmountText\n\n let mediaPreview: React.ReactNode\n if (isPreview && sourceType === 'audio') {\n mediaPreview = (\n <AudioPreview source={source} thumbnail={thumbnail} mimeType={mimeType} />\n )\n } else if (isPreview && sourceType === 'video') {\n mediaPreview = (\n <VideoPreview source={source} thumbnail={thumbnail} mimeType={mimeType} />\n )\n } else if (isPreview && sourceType === 'image') {\n mediaPreview = (\n <ImagePreview\n source={source}\n thumbnail={thumbnail}\n mimeType={mimeType}\n title={title}\n />\n )\n } else {\n mediaPreview = (\n <CollapsedThumbnail thumbnail={thumbnail} mimeType={mimeType} />\n )\n }\n\n return (\n <div className=\"relative w-[280px] select-none overflow-hidden rounded-3xl bg-white shadow-card\">\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"absolute right-3 top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\"\n aria-label=\"Dismiss attachment\"\n >\n <XIcon className=\"size-4\" weight=\"bold\" />\n </button>\n )}\n {mediaPreview}\n <div className=\"px-4 pb-3 pt-3\">\n <p\n className={classNames('mb-1.5 truncate text-base font-medium', {\n 'text-black/30': !title,\n 'text-black': !!title,\n })}\n >\n {title || placeholderTitle}\n </p>\n <div className=\"flex items-center gap-1\">\n {renderTypeIcon(mimeType, {\n className: 'size-5 shrink-0 text-black/55',\n weight: 'regular',\n })}\n {detail && (\n <span className=\"text-xs font-medium text-black/55\">{detail}</span>\n )}\n {paymentStatus === 'paid' ? (\n <>\n <span className=\"text-xs font-medium text-black/55\">•</span>\n <span className=\"text-xs font-medium text-[#008236]\">\n Purchased\n </span>\n <CheckCircleIcon\n className=\"size-4 text-[#008236]\"\n weight=\"bold\"\n />\n </>\n ) : (\n displayAmountText && (\n <>\n <span\n className={classNames('text-xs font-medium', {\n 'text-black/30': isPlaceholderAmount,\n 'text-black/55': !isPlaceholderAmount,\n })}\n >\n •\n </span>\n <span\n className={classNames('text-xs font-medium', {\n 'text-black/30': isPlaceholderAmount,\n 'text-black/55': !isPlaceholderAmount,\n })}\n >\n {displayAmountText}\n </span>\n </>\n )\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default CreatorCard\n"],"names":["CloseButton","props","onClose","jsx","EyeIcon","CollapsedThumbnail","thumbnail","mimeType","OverlayIcon","onClick","jsxs","classNames","AudioPreview","source","playing","setPlaying","useState","played","setPlayed","seeking","setSeeking","audioRef","useRef","trackRef","rafRef","useEffect","el","tick","getFraction","useCallback","e","track","clientX","_a","_b","rect","seekTo","fraction","onMove","f","onUp","toggle","p","PauseIcon","PlayIcon","VideoPreview","expanded","setExpanded","collapse","MediaPlayer","EyeSlashIcon","ImagePreview","title","CreatorCard","detail","amountText","placeholderTitle","placeholderAmountText","paymentStatus","onDismiss","isPreview","sourceType","getSourceType","displayAmountText","isPlaceholderAmount","mediaPreview","XIcon","renderTypeIcon","Fragment","CheckCircleIcon"],"mappings":"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"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { jsxs as L, jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import { FileIcon as $, ImageIcon as V, SpeakerHighIcon as G, VideoCameraIcon as Y, FileMdIcon as Z, FileTextIcon as J, FileZipIcon as Q, FilePptIcon as ee, FileCsvIcon as te, FileXlsIcon as ne, FileDocIcon as ae, FilePdfIcon as re, CircleNotchIcon as ie, PlayIcon as W, PauseIcon as oe } from "@phosphor-icons/react";
|
|
3
|
+
import se, { useState as c, useRef as M, useEffect as x, useCallback as z } from "react";
|
|
4
|
+
const le = [
|
|
5
|
+
[/pdf/, "pdf"],
|
|
6
|
+
[/wordprocessingml|msword|\.doc/, "doc"],
|
|
7
|
+
[/spreadsheetml|ms-excel|\.xls/, "xls"],
|
|
8
|
+
[/csv/, "csv"],
|
|
9
|
+
[/presentationml|ms-powerpoint|\.ppt/, "ppt"],
|
|
10
|
+
[/zip|x-rar|x-7z|x-tar|x-gzip/, "zip"],
|
|
11
|
+
[/plain|rtf/, "text"],
|
|
12
|
+
[/markdown/, "markdown"]
|
|
13
|
+
];
|
|
14
|
+
function H(a) {
|
|
15
|
+
return a.startsWith("video/") ? "video" : a.startsWith("audio/") ? "audio" : a.startsWith("image/") ? "image" : "document";
|
|
16
|
+
}
|
|
17
|
+
function ce(a) {
|
|
18
|
+
const r = le.find(
|
|
19
|
+
([i]) => i.test(a)
|
|
20
|
+
);
|
|
21
|
+
return r ? r[1] : "generic";
|
|
22
|
+
}
|
|
23
|
+
const ue = {
|
|
24
|
+
video: Y,
|
|
25
|
+
audio: G,
|
|
26
|
+
image: V,
|
|
27
|
+
document: $
|
|
28
|
+
}, de = {
|
|
29
|
+
pdf: re,
|
|
30
|
+
doc: ae,
|
|
31
|
+
xls: ne,
|
|
32
|
+
csv: te,
|
|
33
|
+
ppt: ee,
|
|
34
|
+
zip: Q,
|
|
35
|
+
text: J,
|
|
36
|
+
markdown: Z,
|
|
37
|
+
generic: $
|
|
38
|
+
};
|
|
39
|
+
function fe(a) {
|
|
40
|
+
const r = H(a);
|
|
41
|
+
return r !== "document" ? ue[r] : de[ce(a)];
|
|
42
|
+
}
|
|
43
|
+
function me(a, r) {
|
|
44
|
+
return se.createElement(fe(a), r);
|
|
45
|
+
}
|
|
46
|
+
const he = (a, r) => a === "audio" && !r ? "bg-black/5" : "bg-black";
|
|
47
|
+
function pe(a) {
|
|
48
|
+
var r, i;
|
|
49
|
+
return "touches" in a ? ((r = a.touches[0]) == null ? void 0 : r.clientX) ?? ((i = a.changedTouches[0]) == null ? void 0 : i.clientX) ?? 0 : a.clientX;
|
|
50
|
+
}
|
|
51
|
+
const be = ({
|
|
52
|
+
source: a,
|
|
53
|
+
mimeType: r,
|
|
54
|
+
poster: i,
|
|
55
|
+
autoPlay: _ = !1,
|
|
56
|
+
playing: u,
|
|
57
|
+
loop: k = !1,
|
|
58
|
+
controls: v = !0,
|
|
59
|
+
showProgress: X = !1,
|
|
60
|
+
onContainerClick: N,
|
|
61
|
+
muted: C = !1
|
|
62
|
+
}) => {
|
|
63
|
+
const D = H(r), [d, o] = c(_), R = M(u);
|
|
64
|
+
x(() => {
|
|
65
|
+
u !== void 0 && u !== R.current && (R.current = u, o(u));
|
|
66
|
+
}, [u]);
|
|
67
|
+
const [w, g] = c(0), [f, A] = c(!1), [S, j] = c(!1), [T, q] = c(null), [K, m] = c(!1), [I, b] = c(!1), h = M(null), F = M(null), s = M(null);
|
|
68
|
+
x(() => {
|
|
69
|
+
b(!1);
|
|
70
|
+
}, [a]), x(() => {
|
|
71
|
+
if (!d) {
|
|
72
|
+
s.current !== null && (cancelAnimationFrame(s.current), s.current = null);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const e = () => {
|
|
76
|
+
const t = h.current;
|
|
77
|
+
t && t.duration && !f && g(t.currentTime / t.duration), s.current = requestAnimationFrame(e);
|
|
78
|
+
};
|
|
79
|
+
return s.current = requestAnimationFrame(e), () => {
|
|
80
|
+
s.current !== null && cancelAnimationFrame(s.current);
|
|
81
|
+
};
|
|
82
|
+
}, [d, f]), x(() => {
|
|
83
|
+
const e = h.current;
|
|
84
|
+
e && (d ? e.play().catch((t) => {
|
|
85
|
+
o(!1), b(!0);
|
|
86
|
+
}) : e.pause());
|
|
87
|
+
}, [d]);
|
|
88
|
+
const O = z(() => {
|
|
89
|
+
b(!1), o(!0);
|
|
90
|
+
}, []), P = z(
|
|
91
|
+
(e) => {
|
|
92
|
+
const t = F.current;
|
|
93
|
+
if (!t) return 0;
|
|
94
|
+
const p = t.getBoundingClientRect();
|
|
95
|
+
return Math.max(
|
|
96
|
+
0,
|
|
97
|
+
Math.min(1, (pe(e) - p.left) / p.width)
|
|
98
|
+
);
|
|
99
|
+
},
|
|
100
|
+
[]
|
|
101
|
+
), l = z((e) => {
|
|
102
|
+
const t = h.current;
|
|
103
|
+
t && t.duration && (t.currentTime = e * t.duration);
|
|
104
|
+
}, []), E = (e) => {
|
|
105
|
+
e.stopPropagation(), A(!0);
|
|
106
|
+
const t = P(e);
|
|
107
|
+
g(t), l(t);
|
|
108
|
+
};
|
|
109
|
+
x(() => {
|
|
110
|
+
if (!f) return;
|
|
111
|
+
const e = (p) => g(P(p)), t = (p) => {
|
|
112
|
+
A(!1), l(P(p));
|
|
113
|
+
};
|
|
114
|
+
return window.addEventListener("mousemove", e), window.addEventListener("mouseup", t), window.addEventListener("touchmove", e, { passive: !0 }), window.addEventListener("touchend", t), () => {
|
|
115
|
+
window.removeEventListener("mousemove", e), window.removeEventListener("mouseup", t), window.removeEventListener("touchmove", e), window.removeEventListener("touchend", t);
|
|
116
|
+
};
|
|
117
|
+
}, [f, P, l]);
|
|
118
|
+
const B = T ? { aspectRatio: String(T) } : void 0, U = T ? "" : " aspect-video", y = Math.round(w * 100);
|
|
119
|
+
return /* @__PURE__ */ L(
|
|
120
|
+
"div",
|
|
121
|
+
{
|
|
122
|
+
role: "button",
|
|
123
|
+
tabIndex: 0,
|
|
124
|
+
className: `relative cursor-pointer overflow-hidden ${he(D, i)}${U}`,
|
|
125
|
+
style: B,
|
|
126
|
+
onClick: () => {
|
|
127
|
+
if (!I) {
|
|
128
|
+
if (N) {
|
|
129
|
+
N();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
v && o((e) => !e);
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
onKeyDown: (e) => {
|
|
136
|
+
if (!(e.key !== "Enter" && e.key !== " ") && (e.preventDefault(), !I)) {
|
|
137
|
+
if (N) {
|
|
138
|
+
N();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
v && o((t) => !t);
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
children: [
|
|
145
|
+
i && /* @__PURE__ */ n(
|
|
146
|
+
"img",
|
|
147
|
+
{
|
|
148
|
+
src: i,
|
|
149
|
+
alt: "",
|
|
150
|
+
className: "absolute inset-0 h-full w-full object-cover"
|
|
151
|
+
}
|
|
152
|
+
),
|
|
153
|
+
!i && /* @__PURE__ */ n("div", { className: "absolute inset-0 flex items-center justify-center", children: me(r, {
|
|
154
|
+
className: "size-12 text-black/20",
|
|
155
|
+
weight: "regular"
|
|
156
|
+
}) }),
|
|
157
|
+
/* @__PURE__ */ n("div", { className: "absolute inset-0", children: D === "audio" ? /* @__PURE__ */ n(
|
|
158
|
+
"audio",
|
|
159
|
+
{
|
|
160
|
+
ref: h,
|
|
161
|
+
src: a,
|
|
162
|
+
loop: k,
|
|
163
|
+
muted: C,
|
|
164
|
+
style: { width: "100%", height: "100%" },
|
|
165
|
+
onLoadStart: () => m(!0),
|
|
166
|
+
onCanPlay: () => m(!1),
|
|
167
|
+
onWaiting: () => m(!0),
|
|
168
|
+
onPlay: () => b(!1),
|
|
169
|
+
onEnded: () => {
|
|
170
|
+
k || (o(!1), g(0));
|
|
171
|
+
},
|
|
172
|
+
children: /* @__PURE__ */ n("track", { kind: "captions" })
|
|
173
|
+
}
|
|
174
|
+
) : /* @__PURE__ */ n(
|
|
175
|
+
"video",
|
|
176
|
+
{
|
|
177
|
+
ref: h,
|
|
178
|
+
src: a,
|
|
179
|
+
poster: i,
|
|
180
|
+
loop: k,
|
|
181
|
+
muted: C,
|
|
182
|
+
playsInline: !0,
|
|
183
|
+
style: { width: "100%", height: "100%" },
|
|
184
|
+
onLoadStart: () => m(!0),
|
|
185
|
+
onCanPlay: () => m(!1),
|
|
186
|
+
onWaiting: () => m(!0),
|
|
187
|
+
onPlay: () => b(!1),
|
|
188
|
+
onLoadedMetadata: () => {
|
|
189
|
+
const e = h.current;
|
|
190
|
+
e instanceof HTMLVideoElement && e.videoWidth && e.videoHeight && q(e.videoWidth / e.videoHeight);
|
|
191
|
+
},
|
|
192
|
+
onEnded: () => {
|
|
193
|
+
k || (o(!1), g(0));
|
|
194
|
+
},
|
|
195
|
+
children: /* @__PURE__ */ n("track", { kind: "captions" })
|
|
196
|
+
}
|
|
197
|
+
) }),
|
|
198
|
+
K && !I && /* @__PURE__ */ n("div", { className: "absolute inset-0 z-10 flex items-center justify-center", children: /* @__PURE__ */ n(
|
|
199
|
+
ie,
|
|
200
|
+
{
|
|
201
|
+
className: "size-8 animate-spin text-white/80",
|
|
202
|
+
weight: "bold"
|
|
203
|
+
}
|
|
204
|
+
) }),
|
|
205
|
+
I && !v && /* @__PURE__ */ n(
|
|
206
|
+
"div",
|
|
207
|
+
{
|
|
208
|
+
className: "absolute inset-0 z-30 flex cursor-pointer items-center justify-center bg-black/35",
|
|
209
|
+
role: "button",
|
|
210
|
+
tabIndex: 0,
|
|
211
|
+
"aria-label": "Play preview",
|
|
212
|
+
onClick: (e) => {
|
|
213
|
+
e.stopPropagation(), O();
|
|
214
|
+
},
|
|
215
|
+
onKeyDown: (e) => {
|
|
216
|
+
e.key !== "Enter" && e.key !== " " || (e.preventDefault(), e.stopPropagation(), O());
|
|
217
|
+
},
|
|
218
|
+
children: /* @__PURE__ */ n("span", { className: "flex size-16 items-center justify-center rounded-full bg-white/20 text-white backdrop-blur-sm", children: /* @__PURE__ */ n(W, { className: "size-9 translate-x-0.5", weight: "fill" }) })
|
|
219
|
+
}
|
|
220
|
+
),
|
|
221
|
+
X && !v && /* @__PURE__ */ n("div", { className: "absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent", children: /* @__PURE__ */ n(
|
|
222
|
+
"div",
|
|
223
|
+
{
|
|
224
|
+
role: "slider",
|
|
225
|
+
"aria-label": "Playback position",
|
|
226
|
+
"aria-valuenow": y,
|
|
227
|
+
"aria-valuemin": 0,
|
|
228
|
+
"aria-valuemax": 100,
|
|
229
|
+
tabIndex: 0,
|
|
230
|
+
ref: F,
|
|
231
|
+
className: "relative flex h-4 w-full cursor-pointer items-center",
|
|
232
|
+
onMouseDown: E,
|
|
233
|
+
onTouchStart: E,
|
|
234
|
+
onClick: (e) => e.stopPropagation(),
|
|
235
|
+
onKeyDown: (e) => {
|
|
236
|
+
e.key === "ArrowRight" && l(Math.min(1, w + 0.05)), e.key === "ArrowLeft" && l(Math.max(0, w - 0.05));
|
|
237
|
+
},
|
|
238
|
+
children: /* @__PURE__ */ n("div", { className: "w-full overflow-hidden rounded-full bg-white/30 h-1", children: /* @__PURE__ */ n(
|
|
239
|
+
"div",
|
|
240
|
+
{
|
|
241
|
+
className: "h-full rounded-full bg-white",
|
|
242
|
+
style: { width: `${y}%` }
|
|
243
|
+
}
|
|
244
|
+
) })
|
|
245
|
+
}
|
|
246
|
+
) }),
|
|
247
|
+
v && /* @__PURE__ */ L("div", { className: "absolute inset-x-0 bottom-0 flex items-center gap-2 bg-gradient-to-t from-black/60 to-transparent px-3 pb-2.5 pt-6 transition-all duration-200", children: [
|
|
248
|
+
/* @__PURE__ */ n(
|
|
249
|
+
"button",
|
|
250
|
+
{
|
|
251
|
+
type: "button",
|
|
252
|
+
onClick: (e) => {
|
|
253
|
+
e.stopPropagation(), o((t) => !t);
|
|
254
|
+
},
|
|
255
|
+
className: "shrink-0 text-white",
|
|
256
|
+
"aria-label": d ? "Pause" : "Play",
|
|
257
|
+
children: d ? /* @__PURE__ */ n(oe, { className: "size-5", weight: "fill" }) : /* @__PURE__ */ n(W, { className: "size-5 translate-x-px", weight: "fill" })
|
|
258
|
+
}
|
|
259
|
+
),
|
|
260
|
+
/* @__PURE__ */ L(
|
|
261
|
+
"div",
|
|
262
|
+
{
|
|
263
|
+
role: "slider",
|
|
264
|
+
"aria-label": "Playback position",
|
|
265
|
+
"aria-valuenow": y,
|
|
266
|
+
"aria-valuemin": 0,
|
|
267
|
+
"aria-valuemax": 100,
|
|
268
|
+
tabIndex: 0,
|
|
269
|
+
ref: F,
|
|
270
|
+
className: "relative flex h-4 w-full cursor-pointer items-center",
|
|
271
|
+
onMouseDown: E,
|
|
272
|
+
onTouchStart: E,
|
|
273
|
+
onClick: (e) => e.stopPropagation(),
|
|
274
|
+
onMouseEnter: () => j(!0),
|
|
275
|
+
onMouseLeave: () => j(!1),
|
|
276
|
+
onKeyDown: (e) => {
|
|
277
|
+
e.key === "ArrowRight" && l(Math.min(1, w + 0.05)), e.key === "ArrowLeft" && l(Math.max(0, w - 0.05));
|
|
278
|
+
},
|
|
279
|
+
children: [
|
|
280
|
+
/* @__PURE__ */ n(
|
|
281
|
+
"div",
|
|
282
|
+
{
|
|
283
|
+
className: `w-full overflow-hidden rounded-full bg-white/30 transition-all duration-200 ${S || f ? "h-1.5" : "h-1"}`,
|
|
284
|
+
children: /* @__PURE__ */ n(
|
|
285
|
+
"div",
|
|
286
|
+
{
|
|
287
|
+
className: "h-full rounded-full bg-white",
|
|
288
|
+
style: { width: `${y}%` }
|
|
289
|
+
}
|
|
290
|
+
)
|
|
291
|
+
}
|
|
292
|
+
),
|
|
293
|
+
/* @__PURE__ */ n(
|
|
294
|
+
"div",
|
|
295
|
+
{
|
|
296
|
+
className: `absolute size-3 -translate-x-1/2 rounded-full bg-white shadow transition-[opacity,transform] duration-200 ${S || f ? "scale-100 opacity-100" : "scale-0 opacity-0"}`,
|
|
297
|
+
style: { left: `${y}%` }
|
|
298
|
+
}
|
|
299
|
+
)
|
|
300
|
+
]
|
|
301
|
+
}
|
|
302
|
+
)
|
|
303
|
+
] })
|
|
304
|
+
]
|
|
305
|
+
}
|
|
306
|
+
);
|
|
307
|
+
};
|
|
308
|
+
export {
|
|
309
|
+
be as M,
|
|
310
|
+
H as g,
|
|
311
|
+
me as r
|
|
312
|
+
};
|
|
313
|
+
//# sourceMappingURL=MediaPlayer-DXz4IBLx.js.map
|