react-helios 2.2.0 → 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,7 +109,53 @@ 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 |
112
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).
113
159
 
114
160
  ## Context Menu
115
161
 
@@ -166,6 +212,7 @@ export default function App() {
166
212
  | `seekToLive` | `() => void` | Jump to the live edge (HLS live streams) |
167
213
  | `toggleFullscreen` | `() => Promise<void>` | Toggle fullscreen |
168
214
  | `togglePictureInPicture` | `() => Promise<void>` | Toggle Picture-in-Picture |
215
+ | `toggleTheaterMode` | `() => void` | Toggle theater (wide) mode |
169
216
  | `getState` | `() => PlayerState` | Snapshot of current player state |
170
217
  | `getVideoElement` | `() => HTMLVideoElement \| null` | Access the underlying `<video>` element |
171
218
 
@@ -192,6 +239,7 @@ Shortcuts activate when the player has focus (click the player or tab to it).
192
239
  | `↑` / `↓` | Volume +10% / −10% |
193
240
  | `M` | Toggle mute (restores previous volume) |
194
241
  | `F` | Toggle fullscreen |
242
+ | `T` | Toggle theater mode |
195
243
  | `P` | Toggle Picture-in-Picture |
196
244
  | `L` | Seek to live edge (live streams only) |
197
245
  | `0`–`9` | Jump to 0%–90% of duration |
@@ -222,6 +270,7 @@ import type {
222
270
  VideoErrorCode,
223
271
  ThumbnailCue,
224
272
  ContextMenuItem,
273
+ ControlBarItem,
225
274
  } from "react-helios";
226
275
 
227
276
  // VTT utilities (useful for server-side pre-parsing or custom UIs)
@@ -243,6 +292,7 @@ interface PlayerState {
243
292
  error: VideoError | null;
244
293
  isFullscreen: boolean;
245
294
  isPictureInPicture: boolean;
295
+ isTheaterMode: boolean;
246
296
  isLive: boolean;
247
297
  qualityLevels: HLSQualityLevel[];
248
298
  currentQualityLevel: number; // -1 = ABR auto
@@ -281,6 +331,27 @@ interface ThumbnailCue {
281
331
  }
282
332
  ```
283
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
+
284
355
  ## Performance
285
356
 
286
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 {
@@ -63,6 +63,13 @@ interface ContextMenuItem {
63
63
  label: string;
64
64
  onClick: () => void;
65
65
  }
66
+ interface ControlBarItem {
67
+ key: string;
68
+ icon: ReactNode;
69
+ label: string;
70
+ title?: string;
71
+ onClick: () => void;
72
+ }
66
73
  interface VideoPlayerProps {
67
74
  src: string;
68
75
  poster?: string;
@@ -105,6 +112,7 @@ interface VideoPlayerProps {
105
112
  onBuffering?: (isBuffering: boolean) => void;
106
113
  onTheaterModeChange?: (isTheater: boolean) => void;
107
114
  contextMenuItems?: ContextMenuItem[];
115
+ controlBarItems?: ControlBarItem[];
108
116
  }
109
117
 
110
118
  declare const VideoPlayer: react__default.ForwardRefExoticComponent<VideoPlayerProps & react__default.RefAttributes<VideoPlayerRef>>;
@@ -126,6 +134,7 @@ interface ControlsProps {
126
134
  isLive: boolean;
127
135
  qualityLevels: HLSQualityLevel[];
128
136
  currentQualityLevel: number;
137
+ controlBarItems?: ControlBarItem[];
129
138
  }
130
139
  declare const Controls: react__default.FC<ControlsProps>;
131
140
 
@@ -269,4 +278,4 @@ declare function parseThumbnailVtt(text: string, baseUrl?: string): ThumbnailCue
269
278
  */
270
279
  declare function findThumbnailCue(cues: ThumbnailCue[], time: number): ThumbnailCue | null;
271
280
 
272
- export { type BufferedRange, type ContextMenuItem, 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 {
@@ -63,6 +63,13 @@ interface ContextMenuItem {
63
63
  label: string;
64
64
  onClick: () => void;
65
65
  }
66
+ interface ControlBarItem {
67
+ key: string;
68
+ icon: ReactNode;
69
+ label: string;
70
+ title?: string;
71
+ onClick: () => void;
72
+ }
66
73
  interface VideoPlayerProps {
67
74
  src: string;
68
75
  poster?: string;
@@ -105,6 +112,7 @@ interface VideoPlayerProps {
105
112
  onBuffering?: (isBuffering: boolean) => void;
106
113
  onTheaterModeChange?: (isTheater: boolean) => void;
107
114
  contextMenuItems?: ContextMenuItem[];
115
+ controlBarItems?: ControlBarItem[];
108
116
  }
109
117
 
110
118
  declare const VideoPlayer: react__default.ForwardRefExoticComponent<VideoPlayerProps & react__default.RefAttributes<VideoPlayerRef>>;
@@ -126,6 +134,7 @@ interface ControlsProps {
126
134
  isLive: boolean;
127
135
  qualityLevels: HLSQualityLevel[];
128
136
  currentQualityLevel: number;
137
+ controlBarItems?: ControlBarItem[];
129
138
  }
130
139
  declare const Controls: react__default.FC<ControlsProps>;
131
140
 
@@ -269,4 +278,4 @@ declare function parseThumbnailVtt(text: string, baseUrl?: string): ThumbnailCue
269
278
  */
270
279
  declare function findThumbnailCue(cues: ThumbnailCue[], time: number): ThumbnailCue | null;
271
280
 
272
- export { type BufferedRange, type ContextMenuItem, 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 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 p in e)qe(n,p,{get:e[p],enumerable:true});};function J(n){if(!Number.isFinite(n)||n<0)return "0:00";let e=Math.floor(n),p=Math.floor(e/3600),l=Math.floor(e%3600/60),o=e%60;return p>0?`${p}:${String(l).padStart(2,"0")}:${String(o).padStart(2,"0")}`:`${l}:${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 Re(n){return n.map((e,p)=>({id:p,height:e.height??0,width:e.width??0,bitrate:e.bitrate??0,name:e.height?`${e.height}p`:`Level ${p+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,p={}){let l=Et.useRef(null),o=Et.useRef(null),f=Et.useRef(1),d=Et.useRef(0),c=Et.useRef(p);c.current=p;let[b,m]=Et.useState({...Je,isMuted:p.muted??false,volume:p.muted?0:1}),M=Et.useRef(b);M.current=b,Et.useEffect(()=>{let t=n.current;if(!t||(l.current&&(l.current.destroy(),l.current=null),d.current=0,m(i=>({...i,currentTime:0,duration:0,error:null,isBuffering:false,isLive:false,qualityLevels:[],currentQualityLevel:-1})),!e))return;let u=c.current;if(u.enableHLS!==false&&me(e)){if(t.canPlayType("application/vnd.apple.mpegurl"))t.src=e,t.load(),u.autoplay&&t.play().catch(()=>{});else if(pe__default.default.isSupported()){let i=new pe__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...u.hlsConfig});i.attachMedia(t),i.loadSource(e),i.on(pe.Events.MANIFEST_PARSED,(z,w)=>{let h=Re(w.levels);m(g=>({...g,qualityLevels:h,currentQualityLevel:-1})),c.current.autoplay&&t.play().catch(()=>{});}),i.on(pe.Events.LEVEL_SWITCHED,(z,w)=>{m(h=>({...h,currentQualityLevel:w.level}));});let L=3;i.on(pe.Events.ERROR,(z,w)=>{if(!w.fatal){console.warn("[hls] non-fatal:",w.details);return}switch(w.type){case pe__default.default.ErrorTypes.NETWORK_ERROR:if(d.current<L){d.current+=1;let h=1e3*d.current;console.warn(`[hls] network error \u2013 retry ${d.current}/${L} in ${h}ms`),setTimeout(()=>{l.current===i&&i.startLoad();},h);}else {let h={code:"HLS_NETWORK_ERROR",message:"Failed to load stream after multiple retries."};m(g=>({...g,error:h})),c.current.onError?.(h);}break;case pe__default.default.ErrorTypes.MEDIA_ERROR:console.warn("[hls] media error \u2013 recovering"),i.recoverMediaError();break;default:{i.destroy(),l.current=null;let h={code:"HLS_FATAL_ERROR",message:"An unrecoverable HLS error occurred."};m(g=>({...g,error:h})),c.current.onError?.(h);break}}}),l.current=i;}}else t.src=e,t.load(),u.autoplay&&t.play().catch(()=>{});return ()=>{l.current&&(l.current.destroy(),l.current=null);}},[e,n]),Et.useEffect(()=>{let t=n.current;if(!t)return;c.current.muted&&(t.muted=true),c.current.loop&&(t.loop=true);let u=()=>{m(a=>({...a,isPlaying:true})),c.current.onPlay?.();},i=()=>{m(a=>({...a,isPlaying:false})),c.current.onPause?.();},L=()=>{m(a=>({...a,isPlaying:false})),c.current.onEnded?.();},z=()=>{c.current.onTimeUpdate?.(t.currentTime);},w=()=>{let a=t.duration,P=!Number.isFinite(a);m(A=>({...A,duration:P?0:a,isLive:P})),P||c.current.onDurationChange?.(a);},h=()=>{let a=t.volume;a>0&&!t.muted&&(f.current=a),m(P=>({...P,volume:a,isMuted:t.muted||a===0}));},g=()=>{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})),c.current.onError?.(A);},j=()=>{m(a=>({...a,isBuffering:true})),c.current.onBuffering?.(true);},D=()=>{m(a=>({...a,isBuffering:false})),c.current.onBuffering?.(false);},ee=()=>m(a=>({...a,isBuffering:false})),Y=()=>{},r=()=>{let a=!!(document.fullscreenElement||document.webkitFullscreenElement);m(P=>({...P,isFullscreen:a}));},s=()=>{m(a=>({...a,isPictureInPicture:document.pictureInPictureElement===t}));};return t.addEventListener("play",u),t.addEventListener("pause",i),t.addEventListener("ended",L),t.addEventListener("timeupdate",z),t.addEventListener("durationchange",w),t.addEventListener("volumechange",h),t.addEventListener("ratechange",g),t.addEventListener("error",U),t.addEventListener("waiting",j),t.addEventListener("canplay",D),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",u),t.removeEventListener("pause",i),t.removeEventListener("ended",L),t.removeEventListener("timeupdate",z),t.removeEventListener("durationchange",w),t.removeEventListener("volumechange",h),t.removeEventListener("ratechange",g),t.removeEventListener("error",U),t.removeEventListener("waiting",j),t.removeEventListener("canplay",D),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 x=Et.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]),V=Et.useCallback(()=>{n.current?.pause();},[n]),E=Et.useCallback(t=>{let u=n.current;u&&(u.currentTime=Math.max(0,Math.min(t,u.duration||t)));},[n]),v=Et.useCallback(t=>{let u=n.current;if(!u)return;let i=Math.max(0,Math.min(t,1));i>0&&(f.current=i),u.volume=i,u.muted=i===0;},[n]),R=Et.useCallback(()=>{let t=n.current;if(t)if(t.muted||t.volume===0){let u=f.current>0?f.current:1;t.volume=u,t.muted=false;}else f.current=t.volume,t.muted=true;},[n]),H=Et.useCallback(t=>{let u=n.current;u&&(u.playbackRate=t);},[n]),k=Et.useCallback(t=>{let u=l.current;u&&(u.currentLevel=t,m(i=>({...i,currentQualityLevel:t})));},[]),y=Et.useCallback(()=>{let t=l.current,u=n.current;if(!t||!u)return;let i=t.liveSyncPosition;i!=null&&Number.isFinite(i)&&(u.currentTime=i);},[n]),T=Et.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(i){console.error("[player] fullscreen toggle failed:",i);}},[n]),N=Et.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=Et.useCallback(()=>{m(t=>{let u=!t.isTheaterMode;return c.current.onTheaterModeChange?.(u),{...t,isTheaterMode:u}});},[]),Q=Et.useCallback(()=>{let t=n.current,u=t?.currentTime??0,i=[];if(t)for(let L=0;L<t.buffered.length;L++)i.push({start:t.buffered.start(L),end:t.buffered.end(L)});return {...M.current,currentTime:u,bufferedRanges:i}},[n]),q=Et.useCallback(()=>n.current??null,[n]),X=Et.useMemo(()=>({play:x,pause:V,seek:E,setVolume:v,toggleMute:R,setPlaybackRate:H,setQualityLevel:k,seekToLive:y,toggleFullscreen:T,togglePictureInPicture:N,toggleTheaterMode:C,getState:Q,getVideoElement:q}),[x,V,E,v,R,H,k,y,T,N,C,Q,q]);return {state:b,ref:X,hlsRef:l,fullscreenContainerRef:o}}var _e={};Xe(_e,{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 He=Et.memo(({volume:n,isMuted:e,onVolumeChange:p,onToggleMute:l})=>{let[o,f]=Et.useState(false),d=e?0:n,c=d*100,b=Et.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${c}%, rgba(255,255,255,0.3) ${c}%, rgba(255,255,255,0.3) 100%)`,[c]);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:d===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"}):d<.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:c,onChange:m=>p(Number(m.target.value)/100),className:"volumeSlider",style:{background:b},"aria-label":"Volume","aria-valuenow":Math.round(c)})]})});He.displayName="VolumeControl";var fe=He;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 p=[],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
- `),o=0;for(;o<l.length;){let f=l[o].trim();if(f.includes("-->")){let d=f.indexOf("-->"),c=Ve(f.slice(0,d)),b=Ve(f.slice(d+3));for(o++;o<l.length&&!l[o].trim();)o++;if(o<l.length){let m=l[o].trim(),M=m.lastIndexOf("#xywh="),x=m,V=0,E=0,v=160,R=90;if(M!==-1){x=m.slice(0,M);let H=m.slice(M+6).split(",").map(Number);V=H[0]??0,E=H[1]??0,v=H[2]??160,R=H[3]??90;}p.push({start:c,end:b,url:rt(e,x),x:V,y:E,w:v,h:R});}}o++;}return p}function Pe(n,e){if(!n.length)return null;let p=0,l=n.length-1;for(;p<=l;){let o=p+l>>1;if(n[o].end<=e)p=o+1;else if(n[o].start>e)l=o-1;else return n[o]}return null}var Ne=Et.memo(({videoRef:n,playerRef:e,enablePreview:p=true,thumbnailVtt:l})=>{let o=Et.useRef(null),f=Et.useRef(null),d=Et.useRef(null),c=Et.useRef(null),b=Et.useRef(null),m=Et.useRef(null),M=Et.useRef(null),[x,V]=Et.useState([]),E=Et.useRef(false),v=Et.useRef(0),R=Et.useRef(0),H=Et.useRef(null),k=Et.useRef([]),y=Et.useRef(null);Et.useEffect(()=>{let r=()=>{y.current=null;};return window.addEventListener("resize",r,{passive:true}),()=>window.removeEventListener("resize",r)},[]);let T=Et.useCallback(()=>(!y.current&&o.current&&(y.current=o.current.getBoundingClientRect()),y.current),[]);Et.useEffect(()=>{if(!l){k.current=[];return}let r=false;return fetch(l).then(s=>s.text()).then(s=>{r||(k.current=Le(s,l));}).catch(()=>{r||(k.current=[]);}),()=>{r=true;}},[l]),Et.useEffect(()=>{let r=n.current;if(!r)return;let s=()=>{let a=isFinite(r.duration)?r.duration:0,P=r.currentTime,A=a>0?P/a*100:0;f.current&&(f.current.style.width=`${A}%`),d.current&&(d.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",J(P)));};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]),Et.useEffect(()=>{let r=n.current;if(!r)return;let s=()=>{let a=[];for(let P=0;P<r.buffered.length;P++)a.push({start:r.buffered.start(P),end:r.buffered.end(P)});V(a);};return r.addEventListener("progress",s),()=>r.removeEventListener("progress",s)},[n]);let N=Et.useCallback(()=>{E.current=true,d.current?.classList.add("dragging");},[]),C=Et.useCallback(()=>{E.current=false,d.current?.classList.remove("dragging");},[]),Q=Et.useCallback(()=>{p&&(y.current=null,c.current&&(c.current.style.display=""),m.current&&(m.current.style.display=""));},[p]),q=Et.useCallback(()=>{c.current&&(c.current.style.display="none"),m.current&&(m.current.style.display="none");},[]),X=Et.useCallback(r=>{if(!M.current||!k.current.length)return;let s=Pe(k.current,r);if(H.current=s,!s)return;let a=M.current;a.style.backgroundImage=`url(${s.url})`,a.style.backgroundPosition=`-${s.x}px -${s.y}px`,a.style.width=`${s.w}px`,a.style.height=`${s.h}px`;},[]),t=Et.useCallback(r=>{let s=T(),a=n.current?.duration;return !s||s.width===0||!a||!isFinite(a)?0:Math.max(0,Math.min(r-s.left,s.width))/s.width*a},[T,n]),u=Et.useCallback(r=>{let s=T();return s?Math.max(0,Math.min(r-s.left,s.width)):0},[T]),i=Et.useCallback(r=>{let s=n.current;if(!s)return;let a=s.currentTime,P=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,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]),L=Et.useCallback(r=>{let s=t(r.clientX),a=u(r.clientX);v.current=a,R.current=s,c.current&&(c.current.style.left=`${a}px`),m.current&&(m.current.style.left=`${a}px`),b.current&&(b.current.textContent=J(s)),X(s),E.current&&e.seek(s);},[e,X,t,u]),z=Et.useCallback(()=>{Q();},[Q]),w=Et.useCallback(()=>{q(),C();},[q,C]),h=Et.useCallback(r=>{r.preventDefault(),N(),e.seek(t(r.clientX));},[N,t,e]),g=Et.useCallback(()=>C(),[C]),U=Et.useCallback(r=>{E.current||e.seek(t(r.clientX));},[t,e]);Et.useEffect(()=>{let r=o.current;if(!r)return;let s=a=>{E.current&&a.preventDefault();};return r.addEventListener("touchmove",s,{passive:false}),()=>r.removeEventListener("touchmove",s)},[]);let j=Et.useCallback(r=>{y.current=null,N(),e.seek(t(r.touches[0].clientX));},[N,t,e]),D=Et.useCallback(r=>{E.current&&e.seek(t(r.touches[0].clientX));},[t,e]),ee=Et.useCallback(()=>C(),[C]);Et.useEffect(()=>{let r=()=>C();return window.addEventListener("mouseup",r),()=>window.removeEventListener("mouseup",r)},[C]);let Y=Et.useMemo(()=>{let r=n.current,s=r&&isFinite(r.duration)?r.duration:0;return s<=0||!x.length?null:x.map((a,P)=>{let A=a.start/s*100,ye=(a.end-a.start)/s*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${A}%`,width:`${ye}%`}},P)})},[x,n]);return jsxRuntime.jsxs("div",{ref:o,className:"progressContainer",onMouseMove:L,onMouseEnter:z,onMouseLeave:w,onMouseDown:h,onMouseUp:g,onClick:U,onTouchStart:j,onTouchMove:D,onTouchEnd:ee,onKeyDown:i,role:"slider","aria-label":"Video progress","aria-valuemin":0,"aria-valuemax":0,"aria-valuenow":0,"aria-valuetext":"0:00",tabIndex:0,children:[p&&jsxRuntime.jsxs("div",{ref:c,className:"previewTooltip",style:{left:0,display:"none"},"aria-hidden":"true",children:[l&&jsxRuntime.jsx("div",{ref:M,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%"}}),p&&jsxRuntime.jsx("div",{ref:m,className:"hoverIndicator",style:{left:0,display:"none"},"aria-hidden":"true"})]}),jsxRuntime.jsx("div",{ref:d,className:"scrubHandle",style:{left:"0%"},"aria-hidden":"true"})]})});Ne.displayName="ProgressBar";var ve=Ne;var Oe=Et.memo(({currentRate:n,playbackRates:e,onRateChange:p,qualityLevels:l=[],currentQualityLevel:o=-1,onQualityChange:f})=>{let[d,c]=Et.useState(false),[b,m]=Et.useState("speed"),M=Et.useRef(null),x=l.length>0&&!!f;Et.useEffect(()=>{let v=R=>{M.current&&!M.current.contains(R.target)&&c(false);};return d&&document.addEventListener("mousedown",v),()=>document.removeEventListener("mousedown",v)},[d]);let V=Et.useMemo(()=>[...l].sort((v,R)=>R.bitrate-v.bitrate),[l]),E=Et.useMemo(()=>o===-1?"Auto":l.find(v=>v.id===o)?.name??"Auto",[l,o]);return jsxRuntime.jsxs("div",{ref:M,className:"settingsContainer",children:[jsxRuntime.jsx("button",{onClick:()=>c(v=>!v),className:"controlButton","aria-label":"Settings",title:"Settings","aria-expanded":d,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"})})}),d&&jsxRuntime.jsxs("div",{className:"settingsDropdown",role:"menu",children:[x&&jsxRuntime.jsxs("div",{className:"settingsTabs",children:[jsxRuntime.jsx("button",{className:`settingsTab${b==="speed"?" active":""}`,onClick:()=>m("speed"),children:"Speed"}),jsxRuntime.jsx("button",{className:`settingsTab${b==="quality"?" active":""}`,onClick:()=>m("quality"),children:"Quality"})]}),(!x||b==="speed")&&jsxRuntime.jsxs("div",{children:[!x&&jsxRuntime.jsx("div",{className:"settingsPanelLabel",children:"Playback Speed"}),e.map(v=>jsxRuntime.jsx("button",{onClick:()=>{p(v),c(false);},className:`settingsOption${n===v?" active":""}`,role:"menuitemradio","aria-checked":n===v,children:v===1?"Normal":`${v}\xD7`},v))]}),x&&b==="quality"&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>{f(-1),c(false);},className:`settingsOption${o===-1?" active":""}`,role:"menuitemradio","aria-checked":o===-1,children:["Auto ",o===-1&&E!=="Auto"?`(${E})`:""]}),V.map(v=>jsxRuntime.jsxs("button",{onClick:()=>{f(v.id),c(false);},className:`settingsOption${o===v.id?" active":""}`,role:"menuitemradio","aria-checked":o===v.id,children:[v.name,v.bitrate>0&&jsxRuntime.jsxs("span",{className:"settingsOptionBadge",children:[Math.round(v.bitrate/1e3)," kbps"]})]},v.id))]})]})]})});Oe.displayName="SettingsMenu";var he=Oe;var Ae=Et.memo(({videoRef:n,isLive:e=false})=>{let p=Et.useRef(null),l=Et.useRef(null);return Et.useEffect(()=>{let o=n.current;if(!o)return;let f=()=>{p.current&&(p.current.textContent=J(o.currentTime));},d=()=>{if(l.current){let c=isFinite(o.duration)?o.duration:0;l.current.textContent=` / ${J(c)}`;}};return o.addEventListener("timeupdate",f),o.addEventListener("durationchange",d),o.addEventListener("seeked",f),f(),d(),()=>{o.removeEventListener("timeupdate",f),o.removeEventListener("durationchange",d),o.removeEventListener("seeked",f);}},[n,e]),e?jsxRuntime.jsx("span",{className:"timeDisplay",style:{opacity:.7},children:jsxRuntime.jsx("span",{ref:p,children:"0:00"})}):jsxRuntime.jsxs("span",{className:"timeDisplay",children:[jsxRuntime.jsx("span",{ref:p,children:"0:00"}),jsxRuntime.jsx("span",{ref:l,style:{opacity:.6},children:" / 0:00"})]})});Ae.displayName="TimeDisplay";var be=Ae;var _={PlayButton:ie,PauseButton:se,FullscreenButton:le,PiPButton:ue,TheaterButton:ce,VolumeControl:fe,ProgressBar:ve,SettingsMenu:he,TimeDisplay:be};var xe=({videoRef:n,playerRef:e,playerContainerRef:p,playbackRates:l,enablePreview:o,thumbnailVtt:f,isPlaying:d,volume:c,isMuted:b,playbackRate:m,isFullscreen:M,isPictureInPicture:x,isTheaterMode:V,isLive:E,qualityLevels:v,currentQualityLevel:R})=>{let H=Et.useRef(null),k=Et.useRef(null),[y,T]=Et.useState(true),N=Et.useRef({isPlaying:d,volume:c,isMuted:b,isLive:E});N.current={isPlaying:d,volume:c,isMuted:b,isLive:E},Et.useEffect(()=>{if(!d){T(true),k.current&&clearTimeout(k.current);return}let h=()=>{T(true),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>T(false),3e3);},g=H.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)),k.current&&clearTimeout(k.current);}},[d]),Et.useEffect(()=>{let h=g=>{if(!p.current?.contains(document.activeElement))return;let U=g.target;if(U.tagName==="INPUT"||U.tagName==="TEXTAREA"||U.isContentEditable)return;let{isPlaying:j,volume:D,isLive:ee}=N.current,Y=n.current?.currentTime??0,r=n.current?.duration??0;switch(g.code){case "Space":case "KeyK":g.preventDefault(),j?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,D+.1));break;case "ArrowDown":g.preventDefault(),e.setVolume(Math.max(0,D-.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,p,n]);let C=Et.useCallback(()=>e.play(),[e]),Q=Et.useCallback(()=>e.pause(),[e]),q=Et.useCallback(h=>e.setVolume(h),[e]),X=Et.useCallback(()=>e.toggleMute(),[e]),t=Et.useCallback(h=>e.setPlaybackRate(h),[e]),u=Et.useCallback(h=>e.setQualityLevel(h),[e]),i=Et.useCallback(()=>e.togglePictureInPicture(),[e]),L=Et.useCallback(()=>e.toggleTheaterMode(),[e]),z=Et.useCallback(()=>e.toggleFullscreen(),[e]),w=Et.useCallback(()=>e.seekToLive(),[e]);return jsxRuntime.jsx("div",{ref:H,style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:y?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:y?"auto":"none"},role:"region","aria-label":"Video player controls",children:[jsxRuntime.jsx(_.ProgressBar,{videoRef:n,playerRef:e,enablePreview:o,thumbnailVtt:f}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:4},children:[d?jsxRuntime.jsx(_.PauseButton,{onClick:Q}):jsxRuntime.jsx(_.PlayButton,{onClick:C}),jsxRuntime.jsx(_.VolumeControl,{volume:c,isMuted:b,onVolumeChange:q,onToggleMute:X}),jsxRuntime.jsx(_.TimeDisplay,{videoRef:n,isLive:E}),jsxRuntime.jsx("div",{style:{flex:1}}),E&&jsxRuntime.jsx(We,{onClick:w}),jsxRuntime.jsx(_.SettingsMenu,{currentRate:m,playbackRates:l,onRateChange:t,qualityLevels:v,currentQualityLevel:R,onQualityChange:u}),jsxRuntime.jsx(_.PiPButton,{onClick:i,isPiP:x}),jsxRuntime.jsx(_.TheaterButton,{onClick:L,isTheater:V}),jsxRuntime.jsx(_.FullscreenButton,{onClick:z,isFullscreen:M})]})]})})},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 Ce=Et.memo(({x:n,y:e,isPlaying:p,src:l,videoRef:o,playerRef:f,onClose:d,contextMenuItems:c})=>{let b=Et.useRef(null),[m,M]=Et.useState(()=>o.current?.loop??false),x=Math.min(n,window.innerWidth-220),V=Math.min(e,window.innerHeight-290);Et.useEffect(()=>{let y=C=>{b.current&&!b.current.contains(C.target)&&d();},T=C=>{C.key==="Escape"&&d();},N=()=>d();return document.addEventListener("mousedown",y),document.addEventListener("keydown",T),window.addEventListener("scroll",N,true),()=>{document.removeEventListener("mousedown",y),document.removeEventListener("keydown",T),window.removeEventListener("scroll",N,true);}},[d]);let E=Et.useCallback(()=>{p?f.pause():f.play(),d();},[p,f,d]),v=Et.useCallback(()=>{let y=o.current;if(!y)return;let T=!m;y.loop=T,M(T);},[o,m]),R=Et.useCallback(async()=>{try{await navigator.clipboard.writeText(l);}catch{}d();},[l,d]),H=Et.useCallback(async()=>{let y=Math.floor(o.current?.currentTime??0);try{await navigator.clipboard.writeText(`${l}?t=${y}`);}catch{}d();},[l,o,d]),k=Et.useCallback(()=>{f.togglePictureInPicture(),d();},[f,d]);return jsxRuntime.jsxs("div",{ref:b,className:"contextMenu",style:{left:x,top:V},children:[jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:E,children:p?"Pause":"Play"}),jsxRuntime.jsxs("button",{className:"contextMenuItem",onClick:v,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:H,children:"Copy video URL at current time"}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:k,children:"Picture-in-Picture"}),c&&c.length>0&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"contextMenuDivider"}),c.map((y,T)=>jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:()=>{y.onClick(),d();},children:y.label},T))]})]})});Ce.displayName="ContextMenu";var Qe=Et.forwardRef(({src:n,poster:e,autoplay:p=false,muted:l=false,loop:o=false,controls:f=true,preload:d="metadata",playbackRates:c=[.25,.5,.75,1,1.25,1.5,1.75,2],className:b,enableHLS:m=true,enablePreview:M=true,thumbnailVtt:x,hlsConfig:V,subtitles:E,crossOrigin:v,onPlay:R,onPause:H,onEnded:k,onError:y,onTimeUpdate:T,onDurationChange:N,onBuffering:C,onTheaterModeChange:Q,contextMenuItems:q},X)=>{let t=Et.useRef(null),u=Et.useRef(null),{state:i,ref:L,fullscreenContainerRef:z}=Be(t,n,{autoplay:p,muted:l,loop:o,playbackRates:c,enableHLS:m,hlsConfig:V,onPlay:R,onPause:H,onEnded:k,onError:y,onTimeUpdate:T,onDurationChange:N,onBuffering:C,onTheaterModeChange:Q}),[w,h]=Et.useState(null);Et.useEffect(()=>{z.current=u.current;},[z]),Et__default.default.useImperativeHandle(X,()=>L,[L]);let g=Et.useCallback(()=>{u.current?.focus(),i.isPlaying?L.pause():L.play();},[i.isPlaying,L]),U=Et.useCallback(()=>{L.toggleFullscreen();},[L]),j=Et.useCallback(D=>{D.preventDefault(),h({x:D.clientX,y:D.clientY});},[]);return jsxRuntime.jsxs("div",{ref:u,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":i.isTheaterMode?"true":void 0,onContextMenu:j,children:[jsxRuntime.jsx("video",{ref:t,poster:e,preload:d,crossOrigin:v,onClick:g,onDoubleClick:U,playsInline:true,style:{width:"100%",height:"100%",display:"block",cursor:"pointer"},"data-test":"video-element",children:E?.map(D=>jsxRuntime.jsx("track",{kind:"subtitles",src:D.src,label:D.label,srcLang:D.srclang,default:D.default},D.id))}),f&&jsxRuntime.jsx(xe,{videoRef:t,playerRef:L,playerContainerRef:u,playbackRates:c,enablePreview:M,thumbnailVtt:x,isPlaying:i.isPlaying,volume:i.volume,isMuted:i.isMuted,playbackRate:i.playbackRate,isFullscreen:i.isFullscreen,isPictureInPicture:i.isPictureInPicture,isTheaterMode:i.isTheaterMode,isLive:i.isLive,qualityLevels:i.qualityLevels,currentQualityLevel:i.currentQualityLevel}),w&&jsxRuntime.jsx(Ce,{x:w.x,y:w.y,isPlaying:i.isPlaying,src:n,videoRef:t,playerRef:L,onClose:()=>h(null),contextMenuItems:q}),i.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"}),i.isBuffering&&!i.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); } }"})]}),i.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:i.error.code==="MEDIA_ERR_SRC_NOT_SUPPORTED"?"Unsupported Format":i.error.code.startsWith("HLS")?"Stream Error":"Playback Error"}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,opacity:.75},children:i.error.message})]})})]})});Qe.displayName="VideoPlayer";var Mt=Qe;exports.ControlElements=_e;exports.Controls=xe;exports.VideoPlayer=Mt;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