@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.
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  HlsPlayer_default
4
- } from "./chunk-FRNG2H5Y.mjs";
4
+ } from "./chunk-CT5SLXYT.mjs";
5
5
  export {
6
6
  HlsPlayer_default as default
7
7
  };
@@ -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: "rgba(0, 0, 0, 0.45)",
161
- backdropFilter: "blur(10px)",
162
- WebkitBackdropFilter: "blur(10px)",
163
- boxShadow: "0 4px 32px rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.1)",
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: { ...overlayButtonStyle, width: 64, height: 64 },
253
- onMouseEnter: handleButtonMouseEnter,
254
- onMouseLeave: handleButtonMouseLeave,
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
- showMuteButton && /* @__PURE__ */ jsx(
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: /* @__PURE__ */ jsx(
272
- "button",
273
- {
274
- type: "button",
275
- "aria-label": isMuted ? "Unmute" : "Mute",
276
- onClick: (e) => {
277
- e.stopPropagation();
278
- handleMuteToggle();
279
- },
280
- style: overlayButtonStyle,
281
- onMouseEnter: handleButtonMouseEnter,
282
- onMouseLeave: handleButtonMouseLeave,
283
- children: isMuted ? /* @__PURE__ */ jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
284
- /* @__PURE__ */ jsx("path", { d: "M11 5L6 9H2v6h4l5 4V5Z", fill: "white" }),
285
- /* @__PURE__ */ jsx("line", { x1: "23", y1: "9", x2: "17", y2: "15", stroke: "white", strokeWidth: "2", strokeLinecap: "round" }),
286
- /* @__PURE__ */ jsx("line", { x1: "17", y1: "9", x2: "23", y2: "15", stroke: "white", strokeWidth: "2", strokeLinecap: "round" })
287
- ] }) : /* @__PURE__ */ jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
288
- /* @__PURE__ */ jsx("path", { d: "M11 5L6 9H2v6h4l5 4V5Z", fill: "white" }),
289
- /* @__PURE__ */ jsx("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07", stroke: "white", strokeWidth: "2", strokeLinecap: "round" }),
290
- /* @__PURE__ */ jsx("path", { d: "M19.07 4.93a10 10 0 0 1 0 14.14", stroke: "white", strokeWidth: "2", strokeLinecap: "round" })
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: "rgba(0, 0, 0, 0.45)",
687
- backdropFilter: "blur(10px)",
688
- WebkitBackdropFilter: "blur(10px)",
689
- boxShadow: "0 4px 32px rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.1)",
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: { ...overlayButtonStyle, width: 64, height: 64 },
779
- onMouseEnter: handleButtonMouseEnter,
780
- onMouseLeave: handleButtonMouseLeave,
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
- showMuteButton && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
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: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
798
- "button",
799
- {
800
- type: "button",
801
- "aria-label": isMuted ? "Unmute" : "Mute",
802
- onClick: (e) => {
803
- e.stopPropagation();
804
- handleMuteToggle();
805
- },
806
- style: overlayButtonStyle,
807
- onMouseEnter: handleButtonMouseEnter,
808
- onMouseLeave: handleButtonMouseLeave,
809
- children: isMuted ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
810
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { d: "M11 5L6 9H2v6h4l5 4V5Z", fill: "white" }),
811
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("line", { x1: "23", y1: "9", x2: "17", y2: "15", stroke: "white", strokeWidth: "2", strokeLinecap: "round" }),
812
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("line", { x1: "17", y1: "9", x2: "23", y2: "15", stroke: "white", strokeWidth: "2", strokeLinecap: "round" })
813
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
814
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { d: "M11 5L6 9H2v6h4l5 4V5Z", fill: "white" }),
815
- /* @__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" }),
816
- /* @__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" })
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-FRNG2H5Y.mjs";
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-ZPLOKA4L.mjs"), {
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-ZPLOKA4L.mjs"), { ssr: false });
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acoustte-digital-services/digitalstore-controls-dev",
3
- "version": "0.8.1-dev.20260504073103",
3
+ "version": "0.8.1-dev.20260505044510",
4
4
  "description": "Reusable React components",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",