@acoustte-digital-services/digitalstore-controls-dev 0.8.1-dev.20260504073103 → 0.8.1-dev.20260505044510
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.
|
@@ -8,6 +8,24 @@ var pickSource = (sources) => {
|
|
|
8
8
|
}
|
|
9
9
|
return sources.find((s) => !s.media)?.src ?? sources[0]?.src ?? "";
|
|
10
10
|
};
|
|
11
|
+
var requestFullscreen = (el) => {
|
|
12
|
+
if (el.requestFullscreen) return el.requestFullscreen();
|
|
13
|
+
const anyEl = el;
|
|
14
|
+
if (anyEl.webkitRequestFullscreen) return anyEl.webkitRequestFullscreen();
|
|
15
|
+
if (anyEl.mozRequestFullScreen) return anyEl.mozRequestFullScreen();
|
|
16
|
+
return Promise.resolve();
|
|
17
|
+
};
|
|
18
|
+
var exitFullscreen = () => {
|
|
19
|
+
if (document.exitFullscreen) return document.exitFullscreen();
|
|
20
|
+
const anyDoc = document;
|
|
21
|
+
if (anyDoc.webkitExitFullscreen) return anyDoc.webkitExitFullscreen();
|
|
22
|
+
if (anyDoc.mozCancelFullScreen) return anyDoc.mozCancelFullScreen();
|
|
23
|
+
return Promise.resolve();
|
|
24
|
+
};
|
|
25
|
+
var getFullscreenElement = () => (
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
document.fullscreenElement ?? document.webkitFullscreenElement ?? null
|
|
28
|
+
);
|
|
11
29
|
var HlsPlayer = React.memo(
|
|
12
30
|
({
|
|
13
31
|
sources,
|
|
@@ -20,6 +38,7 @@ var HlsPlayer = React.memo(
|
|
|
20
38
|
playOptions = "autoplay",
|
|
21
39
|
placementCode = ""
|
|
22
40
|
}) => {
|
|
41
|
+
const containerRef = useRef(null);
|
|
23
42
|
const videoRef = useRef(null);
|
|
24
43
|
const hlsRef = useRef(null);
|
|
25
44
|
const isPlayOnHover = playOptions === "playOnHover";
|
|
@@ -30,9 +49,12 @@ var HlsPlayer = React.memo(
|
|
|
30
49
|
const [isControlsVisible, setIsControlsVisible] = useState(true);
|
|
31
50
|
const [isPosterVisible, setIsPosterVisible] = useState(true);
|
|
32
51
|
const [isMuted, setIsMuted] = useState(startsMuted);
|
|
52
|
+
const [isFullscreen, setIsFullscreen] = useState(false);
|
|
33
53
|
const wasManuallyPausedRef = useRef(false);
|
|
34
54
|
const inactivityTimerRef = useRef(null);
|
|
55
|
+
const clickTimerRef = useRef(null);
|
|
35
56
|
const INACTIVITY_DELAY = 2500;
|
|
57
|
+
const CLICK_DEBOUNCE = 220;
|
|
36
58
|
const resolvedSources = sources && sources.length > 0 ? sources : assetUrl ? [{ src: assetUrl, posterUrl }] : [];
|
|
37
59
|
useEffect(() => {
|
|
38
60
|
const checkMobile = () => {
|
|
@@ -47,6 +69,17 @@ var HlsPlayer = React.memo(
|
|
|
47
69
|
window.addEventListener("resize", checkMobile);
|
|
48
70
|
return () => window.removeEventListener("resize", checkMobile);
|
|
49
71
|
}, []);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
const onFullscreenChange = () => {
|
|
74
|
+
setIsFullscreen(getFullscreenElement() === containerRef.current);
|
|
75
|
+
};
|
|
76
|
+
document.addEventListener("fullscreenchange", onFullscreenChange);
|
|
77
|
+
document.addEventListener("webkitfullscreenchange", onFullscreenChange);
|
|
78
|
+
return () => {
|
|
79
|
+
document.removeEventListener("fullscreenchange", onFullscreenChange);
|
|
80
|
+
document.removeEventListener("webkitfullscreenchange", onFullscreenChange);
|
|
81
|
+
};
|
|
82
|
+
}, []);
|
|
50
83
|
useEffect(() => {
|
|
51
84
|
if (isPlaying) {
|
|
52
85
|
setIsPosterVisible(false);
|
|
@@ -74,6 +107,7 @@ var HlsPlayer = React.memo(
|
|
|
74
107
|
useEffect(() => {
|
|
75
108
|
return () => {
|
|
76
109
|
if (inactivityTimerRef.current) clearTimeout(inactivityTimerRef.current);
|
|
110
|
+
if (clickTimerRef.current) clearTimeout(clickTimerRef.current);
|
|
77
111
|
};
|
|
78
112
|
}, []);
|
|
79
113
|
useEffect(() => {
|
|
@@ -122,6 +156,28 @@ var HlsPlayer = React.memo(
|
|
|
122
156
|
v.muted = !v.muted;
|
|
123
157
|
setIsMuted(v.muted);
|
|
124
158
|
}, []);
|
|
159
|
+
const handleFullscreenToggle = useCallback(() => {
|
|
160
|
+
const container = containerRef.current;
|
|
161
|
+
if (!container) return;
|
|
162
|
+
if (getFullscreenElement() === container) {
|
|
163
|
+
exitFullscreen().catch(console.error);
|
|
164
|
+
} else {
|
|
165
|
+
requestFullscreen(container).catch(console.error);
|
|
166
|
+
}
|
|
167
|
+
}, []);
|
|
168
|
+
const handleVideoClick = useCallback(() => {
|
|
169
|
+
if (clickTimerRef.current) clearTimeout(clickTimerRef.current);
|
|
170
|
+
clickTimerRef.current = setTimeout(() => {
|
|
171
|
+
handlePlayPause();
|
|
172
|
+
}, CLICK_DEBOUNCE);
|
|
173
|
+
}, [handlePlayPause]);
|
|
174
|
+
const handleVideoDoubleClick = useCallback(() => {
|
|
175
|
+
if (clickTimerRef.current) {
|
|
176
|
+
clearTimeout(clickTimerRef.current);
|
|
177
|
+
clickTimerRef.current = null;
|
|
178
|
+
}
|
|
179
|
+
handleFullscreenToggle();
|
|
180
|
+
}, [handleFullscreenToggle]);
|
|
125
181
|
const handleMouseEnter = useCallback(() => {
|
|
126
182
|
if (isMobile) return;
|
|
127
183
|
setIsHovered(true);
|
|
@@ -157,29 +213,21 @@ var HlsPlayer = React.memo(
|
|
|
157
213
|
display: "flex",
|
|
158
214
|
alignItems: "center",
|
|
159
215
|
justifyContent: "center",
|
|
160
|
-
background: "
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
216
|
+
// background: "#F31F49",
|
|
217
|
+
// background: "linear-gradient(50deg,rgba(243, 31, 73, 1) 0%, rgba(143, 38, 237, 1) 100%)",
|
|
218
|
+
// background: "rgba(0, 0, 0, 0.45)",
|
|
219
|
+
// backdropFilter: "blur(10px)",
|
|
220
|
+
// WebkitBackdropFilter: "blur(10px)",
|
|
221
|
+
// boxShadow: "0 4px 32px rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.1)",
|
|
164
222
|
transition: "transform 0.18s ease, background 0.18s ease, border-color 0.18s ease"
|
|
165
223
|
};
|
|
166
|
-
const handleButtonMouseEnter = useCallback((e) => {
|
|
167
|
-
const btn = e.currentTarget;
|
|
168
|
-
btn.style.transform = "scale(1.1)";
|
|
169
|
-
btn.style.background = "rgba(0,0,0,0.65)";
|
|
170
|
-
btn.style.borderColor = "rgba(255,255,255,0.32)";
|
|
171
|
-
}, []);
|
|
172
|
-
const handleButtonMouseLeave = useCallback((e) => {
|
|
173
|
-
const btn = e.currentTarget;
|
|
174
|
-
btn.style.transform = "scale(1)";
|
|
175
|
-
btn.style.background = "rgba(0,0,0,0.45)";
|
|
176
|
-
btn.style.borderColor = "rgba(255,255,255,0.18)";
|
|
177
|
-
}, []);
|
|
178
224
|
if (resolvedSources.length === 0) return null;
|
|
179
225
|
const showMuteButton = !showControls && !isPlayOnHover;
|
|
226
|
+
const showExpandButton = !showControls && !isPlayOnHover;
|
|
180
227
|
return /* @__PURE__ */ jsxs(
|
|
181
228
|
"div",
|
|
182
229
|
{
|
|
230
|
+
ref: containerRef,
|
|
183
231
|
className: "relative w-full aspect-video bg-black",
|
|
184
232
|
onMouseEnter: handleMouseEnter,
|
|
185
233
|
onMouseLeave: handleMouseLeave,
|
|
@@ -195,8 +243,9 @@ var HlsPlayer = React.memo(
|
|
|
195
243
|
muted: startsMuted,
|
|
196
244
|
autoPlay: playOptions === "autoplay",
|
|
197
245
|
loop,
|
|
198
|
-
onClick: handlePlayPause,
|
|
199
246
|
playsInline: true,
|
|
247
|
+
onClick: handleVideoClick,
|
|
248
|
+
onDoubleClick: handleVideoDoubleClick,
|
|
200
249
|
children: resolvedSources.map(({ src, media }, i) => /* @__PURE__ */ jsx(
|
|
201
250
|
"source",
|
|
202
251
|
{
|
|
@@ -249,9 +298,12 @@ var HlsPlayer = React.memo(
|
|
|
249
298
|
e.stopPropagation();
|
|
250
299
|
handlePlayPause();
|
|
251
300
|
},
|
|
252
|
-
style: {
|
|
253
|
-
|
|
254
|
-
|
|
301
|
+
style: {
|
|
302
|
+
...overlayButtonStyle,
|
|
303
|
+
width: 64,
|
|
304
|
+
height: 64,
|
|
305
|
+
background: "linear-gradient(50deg, rgba(243, 31, 73, 1) 0%, rgba(143, 38, 237, 1) 100%)"
|
|
306
|
+
},
|
|
255
307
|
children: isPlaying ? /* @__PURE__ */ jsxs("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
256
308
|
/* @__PURE__ */ jsx("rect", { x: "3.5", y: "2.5", width: "4.5", height: "15", rx: "1.5", fill: "white" }),
|
|
257
309
|
/* @__PURE__ */ jsx("rect", { x: "12", y: "2.5", width: "4.5", height: "15", rx: "1.5", fill: "white" })
|
|
@@ -260,37 +312,59 @@ var HlsPlayer = React.memo(
|
|
|
260
312
|
)
|
|
261
313
|
}
|
|
262
314
|
),
|
|
263
|
-
|
|
315
|
+
/* @__PURE__ */ jsxs(
|
|
264
316
|
"div",
|
|
265
317
|
{
|
|
266
318
|
className: "absolute bottom-4 right-4 pointer-events-none",
|
|
267
319
|
style: {
|
|
320
|
+
display: "flex",
|
|
321
|
+
alignItems: "center",
|
|
322
|
+
gap: 8,
|
|
268
323
|
opacity: isControlsVisible ? 1 : 0,
|
|
269
324
|
transition: "opacity 0.3s ease"
|
|
270
325
|
},
|
|
271
|
-
children:
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
e
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
/* @__PURE__ */
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
326
|
+
children: [
|
|
327
|
+
showMuteButton && /* @__PURE__ */ jsx(
|
|
328
|
+
"button",
|
|
329
|
+
{
|
|
330
|
+
type: "button",
|
|
331
|
+
"aria-label": isMuted ? "Unmute" : "Mute",
|
|
332
|
+
onClick: (e) => {
|
|
333
|
+
e.stopPropagation();
|
|
334
|
+
handleMuteToggle();
|
|
335
|
+
},
|
|
336
|
+
style: overlayButtonStyle,
|
|
337
|
+
children: isMuted ? /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
338
|
+
/* @__PURE__ */ jsx("path", { d: "M11 5L6 9H2v6h4l5 4V5Z", fill: "white" }),
|
|
339
|
+
/* @__PURE__ */ jsx("line", { x1: "23", y1: "9", x2: "17", y2: "15", stroke: "white", strokeWidth: "2", strokeLinecap: "round" }),
|
|
340
|
+
/* @__PURE__ */ jsx("line", { x1: "17", y1: "9", x2: "23", y2: "15", stroke: "white", strokeWidth: "2", strokeLinecap: "round" })
|
|
341
|
+
] }) : /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
342
|
+
/* @__PURE__ */ jsx("path", { d: "M11 5L6 9H2v6h4l5 4V5Z", fill: "white" }),
|
|
343
|
+
/* @__PURE__ */ jsx("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07", stroke: "white", strokeWidth: "2", strokeLinecap: "round" }),
|
|
344
|
+
/* @__PURE__ */ jsx("path", { d: "M19.07 4.93a10 10 0 0 1 0 14.14", stroke: "white", strokeWidth: "2", strokeLinecap: "round" })
|
|
345
|
+
] })
|
|
346
|
+
}
|
|
347
|
+
),
|
|
348
|
+
showExpandButton && /* @__PURE__ */ jsx(
|
|
349
|
+
"button",
|
|
350
|
+
{
|
|
351
|
+
type: "button",
|
|
352
|
+
"aria-label": isFullscreen ? "Exit fullscreen" : "Enter fullscreen",
|
|
353
|
+
onClick: (e) => {
|
|
354
|
+
e.stopPropagation();
|
|
355
|
+
handleFullscreenToggle();
|
|
356
|
+
},
|
|
357
|
+
style: overlayButtonStyle,
|
|
358
|
+
children: isFullscreen ? (
|
|
359
|
+
/* Compress / exit icon — two inward-pointing arrows */
|
|
360
|
+
/* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx("path", { d: "M8 3v5H3M21 8h-5V3M3 16h5v5M16 21v-5h5", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
361
|
+
) : (
|
|
362
|
+
/* Expand icon — four outward-pointing arrows */
|
|
363
|
+
/* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx("path", { d: "M3 8V3h5M16 3h5v5M21 16v5h-5M8 21H3v-5", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
364
|
+
)
|
|
365
|
+
}
|
|
366
|
+
)
|
|
367
|
+
]
|
|
294
368
|
}
|
|
295
369
|
)
|
|
296
370
|
]
|
package/dist/index.js
CHANGED
|
@@ -520,7 +520,7 @@ var HlsPlayer_exports = {};
|
|
|
520
520
|
__export(HlsPlayer_exports, {
|
|
521
521
|
default: () => HlsPlayer_default
|
|
522
522
|
});
|
|
523
|
-
var import_react32, import_hls, import_jsx_runtime41, pickSource, HlsPlayer, HlsPlayer_default;
|
|
523
|
+
var import_react32, import_hls, import_jsx_runtime41, pickSource, requestFullscreen, exitFullscreen, getFullscreenElement, HlsPlayer, HlsPlayer_default;
|
|
524
524
|
var init_HlsPlayer = __esm({
|
|
525
525
|
"src/components/HlsPlayer.tsx"() {
|
|
526
526
|
"use strict";
|
|
@@ -534,6 +534,24 @@ var init_HlsPlayer = __esm({
|
|
|
534
534
|
}
|
|
535
535
|
return sources.find((s) => !s.media)?.src ?? sources[0]?.src ?? "";
|
|
536
536
|
};
|
|
537
|
+
requestFullscreen = (el) => {
|
|
538
|
+
if (el.requestFullscreen) return el.requestFullscreen();
|
|
539
|
+
const anyEl = el;
|
|
540
|
+
if (anyEl.webkitRequestFullscreen) return anyEl.webkitRequestFullscreen();
|
|
541
|
+
if (anyEl.mozRequestFullScreen) return anyEl.mozRequestFullScreen();
|
|
542
|
+
return Promise.resolve();
|
|
543
|
+
};
|
|
544
|
+
exitFullscreen = () => {
|
|
545
|
+
if (document.exitFullscreen) return document.exitFullscreen();
|
|
546
|
+
const anyDoc = document;
|
|
547
|
+
if (anyDoc.webkitExitFullscreen) return anyDoc.webkitExitFullscreen();
|
|
548
|
+
if (anyDoc.mozCancelFullScreen) return anyDoc.mozCancelFullScreen();
|
|
549
|
+
return Promise.resolve();
|
|
550
|
+
};
|
|
551
|
+
getFullscreenElement = () => (
|
|
552
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
553
|
+
document.fullscreenElement ?? document.webkitFullscreenElement ?? null
|
|
554
|
+
);
|
|
537
555
|
HlsPlayer = import_react32.default.memo(
|
|
538
556
|
({
|
|
539
557
|
sources,
|
|
@@ -546,6 +564,7 @@ var init_HlsPlayer = __esm({
|
|
|
546
564
|
playOptions = "autoplay",
|
|
547
565
|
placementCode = ""
|
|
548
566
|
}) => {
|
|
567
|
+
const containerRef = (0, import_react32.useRef)(null);
|
|
549
568
|
const videoRef = (0, import_react32.useRef)(null);
|
|
550
569
|
const hlsRef = (0, import_react32.useRef)(null);
|
|
551
570
|
const isPlayOnHover = playOptions === "playOnHover";
|
|
@@ -556,9 +575,12 @@ var init_HlsPlayer = __esm({
|
|
|
556
575
|
const [isControlsVisible, setIsControlsVisible] = (0, import_react32.useState)(true);
|
|
557
576
|
const [isPosterVisible, setIsPosterVisible] = (0, import_react32.useState)(true);
|
|
558
577
|
const [isMuted, setIsMuted] = (0, import_react32.useState)(startsMuted);
|
|
578
|
+
const [isFullscreen, setIsFullscreen] = (0, import_react32.useState)(false);
|
|
559
579
|
const wasManuallyPausedRef = (0, import_react32.useRef)(false);
|
|
560
580
|
const inactivityTimerRef = (0, import_react32.useRef)(null);
|
|
581
|
+
const clickTimerRef = (0, import_react32.useRef)(null);
|
|
561
582
|
const INACTIVITY_DELAY = 2500;
|
|
583
|
+
const CLICK_DEBOUNCE = 220;
|
|
562
584
|
const resolvedSources = sources && sources.length > 0 ? sources : assetUrl ? [{ src: assetUrl, posterUrl }] : [];
|
|
563
585
|
(0, import_react32.useEffect)(() => {
|
|
564
586
|
const checkMobile = () => {
|
|
@@ -573,6 +595,17 @@ var init_HlsPlayer = __esm({
|
|
|
573
595
|
window.addEventListener("resize", checkMobile);
|
|
574
596
|
return () => window.removeEventListener("resize", checkMobile);
|
|
575
597
|
}, []);
|
|
598
|
+
(0, import_react32.useEffect)(() => {
|
|
599
|
+
const onFullscreenChange = () => {
|
|
600
|
+
setIsFullscreen(getFullscreenElement() === containerRef.current);
|
|
601
|
+
};
|
|
602
|
+
document.addEventListener("fullscreenchange", onFullscreenChange);
|
|
603
|
+
document.addEventListener("webkitfullscreenchange", onFullscreenChange);
|
|
604
|
+
return () => {
|
|
605
|
+
document.removeEventListener("fullscreenchange", onFullscreenChange);
|
|
606
|
+
document.removeEventListener("webkitfullscreenchange", onFullscreenChange);
|
|
607
|
+
};
|
|
608
|
+
}, []);
|
|
576
609
|
(0, import_react32.useEffect)(() => {
|
|
577
610
|
if (isPlaying) {
|
|
578
611
|
setIsPosterVisible(false);
|
|
@@ -600,6 +633,7 @@ var init_HlsPlayer = __esm({
|
|
|
600
633
|
(0, import_react32.useEffect)(() => {
|
|
601
634
|
return () => {
|
|
602
635
|
if (inactivityTimerRef.current) clearTimeout(inactivityTimerRef.current);
|
|
636
|
+
if (clickTimerRef.current) clearTimeout(clickTimerRef.current);
|
|
603
637
|
};
|
|
604
638
|
}, []);
|
|
605
639
|
(0, import_react32.useEffect)(() => {
|
|
@@ -648,6 +682,28 @@ var init_HlsPlayer = __esm({
|
|
|
648
682
|
v.muted = !v.muted;
|
|
649
683
|
setIsMuted(v.muted);
|
|
650
684
|
}, []);
|
|
685
|
+
const handleFullscreenToggle = (0, import_react32.useCallback)(() => {
|
|
686
|
+
const container = containerRef.current;
|
|
687
|
+
if (!container) return;
|
|
688
|
+
if (getFullscreenElement() === container) {
|
|
689
|
+
exitFullscreen().catch(console.error);
|
|
690
|
+
} else {
|
|
691
|
+
requestFullscreen(container).catch(console.error);
|
|
692
|
+
}
|
|
693
|
+
}, []);
|
|
694
|
+
const handleVideoClick = (0, import_react32.useCallback)(() => {
|
|
695
|
+
if (clickTimerRef.current) clearTimeout(clickTimerRef.current);
|
|
696
|
+
clickTimerRef.current = setTimeout(() => {
|
|
697
|
+
handlePlayPause();
|
|
698
|
+
}, CLICK_DEBOUNCE);
|
|
699
|
+
}, [handlePlayPause]);
|
|
700
|
+
const handleVideoDoubleClick = (0, import_react32.useCallback)(() => {
|
|
701
|
+
if (clickTimerRef.current) {
|
|
702
|
+
clearTimeout(clickTimerRef.current);
|
|
703
|
+
clickTimerRef.current = null;
|
|
704
|
+
}
|
|
705
|
+
handleFullscreenToggle();
|
|
706
|
+
}, [handleFullscreenToggle]);
|
|
651
707
|
const handleMouseEnter = (0, import_react32.useCallback)(() => {
|
|
652
708
|
if (isMobile) return;
|
|
653
709
|
setIsHovered(true);
|
|
@@ -683,29 +739,21 @@ var init_HlsPlayer = __esm({
|
|
|
683
739
|
display: "flex",
|
|
684
740
|
alignItems: "center",
|
|
685
741
|
justifyContent: "center",
|
|
686
|
-
background: "
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
742
|
+
// background: "#F31F49",
|
|
743
|
+
// background: "linear-gradient(50deg,rgba(243, 31, 73, 1) 0%, rgba(143, 38, 237, 1) 100%)",
|
|
744
|
+
// background: "rgba(0, 0, 0, 0.45)",
|
|
745
|
+
// backdropFilter: "blur(10px)",
|
|
746
|
+
// WebkitBackdropFilter: "blur(10px)",
|
|
747
|
+
// boxShadow: "0 4px 32px rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.1)",
|
|
690
748
|
transition: "transform 0.18s ease, background 0.18s ease, border-color 0.18s ease"
|
|
691
749
|
};
|
|
692
|
-
const handleButtonMouseEnter = (0, import_react32.useCallback)((e) => {
|
|
693
|
-
const btn = e.currentTarget;
|
|
694
|
-
btn.style.transform = "scale(1.1)";
|
|
695
|
-
btn.style.background = "rgba(0,0,0,0.65)";
|
|
696
|
-
btn.style.borderColor = "rgba(255,255,255,0.32)";
|
|
697
|
-
}, []);
|
|
698
|
-
const handleButtonMouseLeave = (0, import_react32.useCallback)((e) => {
|
|
699
|
-
const btn = e.currentTarget;
|
|
700
|
-
btn.style.transform = "scale(1)";
|
|
701
|
-
btn.style.background = "rgba(0,0,0,0.45)";
|
|
702
|
-
btn.style.borderColor = "rgba(255,255,255,0.18)";
|
|
703
|
-
}, []);
|
|
704
750
|
if (resolvedSources.length === 0) return null;
|
|
705
751
|
const showMuteButton = !showControls && !isPlayOnHover;
|
|
752
|
+
const showExpandButton = !showControls && !isPlayOnHover;
|
|
706
753
|
return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
|
|
707
754
|
"div",
|
|
708
755
|
{
|
|
756
|
+
ref: containerRef,
|
|
709
757
|
className: "relative w-full aspect-video bg-black",
|
|
710
758
|
onMouseEnter: handleMouseEnter,
|
|
711
759
|
onMouseLeave: handleMouseLeave,
|
|
@@ -721,8 +769,9 @@ var init_HlsPlayer = __esm({
|
|
|
721
769
|
muted: startsMuted,
|
|
722
770
|
autoPlay: playOptions === "autoplay",
|
|
723
771
|
loop,
|
|
724
|
-
onClick: handlePlayPause,
|
|
725
772
|
playsInline: true,
|
|
773
|
+
onClick: handleVideoClick,
|
|
774
|
+
onDoubleClick: handleVideoDoubleClick,
|
|
726
775
|
children: resolvedSources.map(({ src, media }, i) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
727
776
|
"source",
|
|
728
777
|
{
|
|
@@ -775,9 +824,12 @@ var init_HlsPlayer = __esm({
|
|
|
775
824
|
e.stopPropagation();
|
|
776
825
|
handlePlayPause();
|
|
777
826
|
},
|
|
778
|
-
style: {
|
|
779
|
-
|
|
780
|
-
|
|
827
|
+
style: {
|
|
828
|
+
...overlayButtonStyle,
|
|
829
|
+
width: 64,
|
|
830
|
+
height: 64,
|
|
831
|
+
background: "linear-gradient(50deg, rgba(243, 31, 73, 1) 0%, rgba(143, 38, 237, 1) 100%)"
|
|
832
|
+
},
|
|
781
833
|
children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
782
834
|
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("rect", { x: "3.5", y: "2.5", width: "4.5", height: "15", rx: "1.5", fill: "white" }),
|
|
783
835
|
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("rect", { x: "12", y: "2.5", width: "4.5", height: "15", rx: "1.5", fill: "white" })
|
|
@@ -786,37 +838,59 @@ var init_HlsPlayer = __esm({
|
|
|
786
838
|
)
|
|
787
839
|
}
|
|
788
840
|
),
|
|
789
|
-
|
|
841
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
|
|
790
842
|
"div",
|
|
791
843
|
{
|
|
792
844
|
className: "absolute bottom-4 right-4 pointer-events-none",
|
|
793
845
|
style: {
|
|
846
|
+
display: "flex",
|
|
847
|
+
alignItems: "center",
|
|
848
|
+
gap: 8,
|
|
794
849
|
opacity: isControlsVisible ? 1 : 0,
|
|
795
850
|
transition: "opacity 0.3s ease"
|
|
796
851
|
},
|
|
797
|
-
children:
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
e
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
/* @__PURE__ */ (0, import_jsx_runtime41.
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
852
|
+
children: [
|
|
853
|
+
showMuteButton && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
854
|
+
"button",
|
|
855
|
+
{
|
|
856
|
+
type: "button",
|
|
857
|
+
"aria-label": isMuted ? "Unmute" : "Mute",
|
|
858
|
+
onClick: (e) => {
|
|
859
|
+
e.stopPropagation();
|
|
860
|
+
handleMuteToggle();
|
|
861
|
+
},
|
|
862
|
+
style: overlayButtonStyle,
|
|
863
|
+
children: isMuted ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
864
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { d: "M11 5L6 9H2v6h4l5 4V5Z", fill: "white" }),
|
|
865
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("line", { x1: "23", y1: "9", x2: "17", y2: "15", stroke: "white", strokeWidth: "2", strokeLinecap: "round" }),
|
|
866
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("line", { x1: "17", y1: "9", x2: "23", y2: "15", stroke: "white", strokeWidth: "2", strokeLinecap: "round" })
|
|
867
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
868
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { d: "M11 5L6 9H2v6h4l5 4V5Z", fill: "white" }),
|
|
869
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07", stroke: "white", strokeWidth: "2", strokeLinecap: "round" }),
|
|
870
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { d: "M19.07 4.93a10 10 0 0 1 0 14.14", stroke: "white", strokeWidth: "2", strokeLinecap: "round" })
|
|
871
|
+
] })
|
|
872
|
+
}
|
|
873
|
+
),
|
|
874
|
+
showExpandButton && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
875
|
+
"button",
|
|
876
|
+
{
|
|
877
|
+
type: "button",
|
|
878
|
+
"aria-label": isFullscreen ? "Exit fullscreen" : "Enter fullscreen",
|
|
879
|
+
onClick: (e) => {
|
|
880
|
+
e.stopPropagation();
|
|
881
|
+
handleFullscreenToggle();
|
|
882
|
+
},
|
|
883
|
+
style: overlayButtonStyle,
|
|
884
|
+
children: isFullscreen ? (
|
|
885
|
+
/* Compress / exit icon — two inward-pointing arrows */
|
|
886
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { d: "M8 3v5H3M21 8h-5V3M3 16h5v5M16 21v-5h5", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
887
|
+
) : (
|
|
888
|
+
/* Expand icon — four outward-pointing arrows */
|
|
889
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { d: "M3 8V3h5M16 3h5v5M21 16v5h-5M8 21H3v-5", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
890
|
+
)
|
|
891
|
+
}
|
|
892
|
+
)
|
|
893
|
+
]
|
|
820
894
|
}
|
|
821
895
|
)
|
|
822
896
|
]
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
HlsPlayer_default
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CT5SLXYT.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Button_default,
|
|
6
6
|
ClientButton_default,
|
|
@@ -1963,7 +1963,7 @@ var DeviceAssetSelector_default = DeviceAssetSelector;
|
|
|
1963
1963
|
|
|
1964
1964
|
// src/components/pageRenderingEngine/nodes/ImageNode.tsx
|
|
1965
1965
|
import { Fragment as Fragment2, jsx as jsx37 } from "react/jsx-runtime";
|
|
1966
|
-
var HlsPlayer = dynamic2(() => import("./HlsPlayer-
|
|
1966
|
+
var HlsPlayer = dynamic2(() => import("./HlsPlayer-HWWCUCH6.mjs"), {
|
|
1967
1967
|
ssr: false
|
|
1968
1968
|
});
|
|
1969
1969
|
var getNestedValue = (obj, path) => {
|
|
@@ -3645,7 +3645,7 @@ var Pagination_default = Pagination;
|
|
|
3645
3645
|
// src/components/pageRenderingEngine/nodes/ImageGalleryNode.tsx
|
|
3646
3646
|
import dynamic6 from "next/dynamic";
|
|
3647
3647
|
import { Fragment as Fragment8, jsx as jsx56, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
3648
|
-
var HlsPlayer2 = dynamic6(() => import("./HlsPlayer-
|
|
3648
|
+
var HlsPlayer2 = dynamic6(() => import("./HlsPlayer-HWWCUCH6.mjs"), { ssr: false });
|
|
3649
3649
|
var deviceToMediaQuery = (device) => {
|
|
3650
3650
|
switch (device) {
|
|
3651
3651
|
case "sm":
|
package/package.json
CHANGED