softbuilders-react-video-player 1.1.22 → 1.1.24

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.
Files changed (31) hide show
  1. package/dist/components/ControlBar/index.js +10 -8
  2. package/dist/components/ControlBar/index.js.map +1 -1
  3. package/dist/components/ControlBar/index.tsx +20 -16
  4. package/dist/components/MenuButton/index.d.ts +2 -1
  5. package/dist/components/MenuButton/index.js +5 -2
  6. package/dist/components/MenuButton/index.js.map +1 -1
  7. package/dist/components/MenuButton/index.tsx +12 -3
  8. package/dist/components/QualityMenu/index.d.ts +4 -2
  9. package/dist/components/QualityMenu/index.js +9 -7
  10. package/dist/components/QualityMenu/index.js.map +1 -1
  11. package/dist/components/QualityMenu/index.tsx +33 -8
  12. package/dist/components/SoftBuildersVideoPlayer/index.d.ts +2 -1
  13. package/dist/components/SoftBuildersVideoPlayer/index.js +4 -1
  14. package/dist/components/SoftBuildersVideoPlayer/index.js.map +1 -1
  15. package/dist/components/SoftBuildersVideoPlayer/index.tsx +5 -1
  16. package/dist/components/SubtitleMenu/index.d.ts +4 -2
  17. package/dist/components/SubtitleMenu/index.js +8 -3
  18. package/dist/components/SubtitleMenu/index.js.map +1 -1
  19. package/dist/components/SubtitleMenu/index.tsx +19 -4
  20. package/dist/components/VideoPlayerComponent/index.js +70 -8
  21. package/dist/components/VideoPlayerComponent/index.js.map +1 -1
  22. package/dist/components/VideoPlayerComponent/index.tsx +80 -7
  23. package/dist/components/VideoPlayerComponent/style/style.css +1 -0
  24. package/dist/components/VolumeSlider/index.js +12 -3
  25. package/dist/components/VolumeSlider/index.js.map +1 -1
  26. package/dist/components/VolumeSlider/index.tsx +20 -6
  27. package/dist/index.css +35 -11
  28. package/dist/index.d.mts +2 -1
  29. package/dist/index.mjs +295 -158
  30. package/dist/styles/tailwind.css +34 -11
  31. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -154,7 +154,7 @@ var CurrentTimeLabel = ({}) => {
154
154
  var CurrentTimeLabel_default = CurrentTimeLabel;
155
155
 
156
156
  // src/components/VolumeSlider/index.tsx
157
- import { useEffect as useEffect2, useState as useState2 } from "react";
157
+ import React2, { useEffect as useEffect2, useState as useState2 } from "react";
158
158
 
159
159
  // src/components/Slider/index.tsx
160
160
  import { jsx as jsx3 } from "react/jsx-runtime";
@@ -517,11 +517,18 @@ var VolumeSlider = ({ width = 0, setIsSeeking }) => {
517
517
  useEffect2(() => {
518
518
  setVolume((player == null ? void 0 : player.muted()) ? 0 : Number(player == null ? void 0 : player.volume()) * 100 || 0);
519
519
  }, [player]);
520
+ const timeoutRef = React2.useRef(null);
520
521
  const toggleVisiblity = (e) => {
521
522
  e.preventDefault();
522
523
  e.stopPropagation();
523
524
  setIsSeeking(isVisible);
525
+ if (timeoutRef.current) {
526
+ clearTimeout(timeoutRef.current);
527
+ }
524
528
  setVisible((prev) => !prev);
529
+ timeoutRef.current = setTimeout(() => {
530
+ setVisible(false);
531
+ }, 5e3);
525
532
  };
526
533
  const handleValueChange = (e) => {
527
534
  e.preventDefault();
@@ -538,12 +545,12 @@ var VolumeSlider = ({ width = 0, setIsSeeking }) => {
538
545
  return /* @__PURE__ */ jsxs4(
539
546
  "div",
540
547
  {
541
- className: `sb-flex ${isVisible ? "" : "-sb-ml-2"} sb-flex-col-reverse ${false ? "!sb-flex-row !sb-items-end " : ""} sb-items-center sb-justify-start sb-gap-1 sb-h-full`,
548
+ className: `sb-flex ${isVisible ? "" : "-sb-ml-2"} ${width > 400 ? "sb-flex-col-reverse " : "sb-flex-col !sb-justify-start"} ${false ? "!sb-flex-row !sb-items-start " : ""} sb-items-center sb-gap-1 sb-h-full`,
542
549
  children: [
543
550
  /* @__PURE__ */ jsx19(
544
551
  "div",
545
552
  {
546
- className: `sb-flex sb-relative ${width < 400 ? "" : ""} sb-top-1 sb-items-end`,
553
+ className: `sb-flex sb-relative ${width < 400 ? "-sb-top-1" : "sb-top-1"} `,
547
554
  onClick: toggleVisiblity,
548
555
  children: volume === 0 || (player == null ? void 0 : player.muted()) ? /* @__PURE__ */ jsx19(
549
556
  MuteIcon_default,
@@ -561,7 +568,7 @@ var VolumeSlider = ({ width = 0, setIsSeeking }) => {
561
568
  /* @__PURE__ */ jsx19("div", { className: "sb-flex sb-items-center sb-justify-center", children: /* @__PURE__ */ jsx19(
562
569
  "div",
563
570
  {
564
- className: `sb-transition-all sb-ease-in-out sb-duration-500 ${isVisible ? "sb-w-[22px] sb-opacity-100 sb-visible" : "sb-w-0 sb-opacity-0 sb-invisible"} -sb-rotate-90 -sb-translate-y-1 sb-relative ${false ? "sb-static sb-w-16 sb-rotate-0 sb-translate-y-0 " : ""}`,
571
+ className: `sb-transition-all sb-ease-in-out sb-duration-500 ${isVisible ? "sb-w-[22px] sb-opacity-100 sb-visible" : "sb-w-0 sb-opacity-0 sb-invisible"} ${width > 400 ? "-sb-rotate-90 -sb-translate-y-1" : "sb-rotate-90 sb-translate-y-1"} sb-relative ${false ? "sb-static sb-w-16 sb-rotate-0 sb-translate-y-0 " : ""}`,
565
572
  children: /* @__PURE__ */ jsx19(
566
573
  Slider_default,
567
574
  {
@@ -586,7 +593,12 @@ import { useEffect as useEffect4, useState as useState4 } from "react";
586
593
  // src/components/MenuButton/index.tsx
587
594
  import { useCallback, useEffect as useEffect3, useRef, useState as useState3 } from "react";
588
595
  import { jsx as jsx20, jsxs as jsxs5 } from "react/jsx-runtime";
589
- var MenuButton = ({ buttonContent, menuContent, close }) => {
596
+ var MenuButton = ({
597
+ buttonContent,
598
+ menuContent,
599
+ close,
600
+ classContainer
601
+ }) => {
590
602
  const [isOpen, setIsOpen] = useState3(false);
591
603
  const buttonRef = useRef(null);
592
604
  const menuRef = useRef(null);
@@ -611,7 +623,10 @@ var MenuButton = ({ buttonContent, menuContent, close }) => {
611
623
  "button",
612
624
  {
613
625
  ref: buttonRef,
614
- onClick: toggleMenu,
626
+ onClick: (e) => {
627
+ e.stopPropagation();
628
+ toggleMenu();
629
+ },
615
630
  "aria-haspopup": "true",
616
631
  "aria-expanded": isOpen,
617
632
  "aria-label": "Open menu",
@@ -625,7 +640,7 @@ var MenuButton = ({ buttonContent, menuContent, close }) => {
625
640
  role: "menu",
626
641
  "aria-orientation": "vertical",
627
642
  "aria-labelledby": "Open menu",
628
- className: "sb-absolute sb-shadow-lg sb-right-0 sb-bottom-10",
643
+ className: `sb-absolute sb-shadow-lg sb-right-0 sb-bottom-10 ${classContainer}`,
629
644
  children: menuContent
630
645
  }
631
646
  )
@@ -638,14 +653,27 @@ import { jsx as jsx21, jsxs as jsxs6 } from "react/jsx-runtime";
638
653
  var QualityOption = ({
639
654
  isSelected,
640
655
  quality,
641
- onClick
656
+ onClick,
657
+ width
642
658
  }) => {
643
- return /* @__PURE__ */ jsx21("button", { className: "hover:sb-text-orange-500 sb-p-2", onClick, children: /* @__PURE__ */ jsxs6("div", { className: "sb-grid sb-grid-cols-12 sb-items-center sb-gap-2", children: [
644
- /* @__PURE__ */ jsx21("div", { className: "sb-col-span-3", children: isSelected ? /* @__PURE__ */ jsx21(CheckedIcon_default, { className: "sb-w-5 sb-h-5" }) : /* @__PURE__ */ jsx21("div", {}) }),
645
- /* @__PURE__ */ jsx21("p", { className: "sb-text-left sb-col-span-9", children: quality.label })
646
- ] }) });
659
+ return /* @__PURE__ */ jsx21(
660
+ "button",
661
+ {
662
+ className: `hover:sb-text-orange-500 ${width > 400 ? "sb-p-2" : "sp-pb-1"}`,
663
+ onClick,
664
+ children: /* @__PURE__ */ jsxs6("div", { className: "sb-grid sb-grid-cols-12 sb-items-center sb-gap-2", children: [
665
+ /* @__PURE__ */ jsx21("div", { className: "sb-col-span-3", children: isSelected ? /* @__PURE__ */ jsx21(
666
+ CheckedIcon_default,
667
+ {
668
+ className: `${width > 400 ? "sb-w-5 sb-h-5" : "sb-w-3 sb-h-3"}`
669
+ }
670
+ ) : /* @__PURE__ */ jsx21("div", {}) }),
671
+ /* @__PURE__ */ jsx21("p", { className: "sb-text-left sb-col-span-9", children: quality.label })
672
+ ] })
673
+ }
674
+ );
647
675
  };
648
- var QualityMenu = ({}) => {
676
+ var QualityMenu = ({ width }) => {
649
677
  const { player } = useSoftBuildersVideoPlayerContext();
650
678
  const [closeMenuFunction, setCloseMenuFunction] = useState4(void 0);
651
679
  const [qualities, setQualities] = useState4(
@@ -654,12 +682,12 @@ var QualityMenu = ({}) => {
654
682
  const [currentQualitySrc, setCurrentQualitySrc] = useState4(void 0);
655
683
  useEffect4(() => {
656
684
  if (player) {
657
- const sources = player.currentSources();
685
+ const sources = player == null ? void 0 : player.currentSources();
658
686
  const qs = JSON.parse(
659
687
  JSON.stringify(sources)
660
688
  );
661
689
  setQualities(qs);
662
- const source = player.currentSource();
690
+ const source = player == null ? void 0 : player.currentSource();
663
691
  const quality = JSON.parse(
664
692
  JSON.stringify(source)
665
693
  );
@@ -669,47 +697,61 @@ var QualityMenu = ({}) => {
669
697
  return /* @__PURE__ */ jsx21(
670
698
  MenuButton_default,
671
699
  {
700
+ classContainer: `${width < 400 ? "!sb-top-8 -sb-left-9" : ""}`,
672
701
  buttonContent: /* @__PURE__ */ jsx21(SettingsIcon_default, { className: "sb-w-3 sb-h-3" }),
673
- menuContent: /* @__PURE__ */ jsx21("div", { className: "sb-rounded-md sb-bg-[#303030] sb-bg-opacity-50 sb-py-5 sb-w-[150px]", children: /* @__PURE__ */ jsxs6("div", { className: "sb-flex sb-flex-col sb-gap-3", children: [
674
- /* @__PURE__ */ jsxs6("div", { className: "sb-px-5 sb-flex sb-flex-row sb-gap-3 sb-items-start sb-relative sb-top-2", children: [
675
- /* @__PURE__ */ jsx21(
676
- "button",
677
- {
678
- onClick: () => {
679
- if (closeMenuFunction) {
680
- closeMenuFunction();
681
- }
682
- },
683
- className: "hover:sb-scale-150",
684
- children: /* @__PURE__ */ jsx21(LeftArrowIcon_default, { className: "sb-w-3 sb-h-3" })
685
- }
686
- ),
687
- /* @__PURE__ */ jsx21("h3", { children: "Quality" })
688
- ] }),
689
- /* @__PURE__ */ jsx21("div", { className: "sb-w-full sb-h-[.1px] sb-bg-[#AAAAAA] sb-bg-opacity-70" }),
690
- /* @__PURE__ */ jsx21("div", { className: "sb-px-5 sb-flex sb-flex-col sb-gap-3 sb-items-start ", children: qualities.map((q, i) => {
691
- return /* @__PURE__ */ jsx21(
692
- QualityOption,
693
- {
694
- isSelected: currentQualitySrc === q.src,
695
- quality: q,
696
- onClick: () => {
697
- const source = qualities.find(
698
- (_q) => q.label == _q.label
699
- );
700
- if (source && source.src != currentQualitySrc) {
701
- player == null ? void 0 : player.src(source.src);
702
- const currentTime = player == null ? void 0 : player.currentTime();
703
- setCurrentQualitySrc(source.src);
704
- player == null ? void 0 : player.currentTime(currentTime);
705
- player == null ? void 0 : player.play();
706
- }
702
+ menuContent: /* @__PURE__ */ jsx21(
703
+ "div",
704
+ {
705
+ className: `sb-rounded-md sb-bg-[#303030] sb-bg-opacity-50 ${width > 400 ? "sb-w-[150px] sb-py-5" : "sb-w-[90px] sb-items-center sb-justify-center sb-py-1"}`,
706
+ children: /* @__PURE__ */ jsxs6("div", { className: "sb-flex sb-flex-col sb-gap-3", children: [
707
+ /* @__PURE__ */ jsxs6(
708
+ "div",
709
+ {
710
+ className: `sb-px-5 sb-flex sb-flex-row sb-gap-3 sb-items-start sb-relative sb-top-2`,
711
+ children: [
712
+ /* @__PURE__ */ jsx21(
713
+ "button",
714
+ {
715
+ onClick: () => {
716
+ if (closeMenuFunction) {
717
+ closeMenuFunction();
718
+ }
719
+ },
720
+ className: "hover:sb-scale-150",
721
+ children: /* @__PURE__ */ jsx21(LeftArrowIcon_default, { className: "sb-w-3 sb-h-3" })
722
+ }
723
+ ),
724
+ /* @__PURE__ */ jsx21("h3", { children: "Quality" })
725
+ ]
707
726
  }
708
- },
709
- `quality-${q.label}-${i}`
710
- );
711
- }) })
712
- ] }) }),
727
+ ),
728
+ /* @__PURE__ */ jsx21("div", { className: "sb-w-full sb-h-[.1px] sb-bg-[#AAAAAA] sb-bg-opacity-70" }),
729
+ /* @__PURE__ */ jsx21("div", { className: "sb-px-5 sb-flex sb-flex-col sb-gap-3 sb-items-start ", children: qualities.map((q, i) => {
730
+ return /* @__PURE__ */ jsx21(
731
+ QualityOption,
732
+ {
733
+ width,
734
+ isSelected: currentQualitySrc === q.src,
735
+ quality: q,
736
+ onClick: () => {
737
+ const source = qualities.find(
738
+ (_q) => q.label == _q.label
739
+ );
740
+ if (source && source.src != currentQualitySrc) {
741
+ player == null ? void 0 : player.src(source.src);
742
+ const currentTime = player == null ? void 0 : player.currentTime();
743
+ setCurrentQualitySrc(source.src);
744
+ player == null ? void 0 : player.currentTime(currentTime);
745
+ player == null ? void 0 : player.play();
746
+ }
747
+ }
748
+ },
749
+ `quality-${q.label}-${i}`
750
+ );
751
+ }) })
752
+ ] })
753
+ }
754
+ ),
713
755
  close: (fn) => {
714
756
  setCloseMenuFunction(() => fn);
715
757
  }
@@ -1046,12 +1088,22 @@ var SubtitleOption = ({
1046
1088
  subtitle,
1047
1089
  onClick
1048
1090
  }) => {
1049
- return /* @__PURE__ */ jsx32("button", { className: "hover:sb-text-orange-500 sb-p-2", onClick, children: /* @__PURE__ */ jsxs12("div", { className: "sb-grid sb-grid-cols-12 sb-items-center sb-gap-2", children: [
1050
- /* @__PURE__ */ jsx32("div", { className: "sb-col-span-3", children: isSelected ? /* @__PURE__ */ jsx32(CheckedIcon_default, { className: "sb-w-5 sb-h-5" }) : /* @__PURE__ */ jsx32("div", {}) }),
1051
- /* @__PURE__ */ jsx32("p", { className: "sb-text-left sb-col-span-9", children: subtitle.label })
1052
- ] }) });
1091
+ return /* @__PURE__ */ jsx32(
1092
+ "button",
1093
+ {
1094
+ className: "hover:sb-text-orange-500 sb-p-2",
1095
+ onClick: (e) => {
1096
+ e.stopPropagation();
1097
+ onClick();
1098
+ },
1099
+ children: /* @__PURE__ */ jsxs12("div", { className: "sb-grid sb-grid-cols-12 sb-items-center sb-gap-2", children: [
1100
+ /* @__PURE__ */ jsx32("div", { className: "sb-col-span-3", children: isSelected ? /* @__PURE__ */ jsx32(CheckedIcon_default, { className: "sb-w-5 sb-h-5" }) : /* @__PURE__ */ jsx32("div", {}) }),
1101
+ /* @__PURE__ */ jsx32("p", { className: "sb-text-left sb-col-span-9", children: subtitle.label })
1102
+ ] })
1103
+ }
1104
+ );
1053
1105
  };
1054
- var SubtitleMenu = ({}) => {
1106
+ var SubtitleMenu = ({ width }) => {
1055
1107
  const { player } = useSoftBuildersVideoPlayerContext();
1056
1108
  const [closeMenuFunction, setCloseMenuFunction] = useState11(void 0);
1057
1109
  const [subtitles, setSubtitles] = useState11([]);
@@ -1076,38 +1128,45 @@ var SubtitleMenu = ({}) => {
1076
1128
  return /* @__PURE__ */ jsx32(
1077
1129
  MenuButton_default,
1078
1130
  {
1131
+ classContainer: `${width < 400 ? "!sb-top-8 -sb-left-9" : ""}`,
1079
1132
  buttonContent: /* @__PURE__ */ jsx32(SubIcon_default, { className: "sb-w-4 sb-h-4 sb-text-white " }),
1080
- menuContent: /* @__PURE__ */ jsx32("div", { className: "sb-rounded-md sb-bg-[#303030] sb-bg-opacity-50 sb-py-5 sb-w-[150px]", children: /* @__PURE__ */ jsxs12("div", { className: "sb-flex sb-flex-col sb-gap-3", children: [
1081
- /* @__PURE__ */ jsxs12("div", { className: "sb-px-5 sb-flex sb-flex-row sb-gap-3 sb-items-start", children: [
1082
- /* @__PURE__ */ jsx32(
1083
- "button",
1084
- {
1085
- onClick: () => {
1086
- if (closeMenuFunction) {
1087
- closeMenuFunction();
1133
+ menuContent: /* @__PURE__ */ jsx32(
1134
+ "div",
1135
+ {
1136
+ className: `sb-rounded-md sb-bg-[#303030] sb-bg-opacity-50 ${width > 400 ? "sb-w-[150px] sb-py-5" : "sb-w-[90px] sb-items-center sb-justify-center sb-py-1"}`,
1137
+ children: /* @__PURE__ */ jsxs12("div", { className: "sb-flex sb-flex-col sb-gap-3", children: [
1138
+ /* @__PURE__ */ jsxs12("div", { className: "sb-px-5 sb-flex sb-flex-row sb-gap-3 sb-items-start", children: [
1139
+ /* @__PURE__ */ jsx32(
1140
+ "button",
1141
+ {
1142
+ onClick: () => {
1143
+ if (closeMenuFunction) {
1144
+ closeMenuFunction();
1145
+ }
1146
+ },
1147
+ className: "hover:sb-scale-150",
1148
+ children: /* @__PURE__ */ jsx32(LeftArrowIcon_default, { className: "sb-w-3 sb-h-3" })
1088
1149
  }
1089
- },
1090
- className: "hover:sb-scale-150",
1091
- children: /* @__PURE__ */ jsx32(LeftArrowIcon_default, { className: "sb-w-3 sb-h-3" })
1092
- }
1093
- ),
1094
- /* @__PURE__ */ jsx32("h3", { children: "Subtitle" })
1095
- ] }),
1096
- /* @__PURE__ */ jsx32("div", { className: "sb-w-full sb-h-[.1px] sb-bg-[#AAAAAA] sb-bg-opacity-70" }),
1097
- /* @__PURE__ */ jsx32("div", { className: "sb-px-5 sb-flex sb-flex-col sb-gap-3 sb-items-start", children: subtitles.map((q, i) => {
1098
- return /* @__PURE__ */ jsx32(
1099
- SubtitleOption,
1100
- {
1101
- isSelected: q.mode === "showing",
1102
- subtitle: q,
1103
- onClick: () => {
1104
- handleSelectSubtitle(q);
1105
- }
1106
- },
1107
- `subtitle-${q.label}-${i}`
1108
- );
1109
- }) })
1110
- ] }) }),
1150
+ ),
1151
+ /* @__PURE__ */ jsx32("h3", { children: "Subtitle" })
1152
+ ] }),
1153
+ /* @__PURE__ */ jsx32("div", { className: "sb-w-full sb-h-[.1px] sb-bg-[#AAAAAA] sb-bg-opacity-70" }),
1154
+ /* @__PURE__ */ jsx32("div", { className: "sb-px-5 sb-flex sb-flex-col sb-gap-3 sb-items-start", children: subtitles.map((q, i) => {
1155
+ return /* @__PURE__ */ jsx32(
1156
+ SubtitleOption,
1157
+ {
1158
+ isSelected: q.mode === "showing",
1159
+ subtitle: q,
1160
+ onClick: () => {
1161
+ handleSelectSubtitle(q);
1162
+ }
1163
+ },
1164
+ `subtitle-${q.label}-${i}`
1165
+ );
1166
+ }) })
1167
+ ] })
1168
+ }
1169
+ ),
1111
1170
  close: (fn) => {
1112
1171
  setCloseMenuFunction(() => fn);
1113
1172
  }
@@ -1160,70 +1219,79 @@ var ControlBar = ({
1160
1219
  useEffect13(() => {
1161
1220
  setDuration(duration);
1162
1221
  }, [duration]);
1163
- return /* @__PURE__ */ jsxs13("div", { className: " sb-px-2 sb-flex sb-justify-center sb-gap-3 sb-w-full sb-h-full sb-items-end sb-pb-2", children: [
1164
- /* @__PURE__ */ jsx33(BufferTracker_default, {}),
1165
- /* @__PURE__ */ jsx33(CurrentTimeTracker_default, {}),
1166
- /* @__PURE__ */ jsx33(
1167
- "button",
1168
- {
1169
- onClick: () => {
1170
- seek(-seekStep);
1171
- },
1172
- children: /* @__PURE__ */ jsx33(BackwardIcon_default, { className: "sb-w-3 sb-h-3" })
1173
- }
1174
- ),
1175
- /* @__PURE__ */ jsx33("button", { onClick: togglePlay, children: isPaused ? /* @__PURE__ */ jsx33(PlayIcon_default, { className: "sb-w-3 sb-h-3" }) : /* @__PURE__ */ jsx33(PauseIcon_default, { className: "sb-w-3 sb-h-3" }) }),
1176
- /* @__PURE__ */ jsx33(
1177
- "button",
1178
- {
1179
- onClick: (e) => {
1180
- e.preventDefault();
1181
- seek(seekStep);
1182
- },
1183
- children: /* @__PURE__ */ jsx33(ForwardIcon_default, { className: "sb-w-3 sb-h-3" })
1184
- }
1185
- ),
1186
- (isSeeking || width > 400) && /* @__PURE__ */ jsx33(
1187
- "div",
1188
- {
1189
- className: `${width < 400 ? "sb-w-[0px] sb-ml-0 sb-mr-0" : "sb-w-full"}`,
1190
- children: /* @__PURE__ */ jsxs13(
1222
+ return /* @__PURE__ */ jsxs13(
1223
+ "div",
1224
+ {
1225
+ className: ` sb-px-2 sb-flex sb-pt-2 sb-justify-center sb-gap-3 sb-w-full sb-h-full ${width > 400 ? "sb-items-end" : "sb-items-start"} sb-pb-2`,
1226
+ children: [
1227
+ /* @__PURE__ */ jsx33(BufferTracker_default, {}),
1228
+ /* @__PURE__ */ jsx33(CurrentTimeTracker_default, {}),
1229
+ /* @__PURE__ */ jsx33(
1230
+ "button",
1231
+ {
1232
+ onClick: () => {
1233
+ seek(-seekStep);
1234
+ },
1235
+ children: /* @__PURE__ */ jsx33(BackwardIcon_default, { className: "sb-w-3 sb-h-3" })
1236
+ }
1237
+ ),
1238
+ /* @__PURE__ */ jsx33("button", { onClick: togglePlay, children: isPaused ? /* @__PURE__ */ jsx33(PlayIcon_default, { className: "sb-w-3 sb-h-3" }) : /* @__PURE__ */ jsx33(PauseIcon_default, { className: "sb-w-3 sb-h-3" }) }),
1239
+ /* @__PURE__ */ jsx33(
1240
+ "button",
1241
+ {
1242
+ onClick: (e) => {
1243
+ e.preventDefault();
1244
+ seek(seekStep);
1245
+ },
1246
+ children: /* @__PURE__ */ jsx33(ForwardIcon_default, { className: "sb-w-3 sb-h-3" })
1247
+ }
1248
+ ),
1249
+ // isSeeking ||
1250
+ // width > 400 &&
1251
+ /* @__PURE__ */ jsx33(
1191
1252
  "div",
1192
1253
  {
1193
- style: width < 400 ? {
1194
- width: `${width * 0.8}px`,
1195
- left: "10%"
1196
- } : { width: "100%" },
1197
- className: `flex gap-2 ${width < 400 ? "absolute -sb-translate-y-9" : "-sb-translate-y-0 sb-w-full"} hover:sb-w-[45%] sb-transition-all sb-ease-in-out sb-duration-500`,
1198
- children: [
1199
- /* @__PURE__ */ jsx33(CurrentTimeLabel_default, {}),
1200
- /* @__PURE__ */ jsx33(TimeSliderContainer_default, { chapters, notes }),
1201
- /* @__PURE__ */ jsx33("p", { children: durationFormater(duration) })
1202
- ]
1254
+ className: `${width < 400 ? "sb-w-[100px] sb-ml-0 sb-mr-0" : "sb-w-full"}`,
1255
+ children: /* @__PURE__ */ jsxs13(
1256
+ "div",
1257
+ {
1258
+ style: width < 400 ? {
1259
+ width: `${width * 0.9}px`,
1260
+ left: "5%",
1261
+ top: "90%"
1262
+ } : { width: "100%" },
1263
+ className: `flex gap-2 ${width < 400 ? "absolute sb-top-1" : "-sb-translate-y-0 sb-w-full"} hover:sb-w-[45%] sb-transition-all sb-ease-in-out sb-duration-500`,
1264
+ children: [
1265
+ /* @__PURE__ */ jsx33(CurrentTimeLabel_default, {}),
1266
+ /* @__PURE__ */ jsx33(TimeSliderContainer_default, { chapters, notes }),
1267
+ /* @__PURE__ */ jsx33("p", { children: durationFormater(duration) })
1268
+ ]
1269
+ }
1270
+ )
1203
1271
  }
1204
- )
1205
- }
1206
- ),
1207
- /* @__PURE__ */ jsx33("div", { className: "sb-h-full", children: /* @__PURE__ */ jsx33(VolumeSlider_default, { width, setIsSeeking: (val) => setIsSeeking(val) }) }),
1208
- /* @__PURE__ */ jsx33(QualityMenu_default, {}),
1209
- /* @__PURE__ */ jsx33(
1210
- "button",
1211
- {
1212
- onClick: (e) => {
1213
- e.preventDefault();
1214
- e.stopPropagation();
1215
- if (player == null ? void 0 : player.isFullscreen()) {
1216
- player == null ? void 0 : player.exitFullscreen();
1217
- } else {
1218
- player == null ? void 0 : player.requestFullscreen();
1272
+ ),
1273
+ /* @__PURE__ */ jsx33("div", { className: "sb-h-full", children: /* @__PURE__ */ jsx33(VolumeSlider_default, { width, setIsSeeking: (val) => setIsSeeking(val) }) }),
1274
+ /* @__PURE__ */ jsx33(QualityMenu_default, { width }),
1275
+ handleSaveNoteAction && /* @__PURE__ */ jsx33(CreateNoteMenu_default, { handleSaveNoteAction }),
1276
+ /* @__PURE__ */ jsx33(SubtitleMenu_default, { width }),
1277
+ /* @__PURE__ */ jsx33(
1278
+ "button",
1279
+ {
1280
+ onClick: (e) => {
1281
+ e.preventDefault();
1282
+ e.stopPropagation();
1283
+ if (player == null ? void 0 : player.isFullscreen()) {
1284
+ player == null ? void 0 : player.exitFullscreen();
1285
+ } else {
1286
+ player == null ? void 0 : player.requestFullscreen();
1287
+ }
1288
+ },
1289
+ children: /* @__PURE__ */ jsx33(FullScreenIcon_default, { className: "sb-w-3 sb-h-3" })
1219
1290
  }
1220
- },
1221
- children: /* @__PURE__ */ jsx33(FullScreenIcon_default, { className: "sb-w-3 sb-h-3" })
1222
- }
1223
- ),
1224
- handleSaveNoteAction && /* @__PURE__ */ jsx33(CreateNoteMenu_default, { handleSaveNoteAction }),
1225
- /* @__PURE__ */ jsx33(SubtitleMenu_default, {})
1226
- ] });
1291
+ )
1292
+ ]
1293
+ }
1294
+ );
1227
1295
  };
1228
1296
  var ControlBar_default = ControlBar;
1229
1297
 
@@ -1271,7 +1339,7 @@ var renderBigPlayButton = (id, player, isPaused, setIsPaused) => {
1271
1339
  }
1272
1340
  };
1273
1341
  var controlBarRoot = {};
1274
- var renderControlBar = (id, player, isPaused, setIsPaused, duration, notes, chapters, seekStep = 5, handleSaveNoteAction) => {
1342
+ var renderControlBar = (id, player, isPaused, setIsPaused, duration, notes, chapters, seekStep = 5, handleSaveNoteAction, opacity = "0") => {
1275
1343
  const container = document.getElementById(`video-container-${id}`);
1276
1344
  if (container) {
1277
1345
  const element = container.querySelector(".vjs-control-bar");
@@ -1280,6 +1348,7 @@ var renderControlBar = (id, player, isPaused, setIsPaused, duration, notes, chap
1280
1348
  controlBarRoot[id] = ReactDOM.createRoot(element);
1281
1349
  }
1282
1350
  element.style.display = "flex";
1351
+ element.style.opacity = opacity;
1283
1352
  element.style.height = "100%";
1284
1353
  element.style.alignItems = "flex-end";
1285
1354
  controlBarRoot[id].render(
@@ -1317,11 +1386,12 @@ var VideoPlayerComponent = ({
1317
1386
  const [isReady, setIsReady] = useState13(false);
1318
1387
  const [isPaused, setIsPaused] = useState13(!options.autoplay);
1319
1388
  const [duration, setDuration] = useState13(1);
1389
+ const [opacity, setOpacity] = useState13("0");
1320
1390
  const onReady = (player) => {
1321
1391
  if (playerRef) {
1322
1392
  playerRef.current = player;
1323
1393
  setIsReady(true);
1324
- player.currentTime(startTime);
1394
+ player == null ? void 0 : player.currentTime(startTime);
1325
1395
  player.on("waiting", () => {
1326
1396
  });
1327
1397
  player.on("dispose", () => {
@@ -1337,6 +1407,7 @@ var VideoPlayerComponent = ({
1337
1407
  useEffect14(() => {
1338
1408
  if (!playerRef.current) {
1339
1409
  const videoElement = document.createElement("video-js");
1410
+ videoElement.setAttribute("playsinline", "true");
1340
1411
  videoElement.classList.add("vjs-big-play-centered");
1341
1412
  if (poster) {
1342
1413
  videoElement.setAttribute("poster", poster);
@@ -1385,7 +1456,8 @@ var VideoPlayerComponent = ({
1385
1456
  notes,
1386
1457
  chapters,
1387
1458
  5,
1388
- handleSaveNoteAction
1459
+ handleSaveNoteAction,
1460
+ opacity
1389
1461
  );
1390
1462
  }, 500);
1391
1463
  return () => clearTimeout(controlBarTimeout);
@@ -1399,7 +1471,8 @@ var VideoPlayerComponent = ({
1399
1471
  chapters,
1400
1472
  isReady,
1401
1473
  handleSaveNoteAction,
1402
- duration
1474
+ duration,
1475
+ opacity
1403
1476
  ]);
1404
1477
  useEffect14(() => {
1405
1478
  if (isReady) {
@@ -1417,13 +1490,40 @@ var VideoPlayerComponent = ({
1417
1490
  return () => clearInterval(intervalId);
1418
1491
  }
1419
1492
  }, []);
1420
- const handlePlayerClick = (e) => {
1493
+ useEffect14(() => {
1494
+ return () => {
1495
+ if (playerRef.current) {
1496
+ playerRef.current.dispose();
1497
+ playerRef.current = void 0;
1498
+ if (bigPlayButtonRoot[id]) {
1499
+ bigPlayButtonRoot[id].unmount();
1500
+ bigPlayButtonRoot[id] = void 0;
1501
+ }
1502
+ if (controlBarRoot[id]) {
1503
+ controlBarRoot[id].unmount();
1504
+ controlBarRoot[id] = void 0;
1505
+ }
1506
+ }
1507
+ };
1508
+ }, []);
1509
+ const timeoutRef = useRef2(null);
1510
+ const handlePlayerClick = async (e) => {
1421
1511
  e.preventDefault();
1422
- console.log("all");
1512
+ if (timeoutRef.current) {
1513
+ clearTimeout(timeoutRef.current);
1514
+ }
1515
+ setOpacity("100");
1516
+ timeoutRef.current = setTimeout(() => {
1517
+ setOpacity("0");
1518
+ }, 5e3);
1423
1519
  if (playerRef.current) {
1424
1520
  if (playerRef.current.paused()) {
1425
- playerRef.current.play();
1426
- setIsPaused(false);
1521
+ try {
1522
+ await playerRef.current.play();
1523
+ setIsPaused(false);
1524
+ } catch (error) {
1525
+ console.error("Failed to play video:", error);
1526
+ }
1427
1527
  } else {
1428
1528
  playerRef.current.pause();
1429
1529
  setIsPaused(true);
@@ -1431,9 +1531,42 @@ var VideoPlayerComponent = ({
1431
1531
  }
1432
1532
  }
1433
1533
  };
1534
+ const videoRefs = useRef2(null);
1535
+ useEffect14(() => {
1536
+ const observer = new IntersectionObserver(
1537
+ (entries) => {
1538
+ entries.forEach((entry) => {
1539
+ var _a, _b;
1540
+ if (entry.isIntersecting === false) {
1541
+ if (((_a = playerRef == null ? void 0 : playerRef.current) == null ? void 0 : _a.paused()) === false) {
1542
+ try {
1543
+ (_b = playerRef == null ? void 0 : playerRef.current) == null ? void 0 : _b.pause();
1544
+ setIsPaused(true);
1545
+ } catch (error) {
1546
+ console.error("Failed to play video:", error);
1547
+ }
1548
+ }
1549
+ }
1550
+ });
1551
+ },
1552
+ {
1553
+ threshold: 0.1
1554
+ // The amount of the component that must be visible (0.1 means 10% visible)
1555
+ }
1556
+ );
1557
+ if (videoRefs.current) {
1558
+ observer.observe(videoRefs.current);
1559
+ }
1560
+ return () => {
1561
+ if (videoRefs.current) {
1562
+ observer.unobserve(videoRef.current);
1563
+ }
1564
+ };
1565
+ }, []);
1434
1566
  return /* @__PURE__ */ jsx35(
1435
1567
  "div",
1436
1568
  {
1569
+ ref: videoRefs,
1437
1570
  id: `video-container-${id}`,
1438
1571
  className: "sb-relative sb-rounded-md sb-overflow-hidden",
1439
1572
  children: /* @__PURE__ */ jsx35(
@@ -1473,7 +1606,8 @@ var Component = ({
1473
1606
  startTime = 0,
1474
1607
  handleSaveNoteAction,
1475
1608
  onPlay,
1476
- onPause
1609
+ onPause,
1610
+ isFocused = true
1477
1611
  }) => {
1478
1612
  options = __spreadProps(__spreadValues({}, options), {
1479
1613
  responsive: true,
@@ -1491,6 +1625,9 @@ var Component = ({
1491
1625
  if (options.height === void 0) options.height = DEFAULT_OPTIONS.height;
1492
1626
  if (options.width === void 0) options.width = DEFAULT_OPTIONS.width;
1493
1627
  const [tracks, setTracks] = useState14([]);
1628
+ useEffect15(() => {
1629
+ console.log(isFocused, "isF");
1630
+ }, [isFocused]);
1494
1631
  useEffect15(() => {
1495
1632
  const getTracks = async () => {
1496
1633
  const newTracks = [];