react-helios 2.3.3 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -2,6 +2,33 @@ import * as react from 'react';
2
2
  import react__default, { ReactNode } from 'react';
3
3
  import { HlsConfig } from 'hls.js';
4
4
 
5
+ /**
6
+ * Preset bandwidth thresholds (Kbps) for automatic audio mode switching.
7
+ *
8
+ * | Preset | Kbps | Typical connection |
9
+ * |-----------|------|-------------------------|
10
+ * | EXTREME | 100 | 2G / Edge |
11
+ * | POOR | 300 | Slow 3G ← **default** |
12
+ * | FAIR | 700 | 3G |
13
+ * | GOOD | 1500 | 4G / Wi-Fi |
14
+ *
15
+ * Pass any of these (or a custom number) as `audioBandwidthThreshold`.
16
+ * Set to `0` to disable automatic switching entirely.
17
+ *
18
+ * @example
19
+ * import { AUDIO_BANDWIDTH_THRESHOLDS } from "react-helios";
20
+ * <VideoPlayer audioBandwidthThreshold={AUDIO_BANDWIDTH_THRESHOLDS.FAIR} ... />
21
+ */
22
+ declare const AUDIO_BANDWIDTH_THRESHOLDS: {
23
+ /** < 100 Kbps — very poor, 2G / Edge */
24
+ readonly EXTREME: 100;
25
+ /** < 300 Kbps — poor, slow 3G (default) */
26
+ readonly POOR: 300;
27
+ /** < 700 Kbps — fair, 3G */
28
+ readonly FAIR: 700;
29
+ /** < 1500 Kbps — decent, 4G / Wi-Fi */
30
+ readonly GOOD: 1500;
31
+ };
5
32
  interface BufferedRange {
6
33
  start: number;
7
34
  end: number;
@@ -39,6 +66,8 @@ interface PlayerState {
39
66
  isFullscreen: boolean;
40
67
  isPictureInPicture: boolean;
41
68
  isTheaterMode: boolean;
69
+ /** True when the player is in audio-only mode (video hidden, waveform shown). */
70
+ isAudioMode: boolean;
42
71
  isLive: boolean;
43
72
  qualityLevels: HLSQualityLevel[];
44
73
  currentQualityLevel: number;
@@ -56,6 +85,8 @@ interface VideoPlayerRef {
56
85
  toggleFullscreen: () => Promise<void>;
57
86
  togglePictureInPicture: () => Promise<void>;
58
87
  toggleTheaterMode: () => void;
88
+ /** Toggle audio-only mode. Can also be triggered programmatically from outside the player. */
89
+ toggleAudioMode: () => void;
59
90
  getState: () => PlayerState;
60
91
  getVideoElement: () => HTMLVideoElement | null;
61
92
  }
@@ -70,39 +101,36 @@ interface ControlBarItem {
70
101
  title?: string;
71
102
  onClick: () => void;
72
103
  }
73
- interface VideoPlayerProps {
74
- src: string;
75
- poster?: string;
104
+ interface VideoPlayerOptions {
76
105
  autoplay?: boolean;
77
106
  muted?: boolean;
78
107
  loop?: boolean;
79
- controls?: boolean;
80
108
  preload?: "none" | "metadata" | "auto";
81
109
  playbackRates?: PlaybackRate[];
82
- className?: string;
83
110
  enableHLS?: boolean;
111
+ hlsConfig?: Partial<HlsConfig>;
84
112
  enablePreview?: boolean;
85
- /**
86
- * URL to a WebVTT thumbnail track for sprite-sheet preview on the progress bar.
87
- *
88
- * The VTT file should map time ranges to sprite-sheet coordinates using the
89
- * standard `#xywh=x,y,w,h` fragment format:
90
- *
91
- * ```
92
- * WEBVTT
93
- *
94
- * 00:00:00.000 --> 00:00:05.000
95
- * https://cdn.example.com/thumbs/storyboard0.jpg#xywh=0,0,160,90
96
- * ```
97
- *
98
- * When provided, hovering the progress bar shows a thumbnail instead of
99
- * requiring a second video decode. If omitted, only the timestamp tooltip
100
- * is shown.
101
- */
102
113
  thumbnailVtt?: string;
103
- hlsConfig?: Partial<HlsConfig>;
114
+ autoHideControls?: boolean;
104
115
  subtitles?: SubtitleTrack[];
105
116
  crossOrigin?: "anonymous" | "use-credentials";
117
+ logo?: string | ReactNode;
118
+ audioSrc?: string;
119
+ showAudioButton?: boolean;
120
+ audioModeIcon?: ReactNode;
121
+ videoModeIcon?: ReactNode;
122
+ /**
123
+ * Custom content shown in audio mode when no `poster` is provided.
124
+ * Replaces the default animated-gradient + waveform fallback entirely.
125
+ * The `logo` prop is still rendered on top of this if also provided.
126
+ */
127
+ audioModeFallback?: ReactNode;
128
+ /** Label shown next to the icon when in video mode (click → switches to audio). Default: "Audio" */
129
+ audioModeLabel?: string;
130
+ /** Label shown next to the icon when in audio mode (click → switches to video). Default: "Video" */
131
+ videoModeLabel?: string;
132
+ defaultAudioMode?: boolean;
133
+ audioBandwidthThreshold?: number;
106
134
  onPlay?: () => void;
107
135
  onPause?: () => void;
108
136
  onEnded?: () => void;
@@ -111,9 +139,17 @@ interface VideoPlayerProps {
111
139
  onDurationChange?: (duration: number) => void;
112
140
  onBuffering?: (isBuffering: boolean) => void;
113
141
  onTheaterModeChange?: (isTheater: boolean) => void;
142
+ onAudioModeChange?: (isAudio: boolean) => void;
114
143
  contextMenuItems?: ContextMenuItem[];
115
144
  controlBarItems?: ControlBarItem[];
116
145
  }
146
+ interface VideoPlayerProps {
147
+ src: string;
148
+ poster?: string;
149
+ className?: string;
150
+ controls?: boolean;
151
+ options?: VideoPlayerOptions;
152
+ }
117
153
 
118
154
  declare const VideoPlayer: react__default.ForwardRefExoticComponent<VideoPlayerProps & react__default.RefAttributes<VideoPlayerRef>>;
119
155
 
@@ -131,12 +167,19 @@ interface ControlsProps {
131
167
  isFullscreen: boolean;
132
168
  isPictureInPicture: boolean;
133
169
  isTheaterMode: boolean;
170
+ isAudioMode: boolean;
171
+ showAudioButton: boolean;
172
+ audioModeIcon?: ReactNode;
173
+ videoModeIcon?: ReactNode;
174
+ audioModeLabel?: string;
175
+ videoModeLabel?: string;
134
176
  isLive: boolean;
135
177
  qualityLevels: HLSQualityLevel[];
136
178
  currentQualityLevel: number;
137
179
  controlBarItems?: ControlBarItem[];
180
+ autoHideControls: boolean;
138
181
  }
139
- declare const Controls: react__default.FC<ControlsProps>;
182
+ declare const Controls: react__default.NamedExoticComponent<ControlsProps>;
140
183
 
141
184
  interface TimeDisplayProps {
142
185
  videoRef: React.RefObject<HTMLVideoElement | null>;
@@ -278,4 +321,4 @@ declare function parseThumbnailVtt(text: string, baseUrl?: string): ThumbnailCue
278
321
  */
279
322
  declare function findThumbnailCue(cues: ThumbnailCue[], time: number): ThumbnailCue | null;
280
323
 
281
- export { type BufferedRange, type ContextMenuItem, type ControlBarItem, index as ControlElements, Controls, type HLSQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
324
+ export { AUDIO_BANDWIDTH_THRESHOLDS, type BufferedRange, type ContextMenuItem, type ControlBarItem, index as ControlElements, Controls, type HLSQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerOptions, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var Lt=require('react'),fe=require('hls.js'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Lt__default=/*#__PURE__*/_interopDefault(Lt);var fe__default=/*#__PURE__*/_interopDefault(fe);var Xe=Object.defineProperty;var je=(n,e)=>{for(var d in e)Xe(n,d,{get:e[d],enumerable:true});};function Z(n){if(!Number.isFinite(n)||n<0)return "0:00";let e=Math.floor(n),d=Math.floor(e/3600),s=Math.floor(e%3600/60),o=e%60;return d>0?`${d}:${String(s).padStart(2,"0")}:${String(o).padStart(2,"0")}`:`${s}:${String(o).padStart(2,"0")}`}function pe(n){try{return new URL(n,"https://x").pathname.toLowerCase().endsWith(".m3u8")||/\/hls\//i.test(n)||/\/stream\.m3u8/i.test(n)}catch{return n.toLowerCase().includes(".m3u8")}}function Ge(n){if(pe(n))return "application/x-mpegURL";let e=n.toLowerCase().split("?")[0];return e.endsWith(".mp4")?"video/mp4":e.endsWith(".webm")?"video/webm":e.endsWith(".ogv")||e.endsWith(".ogg")?"video/ogg":e.endsWith(".mov")?"video/quicktime":"video/mp4"}function Se(n){return n.map((e,d)=>({id:d,height:e.height??0,width:e.width??0,bitrate:e.bitrate??0,name:e.height?`${e.height}p`:`Level ${d+1}`}))}var Ze={isPlaying:false,currentTime:0,duration:0,volume:1,isMuted:false,playbackRate:1,isFullscreen:false,isPictureInPicture:false,isTheaterMode:false,isBuffering:false,bufferedRanges:[],error:null,isLive:false,qualityLevels:[],currentQualityLevel:-1};function Be(n,e,d={}){let s=Lt.useRef(null),o=Lt.useRef(null),h=Lt.useRef(1),c=Lt.useRef(0),l=Lt.useRef(d);l.current=d;let[y,m]=Lt.useState({...Ze,isMuted:d.muted??false,volume:d.muted?0:1}),x=Lt.useRef(y);x.current=y,Lt.useEffect(()=>{let t=n.current;if(!t||(s.current&&(s.current.destroy(),s.current=null),c.current=0,m(f=>({...f,currentTime:0,duration:0,error:null,isBuffering:false,isLive:false,qualityLevels:[],currentQualityLevel:-1})),!e))return;let u=l.current;if(u.enableHLS!==false&&pe(e)){if(t.canPlayType("application/vnd.apple.mpegurl"))t.src=e,t.load(),u.autoplay&&t.play().catch(()=>{});else if(fe__default.default.isSupported()){let f=new fe__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...u.hlsConfig});f.attachMedia(t),f.loadSource(e),f.on(fe.Events.MANIFEST_PARSED,(w,B)=>{let p=Se(B.levels);m(v=>({...v,qualityLevels:p,currentQualityLevel:-1})),l.current.autoplay&&t.play().catch(()=>{});}),f.on(fe.Events.LEVEL_SWITCHED,(w,B)=>{m(p=>({...p,currentQualityLevel:B.level}));});let b=3;f.on(fe.Events.ERROR,(w,B)=>{if(!B.fatal){console.warn("[hls] non-fatal:",B.details);return}switch(B.type){case fe__default.default.ErrorTypes.NETWORK_ERROR:if(c.current<b){c.current+=1;let p=1e3*c.current;console.warn(`[hls] network error \u2013 retry ${c.current}/${b} in ${p}ms`),setTimeout(()=>{s.current===f&&f.startLoad();},p);}else {let p={code:"HLS_NETWORK_ERROR",message:"Failed to load stream after multiple retries."};m(v=>({...v,error:p})),l.current.onError?.(p);}break;case fe__default.default.ErrorTypes.MEDIA_ERROR:console.warn("[hls] media error \u2013 recovering"),f.recoverMediaError();break;default:{f.destroy(),s.current=null;let p={code:"HLS_FATAL_ERROR",message:"An unrecoverable HLS error occurred."};m(v=>({...v,error:p})),l.current.onError?.(p);break}}}),s.current=f;}}else t.src=e,t.load(),u.autoplay&&t.play().catch(()=>{});return ()=>{s.current&&(s.current.destroy(),s.current=null);}},[e,n]),Lt.useEffect(()=>{let t=n.current;if(!t)return;l.current.muted&&(t.muted=true),l.current.loop&&(t.loop=true);let u=()=>{m(a=>({...a,isPlaying:true})),l.current.onPlay?.();},f=()=>{m(a=>({...a,isPlaying:false})),l.current.onPause?.();},b=()=>{m(a=>({...a,isPlaying:false})),l.current.onEnded?.();},w=()=>{l.current.onTimeUpdate?.(t.currentTime);},B=()=>{let a=t.duration,E=!Number.isFinite(a);m(I=>({...I,duration:E?0:a,isLive:E})),E||l.current.onDurationChange?.(a);},p=()=>{let a=t.volume;a>0&&!t.muted&&(h.current=a),m(E=>({...E,volume:a,isMuted:t.muted||a===0}));},v=()=>{m(a=>({...a,playbackRate:t.playbackRate}));},U=()=>{let a=t.error;if(!a)return;let I={code:{1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"}[a.code]??"UNKNOWN",message:a.message||"Unknown media error"};m(te=>({...te,error:I})),l.current.onError?.(I);},G=()=>{m(a=>({...a,isBuffering:true})),l.current.onBuffering?.(true);},X=()=>{m(a=>({...a,isBuffering:false})),l.current.onBuffering?.(false);},V=()=>m(a=>({...a,isBuffering:false})),J=()=>{},r=()=>{let a=!!(document.fullscreenElement||document.webkitFullscreenElement);m(E=>({...E,isFullscreen:a}));},i=()=>{m(a=>({...a,isPictureInPicture:document.pictureInPictureElement===t}));};return t.addEventListener("play",u),t.addEventListener("pause",f),t.addEventListener("ended",b),t.addEventListener("timeupdate",w),t.addEventListener("durationchange",B),t.addEventListener("volumechange",p),t.addEventListener("ratechange",v),t.addEventListener("error",U),t.addEventListener("waiting",G),t.addEventListener("canplay",X),t.addEventListener("playing",V),t.addEventListener("progress",J),document.addEventListener("fullscreenchange",r),document.addEventListener("webkitfullscreenchange",r),t.addEventListener("enterpictureinpicture",i),t.addEventListener("leavepictureinpicture",i),()=>{t.removeEventListener("play",u),t.removeEventListener("pause",f),t.removeEventListener("ended",b),t.removeEventListener("timeupdate",w),t.removeEventListener("durationchange",B),t.removeEventListener("volumechange",p),t.removeEventListener("ratechange",v),t.removeEventListener("error",U),t.removeEventListener("waiting",G),t.removeEventListener("canplay",X),t.removeEventListener("playing",V),t.removeEventListener("progress",J),document.removeEventListener("fullscreenchange",r),document.removeEventListener("webkitfullscreenchange",r),t.removeEventListener("enterpictureinpicture",i),t.removeEventListener("leavepictureinpicture",i);}},[n]);let k=Lt.useCallback(async()=>{let t=n.current;if(t)try{await t.play();}catch(u){u instanceof Error&&u.name!=="AbortError"&&console.error("[player] play() failed:",u);}},[n]),H=Lt.useCallback(()=>{n.current?.pause();},[n]),P=Lt.useCallback(t=>{let u=n.current;u&&(u.currentTime=Math.max(0,Math.min(t,u.duration||t)));},[n]),g=Lt.useCallback(t=>{let u=n.current;if(!u)return;let f=Math.max(0,Math.min(t,1));f>0&&(h.current=f),u.volume=f,u.muted=f===0;},[n]),R=Lt.useCallback(()=>{let t=n.current;if(t)if(t.muted||t.volume===0){let u=h.current>0?h.current:1;t.volume=u,t.muted=false;}else h.current=t.volume,t.muted=true;},[n]),N=Lt.useCallback(t=>{let u=n.current;u&&(u.playbackRate=t);},[n]),M=Lt.useCallback(t=>{let u=s.current;u&&(u.currentLevel=t,m(f=>({...f,currentQualityLevel:t})));},[]),L=Lt.useCallback(()=>{let t=s.current,u=n.current;if(!t||!u)return;let f=t.liveSyncPosition;f!=null&&Number.isFinite(f)&&(u.currentTime=f);},[n]),T=Lt.useCallback(async()=>{let t=n.current;if(!t)return;let u=o.current??t.parentElement;if(u)try{!document.fullscreenElement&&!document.webkitFullscreenElement?u.requestFullscreen?await u.requestFullscreen():u.webkitRequestFullscreen?.():document.exitFullscreen?await document.exitFullscreen():document.webkitExitFullscreen?.();}catch(f){console.error("[player] fullscreen toggle failed:",f);}},[n]),F=Lt.useCallback(async()=>{let t=n.current;if(t)try{document.pictureInPictureElement?await document.exitPictureInPicture():await t.requestPictureInPicture();}catch(u){console.error("[player] PiP toggle failed:",u);}},[n]),C=Lt.useCallback(()=>{let t=!x.current.isTheaterMode;m(u=>({...u,isTheaterMode:t})),l.current.onTheaterModeChange?.(t);},[]),Q=Lt.useCallback(()=>{let t=n.current,u=t?.currentTime??0,f=[];if(t)for(let b=0;b<t.buffered.length;b++)f.push({start:t.buffered.start(b),end:t.buffered.end(b)});return {...x.current,currentTime:u,bufferedRanges:f}},[n]),q=Lt.useCallback(()=>n.current??null,[n]),j=Lt.useMemo(()=>({play:k,pause:H,seek:P,setVolume:g,toggleMute:R,setPlaybackRate:N,setQualityLevel:M,seekToLive:L,toggleFullscreen:T,togglePictureInPicture:F,toggleTheaterMode:C,getState:Q,getVideoElement:q}),[k,H,P,g,R,N,M,L,T,F,C,Q,q]);return {state:y,ref:j,hlsRef:s,fullscreenContainerRef:o}}var Ae={};je(Ae,{ControlElements:()=>_,FullscreenButton:()=>ue,PauseButton:()=>le,PiPButton:()=>ce,PlayButton:()=>se,ProgressBar:()=>he,SettingsMenu:()=>ge,TheaterButton:()=>de,TimeDisplay:()=>ye,VolumeControl:()=>ve});var se=Lt.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":"Play",title:"Play (Space)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M8 5v14l11-7z"})})}));se.displayName="PlayButton";var le=Lt.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":"Pause",title:"Pause (Space)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"})})}));le.displayName="PauseButton";var ue=Lt.memo(({onClick:n,isFullscreen:e=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":e?"Exit Fullscreen":"Fullscreen",title:e?"Exit Fullscreen (F)":"Fullscreen (F)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:e?jsxRuntime.jsx("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"}):jsxRuntime.jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})})}));ue.displayName="FullscreenButton";var ce=Lt.memo(({onClick:n,isPiP:e=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":e?"Exit Picture-in-Picture":"Picture-in-Picture",title:e?"Exit Picture-in-Picture (P)":"Picture-in-Picture (P)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V5h18v14.02z"})})}));ce.displayName="PiPButton";var de=Lt.memo(({onClick:n,isTheater:e=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":e?"Exit Theater Mode":"Theater Mode",title:e?"Exit Theater Mode (T)":"Theater Mode (T)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:e?jsxRuntime.jsx("path",{d:"M19 7H5c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm0 8H5V9h14v6z"}):jsxRuntime.jsx("path",{d:"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14z"})})}));de.displayName="TheaterButton";var De=Lt.memo(({volume:n,isMuted:e,onVolumeChange:d,onToggleMute:s})=>{let[o,h]=Lt.useState(false),c=e?0:n,l=c*100,y=Lt.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${l}%, rgba(255,255,255,0.3) ${l}%, rgba(255,255,255,0.3) 100%)`,[l]);return jsxRuntime.jsxs("div",{className:"volumeContainer",onMouseEnter:()=>h(true),onMouseLeave:()=>h(false),children:[jsxRuntime.jsx("button",{onClick:s,className:"controlButton","aria-label":e?"Unmute":"Mute",title:e?"Unmute (M)":"Mute (M)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:c===0?jsxRuntime.jsx("path",{d:"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C23.16 14.42 24 13.3 24 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"}):c<.5?jsxRuntime.jsx("path",{d:"M7 9v6h4l5 5V4l-5 5H7z"}):jsxRuntime.jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"})})}),o&&jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",value:l,onChange:m=>d(Number(m.target.value)/100),className:"volumeSlider",style:{background:y},"aria-label":"Volume","aria-valuenow":Math.round(l)})]})});De.displayName="VolumeControl";var ve=De;function Ve(n){let e=n.trim().split(":");return e.length===3?+e[0]*3600+ +e[1]*60+parseFloat(e[2]):+e[0]*60+parseFloat(e[1])}function ot(n,e){if(/^https?:\/\//i.test(e))return e;try{return new URL(e,n).href}catch{return e}}function Le(n,e=""){let d=[],s=n.replace(/\r\n/g,`
1
+ 'use strict';var Dt=require('react'),Ee=require('hls.js'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Dt__default=/*#__PURE__*/_interopDefault(Dt);var Ee__default=/*#__PURE__*/_interopDefault(Ee);var ot=Object.defineProperty;var it=(n,t)=>{for(var r in t)ot(n,r,{get:t[r],enumerable:true});};function se(n){if(!Number.isFinite(n)||n<0)return "0:00";let t=Math.floor(n),r=Math.floor(t/3600),s=Math.floor(t%3600/60),a=t%60;return r>0?`${r}:${String(s).padStart(2,"0")}:${String(a).padStart(2,"0")}`:`${s}:${String(a).padStart(2,"0")}`}function ye(n){try{return new URL(n,"https://x").pathname.toLowerCase().endsWith(".m3u8")||/\/hls\//i.test(n)||/\/stream\.m3u8/i.test(n)}catch{return n.toLowerCase().includes(".m3u8")}}function at(n){if(ye(n))return "application/x-mpegURL";let t=n.toLowerCase().split("?")[0];return t.endsWith(".mp4")?"video/mp4":t.endsWith(".webm")?"video/webm":t.endsWith(".ogv")||t.endsWith(".ogg")?"video/ogg":t.endsWith(".mov")?"video/quicktime":"video/mp4"}function Oe(n){return n.map((t,r)=>({id:r,height:t.height??0,width:t.width??0,bitrate:t.bitrate??0,name:t.height?`${t.height}p`:`Level ${r+1}`}))}var ut={isPlaying:false,currentTime:0,duration:0,volume:1,isMuted:false,playbackRate:1,isFullscreen:false,isPictureInPicture:false,isTheaterMode:false,isAudioMode:false,isBuffering:false,bufferedRanges:[],error:null,isLive:false,qualityLevels:[],currentQualityLevel:-1};function _e(n,t,r={}){let s=Dt.useRef(null),a=Dt.useRef(null),p=Dt.useRef(1),u=Dt.useRef(0),l=Dt.useRef(r);l.current=r;let[L,c]=Dt.useState({...ut,isMuted:r.muted??false,volume:r.muted?0:1,isAudioMode:r.defaultAudioMode??false}),C=Dt.useRef(L);C.current=L;let k=Dt.useRef([]),R=Dt.useRef(false),T=Dt.useRef(false),m=Dt.useRef(null);Dt.useEffect(()=>{let e=n.current;if(!e||(s.current&&(s.current.destroy(),s.current=null),u.current=0,k.current=[],R.current=false,T.current=false,m.current&&(clearTimeout(m.current),m.current=null),c(v=>({...v,currentTime:0,duration:0,error:null,isBuffering:false,isLive:false,qualityLevels:[],currentQualityLevel:-1,isAudioMode:l.current.defaultAudioMode??false})),!t))return;let d=l.current;if(d.enableHLS!==false&&ye(t)){if(e.canPlayType("application/vnd.apple.mpegurl"))e.src=t,e.load(),d.autoplay&&e.play().catch(()=>{});else if(Ee__default.default.isSupported()){let v=new Ee__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...d.hlsConfig});v.attachMedia(e),v.loadSource(t),v.on(Ee.Events.MANIFEST_PARSED,(O,o)=>{let i=Oe(o.levels);c(f=>({...f,qualityLevels:i,currentQualityLevel:-1})),l.current.autoplay&&e.play().catch(()=>{});}),v.on(Ee.Events.LEVEL_SWITCHED,(O,o)=>{c(i=>({...i,currentQualityLevel:o.level}));}),v.on(Ee.Events.FRAG_LOADED,()=>{let O=l.current.audioBandwidthThreshold??300;if(!O||T.current)return;let o=v.bandwidthEstimate/1e3;if(o<=0)return;let i=k.current;if(i.push(o),i.length>5&&i.shift(),i.length<3)return;let f=i.reduce((y,S)=>y+S,0)/i.length;c(y=>!y.isAudioMode&&f<O?(R.current=true,l.current.onAudioModeChange?.(true),{...y,isAudioMode:true}):y.isAudioMode&&R.current&&f>O*1.5?(R.current=false,l.current.onAudioModeChange?.(false),{...y,isAudioMode:false}):y);});let V=3;v.on(Ee.Events.ERROR,(O,o)=>{if(!o.fatal){console.warn("[hls] non-fatal:",o.details);return}switch(o.type){case Ee__default.default.ErrorTypes.NETWORK_ERROR:if(u.current<V){u.current+=1;let i=1e3*u.current;console.warn(`[hls] network error \u2013 retry ${u.current}/${V} in ${i}ms`),setTimeout(()=>{s.current===v&&v.startLoad();},i);}else {let i={code:"HLS_NETWORK_ERROR",message:"Failed to load stream after multiple retries."};c(f=>({...f,error:i})),l.current.onError?.(i);}break;case Ee__default.default.ErrorTypes.MEDIA_ERROR:console.warn("[hls] media error \u2013 recovering"),v.recoverMediaError();break;default:{v.destroy(),s.current=null;let i={code:"HLS_FATAL_ERROR",message:"An unrecoverable HLS error occurred."};c(f=>({...f,error:i})),l.current.onError?.(i);break}}}),s.current=v;}}else e.src=t,e.load(),d.autoplay&&e.play().catch(()=>{});return ()=>{s.current&&(s.current.destroy(),s.current=null),m.current&&(clearTimeout(m.current),m.current=null);}},[t,n]),Dt.useEffect(()=>{let e=n.current;if(!e)return;l.current.muted&&(e.muted=true),l.current.loop&&(e.loop=true);let d=()=>{c(b=>({...b,isPlaying:true})),l.current.onPlay?.();},v=()=>{c(b=>({...b,isPlaying:false})),l.current.onPause?.();},V=()=>{c(b=>({...b,isPlaying:false})),l.current.onEnded?.();},O=()=>{l.current.onTimeUpdate?.(e.currentTime);},o=()=>{let b=e.duration,z=!Number.isFinite(b);c(j=>({...j,duration:z?0:b,isLive:z})),z||l.current.onDurationChange?.(b);},i=()=>{let b=e.volume;b>0&&!e.muted&&(p.current=b),c(z=>({...z,volume:b,isMuted:e.muted||b===0}));},f=()=>{c(b=>({...b,playbackRate:e.playbackRate}));},y=()=>{let b=e.error;if(!b)return;let j={code:{1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"}[b.code]??"UNKNOWN",message:b.message||"Unknown media error"};c(ae=>({...ae,error:j})),l.current.onError?.(j);},S=()=>{c(b=>({...b,isBuffering:true})),l.current.onBuffering?.(true);},h=()=>{c(b=>({...b,isBuffering:false})),l.current.onBuffering?.(false);},E=()=>c(b=>({...b,isBuffering:false})),g=()=>{let b=!!(document.fullscreenElement||document.webkitFullscreenElement);c(z=>({...z,isFullscreen:b}));},A=()=>{c(b=>({...b,isPictureInPicture:document.pictureInPictureElement===e}));};return e.addEventListener("play",d),e.addEventListener("pause",v),e.addEventListener("ended",V),e.addEventListener("timeupdate",O),e.addEventListener("durationchange",o),e.addEventListener("volumechange",i),e.addEventListener("ratechange",f),e.addEventListener("error",y),e.addEventListener("waiting",S),e.addEventListener("canplay",h),e.addEventListener("playing",E),document.addEventListener("fullscreenchange",g),document.addEventListener("webkitfullscreenchange",g),e.addEventListener("enterpictureinpicture",A),e.addEventListener("leavepictureinpicture",A),()=>{e.removeEventListener("play",d),e.removeEventListener("pause",v),e.removeEventListener("ended",V),e.removeEventListener("timeupdate",O),e.removeEventListener("durationchange",o),e.removeEventListener("volumechange",i),e.removeEventListener("ratechange",f),e.removeEventListener("error",y),e.removeEventListener("waiting",S),e.removeEventListener("canplay",h),e.removeEventListener("playing",E),document.removeEventListener("fullscreenchange",g),document.removeEventListener("webkitfullscreenchange",g),e.removeEventListener("enterpictureinpicture",A),e.removeEventListener("leavepictureinpicture",A);}},[n]);let B=Dt.useCallback(async()=>{let e=n.current;if(e)try{await e.play();}catch(d){d instanceof Error&&d.name!=="AbortError"&&console.error("[player] play() failed:",d);}},[n]),I=Dt.useCallback(()=>{n.current?.pause();},[n]),_=Dt.useCallback(e=>{let d=n.current;d&&(d.currentTime=Math.max(0,Math.min(e,d.duration||e)));},[n]),P=Dt.useCallback(e=>{let d=n.current;if(!d)return;let v=Math.max(0,Math.min(e,1));v>0&&(p.current=v),d.volume=v,d.muted=v===0;},[n]),x=Dt.useCallback(()=>{let e=n.current;if(e)if(e.muted||e.volume===0){let d=p.current>0?p.current:1;e.volume=d,e.muted=false;}else p.current=e.volume,e.muted=true;},[n]),D=Dt.useCallback(e=>{let d=n.current;d&&(d.playbackRate=e);},[n]),N=Dt.useCallback(e=>{let d=s.current;d&&(d.currentLevel=e,c(v=>({...v,currentQualityLevel:e})));},[]),ne=Dt.useCallback(()=>{let e=s.current,d=n.current;if(!e||!d)return;let v=e.liveSyncPosition;v!=null&&Number.isFinite(v)&&(d.currentTime=v);},[n]),Z=Dt.useCallback(async()=>{let e=n.current;if(!e)return;let d=a.current??e.parentElement;if(d)try{!document.fullscreenElement&&!document.webkitFullscreenElement?d.requestFullscreen?await d.requestFullscreen():d.webkitRequestFullscreen?.():document.exitFullscreen?await document.exitFullscreen():document.webkitExitFullscreen?.();}catch(v){console.error("[player] fullscreen toggle failed:",v);}},[n]),X=Dt.useCallback(async()=>{let e=n.current;if(e)try{document.pictureInPictureElement?await document.exitPictureInPicture():await e.requestPictureInPicture();}catch(d){console.error("[player] PiP toggle failed:",d);}},[n]),M=Dt.useCallback(()=>{let e=!C.current.isTheaterMode;c(d=>({...d,isTheaterMode:e})),l.current.onTheaterModeChange?.(e);},[]),G=Dt.useCallback(()=>{m.current&&clearTimeout(m.current),R.current=false,T.current=true,m.current=setTimeout(()=>{T.current=false,k.current=[];},6e4);let e=!C.current.isAudioMode;c(d=>({...d,isAudioMode:e})),l.current.onAudioModeChange?.(e);},[]),U=Dt.useCallback(()=>{let e=n.current,d=e?.currentTime??0,v=[];if(e)for(let V=0;V<e.buffered.length;V++)v.push({start:e.buffered.start(V),end:e.buffered.end(V)});return {...C.current,currentTime:d,bufferedRanges:v}},[n]),ee=Dt.useCallback(()=>n.current??null,[n]),ie=Dt.useMemo(()=>({play:B,pause:I,seek:_,setVolume:P,toggleMute:x,setPlaybackRate:D,setQualityLevel:N,seekToLive:ne,toggleFullscreen:Z,togglePictureInPicture:X,toggleTheaterMode:M,toggleAudioMode:G,getState:U,getVideoElement:ee}),[B,I,_,P,x,D,N,ne,Z,X,M,G,U,ee]);return {state:L,ref:ie,hlsRef:s,fullscreenContainerRef:a}}var Ge={};it(Ge,{ControlElements:()=>Q,FullscreenButton:()=>ve,PauseButton:()=>pe,PiPButton:()=>he,PlayButton:()=>fe,ProgressBar:()=>Pe,SettingsMenu:()=>Te,TheaterButton:()=>ge,TimeDisplay:()=>ke,VolumeControl:()=>Le});var fe=Dt.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":"Play",title:"Play (Space)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M8 5v14l11-7z"})})}));fe.displayName="PlayButton";var pe=Dt.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":"Pause",title:"Pause (Space)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"})})}));pe.displayName="PauseButton";var ve=Dt.memo(({onClick:n,isFullscreen:t=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":t?"Exit Fullscreen":"Fullscreen",title:t?"Exit Fullscreen (F)":"Fullscreen (F)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:t?jsxRuntime.jsx("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"}):jsxRuntime.jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})})}));ve.displayName="FullscreenButton";var he=Dt.memo(({onClick:n,isPiP:t=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":t?"Exit Picture-in-Picture":"Picture-in-Picture",title:t?"Exit Picture-in-Picture (P)":"Picture-in-Picture (P)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V5h18v14.02z"})})}));he.displayName="PiPButton";var ge=Dt.memo(({onClick:n,isTheater:t=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":t?"Exit Theater Mode":"Theater Mode",title:t?"Exit Theater Mode (T)":"Theater Mode (T)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:t?jsxRuntime.jsx("path",{d:"M19 7H5c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm0 8H5V9h14v6z"}):jsxRuntime.jsx("path",{d:"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14z"})})}));ge.displayName="TheaterButton";var ze=Dt.memo(({volume:n,isMuted:t,onVolumeChange:r,onToggleMute:s})=>{let[a,p]=Dt.useState(false),u=t?0:n,l=u*100,L=Dt.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${l}%, rgba(255,255,255,0.3) ${l}%, rgba(255,255,255,0.3) 100%)`,[l]);return jsxRuntime.jsxs("div",{className:"volumeContainer",onMouseEnter:()=>p(true),onMouseLeave:()=>p(false),children:[jsxRuntime.jsx("button",{onClick:s,className:"controlButton","aria-label":t?"Unmute":"Mute",title:t?"Unmute (M)":"Mute (M)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:u===0?jsxRuntime.jsx("path",{d:"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C23.16 14.42 24 13.3 24 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"}):u<.5?jsxRuntime.jsx("path",{d:"M7 9v6h4l5 5V4l-5 5H7z"}):jsxRuntime.jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"})})}),a&&jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",value:l,onChange:c=>r(Number(c.target.value)/100),className:"volumeSlider",style:{background:L},"aria-label":"Volume","aria-valuenow":Math.round(l)})]})});ze.displayName="VolumeControl";var Le=ze;function $e(n){let t=n.trim().split(":");return t.length===3?+t[0]*3600+ +t[1]*60+parseFloat(t[2]):+t[0]*60+parseFloat(t[1])}function pt(n,t){if(/^https?:\/\//i.test(t))return t;try{return new URL(t,n).href}catch{return t}}function Re(n,t=""){let r=[],s=n.replace(/\r\n/g,`
2
2
  `).split(`
3
- `),o=0;for(;o<s.length;){let h=s[o].trim();if(h.includes("-->")){let c=h.indexOf("-->"),l=Ve(h.slice(0,c)),y=Ve(h.slice(c+3));for(o++;o<s.length&&!s[o].trim();)o++;if(o<s.length){let m=s[o].trim(),x=m.lastIndexOf("#xywh="),k=m,H=0,P=0,g=160,R=90;if(x!==-1){k=m.slice(0,x);let N=m.slice(x+6).split(",").map(Number);H=N[0]??0,P=N[1]??0,g=N[2]??160,R=N[3]??90;}d.push({start:l,end:y,url:ot(e,k),x:H,y:P,w:g,h:R});}}o++;}return d}function Pe(n,e){if(!n.length)return null;let d=0,s=n.length-1;for(;d<=s;){let o=d+s>>1;if(n[o].end<=e)d=o+1;else if(n[o].start>e)s=o-1;else return n[o]}return null}var He=Lt.memo(({videoRef:n,playerRef:e,enablePreview:d=true,thumbnailVtt:s})=>{let o=Lt.useRef(null),h=Lt.useRef(null),c=Lt.useRef(null),l=Lt.useRef(null),y=Lt.useRef(null),m=Lt.useRef(null),x=Lt.useRef(null),[k,H]=Lt.useState([]),P=Lt.useRef(false),g=Lt.useRef(0),R=Lt.useRef(0),N=Lt.useRef(null),M=Lt.useRef([]),L=Lt.useRef(null);Lt.useEffect(()=>{let r=()=>{L.current=null;};return window.addEventListener("resize",r,{passive:true}),()=>window.removeEventListener("resize",r)},[]);let T=Lt.useCallback(()=>(!L.current&&o.current&&(L.current=o.current.getBoundingClientRect()),L.current),[]);Lt.useEffect(()=>{if(!s){M.current=[];return}let r=false;return fetch(s).then(i=>i.text()).then(i=>{r||(M.current=Le(i,s));}).catch(()=>{r||(M.current=[]);}),()=>{r=true;}},[s]),Lt.useEffect(()=>{let r=n.current;if(!r)return;let i=()=>{let a=isFinite(r.duration)?r.duration:0,E=r.currentTime,I=a>0?E/a*100:0;h.current&&(h.current.style.width=`${I}%`),c.current&&(c.current.style.left=`${I}%`),o.current&&(o.current.setAttribute("aria-valuenow",String(Math.round(E))),o.current.setAttribute("aria-valuemax",String(Math.round(a))),o.current.setAttribute("aria-valuetext",Z(E)));};return r.addEventListener("timeupdate",i),r.addEventListener("durationchange",i),r.addEventListener("seeked",i),i(),()=>{r.removeEventListener("timeupdate",i),r.removeEventListener("durationchange",i),r.removeEventListener("seeked",i);}},[n]),Lt.useEffect(()=>{let r=n.current;if(!r)return;let i=()=>{let a=[];for(let E=0;E<r.buffered.length;E++)a.push({start:r.buffered.start(E),end:r.buffered.end(E)});H(a);};return r.addEventListener("progress",i),()=>r.removeEventListener("progress",i)},[n]);let F=Lt.useCallback(()=>{P.current=true,c.current?.classList.add("dragging");},[]),C=Lt.useCallback(()=>{P.current=false,c.current?.classList.remove("dragging");},[]),Q=Lt.useCallback(()=>{d&&(L.current=null,l.current&&(l.current.style.display="block"),m.current&&(m.current.style.display="block"));},[d]),q=Lt.useCallback(()=>{l.current&&(l.current.style.display="none"),m.current&&(m.current.style.display="none");},[]),j=Lt.useCallback(r=>{if(!x.current||!M.current.length)return;let i=Pe(M.current,r);if(N.current=i,!i)return;let a=x.current;a.style.backgroundImage=`url(${i.url})`,a.style.backgroundPosition=`-${i.x}px -${i.y}px`,a.style.width=`${i.w}px`,a.style.height=`${i.h}px`;},[]),t=Lt.useCallback(r=>{let i=T(),a=n.current?.duration;return !i||i.width===0||!a||!isFinite(a)?0:Math.max(0,Math.min(r-i.left,i.width))/i.width*a},[T,n]),u=Lt.useCallback(r=>{let i=T();return i?Math.max(0,Math.min(r-i.left,i.width)):0},[T]),f=Lt.useCallback(r=>{let i=n.current;if(!i)return;let a=i.currentTime,E=isFinite(i.duration)?i.duration:0;switch(r.key){case "ArrowLeft":case "ArrowRight":{r.preventDefault(),r.nativeEvent.stopImmediatePropagation();let I=r.shiftKey?10:5;e.seek(r.key==="ArrowLeft"?Math.max(0,a-I):Math.min(E,a+I));break}case "Home":r.preventDefault(),r.nativeEvent.stopImmediatePropagation(),e.seek(0);break;case "End":E>0&&(r.preventDefault(),r.nativeEvent.stopImmediatePropagation(),e.seek(E));break}},[n,e]),b=Lt.useCallback(r=>{let i=t(r.clientX),a=u(r.clientX);if(g.current=a,R.current=i,m.current&&(m.current.style.left=`${a}px`),y.current&&(y.current.textContent=Z(i)),j(i),l.current){let E=l.current.offsetWidth,I=T()?.width??0,te=E/2,qe=Math.max(te,Math.min(a,I-te));l.current.style.left=`${qe}px`;}P.current&&e.seek(i);},[e,j,t,u,T]),w=Lt.useCallback(()=>{Q();},[Q]),B=Lt.useCallback(()=>{q(),C();},[q,C]),p=Lt.useCallback(r=>{r.preventDefault(),F(),e.seek(t(r.clientX));},[F,t,e]),v=Lt.useCallback(()=>C(),[C]),U=Lt.useCallback(r=>{P.current||e.seek(t(r.clientX));},[t,e]);Lt.useEffect(()=>{let r=o.current;if(!r)return;let i=a=>{P.current&&a.preventDefault();};return r.addEventListener("touchmove",i,{passive:false}),()=>r.removeEventListener("touchmove",i)},[]);let G=Lt.useCallback(r=>{L.current=null,F(),e.seek(t(r.touches[0].clientX));},[F,t,e]),X=Lt.useCallback(r=>{P.current&&e.seek(t(r.touches[0].clientX));},[t,e]),V=Lt.useCallback(()=>C(),[C]);Lt.useEffect(()=>{let r=()=>C();return window.addEventListener("mouseup",r),()=>window.removeEventListener("mouseup",r)},[C]);let J=Lt.useMemo(()=>{let r=n.current,i=r&&isFinite(r.duration)?r.duration:0;return i<=0||!k.length?null:k.map((a,E)=>{let I=a.start/i*100,te=(a.end-a.start)/i*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${I}%`,width:`${te}%`}},E)})},[k,n]);return jsxRuntime.jsxs("div",{ref:o,className:"progressContainer",onMouseMove:b,onMouseEnter:w,onMouseLeave:B,onMouseDown:p,onMouseUp:v,onClick:U,onTouchStart:G,onTouchMove:X,onTouchEnd:V,onKeyDown:f,role:"slider","aria-label":"Video progress","aria-valuemin":0,"aria-valuemax":0,"aria-valuenow":0,"aria-valuetext":"0:00",tabIndex:0,children:[d&&jsxRuntime.jsxs("div",{ref:l,className:"previewTooltip",style:{left:0,display:"none"},"aria-hidden":"true",children:[s&&jsxRuntime.jsx("div",{ref:x,className:"previewThumbnail"}),jsxRuntime.jsx("div",{ref:y,className:"previewTime"})]}),jsxRuntime.jsxs("div",{className:"progressBackground",children:[J,jsxRuntime.jsx("div",{ref:h,className:"progressFilled",style:{width:"0%"}}),d&&jsxRuntime.jsx("div",{ref:m,className:"hoverIndicator",style:{left:0,display:"none"},"aria-hidden":"true"})]}),jsxRuntime.jsx("div",{ref:c,className:"scrubHandle",style:{left:"0%"},"aria-hidden":"true"})]})});He.displayName="ProgressBar";var he=He;var Ie=Lt.memo(({currentRate:n,playbackRates:e,onRateChange:d,qualityLevels:s=[],currentQualityLevel:o=-1,onQualityChange:h})=>{let[c,l]=Lt.useState(false),[y,m]=Lt.useState("speed"),x=Lt.useRef(null),k=s.length>0&&!!h;Lt.useEffect(()=>{let g=R=>{x.current&&!x.current.contains(R.target)&&l(false);};return c&&document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[c]);let H=Lt.useMemo(()=>[...s].sort((g,R)=>R.bitrate-g.bitrate),[s]),P=Lt.useMemo(()=>o===-1?"Auto":s.find(g=>g.id===o)?.name??"Auto",[s,o]);return jsxRuntime.jsxs("div",{ref:x,className:"settingsContainer",children:[jsxRuntime.jsx("button",{onClick:()=>l(g=>!g),className:"controlButton","aria-label":"Settings",title:"Settings","aria-expanded":c,children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94s-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.49.49 0 0 0-.59-.22l-2.39.96a7.02 7.02 0 0 0-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54a6.88 6.88 0 0 0-1.61.94l-2.39-.96a.488.488 0 0 0-.59.22L2.74 8.87a.48.48 0 0 0 .12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54a6.88 6.88 0 0 0 1.61-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32a.47.47 0 0 0-.12-.61l-2.01-1.58zM12 15.6A3.6 3.6 0 0 1 8.4 12 3.6 3.6 0 0 1 12 8.4a3.6 3.6 0 0 1 3.6 3.6 3.6 3.6 0 0 1-3.6 3.6z"})})}),c&&jsxRuntime.jsxs("div",{className:"settingsDropdown",role:"menu",children:[k&&jsxRuntime.jsxs("div",{className:"settingsTabs",children:[jsxRuntime.jsx("button",{className:`settingsTab${y==="speed"?" active":""}`,onClick:()=>m("speed"),children:"Speed"}),jsxRuntime.jsx("button",{className:`settingsTab${y==="quality"?" active":""}`,onClick:()=>m("quality"),children:"Quality"})]}),(!k||y==="speed")&&jsxRuntime.jsxs("div",{children:[!k&&jsxRuntime.jsx("div",{className:"settingsPanelLabel",children:"Playback Speed"}),e.map(g=>jsxRuntime.jsx("button",{onClick:()=>{d(g),l(false);},className:`settingsOption${n===g?" active":""}`,role:"menuitemradio","aria-checked":n===g,children:g===1?"Normal":`${g}\xD7`},g))]}),k&&y==="quality"&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>{h(-1),l(false);},className:`settingsOption${o===-1?" active":""}`,role:"menuitemradio","aria-checked":o===-1,children:["Auto ",o===-1&&P!=="Auto"?`(${P})`:""]}),H.map(g=>jsxRuntime.jsxs("button",{onClick:()=>{h(g.id),l(false);},className:`settingsOption${o===g.id?" active":""}`,role:"menuitemradio","aria-checked":o===g.id,children:[g.name,g.bitrate>0&&jsxRuntime.jsxs("span",{className:"settingsOptionBadge",children:[Math.round(g.bitrate/1e3)," kbps"]})]},g.id))]})]})]})});Ie.displayName="SettingsMenu";var ge=Ie;var ze=Lt.memo(({videoRef:n,isLive:e=false})=>{let d=Lt.useRef(null),s=Lt.useRef(null);return Lt.useEffect(()=>{let o=n.current;if(!o)return;let h=()=>{d.current&&(d.current.textContent=Z(o.currentTime));},c=()=>{if(s.current){let l=isFinite(o.duration)?o.duration:0;s.current.textContent=` / ${Z(l)}`;}};return o.addEventListener("timeupdate",h),o.addEventListener("durationchange",c),o.addEventListener("seeked",h),h(),c(),()=>{o.removeEventListener("timeupdate",h),o.removeEventListener("durationchange",c),o.removeEventListener("seeked",h);}},[n,e]),e?jsxRuntime.jsx("span",{className:"timeDisplay",style:{opacity:.7},children:jsxRuntime.jsx("span",{ref:d,children:"0:00"})}):jsxRuntime.jsxs("span",{className:"timeDisplay",children:[jsxRuntime.jsx("span",{ref:d,children:"0:00"}),jsxRuntime.jsx("span",{ref:s,style:{opacity:.6},children:" / 0:00"})]})});ze.displayName="TimeDisplay";var ye=ze;var _={PlayButton:se,PauseButton:le,FullscreenButton:ue,PiPButton:ce,TheaterButton:de,VolumeControl:ve,ProgressBar:he,SettingsMenu:ge,TimeDisplay:ye};var Me=({videoRef:n,playerRef:e,playerContainerRef:d,playbackRates:s,enablePreview:o,thumbnailVtt:h,isPlaying:c,volume:l,isMuted:y,playbackRate:m,isFullscreen:x,isPictureInPicture:k,isTheaterMode:H,isLive:P,qualityLevels:g,currentQualityLevel:R,controlBarItems:N})=>{let M=Lt.useRef(null),[L,T]=Lt.useState(true),F=Lt.useRef({isPlaying:c,volume:l,isMuted:y,isLive:P});F.current={isPlaying:c,volume:l,isMuted:y,isLive:P},Lt.useEffect(()=>{if(!c){T(true),M.current&&clearTimeout(M.current);return}let p=()=>{T(true),M.current&&clearTimeout(M.current),M.current=setTimeout(()=>T(false),3e3);},v=d.current;return v&&(v.addEventListener("mousemove",p),v.addEventListener("mouseenter",p),v.addEventListener("mouseleave",()=>{M.current&&clearTimeout(M.current);}),v.addEventListener("touchstart",p,{passive:true})),p(),()=>{v&&(v.removeEventListener("mousemove",p),v.removeEventListener("mouseenter",p),v.removeEventListener("mouseleave",()=>{}),v.removeEventListener("touchstart",p)),M.current&&clearTimeout(M.current);}},[c,d]),Lt.useEffect(()=>{let p=v=>{if(!d.current?.contains(document.activeElement))return;let U=v.target;if(U.tagName==="INPUT"||U.tagName==="TEXTAREA"||U.isContentEditable)return;let{isPlaying:G,volume:X,isLive:V}=F.current,J=n.current?.currentTime??0,r=n.current?.duration??0;switch(v.code){case "Space":case "KeyK":v.preventDefault(),G?e.pause():e.play();break;case "ArrowLeft":v.preventDefault(),e.seek(Math.max(0,J-5));break;case "ArrowRight":v.preventDefault(),e.seek(Math.min(r||1/0,J+5));break;case "ArrowUp":v.preventDefault(),e.setVolume(Math.min(1,X+.1));break;case "ArrowDown":v.preventDefault(),e.setVolume(Math.max(0,X-.1));break;case "KeyM":v.preventDefault(),e.toggleMute();break;case "KeyF":v.preventDefault(),e.toggleFullscreen();break;case "KeyP":v.preventDefault(),e.togglePictureInPicture();break;case "KeyT":v.preventDefault(),e.toggleTheaterMode();break;case "KeyL":v.preventDefault(),V&&e.seekToLive();break;case "Digit0":case "Digit1":case "Digit2":case "Digit3":case "Digit4":case "Digit5":case "Digit6":case "Digit7":case "Digit8":case "Digit9":{v.preventDefault();let i=Number(v.code.replace("Digit",""))*10;e.seek(r/100*i);break}}};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[e,d,n]);let C=Lt.useCallback(()=>e.play(),[e]),Q=Lt.useCallback(()=>e.pause(),[e]),q=Lt.useCallback(p=>e.setVolume(p),[e]),j=Lt.useCallback(()=>e.toggleMute(),[e]),t=Lt.useCallback(p=>e.setPlaybackRate(p),[e]),u=Lt.useCallback(p=>e.setQualityLevel(p),[e]),f=Lt.useCallback(()=>e.togglePictureInPicture(),[e]),b=Lt.useCallback(()=>e.toggleTheaterMode(),[e]),w=Lt.useCallback(()=>e.toggleFullscreen(),[e]),B=Lt.useCallback(()=>e.seekToLive(),[e]);return jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:L?1:0,transition:"opacity 0.3s",pointerEvents:"none"},children:jsxRuntime.jsxs("div",{style:{background:"linear-gradient(to top, rgba(0,0,0,0.75) 0%, rgba(0,0,0,0.2) 60%, transparent 100%)",padding:"48px 12px 12px",pointerEvents:L?"auto":"none"},role:"region","aria-label":"Video player controls",children:[jsxRuntime.jsx(_.ProgressBar,{videoRef:n,playerRef:e,enablePreview:o,thumbnailVtt:h}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:4},children:[c?jsxRuntime.jsx(_.PauseButton,{onClick:Q}):jsxRuntime.jsx(_.PlayButton,{onClick:C}),jsxRuntime.jsx(_.VolumeControl,{volume:l,isMuted:y,onVolumeChange:q,onToggleMute:j}),jsxRuntime.jsx(_.TimeDisplay,{videoRef:n,isLive:P}),jsxRuntime.jsx("div",{style:{flex:1}}),P&&jsxRuntime.jsx(We,{onClick:B}),jsxRuntime.jsx(_.SettingsMenu,{currentRate:m,playbackRates:s,onRateChange:t,qualityLevels:g,currentQualityLevel:R,onQualityChange:u}),N?.map(p=>jsxRuntime.jsx("button",{className:"controlButton","aria-label":p.label,title:p.title??p.label,onClick:p.onClick,children:p.icon},p.key)),jsxRuntime.jsx(_.PiPButton,{onClick:f,isPiP:k}),jsxRuntime.jsx(_.TheaterButton,{onClick:b,isTheater:H}),jsxRuntime.jsx(_.FullscreenButton,{onClick:w,isFullscreen:x})]})]})})},We=Lt.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,style:{background:"none",border:"1px solid rgba(255,255,255,0.6)",color:"#fff",borderRadius:3,padding:"2px 8px",fontSize:11,fontWeight:700,cursor:"pointer",letterSpacing:"0.06em"},title:"Go to live (L)",children:"GO LIVE"}));We.displayName="GoLiveButton";var ke=Lt.memo(({x:n,y:e,isPlaying:d,src:s,videoRef:o,playerRef:h,onClose:c,contextMenuItems:l})=>{let y=Lt.useRef(null),[m,x]=Lt.useState(()=>o.current?.loop??false),k=Math.min(n,window.innerWidth-220),H=Math.min(e,window.innerHeight-290);Lt.useEffect(()=>{let L=C=>{y.current&&!y.current.contains(C.target)&&c();},T=C=>{C.key==="Escape"&&c();},F=()=>c();return document.addEventListener("mousedown",L),document.addEventListener("keydown",T),window.addEventListener("scroll",F,true),()=>{document.removeEventListener("mousedown",L),document.removeEventListener("keydown",T),window.removeEventListener("scroll",F,true);}},[c]);let P=Lt.useCallback(()=>{d?h.pause():h.play(),c();},[d,h,c]),g=Lt.useCallback(()=>{let L=o.current;if(!L)return;let T=!m;L.loop=T,x(T);},[o,m]),R=Lt.useCallback(async()=>{try{await navigator.clipboard.writeText(s);}catch{}c();},[s,c]),N=Lt.useCallback(async()=>{let L=Math.floor(o.current?.currentTime??0);try{await navigator.clipboard.writeText(`${s}?t=${L}`);}catch{}c();},[s,o,c]),M=Lt.useCallback(()=>{h.togglePictureInPicture(),c();},[h,c]);return jsxRuntime.jsxs("div",{ref:y,className:"contextMenu",style:{left:k,top:H},children:[jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:P,children:d?"Pause":"Play"}),jsxRuntime.jsxs("button",{className:"contextMenuItem",onClick:g,children:[jsxRuntime.jsx("span",{children:"Loop"}),m&&jsxRuntime.jsx("span",{className:"contextMenuCheck",children:"\u2713"})]}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:R,children:"Copy video URL"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:N,children:"Copy video URL at current time"}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:M,children:"Picture-in-Picture"}),l&&l.length>0&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"contextMenuDivider"}),l.map((L,T)=>jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:()=>{L.onClick(),c();},children:L.label},T))]})]})});ke.displayName="ContextMenu";var Qe=Lt.forwardRef(({src:n,poster:e,autoplay:d=false,muted:s=false,loop:o=false,controls:h=true,preload:c="metadata",playbackRates:l=[.25,.5,.75,1,1.25,1.5,1.75,2],className:y,enableHLS:m=true,enablePreview:x=true,thumbnailVtt:k,hlsConfig:H,subtitles:P,crossOrigin:g,onPlay:R,onPause:N,onEnded:M,onError:L,onTimeUpdate:T,onDurationChange:F,onBuffering:C,onTheaterModeChange:Q,contextMenuItems:q,controlBarItems:j},t)=>{let u=Lt.useRef(null),f=Lt.useRef(null),{state:b,ref:w,fullscreenContainerRef:B}=Be(u,n,{autoplay:d,muted:s,loop:o,playbackRates:l,enableHLS:m,hlsConfig:H,onPlay:R,onPause:N,onEnded:M,onError:L,onTimeUpdate:T,onDurationChange:F,onBuffering:C,onTheaterModeChange:Q}),[p,v]=Lt.useState(null);Lt.useEffect(()=>{B.current=f.current;},[B]),Lt__default.default.useImperativeHandle(t,()=>w,[w]);let U=Lt.useCallback(()=>{f.current?.focus(),b.isPlaying?w.pause():w.play();},[b.isPlaying,w]),G=Lt.useCallback(()=>{w.toggleFullscreen();},[w]),X=Lt.useCallback(V=>{V.preventDefault(),v({x:V.clientX,y:V.clientY});},[]);return jsxRuntime.jsxs("div",{ref:f,tabIndex:0,style:{position:"relative",width:"100%",backgroundColor:"#000",aspectRatio:"16 / 9",userSelect:"none",outline:"none"},className:y,"data-test":"video-player-container","data-theater":b.isTheaterMode?"true":void 0,onContextMenu:X,children:[jsxRuntime.jsx("video",{ref:u,poster:e,preload:c,crossOrigin:g,onClick:U,onDoubleClick:G,playsInline:true,style:{width:"100%",height:"100%",display:"block",cursor:"pointer"},"data-test":"video-element",children:P?.map(V=>jsxRuntime.jsx("track",{kind:"subtitles",src:V.src,label:V.label,srcLang:V.srclang,default:V.default},V.id))}),h&&jsxRuntime.jsx(Me,{videoRef:u,playerRef:w,playerContainerRef:f,playbackRates:l,enablePreview:x,thumbnailVtt:k,isPlaying:b.isPlaying,volume:b.volume,isMuted:b.isMuted,playbackRate:b.playbackRate,isFullscreen:b.isFullscreen,isPictureInPicture:b.isPictureInPicture,isTheaterMode:b.isTheaterMode,isLive:b.isLive,qualityLevels:b.qualityLevels,currentQualityLevel:b.currentQualityLevel,controlBarItems:j}),p&&jsxRuntime.jsx(ke,{x:p.x,y:p.y,isPlaying:b.isPlaying,src:n,videoRef:u,playerRef:w,onClose:()=>v(null),contextMenuItems:q}),b.isLive&&jsxRuntime.jsx("div",{style:{position:"absolute",top:12,left:12,backgroundColor:"#e53935",color:"#fff",fontSize:11,fontWeight:700,letterSpacing:"0.08em",padding:"2px 8px",borderRadius:3,pointerEvents:"none"},children:"LIVE"}),b.isBuffering&&!b.error&&jsxRuntime.jsxs("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,color:"#fff",pointerEvents:"none"},"data-test":"buffering-indicator",children:[jsxRuntime.jsx("div",{style:{width:48,height:48,border:"4px solid rgba(255,255,255,0.25)",borderTop:"4px solid #fff",borderRadius:"50%",animation:"rvp-spin 0.8s linear infinite"}}),jsxRuntime.jsx("style",{children:"@keyframes rvp-spin { to { transform: rotate(360deg); } }"})]}),b.error&&jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0,0,0,0.85)",color:"#fff",padding:24},"data-test":"error-overlay",children:jsxRuntime.jsxs("div",{style:{textAlign:"center",maxWidth:400},children:[jsxRuntime.jsx("div",{style:{fontSize:36,marginBottom:12},children:"\u26A0"}),jsxRuntime.jsx("h3",{style:{margin:"0 0 8px",fontSize:18},children:b.error.code==="MEDIA_ERR_SRC_NOT_SUPPORTED"?"Unsupported Format":b.error.code.startsWith("HLS")?"Stream Error":"Playback Error"}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,opacity:.75},children:b.error.message})]})})]})});Qe.displayName="VideoPlayer";var xt=Qe;exports.ControlElements=Ae;exports.Controls=Me;exports.VideoPlayer=xt;exports.findThumbnailCue=Pe;exports.formatTime=Z;exports.getMimeType=Ge;exports.isHLSUrl=pe;exports.parseThumbnailVtt=Le;//# sourceMappingURL=index.js.map
3
+ `),a=0;for(;a<s.length;){let p=s[a].trim();if(p.includes("-->")){let u=p.indexOf("-->"),l=$e(p.slice(0,u)),L=$e(p.slice(u+3));for(a++;a<s.length&&!s[a].trim();)a++;if(a<s.length){let c=s[a].trim(),C=c.lastIndexOf("#xywh="),k=c,R=0,T=0,m=160,B=90;if(C!==-1){k=c.slice(0,C);let I=c.slice(C+6).split(",").map(Number);R=I[0]??0,T=I[1]??0,m=I[2]??160,B=I[3]??90;}r.push({start:l,end:L,url:pt(t,k),x:R,y:T,w:m,h:B});}}a++;}return r}function Se(n,t){if(!n.length)return null;let r=0,s=n.length-1;for(;r<=s;){let a=r+s>>1;if(n[a].end<=t)r=a+1;else if(n[a].start>t)s=a-1;else return n[a]}return null}var Ue=Dt.memo(({videoRef:n,playerRef:t,enablePreview:r=true,thumbnailVtt:s})=>{let a=Dt.useRef(null),p=Dt.useRef(null),u=Dt.useRef(null),l=Dt.useRef(null),L=Dt.useRef(null),c=Dt.useRef(null),C=Dt.useRef(null),[k,R]=Dt.useState([]),T=Dt.useRef(false),m=Dt.useRef(0),B=Dt.useRef(0),I=Dt.useRef(null),_=Dt.useRef([]),P=Dt.useRef(null);Dt.useEffect(()=>{let o=()=>{P.current=null;};return window.addEventListener("resize",o,{passive:true}),()=>window.removeEventListener("resize",o)},[]);let x=Dt.useCallback(()=>(!P.current&&a.current&&(P.current=a.current.getBoundingClientRect()),P.current),[]);Dt.useEffect(()=>{if(!s){_.current=[];return}let o=false;return fetch(s).then(i=>i.text()).then(i=>{o||(_.current=Re(i,s));}).catch(()=>{o||(_.current=[]);}),()=>{o=true;}},[s]),Dt.useEffect(()=>{let o=n.current;if(!o)return;let i=()=>{let f=isFinite(o.duration)?o.duration:0,y=o.currentTime,S=f>0?y/f*100:0;p.current&&(p.current.style.width=`${S}%`),u.current&&(u.current.style.left=`${S}%`),a.current&&(a.current.setAttribute("aria-valuenow",String(Math.round(y))),a.current.setAttribute("aria-valuemax",String(Math.round(f))),a.current.setAttribute("aria-valuetext",se(y)));};return o.addEventListener("timeupdate",i),o.addEventListener("durationchange",i),o.addEventListener("seeked",i),i(),()=>{o.removeEventListener("timeupdate",i),o.removeEventListener("durationchange",i),o.removeEventListener("seeked",i);}},[n]),Dt.useEffect(()=>{let o=n.current;if(!o)return;let i=()=>{let f=[];for(let y=0;y<o.buffered.length;y++)f.push({start:o.buffered.start(y),end:o.buffered.end(y)});R(f);};return o.addEventListener("progress",i),()=>o.removeEventListener("progress",i)},[n]);let D=Dt.useCallback(()=>{T.current=true,u.current?.classList.add("dragging");},[]),N=Dt.useCallback(()=>{T.current=false,u.current?.classList.remove("dragging");},[]),ne=Dt.useCallback(()=>{r&&(P.current=null,l.current&&(l.current.style.display="block"),c.current&&(c.current.style.display="block"));},[r]),Z=Dt.useCallback(()=>{l.current&&(l.current.style.display="none"),c.current&&(c.current.style.display="none");},[]),X=Dt.useCallback(o=>{if(!C.current||!_.current.length)return;let i=Se(_.current,o);if(I.current=i,!i)return;let f=C.current;f.style.backgroundImage=`url(${i.url})`,f.style.backgroundPosition=`-${i.x}px -${i.y}px`,f.style.width=`${i.w}px`,f.style.height=`${i.h}px`;},[]),M=Dt.useCallback(o=>{let i=x(),f=n.current?.duration;return !i||i.width===0||!f||!isFinite(f)?0:Math.max(0,Math.min(o-i.left,i.width))/i.width*f},[x,n]),G=Dt.useCallback(o=>{let i=x();return i?Math.max(0,Math.min(o-i.left,i.width)):0},[x]),U=Dt.useCallback(o=>{let i=n.current;if(!i)return;let f=i.currentTime,y=isFinite(i.duration)?i.duration:0;switch(o.key){case "ArrowLeft":case "ArrowRight":{o.preventDefault(),o.nativeEvent.stopImmediatePropagation();let S=o.shiftKey?10:5;t.seek(o.key==="ArrowLeft"?Math.max(0,f-S):Math.min(y,f+S));break}case "Home":o.preventDefault(),o.nativeEvent.stopImmediatePropagation(),t.seek(0);break;case "End":y>0&&(o.preventDefault(),o.nativeEvent.stopImmediatePropagation(),t.seek(y));break}},[n,t]),ee=Dt.useCallback(o=>{let i=M(o.clientX),f=G(o.clientX);if(m.current=f,B.current=i,c.current&&(c.current.style.left=`${f}px`),L.current&&(L.current.textContent=se(i)),X(i),l.current){let y=l.current.offsetWidth,S=x()?.width??0,h=y/2,E=Math.max(h,Math.min(f,S-h));l.current.style.left=`${E}px`;}T.current&&t.seek(i);},[t,X,M,G,x]),ie=Dt.useCallback(()=>{Z(),N();},[Z,N]),e=Dt.useCallback(o=>{o.preventDefault(),D(),t.seek(M(o.clientX));},[D,M,t]),d=Dt.useCallback(o=>{T.current||t.seek(M(o.clientX));},[M,t]);Dt.useEffect(()=>{let o=a.current;if(!o)return;let i=f=>{T.current&&f.preventDefault();};return o.addEventListener("touchmove",i,{passive:false}),()=>o.removeEventListener("touchmove",i)},[]);let v=Dt.useCallback(o=>{P.current=null,D(),t.seek(M(o.touches[0].clientX));},[D,M,t]),V=Dt.useCallback(o=>{T.current&&t.seek(M(o.touches[0].clientX));},[M,t]);Dt.useEffect(()=>{let o=()=>N();return window.addEventListener("mouseup",o),()=>window.removeEventListener("mouseup",o)},[N]);let O=Dt.useMemo(()=>{let o=n.current,i=o&&isFinite(o.duration)?o.duration:0;return i<=0||!k.length?null:k.map((f,y)=>{let S=f.start/i*100,h=(f.end-f.start)/i*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${S}%`,width:`${h}%`}},y)})},[k,n]);return jsxRuntime.jsxs("div",{ref:a,className:"progressContainer",onMouseMove:ee,onMouseEnter:ne,onMouseLeave:ie,onMouseDown:e,onMouseUp:N,onClick:d,onTouchStart:v,onTouchMove:V,onTouchEnd:N,onKeyDown:U,role:"slider","aria-label":"Video progress","aria-valuemin":0,"aria-valuemax":0,"aria-valuenow":0,"aria-valuetext":"0:00",tabIndex:0,children:[r&&jsxRuntime.jsxs("div",{ref:l,className:"previewTooltip",style:{left:0,display:"none"},"aria-hidden":"true",children:[s&&jsxRuntime.jsx("div",{ref:C,className:"previewThumbnail"}),jsxRuntime.jsx("div",{ref:L,className:"previewTime"})]}),jsxRuntime.jsxs("div",{className:"progressBackground",children:[O,jsxRuntime.jsx("div",{ref:p,className:"progressFilled",style:{width:"0%"}}),r&&jsxRuntime.jsx("div",{ref:c,className:"hoverIndicator",style:{left:0,display:"none"},"aria-hidden":"true"})]}),jsxRuntime.jsx("div",{ref:u,className:"scrubHandle",style:{left:"0%"},"aria-hidden":"true"})]})});Ue.displayName="ProgressBar";var Pe=Ue;var Qe=Dt.memo(({currentRate:n,playbackRates:t,onRateChange:r,qualityLevels:s=[],currentQualityLevel:a=-1,onQualityChange:p})=>{let[u,l]=Dt.useState(false),[L,c]=Dt.useState("speed"),C=Dt.useRef(null),k=s.length>0&&!!p;Dt.useEffect(()=>{let m=B=>{C.current&&!C.current.contains(B.target)&&l(false);};return u&&document.addEventListener("mousedown",m),()=>document.removeEventListener("mousedown",m)},[u]);let R=Dt.useMemo(()=>[...s].sort((m,B)=>B.bitrate-m.bitrate),[s]),T=Dt.useMemo(()=>a===-1?"Auto":s.find(m=>m.id===a)?.name??"Auto",[s,a]);return jsxRuntime.jsxs("div",{ref:C,className:"settingsContainer",children:[jsxRuntime.jsx("button",{onClick:()=>l(m=>!m),className:"controlButton","aria-label":"Settings",title:"Settings","aria-expanded":u,children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94s-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.49.49 0 0 0-.59-.22l-2.39.96a7.02 7.02 0 0 0-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54a6.88 6.88 0 0 0-1.61.94l-2.39-.96a.488.488 0 0 0-.59.22L2.74 8.87a.48.48 0 0 0 .12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54a6.88 6.88 0 0 0 1.61-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32a.47.47 0 0 0-.12-.61l-2.01-1.58zM12 15.6A3.6 3.6 0 0 1 8.4 12 3.6 3.6 0 0 1 12 8.4a3.6 3.6 0 0 1 3.6 3.6 3.6 3.6 0 0 1-3.6 3.6z"})})}),u&&jsxRuntime.jsxs("div",{className:"settingsDropdown",role:"menu",children:[k&&jsxRuntime.jsxs("div",{className:"settingsTabs",children:[jsxRuntime.jsx("button",{className:`settingsTab${L==="speed"?" active":""}`,onClick:()=>c("speed"),children:"Speed"}),jsxRuntime.jsx("button",{className:`settingsTab${L==="quality"?" active":""}`,onClick:()=>c("quality"),children:"Quality"})]}),(!k||L==="speed")&&jsxRuntime.jsxs("div",{children:[!k&&jsxRuntime.jsx("div",{className:"settingsPanelLabel",children:"Playback Speed"}),t.map(m=>jsxRuntime.jsx("button",{onClick:()=>{r(m),l(false);},className:`settingsOption${n===m?" active":""}`,role:"menuitemradio","aria-checked":n===m,children:m===1?"Normal":`${m}\xD7`},m))]}),k&&L==="quality"&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>{p(-1),l(false);},className:`settingsOption${a===-1?" active":""}`,role:"menuitemradio","aria-checked":a===-1,children:["Auto ",a===-1&&T!=="Auto"?`(${T})`:""]}),R.map(m=>jsxRuntime.jsxs("button",{onClick:()=>{p(m.id),l(false);},className:`settingsOption${a===m.id?" active":""}`,role:"menuitemradio","aria-checked":a===m.id,children:[m.name,m.bitrate>0&&jsxRuntime.jsxs("span",{className:"settingsOptionBadge",children:[Math.round(m.bitrate/1e3)," kbps"]})]},m.id))]})]})]})});Qe.displayName="SettingsMenu";var Te=Qe;var Xe=Dt.memo(({videoRef:n,isLive:t=false})=>{let r=Dt.useRef(null),s=Dt.useRef(null);return Dt.useEffect(()=>{let a=n.current;if(!a)return;let p=()=>{r.current&&(r.current.textContent=se(a.currentTime));},u=()=>{if(s.current){let l=isFinite(a.duration)?a.duration:0;s.current.textContent=` / ${se(l)}`;}};return a.addEventListener("timeupdate",p),a.addEventListener("durationchange",u),a.addEventListener("seeked",p),p(),u(),()=>{a.removeEventListener("timeupdate",p),a.removeEventListener("durationchange",u),a.removeEventListener("seeked",p);}},[n,t]),t?jsxRuntime.jsx("span",{className:"timeDisplay",style:{opacity:.7},children:jsxRuntime.jsx("span",{ref:r,children:"0:00"})}):jsxRuntime.jsxs("span",{className:"timeDisplay",children:[jsxRuntime.jsx("span",{ref:r,children:"0:00"}),jsxRuntime.jsx("span",{ref:s,style:{opacity:.6},children:" / 0:00"})]})});Xe.displayName="TimeDisplay";var ke=Xe;var Q={PlayButton:fe,PauseButton:pe,FullscreenButton:ve,PiPButton:he,TheaterButton:ge,VolumeControl:Le,ProgressBar:Pe,SettingsMenu:Te,TimeDisplay:ke};var xe=Dt.memo(function({videoRef:t,playerRef:r,playerContainerRef:s,playbackRates:a,enablePreview:p,thumbnailVtt:u,isPlaying:l,volume:L,isMuted:c,playbackRate:C,isFullscreen:k,isPictureInPicture:R,isTheaterMode:T,isAudioMode:m,showAudioButton:B,audioModeIcon:I,videoModeIcon:_,audioModeLabel:P,videoModeLabel:x,isLive:D,qualityLevels:N,currentQualityLevel:ne,controlBarItems:Z,autoHideControls:X}){let M=Dt.useRef(null),[G,U]=Dt.useState(true),ee=Dt.useRef({isPlaying:l,volume:L,isMuted:c,isLive:D});ee.current={isPlaying:l,volume:L,isMuted:c,isLive:D},Dt.useEffect(()=>{if(m||!X){U(true),M.current&&clearTimeout(M.current);return}if(!l){U(true),M.current&&clearTimeout(M.current);return}let h=s.current;if(!h)return;let E=()=>{U(true),M.current&&clearTimeout(M.current),M.current=setTimeout(()=>U(false),3e3);},g=()=>{M.current&&clearTimeout(M.current),U(false);};return h.addEventListener("mousemove",E),h.addEventListener("mouseenter",E),h.addEventListener("mouseleave",g),h.addEventListener("touchstart",E,{passive:true}),U(false),()=>{h.removeEventListener("mousemove",E),h.removeEventListener("mouseenter",E),h.removeEventListener("mouseleave",g),h.removeEventListener("touchstart",E),M.current&&clearTimeout(M.current);}},[l,m,X,s]),Dt.useEffect(()=>{let h=E=>{if(!s.current?.contains(document.activeElement))return;let g=E.target;if(g.tagName==="INPUT"||g.tagName==="TEXTAREA"||g.isContentEditable)return;let{isPlaying:A,volume:b,isLive:z}=ee.current,j=t.current?.currentTime??0,ae=t.current?.duration??0;switch(E.code){case "Space":case "KeyK":E.preventDefault(),A?r.pause():r.play();break;case "ArrowLeft":E.preventDefault(),r.seek(Math.max(0,j-5));break;case "ArrowRight":E.preventDefault(),r.seek(Math.min(ae||1/0,j+5));break;case "ArrowUp":E.preventDefault(),r.setVolume(Math.min(1,b+.1));break;case "ArrowDown":E.preventDefault(),r.setVolume(Math.max(0,b-.1));break;case "KeyM":E.preventDefault(),r.toggleMute();break;case "KeyF":E.preventDefault(),r.toggleFullscreen();break;case "KeyP":E.preventDefault(),r.togglePictureInPicture();break;case "KeyT":E.preventDefault(),r.toggleTheaterMode();break;case "KeyL":E.preventDefault(),z&&r.seekToLive();break;case "Digit0":case "Digit1":case "Digit2":case "Digit3":case "Digit4":case "Digit5":case "Digit6":case "Digit7":case "Digit8":case "Digit9":{E.preventDefault();let we=Number(E.code.replace("Digit",""))*10;r.seek(ae/100*we);break}}};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[r,s,t]);let ie=Dt.useCallback(()=>r.play(),[r]),e=Dt.useCallback(()=>r.pause(),[r]),d=Dt.useCallback(h=>r.setVolume(h),[r]),v=Dt.useCallback(()=>r.toggleMute(),[r]),V=Dt.useCallback(h=>r.setPlaybackRate(h),[r]),O=Dt.useCallback(h=>r.setQualityLevel(h),[r]),o=Dt.useCallback(()=>r.togglePictureInPicture(),[r]),i=Dt.useCallback(()=>r.toggleTheaterMode(),[r]),f=Dt.useCallback(()=>r.toggleAudioMode(),[r]),y=Dt.useCallback(()=>r.toggleFullscreen(),[r]),S=Dt.useCallback(()=>r.seekToLive(),[r]);return jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:G?1:0,transition:"opacity 0.3s",pointerEvents:"none",zIndex:2},children:jsxRuntime.jsxs("div",{style:{background:"linear-gradient(to top, rgba(0,0,0,0.75) 0%, rgba(0,0,0,0.2) 60%, transparent 100%)",padding:"48px 12px 12px",pointerEvents:G?"auto":"none"},role:"region","aria-label":"Video player controls",children:[jsxRuntime.jsx(Q.ProgressBar,{videoRef:t,playerRef:r,enablePreview:p,thumbnailVtt:u}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:4},children:[l?jsxRuntime.jsx(Q.PauseButton,{onClick:e}):jsxRuntime.jsx(Q.PlayButton,{onClick:ie}),jsxRuntime.jsx(Q.VolumeControl,{volume:L,isMuted:c,onVolumeChange:d,onToggleMute:v}),jsxRuntime.jsx(Q.TimeDisplay,{videoRef:t,isLive:D}),jsxRuntime.jsx("div",{style:{flex:1}}),D&&jsxRuntime.jsx(Ze,{onClick:S}),B&&jsxRuntime.jsx(Je,{onClick:f,isAudioMode:m,audioModeIcon:I,videoModeIcon:_,audioModeLabel:P,videoModeLabel:x}),jsxRuntime.jsx(Q.SettingsMenu,{currentRate:C,playbackRates:a,onRateChange:V,qualityLevels:N,currentQualityLevel:ne,onQualityChange:O}),Z?.map(h=>jsxRuntime.jsx("button",{className:"controlButton","aria-label":h.label,title:h.title??h.label,onClick:h.onClick,children:h.icon},h.key)),jsxRuntime.jsx(Q.PiPButton,{onClick:o,isPiP:R}),jsxRuntime.jsx(Q.TheaterButton,{onClick:i,isTheater:T}),jsxRuntime.jsx(Q.FullscreenButton,{onClick:y,isFullscreen:k})]})]})})});xe.displayName="Controls";var Je=Dt.memo(({onClick:n,isAudioMode:t,audioModeIcon:r,videoModeIcon:s,audioModeLabel:a,videoModeLabel:p})=>{let u=t?p??"Video":a??"Audio";return jsxRuntime.jsxs("button",{onClick:n,className:"rvp-audio-toggle-btn","aria-label":u,title:u,"aria-pressed":t,children:[t?s??jsxRuntime.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"})}):r??jsxRuntime.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M12 3a9 9 0 0 0-9 9v7c0 1.1.9 2 2 2h1a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H4v-1a8 8 0 0 1 16 0v1h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h1a3 3 0 0 0 3-3v-4c0-4.97-4.03-9-9-9z"})}),u]})});Je.displayName="AudioModeButton";var Ze=Dt.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,style:{background:"none",border:"1px solid rgba(255,255,255,0.6)",color:"#fff",borderRadius:3,padding:"2px 8px",fontSize:11,fontWeight:700,cursor:"pointer",letterSpacing:"0.06em"},title:"Go to live (L)",children:"GO LIVE"}));Ze.displayName="GoLiveButton";var Ve=Dt.memo(({x:n,y:t,isPlaying:r,src:s,videoRef:a,playerRef:p,onClose:u,contextMenuItems:l})=>{let L=Dt.useRef(null),[c,C]=Dt.useState(()=>a.current?.loop??false),k=Math.min(n,window.innerWidth-220),R=Math.min(t,window.innerHeight-290);Dt.useEffect(()=>{let P=N=>{L.current&&!L.current.contains(N.target)&&u();},x=N=>{N.key==="Escape"&&u();},D=()=>u();return document.addEventListener("mousedown",P),document.addEventListener("keydown",x),window.addEventListener("scroll",D,true),()=>{document.removeEventListener("mousedown",P),document.removeEventListener("keydown",x),window.removeEventListener("scroll",D,true);}},[u]);let T=Dt.useCallback(()=>{r?p.pause():p.play(),u();},[r,p,u]),m=Dt.useCallback(()=>{let P=a.current;if(!P)return;let x=!c;P.loop=x,C(x);},[a,c]),B=Dt.useCallback(async()=>{try{await navigator.clipboard.writeText(s);}catch{}u();},[s,u]),I=Dt.useCallback(async()=>{let P=Math.floor(a.current?.currentTime??0);try{await navigator.clipboard.writeText(`${s}?t=${P}`);}catch{}u();},[s,a,u]),_=Dt.useCallback(()=>{p.togglePictureInPicture(),u();},[p,u]);return jsxRuntime.jsxs("div",{ref:L,className:"contextMenu",style:{left:k,top:R},children:[jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:T,children:r?"Pause":"Play"}),jsxRuntime.jsxs("button",{className:"contextMenuItem",onClick:m,children:[jsxRuntime.jsx("span",{children:"Loop"}),c&&jsxRuntime.jsx("span",{className:"contextMenuCheck",children:"\u2713"})]}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:B,children:"Copy video URL"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:I,children:"Copy video URL at current time"}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:_,children:"Picture-in-Picture"}),l&&l.length>0&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"contextMenuDivider"}),l.map((P,x)=>jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:()=>{P.onClick(),u();},children:P.label},x))]})]})});Ve.displayName="ContextMenu";var Ae=Dt.memo(function({poster:t,logo:r,audioModeFallback:s,isBuffering:a=false,onOverlayClick:p}){return jsxRuntime.jsxs("div",{className:"rvp-audio-overlay",onClick:p,"data-test":"audio-mode-overlay",children:[t?jsxRuntime.jsx("div",{className:"rvp-audio-artwork-container",children:jsxRuntime.jsx("img",{src:t,alt:"Artwork",className:"rvp-audio-artwork",draggable:false})}):s?jsxRuntime.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center"},children:s}):r?typeof r=="string"?jsxRuntime.jsx("img",{src:r,alt:"Logo",className:"rvp-audio-logo",draggable:false}):jsxRuntime.jsx("div",{className:"rvp-audio-logo-node",children:r}):null,jsxRuntime.jsx("span",{className:"rvp-audio-label",children:"Audio Mode"}),a?jsxRuntime.jsx("div",{className:"rvp-audio-buffering-overlay","aria-label":"Buffering",children:jsxRuntime.jsx("div",{className:"rvp-audio-spinner"})}):null]})});Ae.displayName="AudioModeOverlay";var nt=Dt.forwardRef((n,t)=>{let{src:r,poster:s,className:a,controls:p=true,options:u={}}=n,{autoplay:l=false,muted:L=false,loop:c=false,preload:C="metadata",playbackRates:k=[.25,.5,.75,1,1.25,1.5,1.75,2],enableHLS:R=true,enablePreview:T=true,thumbnailVtt:m,hlsConfig:B,autoHideControls:I=true,subtitles:_,crossOrigin:P,logo:x,audioModeFallback:D,audioSrc:N,showAudioButton:ne,audioModeIcon:Z,videoModeIcon:X,audioModeLabel:M,videoModeLabel:G,defaultAudioMode:U,audioBandwidthThreshold:ee,onPlay:ie,onPause:e,onEnded:d,onError:v,onTimeUpdate:V,onDurationChange:O,onBuffering:o,onTheaterModeChange:i,onAudioModeChange:f,contextMenuItems:y,controlBarItems:S}=u,h=Dt.useRef(null),E=Dt.useRef(null),{state:g,ref:A,fullscreenContainerRef:b}=_e(h,r,{autoplay:l,muted:L,loop:c,playbackRates:k,enableHLS:R,hlsConfig:B,defaultAudioMode:U,audioBandwidthThreshold:ee,onPlay:ie,onPause:e,onEnded:d,onError:v,onTimeUpdate:V,onDurationChange:O,onBuffering:o,onTheaterModeChange:i,onAudioModeChange:f}),[z,j]=Dt.useState(null);Dt.useEffect(()=>{b.current=E.current;},[b]),Dt__default.default.useImperativeHandle(t,()=>A,[A]);let ae=Dt.useCallback(()=>{E.current?.focus(),g.isPlaying?A.pause():A.play();},[g.isPlaying,A]),we=Dt.useCallback(()=>{A.toggleFullscreen();},[A]),rt=Dt.useCallback(te=>{te.preventDefault(),j({x:te.clientX,y:te.clientY});},[]);return jsxRuntime.jsxs("div",{ref:E,tabIndex:0,style:{position:"relative",width:"100%",backgroundColor:"#000",aspectRatio:"16 / 9",userSelect:"none",outline:"none"},className:a,"data-test":"video-player-container","data-theater":g.isTheaterMode?"true":void 0,onContextMenu:rt,children:[jsxRuntime.jsx("video",{ref:h,poster:s,preload:C,crossOrigin:P,onClick:ae,onDoubleClick:we,playsInline:true,style:{width:"100%",height:"100%",display:"block",cursor:"pointer",visibility:g.isAudioMode?"hidden":"visible"},"data-test":"video-element",children:_?.map(te=>jsxRuntime.jsx("track",{kind:"subtitles",src:te.src,label:te.label,srcLang:te.srclang,default:te.default},te.id))}),g.isAudioMode&&jsxRuntime.jsx(Ae,{poster:s,logo:x,audioModeFallback:D,isBuffering:g.isBuffering,onOverlayClick:ae}),p&&jsxRuntime.jsx(xe,{videoRef:h,playerRef:A,playerContainerRef:E,playbackRates:k,enablePreview:T,thumbnailVtt:g.isAudioMode?void 0:m,isPlaying:g.isPlaying,volume:g.volume,isMuted:g.isMuted,playbackRate:g.playbackRate,isFullscreen:g.isFullscreen,isPictureInPicture:g.isPictureInPicture,isTheaterMode:g.isTheaterMode,isAudioMode:g.isAudioMode,showAudioButton:ne??!!N,audioModeIcon:Z,videoModeIcon:X,audioModeLabel:M,videoModeLabel:G,isLive:g.isLive,qualityLevels:g.qualityLevels,currentQualityLevel:g.currentQualityLevel,controlBarItems:S,autoHideControls:I}),z&&jsxRuntime.jsx(Ve,{x:z.x,y:z.y,isPlaying:g.isPlaying,src:r,videoRef:h,playerRef:A,onClose:()=>j(null),contextMenuItems:y}),g.isLive&&jsxRuntime.jsx("div",{style:{position:"absolute",top:12,left:12,backgroundColor:"#e53935",color:"#fff",fontSize:11,fontWeight:700,letterSpacing:"0.08em",padding:"2px 8px",borderRadius:3,pointerEvents:"none"},children:"LIVE"}),g.isBuffering&&!g.error&&jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,color:"#fff",pointerEvents:"none"},"data-test":"buffering-indicator",children:jsxRuntime.jsx("div",{style:{width:48,height:48,border:"4px solid rgba(255,255,255,0.25)",borderTop:"4px solid #fff",borderRadius:"50%",animation:"rvp-spin 0.8s linear infinite"}})}),g.error&&jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0,0,0,0.85)",color:"#fff",padding:24},"data-test":"error-overlay",children:jsxRuntime.jsxs("div",{style:{textAlign:"center",maxWidth:400},children:[jsxRuntime.jsx("div",{style:{fontSize:36,marginBottom:12},children:"\u26A0"}),jsxRuntime.jsx("h3",{style:{margin:"0 0 8px",fontSize:18},children:g.error.code==="MEDIA_ERR_SRC_NOT_SUPPORTED"?"Unsupported Format":g.error.code.startsWith("HLS")?"Stream Error":"Playback Error"}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,opacity:.75},children:g.error.message})]})})]})});nt.displayName="VideoPlayer";var At=nt;var It={EXTREME:100,POOR:300,FAIR:700,GOOD:1500};exports.AUDIO_BANDWIDTH_THRESHOLDS=It;exports.ControlElements=Ge;exports.Controls=xe;exports.VideoPlayer=At;exports.findThumbnailCue=Se;exports.formatTime=se;exports.getMimeType=at;exports.isHLSUrl=ye;exports.parseThumbnailVtt=Re;//# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map