react-helios 2.1.1 → 2.3.1

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/README.md CHANGED
@@ -109,6 +109,70 @@ To disable the preview entirely:
109
109
  | `onTimeUpdate` | `(time: number) => void` | — | Fired every ~250 ms during playback |
110
110
  | `onDurationChange` | `(duration: number) => void` | — | Fired when video duration becomes known |
111
111
  | `onBuffering` | `(isBuffering: boolean) => void` | — | Fired when buffering starts / stops |
112
+ | `onTheaterModeChange` | `(isTheater: boolean) => void` | — | Fired when theater mode is toggled |
113
+ | `contextMenuItems` | `ContextMenuItem[]` | — | Extra items appended to the right-click context menu |
114
+ | `controlBarItems` | `ControlBarItem[]` | — | Extra icon buttons appended to the right side of the control bar |
115
+
116
+ ## Quality Selection
117
+
118
+ For HLS streams (`.m3u8`) the player automatically parses the available quality levels from the manifest. Once levels are available, the **Settings (⚙)** button in the control bar grows a **Speed / Quality** tab bar:
119
+
120
+ - **Speed tab** — always visible, lets you change playback rate.
121
+ - **Quality tab** — appears only for HLS streams. Lists all levels sorted by bitrate (e.g. 1080p, 720p, 480p) plus an **Auto** option that enables ABR (adaptive bitrate). The current auto-selected level is shown in parentheses next to "Auto".
122
+
123
+ For plain MP4/WebM files there are no quality levels to switch between, so the Quality tab never appears.
124
+
125
+ You can also switch quality programmatically via the ref:
126
+
127
+ ```tsx
128
+ playerRef.current?.setQualityLevel(0); // pin to highest level
129
+ playerRef.current?.setQualityLevel(-1); // back to ABR auto
130
+ ```
131
+
132
+ ## Custom Control Bar Buttons
133
+
134
+ Inject your own icon buttons into the right side of the control bar (between the settings gear and the PiP/Theater/Fullscreen buttons) using `controlBarItems`:
135
+
136
+ ```tsx
137
+ import { VideoPlayer, ControlBarItem } from "react-helios";
138
+
139
+ const items: ControlBarItem[] = [
140
+ {
141
+ key: "download",
142
+ label: "Download",
143
+ icon: <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M19 9h-4V3H9v6H5l7 7 7-7zm-8 2V5h2v6h1.17L12 13.17 9.83 11H11zm-6 7h14v2H5v-2z"/></svg>,
144
+ onClick: () => downloadVideo(),
145
+ },
146
+ {
147
+ key: "share",
148
+ label: "Share",
149
+ title: "Share this video",
150
+ icon: <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11A2.99 2.99 0 0 0 18 8a3 3 0 1 0-3-3c0 .24.04.47.09.7L8.04 9.81A2.99 2.99 0 0 0 6 9a3 3 0 1 0 3 3c0-.24-.04-.47-.09-.7l7.05-4.11c.52.47 1.2.77 1.96.77a3 3 0 0 0 3-3 3 3 0 0 0-3-3z"/></svg>,
151
+ onClick: () => openShareDialog(),
152
+ },
153
+ ];
154
+
155
+ <VideoPlayer src="..." controlBarItems={items} />
156
+ ```
157
+
158
+ Buttons receive the same `controlButton` CSS class as built-in buttons (hover highlight, active press scale, no focus outline).
159
+
160
+ ## Context Menu
161
+
162
+ Right-clicking the player shows a built-in menu (Play/Pause, Loop, Copy URL, Picture-in-Picture). You can append your own items by passing `contextMenuItems`:
163
+
164
+ ```tsx
165
+ import { VideoPlayer, ContextMenuItem } from "react-helios";
166
+
167
+ const items: ContextMenuItem[] = [
168
+ { label: "Add to Watchlist", onClick: () => addToWatchlist() },
169
+ { label: "Share", onClick: () => openShareDialog() },
170
+ ];
171
+
172
+ <VideoPlayer src="..." contextMenuItems={items} />
173
+ ```
174
+
175
+ Each item closes the menu automatically after its `onClick` is called.
112
176
 
113
177
  ## Imperative API (Ref)
114
178
 
@@ -148,6 +212,7 @@ export default function App() {
148
212
  | `seekToLive` | `() => void` | Jump to the live edge (HLS live streams) |
149
213
  | `toggleFullscreen` | `() => Promise<void>` | Toggle fullscreen |
150
214
  | `togglePictureInPicture` | `() => Promise<void>` | Toggle Picture-in-Picture |
215
+ | `toggleTheaterMode` | `() => void` | Toggle theater (wide) mode |
151
216
  | `getState` | `() => PlayerState` | Snapshot of current player state |
152
217
  | `getVideoElement` | `() => HTMLVideoElement \| null` | Access the underlying `<video>` element |
153
218
 
@@ -174,6 +239,7 @@ Shortcuts activate when the player has focus (click the player or tab to it).
174
239
  | `↑` / `↓` | Volume +10% / −10% |
175
240
  | `M` | Toggle mute (restores previous volume) |
176
241
  | `F` | Toggle fullscreen |
242
+ | `T` | Toggle theater mode |
177
243
  | `P` | Toggle Picture-in-Picture |
178
244
  | `L` | Seek to live edge (live streams only) |
179
245
  | `0`–`9` | Jump to 0%–90% of duration |
@@ -203,6 +269,8 @@ import type {
203
269
  VideoError,
204
270
  VideoErrorCode,
205
271
  ThumbnailCue,
272
+ ContextMenuItem,
273
+ ControlBarItem,
206
274
  } from "react-helios";
207
275
 
208
276
  // VTT utilities (useful for server-side pre-parsing or custom UIs)
@@ -224,6 +292,7 @@ interface PlayerState {
224
292
  error: VideoError | null;
225
293
  isFullscreen: boolean;
226
294
  isPictureInPicture: boolean;
295
+ isTheaterMode: boolean;
227
296
  isLive: boolean;
228
297
  qualityLevels: HLSQualityLevel[];
229
298
  currentQualityLevel: number; // -1 = ABR auto
@@ -262,6 +331,27 @@ interface ThumbnailCue {
262
331
  }
263
332
  ```
264
333
 
334
+ ### `ControlBarItem`
335
+
336
+ ```ts
337
+ interface ControlBarItem {
338
+ key: string; // React reconciliation key
339
+ icon: ReactNode; // SVG, img, or any React node
340
+ label: string; // aria-label
341
+ title?: string; // tooltip (falls back to label)
342
+ onClick: () => void;
343
+ }
344
+ ```
345
+
346
+ ### `ContextMenuItem`
347
+
348
+ ```ts
349
+ interface ContextMenuItem {
350
+ label: string;
351
+ onClick: () => void;
352
+ }
353
+ ```
354
+
265
355
  ## Performance
266
356
 
267
357
  The player is architected to produce **zero React re-renders during playback**:
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import react__default from 'react';
2
+ import react__default, { ReactNode } from 'react';
3
3
  import { HlsConfig } from 'hls.js';
4
4
 
5
5
  interface BufferedRange {
@@ -59,6 +59,17 @@ interface VideoPlayerRef {
59
59
  getState: () => PlayerState;
60
60
  getVideoElement: () => HTMLVideoElement | null;
61
61
  }
62
+ interface ContextMenuItem {
63
+ label: string;
64
+ onClick: () => void;
65
+ }
66
+ interface ControlBarItem {
67
+ key: string;
68
+ icon: ReactNode;
69
+ label: string;
70
+ title?: string;
71
+ onClick: () => void;
72
+ }
62
73
  interface VideoPlayerProps {
63
74
  src: string;
64
75
  poster?: string;
@@ -100,6 +111,8 @@ interface VideoPlayerProps {
100
111
  onDurationChange?: (duration: number) => void;
101
112
  onBuffering?: (isBuffering: boolean) => void;
102
113
  onTheaterModeChange?: (isTheater: boolean) => void;
114
+ contextMenuItems?: ContextMenuItem[];
115
+ controlBarItems?: ControlBarItem[];
103
116
  }
104
117
 
105
118
  declare const VideoPlayer: react__default.ForwardRefExoticComponent<VideoPlayerProps & react__default.RefAttributes<VideoPlayerRef>>;
@@ -121,6 +134,7 @@ interface ControlsProps {
121
134
  isLive: boolean;
122
135
  qualityLevels: HLSQualityLevel[];
123
136
  currentQualityLevel: number;
137
+ controlBarItems?: ControlBarItem[];
124
138
  }
125
139
  declare const Controls: react__default.FC<ControlsProps>;
126
140
 
@@ -264,4 +278,4 @@ declare function parseThumbnailVtt(text: string, baseUrl?: string): ThumbnailCue
264
278
  */
265
279
  declare function findThumbnailCue(cues: ThumbnailCue[], time: number): ThumbnailCue | null;
266
280
 
267
- export { type BufferedRange, 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 };
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 };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import react__default from 'react';
2
+ import react__default, { ReactNode } from 'react';
3
3
  import { HlsConfig } from 'hls.js';
4
4
 
5
5
  interface BufferedRange {
@@ -59,6 +59,17 @@ interface VideoPlayerRef {
59
59
  getState: () => PlayerState;
60
60
  getVideoElement: () => HTMLVideoElement | null;
61
61
  }
62
+ interface ContextMenuItem {
63
+ label: string;
64
+ onClick: () => void;
65
+ }
66
+ interface ControlBarItem {
67
+ key: string;
68
+ icon: ReactNode;
69
+ label: string;
70
+ title?: string;
71
+ onClick: () => void;
72
+ }
62
73
  interface VideoPlayerProps {
63
74
  src: string;
64
75
  poster?: string;
@@ -100,6 +111,8 @@ interface VideoPlayerProps {
100
111
  onDurationChange?: (duration: number) => void;
101
112
  onBuffering?: (isBuffering: boolean) => void;
102
113
  onTheaterModeChange?: (isTheater: boolean) => void;
114
+ contextMenuItems?: ContextMenuItem[];
115
+ controlBarItems?: ControlBarItem[];
103
116
  }
104
117
 
105
118
  declare const VideoPlayer: react__default.ForwardRefExoticComponent<VideoPlayerProps & react__default.RefAttributes<VideoPlayerRef>>;
@@ -121,6 +134,7 @@ interface ControlsProps {
121
134
  isLive: boolean;
122
135
  qualityLevels: HLSQualityLevel[];
123
136
  currentQualityLevel: number;
137
+ controlBarItems?: ControlBarItem[];
124
138
  }
125
139
  declare const Controls: react__default.FC<ControlsProps>;
126
140
 
@@ -264,4 +278,4 @@ declare function parseThumbnailVtt(text: string, baseUrl?: string): ThumbnailCue
264
278
  */
265
279
  declare function findThumbnailCue(cues: ThumbnailCue[], time: number): ThumbnailCue | null;
266
280
 
267
- export { type BufferedRange, 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 };
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 };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var yt=require('react'),pe=require('hls.js'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var yt__default=/*#__PURE__*/_interopDefault(yt);var pe__default=/*#__PURE__*/_interopDefault(pe);var qe=Object.defineProperty;var Xe=(n,e)=>{for(var m in e)qe(n,m,{get:e[m],enumerable:true});};function J(n){if(!Number.isFinite(n)||n<0)return "0:00";let e=Math.floor(n),m=Math.floor(e/3600),l=Math.floor(e%3600/60),a=e%60;return m>0?`${m}:${String(l).padStart(2,"0")}:${String(a).padStart(2,"0")}`:`${l}:${String(a).padStart(2,"0")}`}function me(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 je(n){if(me(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,m)=>({id:m,height:e.height??0,width:e.width??0,bitrate:e.bitrate??0,name:e.height?`${e.height}p`:`Level ${m+1}`}))}var Je={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 De(n,e,m={}){let l=yt.useRef(null),a=yt.useRef(null),f=yt.useRef(1),c=yt.useRef(0),u=yt.useRef(m);u.current=m;let[b,p]=yt.useState({...Je,isMuted:m.muted??false,volume:m.muted?0:1}),P=yt.useRef(b);P.current=b,yt.useEffect(()=>{let t=n.current;if(!t||(l.current&&(l.current.destroy(),l.current=null),c.current=0,p(d=>({...d,currentTime:0,duration:0,error:null,isBuffering:false,isLive:false,qualityLevels:[],currentQualityLevel:-1})),!e))return;let o=u.current;if(o.enableHLS!==false&&me(e)){if(t.canPlayType("application/vnd.apple.mpegurl"))t.src=e,t.load(),o.autoplay&&t.play().catch(()=>{});else if(pe__default.default.isSupported()){let d=new pe__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...o.hlsConfig});d.attachMedia(t),d.loadSource(e),d.on(pe.Events.MANIFEST_PARSED,(F,R)=>{let h=Se(R.levels);p(g=>({...g,qualityLevels:h,currentQualityLevel:-1})),u.current.autoplay&&t.play().catch(()=>{});}),d.on(pe.Events.LEVEL_SWITCHED,(F,R)=>{p(h=>({...h,currentQualityLevel:R.level}));});let S=3;d.on(pe.Events.ERROR,(F,R)=>{if(!R.fatal){console.warn("[hls] non-fatal:",R.details);return}switch(R.type){case pe__default.default.ErrorTypes.NETWORK_ERROR:if(c.current<S){c.current+=1;let h=1e3*c.current;console.warn(`[hls] network error \u2013 retry ${c.current}/${S} in ${h}ms`),setTimeout(()=>{l.current===d&&d.startLoad();},h);}else {let h={code:"HLS_NETWORK_ERROR",message:"Failed to load stream after multiple retries."};p(g=>({...g,error:h})),u.current.onError?.(h);}break;case pe__default.default.ErrorTypes.MEDIA_ERROR:console.warn("[hls] media error \u2013 recovering"),d.recoverMediaError();break;default:{d.destroy(),l.current=null;let h={code:"HLS_FATAL_ERROR",message:"An unrecoverable HLS error occurred."};p(g=>({...g,error:h})),u.current.onError?.(h);break}}}),l.current=d;}}else t.src=e,t.load(),o.autoplay&&t.play().catch(()=>{});return ()=>{l.current&&(l.current.destroy(),l.current=null);}},[e,n]),yt.useEffect(()=>{let t=n.current;if(!t)return;u.current.muted&&(t.muted=true),u.current.loop&&(t.loop=true);let o=()=>{p(i=>({...i,isPlaying:true})),u.current.onPlay?.();},d=()=>{p(i=>({...i,isPlaying:false})),u.current.onPause?.();},S=()=>{p(i=>({...i,isPlaying:false})),u.current.onEnded?.();},F=()=>{u.current.onTimeUpdate?.(t.currentTime);},R=()=>{let i=t.duration,E=!Number.isFinite(i);p(A=>({...A,duration:E?0:i,isLive:E})),E||u.current.onDurationChange?.(i);},h=()=>{let i=t.volume;i>0&&!t.muted&&(f.current=i),p(E=>({...E,volume:i,isMuted:t.muted||i===0}));},g=()=>{p(i=>({...i,playbackRate:t.playbackRate}));},W=()=>{let i=t.error;if(!i)return;let A={code:{1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"}[i.code]??"UNKNOWN",message:i.message||"Unknown media error"};p(ye=>({...ye,error:A})),u.current.onError?.(A);},H=()=>{p(i=>({...i,isBuffering:true})),u.current.onBuffering?.(true);},G=()=>{p(i=>({...i,isBuffering:false})),u.current.onBuffering?.(false);},ee=()=>p(i=>({...i,isBuffering:false})),Y=()=>{},r=()=>{let i=!!(document.fullscreenElement||document.webkitFullscreenElement);p(E=>({...E,isFullscreen:i}));},s=()=>{p(i=>({...i,isPictureInPicture:document.pictureInPictureElement===t}));};return t.addEventListener("play",o),t.addEventListener("pause",d),t.addEventListener("ended",S),t.addEventListener("timeupdate",F),t.addEventListener("durationchange",R),t.addEventListener("volumechange",h),t.addEventListener("ratechange",g),t.addEventListener("error",W),t.addEventListener("waiting",H),t.addEventListener("canplay",G),t.addEventListener("playing",ee),t.addEventListener("progress",Y),document.addEventListener("fullscreenchange",r),document.addEventListener("webkitfullscreenchange",r),t.addEventListener("enterpictureinpicture",s),t.addEventListener("leavepictureinpicture",s),()=>{t.removeEventListener("play",o),t.removeEventListener("pause",d),t.removeEventListener("ended",S),t.removeEventListener("timeupdate",F),t.removeEventListener("durationchange",R),t.removeEventListener("volumechange",h),t.removeEventListener("ratechange",g),t.removeEventListener("error",W),t.removeEventListener("waiting",H),t.removeEventListener("canplay",G),t.removeEventListener("playing",ee),t.removeEventListener("progress",Y),document.removeEventListener("fullscreenchange",r),document.removeEventListener("webkitfullscreenchange",r),t.removeEventListener("enterpictureinpicture",s),t.removeEventListener("leavepictureinpicture",s);}},[n]);let T=yt.useCallback(async()=>{let t=n.current;if(t)try{await t.play();}catch(o){o instanceof Error&&o.name!=="AbortError"&&console.error("[player] play() failed:",o);}},[n]),V=yt.useCallback(()=>{n.current?.pause();},[n]),y=yt.useCallback(t=>{let o=n.current;o&&(o.currentTime=Math.max(0,Math.min(t,o.duration||t)));},[n]),v=yt.useCallback(t=>{let o=n.current;if(!o)return;let d=Math.max(0,Math.min(t,1));d>0&&(f.current=d),o.volume=d,o.muted=d===0;},[n]),w=yt.useCallback(()=>{let t=n.current;if(t)if(t.muted||t.volume===0){let o=f.current>0?f.current:1;t.volume=o,t.muted=false;}else f.current=t.volume,t.muted=true;},[n]),B=yt.useCallback(t=>{let o=n.current;o&&(o.playbackRate=t);},[n]),M=yt.useCallback(t=>{let o=l.current;o&&(o.currentLevel=t,p(d=>({...d,currentQualityLevel:t})));},[]),L=yt.useCallback(()=>{let t=l.current,o=n.current;if(!t||!o)return;let d=t.liveSyncPosition;d!=null&&Number.isFinite(d)&&(o.currentTime=d);},[n]),x=yt.useCallback(async()=>{let t=n.current;if(!t)return;let o=a.current??t.parentElement;if(o)try{!document.fullscreenElement&&!document.webkitFullscreenElement?o.requestFullscreen?await o.requestFullscreen():o.webkitRequestFullscreen?.():document.exitFullscreen?await document.exitFullscreen():document.webkitExitFullscreen?.();}catch(d){console.error("[player] fullscreen toggle failed:",d);}},[n]),N=yt.useCallback(async()=>{let t=n.current;if(t)try{document.pictureInPictureElement?await document.exitPictureInPicture():await t.requestPictureInPicture();}catch(o){console.error("[player] PiP toggle failed:",o);}},[n]),k=yt.useCallback(()=>{p(t=>{let o=!t.isTheaterMode;return u.current.onTheaterModeChange?.(o),{...t,isTheaterMode:o}});},[]),Q=yt.useCallback(()=>{let t=n.current,o=t?.currentTime??0,d=[];if(t)for(let S=0;S<t.buffered.length;S++)d.push({start:t.buffered.start(S),end:t.buffered.end(S)});return {...P.current,currentTime:o,bufferedRanges:d}},[n]),q=yt.useCallback(()=>n.current??null,[n]),_=yt.useMemo(()=>({play:T,pause:V,seek:y,setVolume:v,toggleMute:w,setPlaybackRate:B,setQualityLevel:M,seekToLive:L,toggleFullscreen:x,togglePictureInPicture:N,toggleTheaterMode:k,getState:Q,getVideoElement:q}),[T,V,y,v,w,B,M,L,x,N,k,Q,q]);return {state:b,ref:_,hlsRef:l,fullscreenContainerRef:a}}var Ae={};Xe(Ae,{ControlElements:()=>$,FullscreenButton:()=>ue,PauseButton:()=>le,PiPButton:()=>ce,PlayButton:()=>se,ProgressBar:()=>ve,SettingsMenu:()=>he,TheaterButton:()=>de,TimeDisplay:()=>be,VolumeControl:()=>fe});var se=yt.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=yt.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=yt.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=yt.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=yt.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 Be=yt.memo(({volume:n,isMuted:e,onVolumeChange:m,onToggleMute:l})=>{let[a,f]=yt.useState(false),c=e?0:n,u=c*100,b=yt.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${u}%, rgba(255,255,255,0.3) ${u}%, rgba(255,255,255,0.3) 100%)`,[u]);return jsxRuntime.jsxs("div",{className:"volumeContainer",onMouseEnter:()=>f(true),onMouseLeave:()=>f(false),children:[jsxRuntime.jsx("button",{onClick:l,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"})})}),a&&jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",value:u,onChange:p=>m(Number(p.target.value)/100),className:"volumeSlider",style:{background:b},"aria-label":"Volume","aria-valuenow":Math.round(u)})]})});Be.displayName="VolumeControl";var fe=Be;function He(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 rt(n,e){if(/^https?:\/\//i.test(e))return e;try{return new URL(e,n).href}catch{return e}}function Le(n,e=""){let m=[],l=n.replace(/\r\n/g,`
1
+ 'use strict';var Et=require('react'),pe=require('hls.js'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Et__default=/*#__PURE__*/_interopDefault(Et);var pe__default=/*#__PURE__*/_interopDefault(pe);var qe=Object.defineProperty;var Xe=(n,e)=>{for(var d in e)qe(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 me(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 je(n){if(me(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 Je={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=Et.useRef(null),o=Et.useRef(null),h=Et.useRef(1),c=Et.useRef(0),u=Et.useRef(d);u.current=d;let[y,m]=Et.useState({...Je,isMuted:d.muted??false,volume:d.muted?0:1}),x=Et.useRef(y);x.current=y,Et.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 l=u.current;if(l.enableHLS!==false&&me(e)){if(t.canPlayType("application/vnd.apple.mpegurl"))t.src=e,t.load(),l.autoplay&&t.play().catch(()=>{});else if(pe__default.default.isSupported()){let f=new pe__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...l.hlsConfig});f.attachMedia(t),f.loadSource(e),f.on(pe.Events.MANIFEST_PARSED,(w,B)=>{let p=Se(B.levels);m(v=>({...v,qualityLevels:p,currentQualityLevel:-1})),u.current.autoplay&&t.play().catch(()=>{});}),f.on(pe.Events.LEVEL_SWITCHED,(w,B)=>{m(p=>({...p,currentQualityLevel:B.level}));});let b=3;f.on(pe.Events.ERROR,(w,B)=>{if(!B.fatal){console.warn("[hls] non-fatal:",B.details);return}switch(B.type){case pe__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})),u.current.onError?.(p);}break;case pe__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})),u.current.onError?.(p);break}}}),s.current=f;}}else t.src=e,t.load(),l.autoplay&&t.play().catch(()=>{});return ()=>{s.current&&(s.current.destroy(),s.current=null);}},[e,n]),Et.useEffect(()=>{let t=n.current;if(!t)return;u.current.muted&&(t.muted=true),u.current.loop&&(t.loop=true);let l=()=>{m(a=>({...a,isPlaying:true})),u.current.onPlay?.();},f=()=>{m(a=>({...a,isPlaying:false})),u.current.onPause?.();},b=()=>{m(a=>({...a,isPlaying:false})),u.current.onEnded?.();},w=()=>{u.current.onTimeUpdate?.(t.currentTime);},B=()=>{let a=t.duration,P=!Number.isFinite(a);m(A=>({...A,duration:P?0:a,isLive:P})),P||u.current.onDurationChange?.(a);},p=()=>{let a=t.volume;a>0&&!t.muted&&(h.current=a),m(P=>({...P,volume:a,isMuted:t.muted||a===0}));},v=()=>{m(a=>({...a,playbackRate:t.playbackRate}));},U=()=>{let a=t.error;if(!a)return;let A={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(ye=>({...ye,error:A})),u.current.onError?.(A);},G=()=>{m(a=>({...a,isBuffering:true})),u.current.onBuffering?.(true);},X=()=>{m(a=>({...a,isBuffering:false})),u.current.onBuffering?.(false);},V=()=>m(a=>({...a,isBuffering:false})),J=()=>{},r=()=>{let a=!!(document.fullscreenElement||document.webkitFullscreenElement);m(P=>({...P,isFullscreen:a}));},i=()=>{m(a=>({...a,isPictureInPicture:document.pictureInPictureElement===t}));};return t.addEventListener("play",l),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",l),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=Et.useCallback(async()=>{let t=n.current;if(t)try{await t.play();}catch(l){l instanceof Error&&l.name!=="AbortError"&&console.error("[player] play() failed:",l);}},[n]),H=Et.useCallback(()=>{n.current?.pause();},[n]),L=Et.useCallback(t=>{let l=n.current;l&&(l.currentTime=Math.max(0,Math.min(t,l.duration||t)));},[n]),g=Et.useCallback(t=>{let l=n.current;if(!l)return;let f=Math.max(0,Math.min(t,1));f>0&&(h.current=f),l.volume=f,l.muted=f===0;},[n]),R=Et.useCallback(()=>{let t=n.current;if(t)if(t.muted||t.volume===0){let l=h.current>0?h.current:1;t.volume=l,t.muted=false;}else h.current=t.volume,t.muted=true;},[n]),N=Et.useCallback(t=>{let l=n.current;l&&(l.playbackRate=t);},[n]),T=Et.useCallback(t=>{let l=s.current;l&&(l.currentLevel=t,m(f=>({...f,currentQualityLevel:t})));},[]),E=Et.useCallback(()=>{let t=s.current,l=n.current;if(!t||!l)return;let f=t.liveSyncPosition;f!=null&&Number.isFinite(f)&&(l.currentTime=f);},[n]),M=Et.useCallback(async()=>{let t=n.current;if(!t)return;let l=o.current??t.parentElement;if(l)try{!document.fullscreenElement&&!document.webkitFullscreenElement?l.requestFullscreen?await l.requestFullscreen():l.webkitRequestFullscreen?.():document.exitFullscreen?await document.exitFullscreen():document.webkitExitFullscreen?.();}catch(f){console.error("[player] fullscreen toggle failed:",f);}},[n]),F=Et.useCallback(async()=>{let t=n.current;if(t)try{document.pictureInPictureElement?await document.exitPictureInPicture():await t.requestPictureInPicture();}catch(l){console.error("[player] PiP toggle failed:",l);}},[n]),C=Et.useCallback(()=>{m(t=>{let l=!t.isTheaterMode;return u.current.onTheaterModeChange?.(l),{...t,isTheaterMode:l}});},[]),Q=Et.useCallback(()=>{let t=n.current,l=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:l,bufferedRanges:f}},[n]),q=Et.useCallback(()=>n.current??null,[n]),j=Et.useMemo(()=>({play:k,pause:H,seek:L,setVolume:g,toggleMute:R,setPlaybackRate:N,setQualityLevel:T,seekToLive:E,toggleFullscreen:M,togglePictureInPicture:F,toggleTheaterMode:C,getState:Q,getVideoElement:q}),[k,H,L,g,R,N,T,E,M,F,C,Q,q]);return {state:y,ref:j,hlsRef:s,fullscreenContainerRef:o}}var Ae={};Xe(Ae,{ControlElements:()=>_,FullscreenButton:()=>le,PauseButton:()=>se,PiPButton:()=>ue,PlayButton:()=>ie,ProgressBar:()=>ve,SettingsMenu:()=>he,TheaterButton:()=>ce,TimeDisplay:()=>be,VolumeControl:()=>fe});var ie=Et.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"})})}));ie.displayName="PlayButton";var se=Et.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"})})}));se.displayName="PauseButton";var le=Et.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"})})}));le.displayName="FullscreenButton";var ue=Et.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"})})}));ue.displayName="PiPButton";var ce=Et.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"})})}));ce.displayName="TheaterButton";var De=Et.memo(({volume:n,isMuted:e,onVolumeChange:d,onToggleMute:s})=>{let[o,h]=Et.useState(false),c=e?0:n,u=c*100,y=Et.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${u}%, rgba(255,255,255,0.3) ${u}%, rgba(255,255,255,0.3) 100%)`,[u]);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:u,onChange:m=>d(Number(m.target.value)/100),className:"volumeSlider",style:{background:y},"aria-label":"Volume","aria-valuenow":Math.round(u)})]})});De.displayName="VolumeControl";var fe=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 rt(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,`
2
2
  `).split(`
3
- `),a=0;for(;a<l.length;){let f=l[a].trim();if(f.includes("-->")){let c=f.indexOf("-->"),u=He(f.slice(0,c)),b=He(f.slice(c+3));for(a++;a<l.length&&!l[a].trim();)a++;if(a<l.length){let p=l[a].trim(),P=p.lastIndexOf("#xywh="),T=p,V=0,y=0,v=160,w=90;if(P!==-1){T=p.slice(0,P);let B=p.slice(P+6).split(",").map(Number);V=B[0]??0,y=B[1]??0,v=B[2]??160,w=B[3]??90;}m.push({start:u,end:b,url:rt(e,T),x:V,y,w:v,h:w});}}a++;}return m}function Pe(n,e){if(!n.length)return null;let m=0,l=n.length-1;for(;m<=l;){let a=m+l>>1;if(n[a].end<=e)m=a+1;else if(n[a].start>e)l=a-1;else return n[a]}return null}var Ve=yt.memo(({videoRef:n,playerRef:e,enablePreview:m=true,thumbnailVtt:l})=>{let a=yt.useRef(null),f=yt.useRef(null),c=yt.useRef(null),u=yt.useRef(null),b=yt.useRef(null),p=yt.useRef(null),P=yt.useRef(null),[T,V]=yt.useState([]),y=yt.useRef(false),v=yt.useRef(0),w=yt.useRef(0),B=yt.useRef(null),M=yt.useRef([]),L=yt.useRef(null);yt.useEffect(()=>{let r=()=>{L.current=null;};return window.addEventListener("resize",r,{passive:true}),()=>window.removeEventListener("resize",r)},[]);let x=yt.useCallback(()=>(!L.current&&a.current&&(L.current=a.current.getBoundingClientRect()),L.current),[]);yt.useEffect(()=>{if(!l){M.current=[];return}let r=false;return fetch(l).then(s=>s.text()).then(s=>{r||(M.current=Le(s,l));}).catch(()=>{r||(M.current=[]);}),()=>{r=true;}},[l]),yt.useEffect(()=>{let r=n.current;if(!r)return;let s=()=>{let i=isFinite(r.duration)?r.duration:0,E=r.currentTime,A=i>0?E/i*100:0;f.current&&(f.current.style.width=`${A}%`),c.current&&(c.current.style.left=`${A}%`),a.current&&(a.current.setAttribute("aria-valuenow",String(Math.round(E))),a.current.setAttribute("aria-valuemax",String(Math.round(i))),a.current.setAttribute("aria-valuetext",J(E)));};return r.addEventListener("timeupdate",s),r.addEventListener("durationchange",s),r.addEventListener("seeked",s),s(),()=>{r.removeEventListener("timeupdate",s),r.removeEventListener("durationchange",s),r.removeEventListener("seeked",s);}},[n]),yt.useEffect(()=>{let r=n.current;if(!r)return;let s=()=>{let i=[];for(let E=0;E<r.buffered.length;E++)i.push({start:r.buffered.start(E),end:r.buffered.end(E)});V(i);};return r.addEventListener("progress",s),()=>r.removeEventListener("progress",s)},[n]);let N=yt.useCallback(()=>{y.current=true,c.current?.classList.add("dragging");},[]),k=yt.useCallback(()=>{y.current=false,c.current?.classList.remove("dragging");},[]),Q=yt.useCallback(()=>{m&&(L.current=null,u.current&&(u.current.style.display=""),p.current&&(p.current.style.display=""));},[m]),q=yt.useCallback(()=>{u.current&&(u.current.style.display="none"),p.current&&(p.current.style.display="none");},[]),_=yt.useCallback(r=>{if(!P.current||!M.current.length)return;let s=Pe(M.current,r);if(B.current=s,!s)return;let i=P.current;i.style.backgroundImage=`url(${s.url})`,i.style.backgroundPosition=`-${s.x}px -${s.y}px`,i.style.width=`${s.w}px`,i.style.height=`${s.h}px`;},[]),t=yt.useCallback(r=>{let s=x(),i=n.current?.duration;return !s||s.width===0||!i||!isFinite(i)?0:Math.max(0,Math.min(r-s.left,s.width))/s.width*i},[x,n]),o=yt.useCallback(r=>{let s=x();return s?Math.max(0,Math.min(r-s.left,s.width)):0},[x]),d=yt.useCallback(r=>{let s=n.current;if(!s)return;let i=s.currentTime,E=isFinite(s.duration)?s.duration:0;switch(r.key){case "ArrowLeft":case "ArrowRight":{r.preventDefault(),r.nativeEvent.stopImmediatePropagation();let A=r.shiftKey?10:5;e.seek(r.key==="ArrowLeft"?Math.max(0,i-A):Math.min(E,i+A));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]),S=yt.useCallback(r=>{let s=t(r.clientX),i=o(r.clientX);v.current=i,w.current=s,u.current&&(u.current.style.left=`${i}px`),p.current&&(p.current.style.left=`${i}px`),b.current&&(b.current.textContent=J(s)),_(s),y.current&&e.seek(s);},[e,_,t,o]),F=yt.useCallback(()=>{Q();},[Q]),R=yt.useCallback(()=>{q(),k();},[q,k]),h=yt.useCallback(r=>{r.preventDefault(),N(),e.seek(t(r.clientX));},[N,t,e]),g=yt.useCallback(()=>k(),[k]),W=yt.useCallback(r=>{y.current||e.seek(t(r.clientX));},[t,e]);yt.useEffect(()=>{let r=a.current;if(!r)return;let s=i=>{y.current&&i.preventDefault();};return r.addEventListener("touchmove",s,{passive:false}),()=>r.removeEventListener("touchmove",s)},[]);let H=yt.useCallback(r=>{L.current=null,N(),e.seek(t(r.touches[0].clientX));},[N,t,e]),G=yt.useCallback(r=>{y.current&&e.seek(t(r.touches[0].clientX));},[t,e]),ee=yt.useCallback(()=>k(),[k]);yt.useEffect(()=>{let r=()=>k();return window.addEventListener("mouseup",r),()=>window.removeEventListener("mouseup",r)},[k]);let Y=yt.useMemo(()=>{let r=n.current,s=r&&isFinite(r.duration)?r.duration:0;return s<=0||!T.length?null:T.map((i,E)=>{let A=i.start/s*100,ye=(i.end-i.start)/s*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${A}%`,width:`${ye}%`}},E)})},[T,n]);return jsxRuntime.jsxs("div",{ref:a,className:"progressContainer",onMouseMove:S,onMouseEnter:F,onMouseLeave:R,onMouseDown:h,onMouseUp:g,onClick:W,onTouchStart:H,onTouchMove:G,onTouchEnd:ee,onKeyDown:d,role:"slider","aria-label":"Video progress","aria-valuemin":0,"aria-valuemax":0,"aria-valuenow":0,"aria-valuetext":"0:00",tabIndex:0,children:[m&&jsxRuntime.jsxs("div",{ref:u,className:"previewTooltip",style:{left:0,display:"none"},"aria-hidden":"true",children:[l&&jsxRuntime.jsx("div",{ref:P,className:"previewThumbnail"}),jsxRuntime.jsx("div",{ref:b,className:"previewTime"})]}),jsxRuntime.jsxs("div",{className:"progressBackground",children:[Y,jsxRuntime.jsx("div",{ref:f,className:"progressFilled",style:{width:"0%"}}),m&&jsxRuntime.jsx("div",{ref:p,className:"hoverIndicator",style:{left:0,display:"none"},"aria-hidden":"true"})]}),jsxRuntime.jsx("div",{ref:c,className:"scrubHandle",style:{left:"0%"},"aria-hidden":"true"})]})});Ve.displayName="ProgressBar";var ve=Ve;var Ie=yt.memo(({currentRate:n,playbackRates:e,onRateChange:m,qualityLevels:l=[],currentQualityLevel:a=-1,onQualityChange:f})=>{let[c,u]=yt.useState(false),[b,p]=yt.useState("speed"),P=yt.useRef(null),T=l.length>0&&!!f;yt.useEffect(()=>{let v=w=>{P.current&&!P.current.contains(w.target)&&u(false);};return c&&document.addEventListener("mousedown",v),()=>document.removeEventListener("mousedown",v)},[c]);let V=yt.useMemo(()=>[...l].sort((v,w)=>w.bitrate-v.bitrate),[l]),y=yt.useMemo(()=>a===-1?"Auto":l.find(v=>v.id===a)?.name??"Auto",[l,a]);return jsxRuntime.jsxs("div",{ref:P,className:"settingsContainer",children:[jsxRuntime.jsx("button",{onClick:()=>u(v=>!v),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:[T&&jsxRuntime.jsxs("div",{className:"settingsTabs",children:[jsxRuntime.jsx("button",{className:`settingsTab${b==="speed"?" active":""}`,onClick:()=>p("speed"),children:"Speed"}),jsxRuntime.jsx("button",{className:`settingsTab${b==="quality"?" active":""}`,onClick:()=>p("quality"),children:"Quality"})]}),(!T||b==="speed")&&jsxRuntime.jsxs("div",{children:[!T&&jsxRuntime.jsx("div",{className:"settingsPanelLabel",children:"Playback Speed"}),e.map(v=>jsxRuntime.jsx("button",{onClick:()=>{m(v),u(false);},className:`settingsOption${n===v?" active":""}`,role:"menuitemradio","aria-checked":n===v,children:v===1?"Normal":`${v}\xD7`},v))]}),T&&b==="quality"&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>{f(-1),u(false);},className:`settingsOption${a===-1?" active":""}`,role:"menuitemradio","aria-checked":a===-1,children:["Auto ",a===-1&&y!=="Auto"?`(${y})`:""]}),V.map(v=>jsxRuntime.jsxs("button",{onClick:()=>{f(v.id),u(false);},className:`settingsOption${a===v.id?" active":""}`,role:"menuitemradio","aria-checked":a===v.id,children:[v.name,v.bitrate>0&&jsxRuntime.jsxs("span",{className:"settingsOptionBadge",children:[Math.round(v.bitrate/1e3)," kbps"]})]},v.id))]})]})]})});Ie.displayName="SettingsMenu";var he=Ie;var ze=yt.memo(({videoRef:n,isLive:e=false})=>{let m=yt.useRef(null),l=yt.useRef(null);return yt.useEffect(()=>{let a=n.current;if(!a)return;let f=()=>{m.current&&(m.current.textContent=J(a.currentTime));},c=()=>{if(l.current){let u=isFinite(a.duration)?a.duration:0;l.current.textContent=` / ${J(u)}`;}};return a.addEventListener("timeupdate",f),a.addEventListener("durationchange",c),a.addEventListener("seeked",f),f(),c(),()=>{a.removeEventListener("timeupdate",f),a.removeEventListener("durationchange",c),a.removeEventListener("seeked",f);}},[n,e]),e?jsxRuntime.jsx("span",{className:"timeDisplay",style:{opacity:.7},children:jsxRuntime.jsx("span",{ref:m,children:"0:00"})}):jsxRuntime.jsxs("span",{className:"timeDisplay",children:[jsxRuntime.jsx("span",{ref:m,children:"0:00"}),jsxRuntime.jsx("span",{ref:l,style:{opacity:.6},children:" / 0:00"})]})});ze.displayName="TimeDisplay";var be=ze;var $={PlayButton:se,PauseButton:le,FullscreenButton:ue,PiPButton:ce,TheaterButton:de,VolumeControl:fe,ProgressBar:ve,SettingsMenu:he,TimeDisplay:be};var xe=({videoRef:n,playerRef:e,playerContainerRef:m,playbackRates:l,enablePreview:a,thumbnailVtt:f,isPlaying:c,volume:u,isMuted:b,playbackRate:p,isFullscreen:P,isPictureInPicture:T,isTheaterMode:V,isLive:y,qualityLevels:v,currentQualityLevel:w})=>{let B=yt.useRef(null),M=yt.useRef(null),[L,x]=yt.useState(true),N=yt.useRef({isPlaying:c,volume:u,isMuted:b,isLive:y});N.current={isPlaying:c,volume:u,isMuted:b,isLive:y},yt.useEffect(()=>{if(!c){x(true),M.current&&clearTimeout(M.current);return}let h=()=>{x(true),M.current&&clearTimeout(M.current),M.current=setTimeout(()=>x(false),3e3);},g=B.current;return g&&(g.addEventListener("mousemove",h),g.addEventListener("mouseenter",h),g.addEventListener("touchstart",h,{passive:true})),h(),()=>{g&&(g.removeEventListener("mousemove",h),g.removeEventListener("mouseenter",h),g.removeEventListener("touchstart",h)),M.current&&clearTimeout(M.current);}},[c]),yt.useEffect(()=>{let h=g=>{if(!m.current?.contains(document.activeElement))return;let W=g.target;if(W.tagName==="INPUT"||W.tagName==="TEXTAREA"||W.isContentEditable)return;let{isPlaying:H,volume:G,isLive:ee}=N.current,Y=n.current?.currentTime??0,r=n.current?.duration??0;switch(g.code){case "Space":case "KeyK":g.preventDefault(),H?e.pause():e.play();break;case "ArrowLeft":g.preventDefault(),e.seek(Math.max(0,Y-5));break;case "ArrowRight":g.preventDefault(),e.seek(Math.min(r||1/0,Y+5));break;case "ArrowUp":g.preventDefault(),e.setVolume(Math.min(1,G+.1));break;case "ArrowDown":g.preventDefault(),e.setVolume(Math.max(0,G-.1));break;case "KeyM":g.preventDefault(),e.toggleMute();break;case "KeyF":g.preventDefault(),e.toggleFullscreen();break;case "KeyP":g.preventDefault(),e.togglePictureInPicture();break;case "KeyT":g.preventDefault(),e.toggleTheaterMode();break;case "KeyL":g.preventDefault(),ee&&e.seekToLive();break;case "Digit0":case "Digit1":case "Digit2":case "Digit3":case "Digit4":case "Digit5":case "Digit6":case "Digit7":case "Digit8":case "Digit9":{g.preventDefault();let s=Number(g.code.replace("Digit",""))*10;e.seek(r/100*s);break}}};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[e,m,n]);let k=yt.useCallback(()=>e.play(),[e]),Q=yt.useCallback(()=>e.pause(),[e]),q=yt.useCallback(h=>e.setVolume(h),[e]),_=yt.useCallback(()=>e.toggleMute(),[e]),t=yt.useCallback(h=>e.setPlaybackRate(h),[e]),o=yt.useCallback(h=>e.setQualityLevel(h),[e]),d=yt.useCallback(()=>e.togglePictureInPicture(),[e]),S=yt.useCallback(()=>e.toggleTheaterMode(),[e]),F=yt.useCallback(()=>e.toggleFullscreen(),[e]),R=yt.useCallback(()=>e.seekToLive(),[e]);return jsxRuntime.jsx("div",{ref:B,style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:L?1:0,transition:"opacity 0.3s",pointerEvents:L?"auto":"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"},role:"region","aria-label":"Video player controls",children:[jsxRuntime.jsx($.ProgressBar,{videoRef:n,playerRef:e,enablePreview:a,thumbnailVtt:f}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:4},children:[c?jsxRuntime.jsx($.PauseButton,{onClick:Q}):jsxRuntime.jsx($.PlayButton,{onClick:k}),jsxRuntime.jsx($.VolumeControl,{volume:u,isMuted:b,onVolumeChange:q,onToggleMute:_}),jsxRuntime.jsx($.TimeDisplay,{videoRef:n,isLive:y}),jsxRuntime.jsx("div",{style:{flex:1}}),y&&jsxRuntime.jsx(Ue,{onClick:R}),jsxRuntime.jsx($.SettingsMenu,{currentRate:p,playbackRates:l,onRateChange:t,qualityLevels:v,currentQualityLevel:w,onQualityChange:o}),jsxRuntime.jsx($.PiPButton,{onClick:d,isPiP:T}),jsxRuntime.jsx($.TheaterButton,{onClick:S,isTheater:V}),jsxRuntime.jsx($.FullscreenButton,{onClick:F,isFullscreen:P})]})]})})},Ue=yt.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"}));Ue.displayName="GoLiveButton";var ke=yt.memo(({x:n,y:e,isPlaying:m,src:l,videoRef:a,playerRef:f,onClose:c})=>{let u=yt.useRef(null),[b,p]=yt.useState(()=>a.current?.loop??false),P=Math.min(n,window.innerWidth-220),T=Math.min(e,window.innerHeight-290);yt.useEffect(()=>{let L=k=>{u.current&&!u.current.contains(k.target)&&c();},x=k=>{k.key==="Escape"&&c();},N=()=>c();return document.addEventListener("mousedown",L),document.addEventListener("keydown",x),window.addEventListener("scroll",N,true),()=>{document.removeEventListener("mousedown",L),document.removeEventListener("keydown",x),window.removeEventListener("scroll",N,true);}},[c]);let V=yt.useCallback(()=>{m?f.pause():f.play(),c();},[m,f,c]),y=yt.useCallback(()=>{let L=a.current;if(!L)return;let x=!b;L.loop=x,p(x);},[a,b]),v=yt.useCallback(async()=>{try{await navigator.clipboard.writeText(l);}catch{}c();},[l,c]),w=yt.useCallback(async()=>{let L=Math.floor(a.current?.currentTime??0);try{await navigator.clipboard.writeText(`${l}?t=${L}`);}catch{}c();},[l,a,c]),B=yt.useCallback(()=>{f.togglePictureInPicture(),c();},[f,c]),M=yt.useCallback(()=>{f.toggleFullscreen(),c();},[f,c]);return jsxRuntime.jsxs("div",{ref:u,className:"contextMenu",style:{left:P,top:T},children:[jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:V,children:m?"Pause":"Play"}),jsxRuntime.jsxs("button",{className:"contextMenuItem",onClick:y,children:[jsxRuntime.jsx("span",{children:"Loop"}),b&&jsxRuntime.jsx("span",{className:"contextMenuCheck",children:"\u2713"})]}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:v,children:"Copy video URL"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:w,children:"Copy video URL at current time"}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:B,children:"Picture-in-Picture"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:M,children:"Fullscreen"})]})});ke.displayName="ContextMenu";var Qe=yt.forwardRef(({src:n,poster:e,autoplay:m=false,muted:l=false,loop:a=false,controls:f=true,preload:c="metadata",playbackRates:u=[.25,.5,.75,1,1.25,1.5,1.75,2],className:b,enableHLS:p=true,enablePreview:P=true,thumbnailVtt:T,hlsConfig:V,subtitles:y,crossOrigin:v,onPlay:w,onPause:B,onEnded:M,onError:L,onTimeUpdate:x,onDurationChange:N,onBuffering:k,onTheaterModeChange:Q},q)=>{let _=yt.useRef(null),t=yt.useRef(null),{state:o,ref:d,fullscreenContainerRef:S}=De(_,n,{autoplay:m,muted:l,loop:a,playbackRates:u,enableHLS:p,hlsConfig:V,onPlay:w,onPause:B,onEnded:M,onError:L,onTimeUpdate:x,onDurationChange:N,onBuffering:k,onTheaterModeChange:Q}),[F,R]=yt.useState(null);yt.useEffect(()=>{S.current=t.current;},[S]),yt__default.default.useImperativeHandle(q,()=>d,[d]);let h=yt.useCallback(()=>{t.current?.focus(),o.isPlaying?d.pause():d.play();},[o.isPlaying,d]),g=yt.useCallback(()=>{d.toggleFullscreen();},[d]),W=yt.useCallback(H=>{H.preventDefault(),R({x:H.clientX,y:H.clientY});},[]);return jsxRuntime.jsxs("div",{ref:t,tabIndex:0,style:{position:"relative",width:"100%",backgroundColor:"#000",aspectRatio:"16 / 9",userSelect:"none",outline:"none"},className:b,"data-test":"video-player-container","data-theater":o.isTheaterMode?"true":void 0,onContextMenu:W,children:[jsxRuntime.jsx("video",{ref:_,poster:e,preload:c,crossOrigin:v,onClick:h,onDoubleClick:g,playsInline:true,style:{width:"100%",height:"100%",display:"block",cursor:"pointer"},"data-test":"video-element",children:y?.map(H=>jsxRuntime.jsx("track",{kind:"subtitles",src:H.src,label:H.label,srcLang:H.srclang,default:H.default},H.id))}),f&&jsxRuntime.jsx(xe,{videoRef:_,playerRef:d,playerContainerRef:t,playbackRates:u,enablePreview:P,thumbnailVtt:T,isPlaying:o.isPlaying,volume:o.volume,isMuted:o.isMuted,playbackRate:o.playbackRate,isFullscreen:o.isFullscreen,isPictureInPicture:o.isPictureInPicture,isTheaterMode:o.isTheaterMode,isLive:o.isLive,qualityLevels:o.qualityLevels,currentQualityLevel:o.currentQualityLevel}),F&&jsxRuntime.jsx(ke,{x:F.x,y:F.y,isPlaying:o.isPlaying,src:n,videoRef:_,playerRef:d,onClose:()=>R(null)}),o.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"}),o.isBuffering&&!o.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); } }"})]}),o.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:o.error.code==="MEDIA_ERR_SRC_NOT_SUPPORTED"?"Unsupported Format":o.error.code.startsWith("HLS")?"Stream Error":"Playback Error"}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,opacity:.75},children:o.error.message})]})})]})});Qe.displayName="VideoPlayer";var Tt=Qe;exports.ControlElements=Ae;exports.Controls=xe;exports.VideoPlayer=Tt;exports.findThumbnailCue=Pe;exports.formatTime=J;exports.getMimeType=je;exports.isHLSUrl=me;exports.parseThumbnailVtt=Le;//# sourceMappingURL=index.js.map
3
+ `),o=0;for(;o<s.length;){let h=s[o].trim();if(h.includes("-->")){let c=h.indexOf("-->"),u=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,L=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,L=N[1]??0,g=N[2]??160,R=N[3]??90;}d.push({start:u,end:y,url:rt(e,k),x:H,y:L,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=Et.memo(({videoRef:n,playerRef:e,enablePreview:d=true,thumbnailVtt:s})=>{let o=Et.useRef(null),h=Et.useRef(null),c=Et.useRef(null),u=Et.useRef(null),y=Et.useRef(null),m=Et.useRef(null),x=Et.useRef(null),[k,H]=Et.useState([]),L=Et.useRef(false),g=Et.useRef(0),R=Et.useRef(0),N=Et.useRef(null),T=Et.useRef([]),E=Et.useRef(null);Et.useEffect(()=>{let r=()=>{E.current=null;};return window.addEventListener("resize",r,{passive:true}),()=>window.removeEventListener("resize",r)},[]);let M=Et.useCallback(()=>(!E.current&&o.current&&(E.current=o.current.getBoundingClientRect()),E.current),[]);Et.useEffect(()=>{if(!s){T.current=[];return}let r=false;return fetch(s).then(i=>i.text()).then(i=>{r||(T.current=Le(i,s));}).catch(()=>{r||(T.current=[]);}),()=>{r=true;}},[s]),Et.useEffect(()=>{let r=n.current;if(!r)return;let i=()=>{let a=isFinite(r.duration)?r.duration:0,P=r.currentTime,A=a>0?P/a*100:0;h.current&&(h.current.style.width=`${A}%`),c.current&&(c.current.style.left=`${A}%`),o.current&&(o.current.setAttribute("aria-valuenow",String(Math.round(P))),o.current.setAttribute("aria-valuemax",String(Math.round(a))),o.current.setAttribute("aria-valuetext",Z(P)));};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]),Et.useEffect(()=>{let r=n.current;if(!r)return;let i=()=>{let a=[];for(let P=0;P<r.buffered.length;P++)a.push({start:r.buffered.start(P),end:r.buffered.end(P)});H(a);};return r.addEventListener("progress",i),()=>r.removeEventListener("progress",i)},[n]);let F=Et.useCallback(()=>{L.current=true,c.current?.classList.add("dragging");},[]),C=Et.useCallback(()=>{L.current=false,c.current?.classList.remove("dragging");},[]),Q=Et.useCallback(()=>{d&&(E.current=null,u.current&&(u.current.style.display=""),m.current&&(m.current.style.display=""));},[d]),q=Et.useCallback(()=>{u.current&&(u.current.style.display="none"),m.current&&(m.current.style.display="none");},[]),j=Et.useCallback(r=>{if(!x.current||!T.current.length)return;let i=Pe(T.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=Et.useCallback(r=>{let i=M(),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},[M,n]),l=Et.useCallback(r=>{let i=M();return i?Math.max(0,Math.min(r-i.left,i.width)):0},[M]),f=Et.useCallback(r=>{let i=n.current;if(!i)return;let a=i.currentTime,P=isFinite(i.duration)?i.duration:0;switch(r.key){case "ArrowLeft":case "ArrowRight":{r.preventDefault(),r.nativeEvent.stopImmediatePropagation();let A=r.shiftKey?10:5;e.seek(r.key==="ArrowLeft"?Math.max(0,a-A):Math.min(P,a+A));break}case "Home":r.preventDefault(),r.nativeEvent.stopImmediatePropagation(),e.seek(0);break;case "End":P>0&&(r.preventDefault(),r.nativeEvent.stopImmediatePropagation(),e.seek(P));break}},[n,e]),b=Et.useCallback(r=>{let i=t(r.clientX),a=l(r.clientX);g.current=a,R.current=i,u.current&&(u.current.style.left=`${a}px`),m.current&&(m.current.style.left=`${a}px`),y.current&&(y.current.textContent=Z(i)),j(i),L.current&&e.seek(i);},[e,j,t,l]),w=Et.useCallback(()=>{Q();},[Q]),B=Et.useCallback(()=>{q(),C();},[q,C]),p=Et.useCallback(r=>{r.preventDefault(),F(),e.seek(t(r.clientX));},[F,t,e]),v=Et.useCallback(()=>C(),[C]),U=Et.useCallback(r=>{L.current||e.seek(t(r.clientX));},[t,e]);Et.useEffect(()=>{let r=o.current;if(!r)return;let i=a=>{L.current&&a.preventDefault();};return r.addEventListener("touchmove",i,{passive:false}),()=>r.removeEventListener("touchmove",i)},[]);let G=Et.useCallback(r=>{E.current=null,F(),e.seek(t(r.touches[0].clientX));},[F,t,e]),X=Et.useCallback(r=>{L.current&&e.seek(t(r.touches[0].clientX));},[t,e]),V=Et.useCallback(()=>C(),[C]);Et.useEffect(()=>{let r=()=>C();return window.addEventListener("mouseup",r),()=>window.removeEventListener("mouseup",r)},[C]);let J=Et.useMemo(()=>{let r=n.current,i=r&&isFinite(r.duration)?r.duration:0;return i<=0||!k.length?null:k.map((a,P)=>{let A=a.start/i*100,ye=(a.end-a.start)/i*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${A}%`,width:`${ye}%`}},P)})},[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:u,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 ve=He;var Ie=Et.memo(({currentRate:n,playbackRates:e,onRateChange:d,qualityLevels:s=[],currentQualityLevel:o=-1,onQualityChange:h})=>{let[c,u]=Et.useState(false),[y,m]=Et.useState("speed"),x=Et.useRef(null),k=s.length>0&&!!h;Et.useEffect(()=>{let g=R=>{x.current&&!x.current.contains(R.target)&&u(false);};return c&&document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[c]);let H=Et.useMemo(()=>[...s].sort((g,R)=>R.bitrate-g.bitrate),[s]),L=Et.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:()=>u(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),u(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),u(false);},className:`settingsOption${o===-1?" active":""}`,role:"menuitemradio","aria-checked":o===-1,children:["Auto ",o===-1&&L!=="Auto"?`(${L})`:""]}),H.map(g=>jsxRuntime.jsxs("button",{onClick:()=>{h(g.id),u(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 he=Ie;var ze=Et.memo(({videoRef:n,isLive:e=false})=>{let d=Et.useRef(null),s=Et.useRef(null);return Et.useEffect(()=>{let o=n.current;if(!o)return;let h=()=>{d.current&&(d.current.textContent=Z(o.currentTime));},c=()=>{if(s.current){let u=isFinite(o.duration)?o.duration:0;s.current.textContent=` / ${Z(u)}`;}};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 be=ze;var _={PlayButton:ie,PauseButton:se,FullscreenButton:le,PiPButton:ue,TheaterButton:ce,VolumeControl:fe,ProgressBar:ve,SettingsMenu:he,TimeDisplay:be};var Me=({videoRef:n,playerRef:e,playerContainerRef:d,playbackRates:s,enablePreview:o,thumbnailVtt:h,isPlaying:c,volume:u,isMuted:y,playbackRate:m,isFullscreen:x,isPictureInPicture:k,isTheaterMode:H,isLive:L,qualityLevels:g,currentQualityLevel:R,controlBarItems:N})=>{let T=Et.useRef(null),[E,M]=Et.useState(true),F=Et.useRef({isPlaying:c,volume:u,isMuted:y,isLive:L});F.current={isPlaying:c,volume:u,isMuted:y,isLive:L},Et.useEffect(()=>{if(!c){M(true),T.current&&clearTimeout(T.current);return}let p=()=>{M(true),T.current&&clearTimeout(T.current),T.current=setTimeout(()=>M(false),3e3);},v=d.current;return v&&(v.addEventListener("mousemove",p),v.addEventListener("mouseenter",p),v.addEventListener("mouseleave",()=>{T.current&&clearTimeout(T.current);}),v.addEventListener("touchstart",p,{passive:true})),p(),()=>{v&&(v.removeEventListener("mousemove",p),v.removeEventListener("mouseenter",p),v.removeEventListener("mouseleave",()=>{}),v.removeEventListener("touchstart",p)),T.current&&clearTimeout(T.current);}},[c,d]),Et.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=Et.useCallback(()=>e.play(),[e]),Q=Et.useCallback(()=>e.pause(),[e]),q=Et.useCallback(p=>e.setVolume(p),[e]),j=Et.useCallback(()=>e.toggleMute(),[e]),t=Et.useCallback(p=>e.setPlaybackRate(p),[e]),l=Et.useCallback(p=>e.setQualityLevel(p),[e]),f=Et.useCallback(()=>e.togglePictureInPicture(),[e]),b=Et.useCallback(()=>e.toggleTheaterMode(),[e]),w=Et.useCallback(()=>e.toggleFullscreen(),[e]),B=Et.useCallback(()=>e.seekToLive(),[e]);return jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:E?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:E?"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:u,isMuted:y,onVolumeChange:q,onToggleMute:j}),jsxRuntime.jsx(_.TimeDisplay,{videoRef:n,isLive:L}),jsxRuntime.jsx("div",{style:{flex:1}}),L&&jsxRuntime.jsx(We,{onClick:B}),jsxRuntime.jsx(_.SettingsMenu,{currentRate:m,playbackRates:s,onRateChange:t,qualityLevels:g,currentQualityLevel:R,onQualityChange:l}),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=Et.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=Et.memo(({x:n,y:e,isPlaying:d,src:s,videoRef:o,playerRef:h,onClose:c,contextMenuItems:u})=>{let y=Et.useRef(null),[m,x]=Et.useState(()=>o.current?.loop??false),k=Math.min(n,window.innerWidth-220),H=Math.min(e,window.innerHeight-290);Et.useEffect(()=>{let E=C=>{y.current&&!y.current.contains(C.target)&&c();},M=C=>{C.key==="Escape"&&c();},F=()=>c();return document.addEventListener("mousedown",E),document.addEventListener("keydown",M),window.addEventListener("scroll",F,true),()=>{document.removeEventListener("mousedown",E),document.removeEventListener("keydown",M),window.removeEventListener("scroll",F,true);}},[c]);let L=Et.useCallback(()=>{d?h.pause():h.play(),c();},[d,h,c]),g=Et.useCallback(()=>{let E=o.current;if(!E)return;let M=!m;E.loop=M,x(M);},[o,m]),R=Et.useCallback(async()=>{try{await navigator.clipboard.writeText(s);}catch{}c();},[s,c]),N=Et.useCallback(async()=>{let E=Math.floor(o.current?.currentTime??0);try{await navigator.clipboard.writeText(`${s}?t=${E}`);}catch{}c();},[s,o,c]),T=Et.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:L,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:T,children:"Picture-in-Picture"}),u&&u.length>0&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"contextMenuDivider"}),u.map((E,M)=>jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:()=>{E.onClick(),c();},children:E.label},M))]})]})});ke.displayName="ContextMenu";var Qe=Et.forwardRef(({src:n,poster:e,autoplay:d=false,muted:s=false,loop:o=false,controls:h=true,preload:c="metadata",playbackRates:u=[.25,.5,.75,1,1.25,1.5,1.75,2],className:y,enableHLS:m=true,enablePreview:x=true,thumbnailVtt:k,hlsConfig:H,subtitles:L,crossOrigin:g,onPlay:R,onPause:N,onEnded:T,onError:E,onTimeUpdate:M,onDurationChange:F,onBuffering:C,onTheaterModeChange:Q,contextMenuItems:q,controlBarItems:j},t)=>{let l=Et.useRef(null),f=Et.useRef(null),{state:b,ref:w,fullscreenContainerRef:B}=Be(l,n,{autoplay:d,muted:s,loop:o,playbackRates:u,enableHLS:m,hlsConfig:H,onPlay:R,onPause:N,onEnded:T,onError:E,onTimeUpdate:M,onDurationChange:F,onBuffering:C,onTheaterModeChange:Q}),[p,v]=Et.useState(null);Et.useEffect(()=>{B.current=f.current;},[B]),Et__default.default.useImperativeHandle(t,()=>w,[w]);let U=Et.useCallback(()=>{f.current?.focus(),b.isPlaying?w.pause():w.play();},[b.isPlaying,w]),G=Et.useCallback(()=>{w.toggleFullscreen();},[w]),X=Et.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:l,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:L?.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:l,playerRef:w,playerContainerRef:f,playbackRates:u,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:l,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 Mt=Qe;exports.ControlElements=Ae;exports.Controls=Me;exports.VideoPlayer=Mt;exports.findThumbnailCue=Pe;exports.formatTime=Z;exports.getMimeType=je;exports.isHLSUrl=me;exports.parseThumbnailVtt=Le;//# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map