@therealtinhtute/baroiplayer 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core-plugins-By-4-kGs.cjs +2 -0
- package/dist/core-plugins-By-4-kGs.cjs.map +1 -0
- package/dist/{core-plugins-CROGvQUy.js → core-plugins-DSBWcTuX.js} +444 -309
- package/dist/core-plugins-DSBWcTuX.js.map +1 -0
- package/dist/core.js +2 -2
- package/dist/core.mjs +19 -19
- package/dist/{enhanced-components-DUw2KrmQ.js → enhanced-components-B_l3cist.js} +2 -2
- package/dist/{enhanced-components-DUw2KrmQ.js.map → enhanced-components-B_l3cist.js.map} +1 -1
- package/dist/{enhanced-components-DXBCHU0v.cjs → enhanced-components-BspFs9OO.cjs} +2 -2
- package/dist/{enhanced-components-DXBCHU0v.cjs.map → enhanced-components-BspFs9OO.cjs.map} +1 -1
- package/dist/hooks-BXwI8QG6.cjs +4 -0
- package/dist/hooks-BXwI8QG6.cjs.map +1 -0
- package/dist/hooks-Bpi-jDiO.js +1816 -0
- package/dist/hooks-Bpi-jDiO.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -20
- package/dist/index.mjs.map +1 -1
- package/dist/{minimal-components-DlRK7Qu_.js → minimal-components-C4z900Ro.js} +297 -298
- package/dist/minimal-components-C4z900Ro.js.map +1 -0
- package/dist/minimal-components-v4qBp6jv.cjs +2 -0
- package/dist/minimal-components-v4qBp6jv.cjs.map +1 -0
- package/package.json +1 -1
- package/src/components/accessibility/keyboard-help-overlay.tsx +2 -0
- package/src/components/enhanced/debug-panel.tsx +1 -1
- package/src/components/enhanced/enhanced-media-player.tsx +68 -25
- package/src/components/legacy.tsx +6 -6
- package/src/components/media-player-video.tsx +5 -12
- package/src/components/media-player.tsx +2 -2
- package/src/components/ui/enhanced-seek-bar.tsx +2 -2
- package/src/components/ui/media-resource-preloader.tsx +21 -23
- package/src/components/unified/base-media-player.tsx +22 -10
- package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +58 -38
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +6 -6
- package/src/core/optimization/bundle-optimizer.tsx +26 -27
- package/src/core/plugins/__tests__/registry.test.ts +1 -1
- package/src/core/plugins/enhanced-plugin-system.ts +26 -8
- package/src/core/plugins/registry.ts +319 -92
- package/src/core/plugins/types.ts +21 -3
- package/src/core/providers/enhanced-hls-provider.ts +11 -40
- package/src/core/providers/lazy-provider.tsx +5 -42
- package/src/features/media-session/media-session-manager.ts +4 -26
- package/src/features/picture-in-picture/pip-manager.ts +2 -2
- package/src/features/playlist/playlist-manager.ts +26 -18
- package/src/features/subtitles/subtitle-manager.ts +1 -1
- package/src/features/subtitles/subtitle-parser.ts +19 -16
- package/src/features/thumbnails/thumbnail-generator.ts +12 -5
- package/src/hooks/__tests__/currentTime-fix.test.ts +149 -0
- package/src/hooks/accessibility/use-accessibility-preferences.ts +1 -1
- package/src/hooks/accessibility/use-focus-management.ts +2 -2
- package/src/hooks/accessibility/use-keyboard-shortcuts.ts +2 -2
- package/src/hooks/accessibility/use-screen-reader.ts +1 -1
- package/src/hooks/core/index.ts +1 -1
- package/src/hooks/use-buffer-health.ts +1 -1
- package/src/hooks/use-enhanced-media-player.ts +107 -9
- package/src/hooks/use-focus-trap.tsx +2 -2
- package/src/hooks/use-intelligent-preloading.ts +23 -3
- package/src/hooks/use-keyboard-shortcuts.ts +2 -2
- package/src/hooks/use-media-player.ts +74 -43
- package/src/hooks/use-memory-optimization.ts +15 -15
- package/src/hooks/use-smart-preload.ts +1 -2
- package/src/hooks/useKeyboardShortcuts.ts +34 -2
- package/src/hooks/useVideoPlayer.ts +50 -4
- package/src/index-legacy.ts +3 -5
- package/src/test/accessibility-utils.ts +7 -7
- package/src/test/media-mocks.ts +41 -28
- package/src/test/setup.ts +22 -4
- package/src/types/index.ts +13 -0
- package/dist/core-plugins-CROGvQUy.js.map +0 -1
- package/dist/core-plugins-DtsHBOtF.cjs +0 -2
- package/dist/core-plugins-DtsHBOtF.cjs.map +0 -1
- package/dist/hooks-BW-JjVgP.cjs +0 -4
- package/dist/hooks-BW-JjVgP.cjs.map +0 -1
- package/dist/hooks-CyX6De5M.js +0 -1693
- package/dist/hooks-CyX6De5M.js.map +0 -1
- package/dist/minimal-components-Bdcpxav5.cjs +0 -2
- package/dist/minimal-components-Bdcpxav5.cjs.map +0 -1
- package/dist/minimal-components-DlRK7Qu_.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhanced-components-DXBCHU0v.cjs","sources":["../src/components/enhanced/media-player-enhanced.tsx","../src/components/enhanced/advanced-features.tsx","../src/components/enhanced/enhanced-controls.tsx","../src/components/enhanced/debug-panel.tsx"],"sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport {\n\tMediaActionTypes,\n\tuseMediaContext,\n\tuseMediaDispatch,\n\tuseMediaSelector\n} from \"../../context/media-context\"\nimport { cn } from \"../../lib/utils\"\n\n// Utility function to compose refs\nfunction composeRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n\treturn (node: T) => {\n\t\trefs.forEach((ref) => {\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(node)\n\t\t\t} else if (ref) {\n\t\t\t\t;(ref as React.MutableRefObject<T>).current = node\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Enhanced media player with better performance and mobile support\nexport interface EnhancedMediaPlayerProps {\n\tchildren: React.ReactNode\n\tclassName?: string\n\tautoHide?: boolean\n\tautoHideDelay?: number\n\tshowControlsOnHover?: boolean\n\tshowControlsOnTouch?: boolean\n\tenableKeyboardControls?: boolean\n\tenableTouchGestures?: boolean\n\tonPlay?: () => void\n\tonPause?: () => void\n\tonTimeUpdate?: (time: number) => void\n\tonVolumeChange?: (volume: number) => void\n\tonFullscreenChange?: (isFullscreen: boolean) => void\n}\n\n// Custom hook for auto-hide controls\nfunction useAutoHideControls(\n\tautoHide: boolean,\n\tdelay: number,\n\tshowOnHover: boolean,\n\tshowOnTouch: boolean\n) {\n\tconst [showControls, setShowControls] = React.useState(true)\n\tconst [isHovering, setIsHovering] = React.useState(false)\n\tconst [isTouching, setIsTouching] = React.useState(false)\n\tconst timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n\n\tconst resetTimeout = React.useCallback(() => {\n\t\tif (timeoutRef.current) {\n\t\t\tclearTimeout(timeoutRef.current)\n\t\t}\n\t\tif (autoHide) {\n\t\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\t\tif (!isHovering && !isTouching) {\n\t\t\t\t\tsetShowControls(false)\n\t\t\t\t}\n\t\t\t}, delay)\n\t\t}\n\t}, [autoHide, delay, isHovering, isTouching])\n\n\tconst showControlsTemporarily = React.useCallback(() => {\n\t\tsetShowControls(true)\n\t\tresetTimeout()\n\t}, [resetTimeout])\n\n\tReact.useEffect(() => {\n\t\tif (autoHide) {\n\t\t\tresetTimeout()\n\t\t} else {\n\t\t\tsetShowControls(true)\n\t\t}\n\t\treturn () => {\n\t\t\tif (timeoutRef.current) {\n\t\t\t\tclearTimeout(timeoutRef.current)\n\t\t\t}\n\t\t}\n\t}, [autoHide, resetTimeout])\n\n\tconst handleMouseEnter = React.useCallback(() => {\n\t\tif (showOnHover) {\n\t\t\tsetIsHovering(true)\n\t\t\tsetShowControls(true)\n\t\t}\n\t}, [showOnHover])\n\n\tconst handleMouseLeave = React.useCallback(() => {\n\t\tif (showOnHover) {\n\t\t\tsetIsHovering(false)\n\t\t\tresetTimeout()\n\t\t}\n\t}, [showOnHover, resetTimeout])\n\n\tconst handleTouchStart = React.useCallback(() => {\n\t\tif (showOnTouch) {\n\t\t\tsetIsTouching(true)\n\t\t\tshowControlsTemporarily()\n\t\t}\n\t}, [showOnTouch, showControlsTemporarily])\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\tif (showOnTouch) {\n\t\t\tsetIsTouching(false)\n\t\t\tresetTimeout()\n\t\t}\n\t}, [showOnTouch, resetTimeout])\n\n\treturn {\n\t\tshowControls,\n\t\tshowControlsTemporarily,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave,\n\t\thandleTouchStart,\n\t\thandleTouchEnd\n\t}\n}\n\n// Custom hook for touch gestures\nfunction useTouchGestures(enabled: boolean) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPlaying = useMediaSelector((state) => state.isPlaying)\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\tconst volume = useMediaSelector((state) => state.volume)\n\n\tconst [touchStart, setTouchStart] = React.useState<{ x: number; y: number; time: number } | null>(\n\t\tnull\n\t)\n\tconst [isDoubleTap, setIsDoubleTap] = React.useState(false)\n\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!enabled) return\n\n\t\t\tconst touch = e.touches[0]\n\t\t\tif (!touch) return\n\n\t\t\tconst now = Date.now()\n\n\t\t\tif (touchStart && now - touchStart.time < 300) {\n\t\t\t\tsetIsDoubleTap(true)\n\t\t\t\t// Double tap to play/pause\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tsetTouchStart({\n\t\t\t\t\tx: touch.clientX,\n\t\t\t\t\ty: touch.clientY,\n\t\t\t\t\ttime: now\n\t\t\t\t})\n\t\t\t\tsetIsDoubleTap(false)\n\t\t\t}\n\t\t},\n\t\t[enabled, touchStart, isPlaying, dispatch]\n\t)\n\n\tconst handleTouchMove = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!enabled || !touchStart || isDoubleTap) return\n\n\t\t\tconst touch = e.touches[0]\n\t\t\tif (!touch) return\n\n\t\t\tconst deltaX = touch.clientX - touchStart.x\n\t\t\tconst deltaY = touch.clientY - touchStart.y\n\n\t\t\t// Horizontal swipe for seeking\n\t\t\tif (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 50) {\n\t\t\t\tconst seekAmount = (deltaX / window.innerWidth) * 30 // 30 seconds max\n\t\t\t\tconst newTime = Math.max(0, Math.min(duration, currentTime + seekAmount))\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\tdetail: newTime\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Vertical swipe for volume (right side of screen)\n\t\t\tif (\n\t\t\t\tMath.abs(deltaY) > Math.abs(deltaX) &&\n\t\t\t\tMath.abs(deltaY) > 50 &&\n\t\t\t\ttouchStart.x > window.innerWidth / 2\n\t\t\t) {\n\t\t\t\tconst volumeChange = -(deltaY / window.innerHeight) * 1 // Full range\n\t\t\t\tconst newVolume = Math.max(0, Math.min(1, volume + volumeChange))\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\tdetail: newVolume\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[enabled, touchStart, isDoubleTap, duration, currentTime, volume, dispatch]\n\t)\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\tif (!enabled) return\n\t\t// Reset touch state after a delay to allow for double tap detection\n\t\tsetTimeout(() => {\n\t\t\tsetTouchStart(null)\n\t\t\tsetIsDoubleTap(false)\n\t\t}, 300)\n\t}, [enabled])\n\n\treturn {\n\t\thandleTouchStart,\n\t\thandleTouchMove,\n\t\thandleTouchEnd\n\t}\n}\n\nexport const EnhancedMediaPlayer = function EnhancedMediaPlayer({\n\tchildren,\n\tclassName,\n\tautoHide = true,\n\tautoHideDelay = 3000,\n\tshowControlsOnHover = true,\n\tshowControlsOnTouch = true,\n\tenableKeyboardControls = true,\n\tenableTouchGestures = true,\n\tonPlay,\n\tonPause,\n\tonTimeUpdate,\n\tonVolumeChange,\n\tonFullscreenChange\n}: EnhancedMediaPlayerProps) {\n\tconst context = useMediaContext()\n\tconst dispatch = useMediaDispatch()\n\n\t// State selectors with memoization\n\tconst isPlaying = useMediaSelector(React.useCallback((state) => state.isPlaying, []))\n\tconst isFullscreen = useMediaSelector(React.useCallback((state) => state.isFullscreen, []))\n\tconst currentTime = useMediaSelector(React.useCallback((state) => state.currentTime, []))\n\tconst volume = useMediaSelector(React.useCallback((state) => state.volume, []))\n\tconst error = useMediaSelector(React.useCallback((state) => state.error, []))\n\n\t// Custom hooks\n\tconst {\n\t\tshowControls,\n\t\tshowControlsTemporarily,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave,\n\t\thandleTouchStart: handleControlsTouch,\n\t\thandleTouchEnd: handleControlsTouchEnd\n\t} = useAutoHideControls(autoHide, autoHideDelay, showControlsOnHover, showControlsOnTouch)\n\n\tconst {\n\t\thandleTouchStart: handleGestureStart,\n\t\thandleTouchMove: handleGestureMove,\n\t\thandleTouchEnd: handleGestureEnd\n\t} = useTouchGestures(enableTouchGestures)\n\n\t// Combine touch handlers\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\thandleControlsTouch()\n\t\t\thandleGestureStart(e)\n\t\t},\n\t\t[handleControlsTouch, handleGestureStart]\n\t)\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\thandleControlsTouchEnd()\n\t\thandleGestureEnd()\n\t}, [handleControlsTouchEnd, handleGestureEnd])\n\n\t// Event handlers with memoization\n\tconst handleClick = React.useCallback(() => {\n\t\tshowControlsTemporarily()\n\t}, [showControlsTemporarily])\n\n\t// Keyboard controls\n\tReact.useEffect(() => {\n\t\tif (!enableKeyboardControls) return\n\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Space\":\n\t\t\t\tcase \"KeyK\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"KeyF\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: isFullscreen\n\t\t\t\t\t\t\t? MediaActionTypes.EXIT_FULLSCREEN\n\t\t\t\t\t\t\t: MediaActionTypes.ENTER_FULLSCREEN\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"KeyM\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({ type: MediaActionTypes.TOGGLE_MUTE })\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: Math.max(0, currentTime - 10)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: currentTime + 10\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\t\tdetail: Math.min(1, volume + 0.1)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\t\tdetail: Math.max(0, volume - 0.1)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown)\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown)\n\t}, [enableKeyboardControls, dispatch, isPlaying, isFullscreen, currentTime, volume])\n\n\t// Event callbacks\n\tReact.useEffect(() => {\n\t\tif (isPlaying) onPlay?.()\n\t\telse onPause?.()\n\t}, [isPlaying, onPlay, onPause])\n\n\tReact.useEffect(() => {\n\t\tonTimeUpdate?.(currentTime)\n\t}, [currentTime, onTimeUpdate])\n\n\tReact.useEffect(() => {\n\t\tonVolumeChange?.(volume)\n\t}, [volume, onVolumeChange])\n\n\tReact.useEffect(() => {\n\t\tonFullscreenChange?.(isFullscreen)\n\t}, [isFullscreen, onFullscreenChange])\n\n\treturn (\n\t\t<div\n\t\t\tref={composeRefs(context.rootRef)}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative isolate flex flex-col overflow-hidden rounded-lg bg-black outline-none\",\n\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n\t\t\t\t\"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\t\t\t\tisFullscreen && \"fixed inset-0 z-50 rounded-none\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-state={isFullscreen ? \"fullscreen\" : \"inline\"}\n\t\t\tdata-disabled={error ? \"\" : undefined}\n\t\t\tdata-controls-visible={showControls ? \"\" : undefined}\n\t\t\ttabIndex={0}\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\tonTouchStart={handleTouchStart}\n\t\t\tonTouchMove={handleGestureMove}\n\t\t\tonTouchEnd={handleTouchEnd}\n\t\t\tonClick={handleClick}>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nEnhancedMediaPlayer.displayName = \"EnhancedMediaPlayer\"\n","\"use client\"\n\nimport React from \"react\"\nimport { MediaActionTypes, useMediaDispatch, useMediaSelector } from \"../../context/media-context\"\nimport { formatTime } from \"../../lib/format-time\"\nimport { cn } from \"../../lib/utils\"\n\n// Types for advanced features\nexport interface Chapter {\n\tid: string\n\ttitle: string\n\tstartTime: number\n\tendTime: number\n\tthumbnail?: string\n}\n\nexport interface QualityLevel {\n\tid: string\n\tlabel: string\n\twidth: number\n\theight: number\n\tbitrate?: number\n}\n\nexport interface Subtitle {\n\tid: string\n\tlabel: string\n\tlanguage: string\n\tsrc: string\n\tdefault?: boolean\n}\n\n// Quality selector component\nexport const QualitySelector = function QualitySelector({\n\tqualities,\n\tcurrentQuality,\n\tonQualityChange,\n\tclassName\n}: {\n\tqualities: QualityLevel[]\n\tcurrentQuality: string\n\tonQualityChange: (qualityId: string) => void\n\tclassName?: string\n}) {\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst currentQualityLabel = React.useMemo(() => {\n\t\treturn qualities.find((q) => q.id === currentQuality)?.label || \"Auto\"\n\t}, [qualities, currentQuality])\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select quality\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{currentQualityLabel}</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t{qualities.map((quality) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={quality.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonQualityChange(quality.id)\n\t\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tquality.id === currentQuality && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{quality.label}\n\t\t\t\t\t\t\t{quality.bitrate && (\n\t\t\t\t\t\t\t\t<span className=\"ml-2 text-white/60 text-xs\">\n\t\t\t\t\t\t\t\t\t({Math.round(quality.bitrate / 1000)}k)\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Subtitle selector component\nexport const SubtitleSelector = function SubtitleSelector({\n\tsubtitles,\n\tcurrentSubtitle,\n\tonSubtitleChange,\n\tclassName\n}: {\n\tsubtitles: Subtitle[]\n\tcurrentSubtitle: string | null\n\tonSubtitleChange: (subtitleId: string | null) => void\n\tclassName?: string\n}) {\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst currentSubtitleLabel = React.useMemo(() => {\n\t\tif (!currentSubtitle) return \"Off\"\n\t\treturn subtitles.find((s) => s.id === currentSubtitle)?.label || \"Off\"\n\t}, [subtitles, currentSubtitle])\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select subtitles\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{currentSubtitleLabel}</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tonSubtitleChange(null)\n\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t!currentSubtitle && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\tOff\n\t\t\t\t\t</button>\n\t\t\t\t\t{subtitles.map((subtitle) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={subtitle.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonSubtitleChange(subtitle.id)\n\t\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tsubtitle.id === currentSubtitle && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{subtitle.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Playback speed selector\nexport const PlaybackSpeedSelector = function PlaybackSpeedSelector({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst playbackRate = useMediaSelector((state) => state.playbackRate)\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst speeds = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n\n\tconst handleSpeedChange = React.useCallback(\n\t\t(speed: number) => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_PLAYBACK_RATE, detail: speed })\n\t\t\tsetIsOpen(false)\n\t\t},\n\t\t[dispatch]\n\t)\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select playback speed\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M13,8A4,4 0 0,0 9,12A4,4 0 0,0 13,16A4,4 0 0,0 17,12A4,4 0 0,0 13,8M13,14A2,2 0 0,1 11,12A2,2 0 0,1 13,10A2,2 0 0,1 15,12A2,2 0 0,1 13,14M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4Z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{playbackRate}x</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-20 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t{speeds.map((speed) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={speed}\n\t\t\t\t\t\t\tonClick={() => handleSpeedChange(speed)}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tspeed === playbackRate && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{speed}x\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Chapters component\nexport const ChaptersPanel = function ChaptersPanel({\n\tchapters,\n\tonChapterSelect,\n\tclassName\n}: {\n\tchapters: Chapter[]\n\tonChapterSelect: (chapter: Chapter) => void\n\tclassName?: string\n}) {\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\n\tconst currentChapter = React.useMemo(() => {\n\t\treturn chapters.find(\n\t\t\t(chapter) => currentTime >= chapter.startTime && currentTime < chapter.endTime\n\t\t)\n\t}, [chapters, currentTime])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-lg border border-white/20 bg-black/90 p-4 backdrop-blur-sm\",\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<h3 className=\"mb-3 font-semibold text-white\">Chapters</h3>\n\t\t\t<div className=\"max-h-64 space-y-2 overflow-y-auto\">\n\t\t\t\t{chapters.map((chapter) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={chapter.id}\n\t\t\t\t\t\tonClick={() => onChapterSelect(chapter)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-full items-center gap-3 rounded-lg p-3 text-left transition-colors\",\n\t\t\t\t\t\t\t\"hover:bg-white/10\",\n\t\t\t\t\t\t\tchapter.id === currentChapter?.id && \"border border-primary/30 bg-primary/20\"\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\t{chapter.thumbnail && (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={chapter.thumbnail}\n\t\t\t\t\t\t\t\talt={chapter.title}\n\t\t\t\t\t\t\t\tclassName=\"h-9 w-16 rounded object-cover\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<div className=\"truncate font-medium text-white\">{chapter.title}</div>\n\t\t\t\t\t\t\t<div className=\"text-sm text-white/60\">\n\t\t\t\t\t\t\t\t{formatTime(chapter.startTime)} - {formatTime(chapter.endTime)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Picture-in-Picture button\nexport const PictureInPictureButton = function PictureInPictureButton({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPictureInPicture = useMediaSelector((state) => state.isPictureInPicture)\n\n\tconst handleTogglePiP = React.useCallback(() => {\n\t\tdispatch({\n\t\t\ttype: isPictureInPicture ? MediaActionTypes.EXIT_PIP : MediaActionTypes.ENTER_PIP\n\t\t})\n\t}, [dispatch, isPictureInPicture])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleTogglePiP}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex h-10 w-10 items-center justify-center rounded-full text-white\",\n\t\t\t\t\"transition-colors hover:bg-white/10\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={isPictureInPicture ? \"Exit Picture-in-Picture\" : \"Enter Picture-in-Picture\"}>\n\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t<path d=\"M19 7h-8v6h8V7zm2-4H3c-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\" />\n\t\t\t</svg>\n\t\t</button>\n\t)\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { MediaActionTypes, useMediaDispatch, useMediaSelector } from \"../../context/media-context\"\nimport { formatTime } from \"../../lib/format-time\"\nimport { cn } from \"../../lib/utils\"\n\n// Enhanced play button with better animations\nexport const EnhancedPlayButton = function EnhancedPlayButton({\n\tclassName,\n\tsize = \"md\"\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPlaying = useMediaSelector((state) => state.isPlaying)\n\tconst isLoading = useMediaSelector((state) => state.isLoading)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\",\n\t\txl: \"h-16 w-16\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\",\n\t\txl: \"h-8 w-8\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tdispatch({\n\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t})\n\t}, [dispatch, isPlaying])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tdisabled={isLoading}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={isPlaying ? \"Pause\" : \"Play\"}>\n\t\t\t{isLoading ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"animate-spin rounded-full border-2 border-white/30 border-t-white\",\n\t\t\t\t\t\ticonSizes[size]\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className={cn(\"transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t\t{isPlaying ? (\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t\t\t<path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"ml-0.5 h-full w-full\">\n\t\t\t\t\t\t\t<path d=\"M8 5v14l11-7z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</button>\n\t)\n}\n\n// Enhanced seek bar with preview and better touch support\nexport const EnhancedSeekBar = function EnhancedSeekBar({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\tconst buffered = useMediaSelector((state) => state.buffered)\n\tconst previewTime = useMediaSelector((state) => state.previewTime)\n\n\tconst [isDragging, setIsDragging] = React.useState(false)\n\tconst [hoverTime, setHoverTime] = React.useState<number | null>(null)\n\tconst progressRef = React.useRef<HTMLDivElement>(null)\n\n\tconst progress = duration > 0 ? (currentTime / duration) * 100 : 0\n\tconst previewProgress =\n\t\tduration > 0 && previewTime !== null ? (previewTime / duration) * 100 : null\n\n\t// Calculate buffered ranges\n\tconst bufferedRanges = React.useMemo(() => {\n\t\tif (!buffered || duration === 0) return []\n\t\tconst ranges = []\n\t\tfor (let i = 0; i < buffered.length; i++) {\n\t\t\tranges.push({\n\t\t\t\tstart: (buffered.start(i) / duration) * 100,\n\t\t\t\tend: (buffered.end(i) / duration) * 100\n\t\t\t})\n\t\t}\n\t\treturn ranges\n\t}, [buffered, duration])\n\n\tconst getTimeFromPosition = React.useCallback(\n\t\t(clientX: number) => {\n\t\t\tif (!progressRef.current) return 0\n\t\t\tconst rect = progressRef.current.getBoundingClientRect()\n\t\t\tconst position = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n\t\t\treturn position * duration\n\t\t},\n\t\t[duration]\n\t)\n\n\tconst handleMouseMove = React.useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\t\tsetHoverTime(time)\n\t\t\t\tdispatch({ type: MediaActionTypes.PREVIEW_TIME, detail: time })\n\t\t\t}\n\t\t},\n\t\t[isDragging, getTimeFromPosition, dispatch]\n\t)\n\n\tconst handleMouseLeave = React.useCallback(() => {\n\t\tif (!isDragging) {\n\t\t\tsetHoverTime(null)\n\t\t\tdispatch({ type: MediaActionTypes.CLEAR_PREVIEW })\n\t\t}\n\t}, [isDragging, dispatch])\n\n\tconst handleMouseDown = React.useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tsetIsDragging(true)\n\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t},\n\t\t[getTimeFromPosition, dispatch]\n\t)\n\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tsetIsDragging(true)\n\t\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t},\n\t\t[getTimeFromPosition, dispatch]\n\t)\n\n\tReact.useEffect(() => {\n\t\tconst handleMouseMove = (e: MouseEvent) => {\n\t\t\tif (isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t\t}\n\t\t}\n\n\t\tconst handleMouseUp = () => {\n\t\t\tsetIsDragging(false)\n\t\t\tsetHoverTime(null)\n\t\t\tdispatch({ type: MediaActionTypes.CLEAR_PREVIEW })\n\t\t}\n\n\t\tconst handleTouchMove = (e: TouchEvent) => {\n\t\t\tif (isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t\t}\n\t\t}\n\n\t\tif (isDragging) {\n\t\t\tdocument.addEventListener(\"mousemove\", handleMouseMove)\n\t\t\tdocument.addEventListener(\"mouseup\", handleMouseUp)\n\t\t\tdocument.addEventListener(\"touchmove\", handleTouchMove)\n\t\t\tdocument.addEventListener(\"touchend\", handleMouseUp)\n\t\t}\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousemove\", handleMouseMove)\n\t\t\tdocument.removeEventListener(\"mouseup\", handleMouseUp)\n\t\t\tdocument.removeEventListener(\"touchmove\", handleTouchMove)\n\t\t\tdocument.removeEventListener(\"touchend\", handleMouseUp)\n\t\t}\n\t}, [isDragging, getTimeFromPosition, dispatch])\n\n\treturn (\n\t\t<div className={cn(\"group relative flex items-center\", className)}>\n\t\t\t{/* Time preview tooltip */}\n\t\t\t{(hoverTime !== null || previewTime !== null) && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"pointer-events-none absolute bottom-full mb-2 rounded bg-black/80 px-2 py-1 text-white text-xs\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tleft: `${previewProgress || ((hoverTime || 0) / duration) * 100}%`,\n\t\t\t\t\t\ttransform: \"translateX(-50%)\"\n\t\t\t\t\t}}>\n\t\t\t\t\t{formatTime(hoverTime || previewTime || 0)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tref={progressRef}\n\t\t\t\tclassName=\"relative h-2 w-full cursor-pointer rounded-full bg-white/20 transition-all duration-200 group-hover:h-3\"\n\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\tonTouchStart={handleTouchStart}>\n\t\t\t\t{/* Buffered ranges */}\n\t\t\t\t{bufferedRanges.map((range, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName=\"absolute top-0 h-full rounded-full bg-white/30\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tleft: `${range.start}%`,\n\t\t\t\t\t\t\twidth: `${range.end - range.start}%`\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\n\t\t\t\t{/* Progress bar */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute top-0 h-full rounded-full bg-primary transition-all duration-100\"\n\t\t\t\t\tstyle={{ width: `${progress}%` }}\n\t\t\t\t/>\n\n\t\t\t\t{/* Preview indicator */}\n\t\t\t\t{previewProgress !== null && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute top-0 h-full w-1 rounded-full bg-white/80\"\n\t\t\t\t\t\tstyle={{ left: `${previewProgress}%` }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* Thumb */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 h-4 w-4 rounded-full border-2 border-white bg-primary opacity-0 shadow-lg transition-all duration-200 group-hover:opacity-100\"\n\t\t\t\t\tstyle={{ left: `${progress}%`, transform: \"translateX(-50%) translateY(-50%)\" }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Enhanced volume control with better UX\nexport const EnhancedVolumeControl = function EnhancedVolumeControl({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst volume = useMediaSelector((state) => state.volume)\n\tconst isMuted = useMediaSelector((state) => state.isMuted)\n\n\tconst [showSlider, setShowSlider] = React.useState(false)\n\n\tconst handleToggleMute = React.useCallback(() => {\n\t\tdispatch({ type: MediaActionTypes.TOGGLE_MUTE })\n\t}, [dispatch])\n\n\tconst handleVolumeChange = React.useCallback(\n\t\t(newVolume: number) => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_VOLUME, detail: newVolume })\n\t\t},\n\t\t[dispatch]\n\t)\n\n\tconst VolumeIcon = React.useMemo(() => {\n\t\tif (isMuted || volume === 0) {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<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.51C20.63 14.91 21 13.5 21 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\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t} else if (volume < 0.5) {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<path d=\"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t} else {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<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\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t}\n\t}, [isMuted, volume])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"relative flex items-center\", className)}\n\t\t\tonMouseEnter={() => setShowSlider(true)}\n\t\t\tonMouseLeave={() => setShowSlider(false)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={handleToggleMute}\n\t\t\t\tclassName=\"flex h-10 w-10 items-center justify-center rounded-full text-white transition-colors hover:bg-white/10\"\n\t\t\t\taria-label={isMuted ? \"Unmute\" : \"Mute\"}>\n\t\t\t\t{VolumeIcon}\n\t\t\t</button>\n\n\t\t\t{/* Volume slider */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute left-full ml-2 flex items-center transition-all duration-200\",\n\t\t\t\t\tshowSlider ? \"translate-x-0 opacity-100\" : \"-translate-x-2 pointer-events-none opacity-0\"\n\t\t\t\t)}>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"range\"\n\t\t\t\t\tmin=\"0\"\n\t\t\t\t\tmax=\"1\"\n\t\t\t\t\tstep=\"0.01\"\n\t\t\t\t\tvalue={isMuted ? 0 : volume}\n\t\t\t\t\tonChange={(e) => handleVolumeChange(parseFloat(e.target.value))}\n\t\t\t\t\tclassName=\"slider h-1 w-20 cursor-pointer appearance-none rounded-lg bg-white/20\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Enhanced backward skip button\nexport const EnhancedBackwardButton = function EnhancedBackwardButton({\n\tclassName,\n\tsize = \"md\",\n\tskipTime = 10\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tconst newTime = Math.max(0, currentTime - skipTime)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: newTime })\n\t}, [dispatch, currentTime, skipTime])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={`Backward ${skipTime} seconds`}\n\t\t\ttitle={`Backward ${skipTime}s`}>\n\t\t\t<div className={cn(\"flex items-center transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t<path d=\"M7 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM15.5 7.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v9c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-9z\" />\n\t\t\t\t\t<path d=\"M5.5 12l7-4.5v9l-7-4.5z\" opacity=\"0.8\" />\n\t\t\t\t</svg>\n\t\t\t\t{skipTime && <span className=\"-bottom-1 absolute font-bold text-[10px]\">{skipTime}</span>}\n\t\t\t</div>\n\t\t</button>\n\t)\n}\n\n// Enhanced forward skip button\nexport const EnhancedForwardButton = function EnhancedForwardButton({\n\tclassName,\n\tsize = \"md\",\n\tskipTime = 10\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tconst newTime = Math.min(duration, currentTime + skipTime)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: newTime })\n\t}, [dispatch, currentTime, duration, skipTime])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={`Forward ${skipTime} seconds`}\n\t\t\ttitle={`Forward ${skipTime}s`}>\n\t\t\t<div className={cn(\"flex items-center transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t<path d=\"M17 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM8.5 7.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v9c0 .83-.67 1.5-1.5 1.5s-1.5-.67-1.5-1.5v-9z\" />\n\t\t\t\t\t<path d=\"M18.5 12l-7-4.5v9l7-4.5z\" opacity=\"0.8\" />\n\t\t\t\t</svg>\n\t\t\t\t{skipTime && <span className=\"-bottom-1 absolute font-bold text-[10px]\">{skipTime}</span>}\n\t\t\t</div>\n\t\t</button>\n\t)\n}\n\n// Enhanced time display\nexport const EnhancedTimeDisplay = function EnhancedTimeDisplay({\n\tvariant = \"current\",\n\tclassName\n}: {\n\tvariant?: \"current\" | \"duration\" | \"remaining\"\n\tclassName?: string\n}) {\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\n\tconst displayTime = React.useMemo(() => {\n\t\tswitch (variant) {\n\t\t\tcase \"current\":\n\t\t\t\treturn formatTime(currentTime)\n\t\t\tcase \"duration\":\n\t\t\t\treturn formatTime(duration)\n\t\t\tcase \"remaining\":\n\t\t\t\treturn `-${formatTime(duration - currentTime)}`\n\t\t\tdefault:\n\t\t\t\treturn formatTime(currentTime)\n\t\t}\n\t}, [variant, currentTime, duration])\n\n\treturn (\n\t\t<div className={cn(\"font-mono text-sm text-white tabular-nums\", className)}>{displayTime}</div>\n\t)\n}\n\n// Performance indicator component\nexport const PerformanceIndicator = function PerformanceIndicator({\n\tmetrics,\n\tclassName\n}: {\n\tmetrics?: {\n\t\tfps?: number\n\t\tbufferHealth?: number\n\t\tquality?: number\n\t\tbandwidth?: number\n\t}\n\tclassName?: string\n}) {\n\tif (!metrics || process.env.NODE_ENV !== \"development\") {\n\t\treturn null\n\t}\n\n\tconst getPerformanceColor = (fps: number) => {\n\t\tif (fps >= 50) return \"text-green-400\"\n\t\tif (fps >= 30) return \"text-yellow-400\"\n\t\treturn \"text-red-400\"\n\t}\n\n\tconst getBufferColor = (health: number) => {\n\t\tif (health >= 5) return \"text-green-400\"\n\t\tif (health >= 2) return \"text-yellow-400\"\n\t\treturn \"text-red-400\"\n\t}\n\n\treturn (\n\t\t<div className={cn(\"flex items-center gap-3 font-mono text-xs\", className)}>\n\t\t\t{metrics.fps !== undefined && (\n\t\t\t\t<div className={cn(\"flex items-center gap-1\", getPerformanceColor(metrics.fps))}>\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.fps} FPS</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{metrics.bufferHealth !== undefined && (\n\t\t\t\t<div className={cn(\"flex items-center gap-1\", getBufferColor(metrics.bufferHealth))}>\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.bufferHealth.toFixed(1)}s</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{metrics.quality !== undefined && (\n\t\t\t\t<div className=\"flex items-center gap-1 text-blue-400\">\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.quality}p</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Enhanced control bar that combines all controls\nexport const EnhancedControlBar = function EnhancedControlBar({\n\tclassName,\n\tshowSkipButtons = true,\n\tshowVolumeControl = true,\n\tshowTimeDisplay = true,\n\tplayButtonSize = \"xl\",\n\tskipButtonSize = \"md\",\n\tskipTime = 10,\n\tshowPerformanceIndicators = process.env.NODE_ENV === \"development\",\n\tperformanceMetrics\n}: {\n\tclassName?: string\n\tshowSkipButtons?: boolean\n\tshowVolumeControl?: boolean\n\tshowTimeDisplay?: boolean\n\tplayButtonSize?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n\tskipButtonSize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n\tshowPerformanceIndicators?: boolean\n\tperformanceMetrics?: {\n\t\tfps?: number\n\t\tbufferHealth?: number\n\t\tquality?: number\n\t\tbandwidth?: number\n\t}\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-4 bg-gradient-to-t from-black/80 to-transparent p-4\",\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t{/* Seek Bar */}\n\t\t\t<EnhancedSeekBar className=\"w-full\" />\n\n\t\t\t{/* Control Buttons */}\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t{/* Left side - Media controls */}\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedBackwardButton\n\t\t\t\t\t\t\tsize={skipButtonSize}\n\t\t\t\t\t\t\tskipTime={skipTime}\n\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<EnhancedPlayButton size={playButtonSize} className=\"shrink-0\" />\n\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedForwardButton size={skipButtonSize} skipTime={skipTime} className=\"shrink-0\" />\n\t\t\t\t\t)}\n\n\t\t\t\t\t{showVolumeControl && <EnhancedVolumeControl className=\"shrink-0\" />}\n\n\t\t\t\t\t{showTimeDisplay && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1 font-mono text-sm\">\n\t\t\t\t\t\t\t<EnhancedTimeDisplay variant=\"current\" />\n\t\t\t\t\t\t\t<span className=\"text-white/60\">/</span>\n\t\t\t\t\t\t\t<EnhancedTimeDisplay variant=\"duration\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Right side - Performance indicators and additional controls */}\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{showPerformanceIndicators && (\n\t\t\t\t\t\t<PerformanceIndicator metrics={performanceMetrics} className=\"text-white/80\" />\n\t\t\t\t\t)}\n\t\t\t\t\t{/* Future: Settings, Fullscreen, etc. */}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","/**\n * Debug Panel Component for Performance Monitoring\n * Development-only component for displaying performance metrics\n */\n\nimport React, { useMemo } from \"react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface PerformanceMetrics {\n\tfps: number\n\tmemoryUsage: number\n\tbufferHealth: number\n\tnetworkBandwidth: number\n\tdroppedFrames: number\n\tdecodedFrames: number\n\tpresentationTime: number\n}\n\ninterface PreloadingStats {\n\tpreloadedItems: number\n\tengagementScore: number\n\tqueueLength: number\n\thitRate: number\n\ttotalSaved: number\n}\n\ninterface DebugPanelProps {\n\t/** Performance metrics to display */\n\tperformanceMetrics?: Partial<PerformanceMetrics>\n\t/** Preloading statistics */\n\tpreloadingStats?: PreloadingStats\n\t/** Current playback state */\n\tplaybackState?: {\n\t\tcurrentTime: number\n\t\tduration: number\n\t\tvolume: number\n\t\tisPlaying: boolean\n\t\tquality: number\n\t\tisBuffering: boolean\n\t\terror?: string\n\t}\n\t/** HLS-specific metrics */\n\thlsMetrics?: {\n\t\tcurrentLevel: number\n\t\tavailableLevels: number\n\t\tbandwidthEstimate: number\n\t\tdroppedFrames: number\n\t}\n\t/** Plugin information */\n\tpluginInfo?: {\n\t\tloadedPlugins: string[]\n\t\tactivePlugins: string[]\n\t\tpluginCount: number\n\t}\n\t/** Additional debug information */\n\tdebugInfo?: Record<string, any>\n\t/** Custom className */\n\tclassName?: string\n\t/** Panel position */\n\tposition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\"\n\t/** Whether the panel is collapsed by default */\n\tdefaultCollapsed?: boolean\n\t/** Custom title */\n\ttitle?: string\n}\n\n/**\n * Debug Panel Component\n */\nexport const DebugPanel: React.FC<DebugPanelProps> = ({\n\tperformanceMetrics = {},\n\tpreloadingStats = {} as PreloadingStats,\n\tplaybackState = {} as any,\n\thlsMetrics = {},\n\tpluginInfo = {},\n\tdebugInfo = {},\n\tclassName,\n\tposition = \"top-right\",\n\tdefaultCollapsed = false,\n\ttitle = \"BaroiPlayer Debug Panel\"\n}) => {\n\tconst [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed)\n\tconst [activeTab, setActiveTab] = React.useState<\"performance\" | \"hls\" | \"plugins\" | \"debug\">(\n\t\t\"performance\"\n\t)\n\n\t// Position classes\n\tconst positionClasses = useMemo(() => {\n\t\tswitch (position) {\n\t\t\tcase \"top-left\":\n\t\t\t\treturn \"top-4 left-4\"\n\t\t\tcase \"top-right\":\n\t\t\t\treturn \"top-4 right-4\"\n\t\t\tcase \"bottom-left\":\n\t\t\t\treturn \"bottom-4 left-4\"\n\t\t\tcase \"bottom-right\":\n\t\t\t\treturn \"bottom-4 right-4\"\n\t\t\tdefault:\n\t\t\t\treturn \"top-4 right-4\"\n\t\t}\n\t}, [position])\n\n\t// Format bytes\n\tconst formatBytes = (bytes: number): string => {\n\t\tif (bytes === 0) return \"0 B\"\n\t\tconst k = 1024\n\t\tconst sizes = [\"B\", \"KB\", \"MB\", \"GB\"]\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\n\t\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i]\n\t}\n\n\t// Format time\n\tconst formatTime = (seconds: number): string => {\n\t\tconst mins = Math.floor(seconds / 60)\n\t\tconst secs = Math.floor(seconds % 60)\n\t\treturn `${mins}:${secs.toString().padStart(2, \"0\")}`\n\t}\n\n\t// Render performance metrics\n\tconst renderPerformanceMetrics = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">FPS:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.fps || 0}</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Memory:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)} MB\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Buffer:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{(performanceMetrics.bufferHealth || 0).toFixed(2)}s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Bandwidth:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{formatBytes(performanceMetrics.networkBandwidth || 0)}/s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Dropped:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.droppedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-cyan-400\">Decoded:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.decodedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render playback state\n\tconst renderPlaybackState = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Status:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{playbackState.isPlaying ? (\n\t\t\t\t\t\t\t<span className=\"text-green-300\">Playing</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"text-red-300\">Paused</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Time:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{formatTime(playbackState.currentTime || 0)} / {formatTime(playbackState.duration || 0)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Volume:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{Math.round((playbackState.volume || 0) * 100)}%</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Quality:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{playbackState.quality || 0}p</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Buffering:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{playbackState.isBuffering ? (\n\t\t\t\t\t\t\t<span className=\"text-yellow-300\">Yes</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"text-green-300\">No</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t{playbackState.error && (\n\t\t\t\t\t<div className=\"col-span-2\">\n\t\t\t\t\t\t<span className=\"text-red-400\">Error:</span>\n\t\t\t\t\t\t<span className=\"ml-2 break-all font-mono text-red-300 text-xs\">\n\t\t\t\t\t\t\t{playbackState.error}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render preloading stats\n\tconst renderPreloadingStats = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Preloaded:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{preloadingStats.preloadedItems || 0} items</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Engagement:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{(preloadingStats.engagementScore || 0).toFixed(1)}%\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Queue:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{preloadingStats.queueLength || 0} items</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Hit Rate:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{(preloadingStats.hitRate || 0).toFixed(1)}%</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"col-span-2\">\n\t\t\t\t\t<span className=\"text-cyan-400\">Saved:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{formatBytes(preloadingStats.totalSaved || 0)}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render HLS metrics\n\tconst renderHLSMetrics = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Level:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{hlsMetrics.currentLevel || 0} / {hlsMetrics.availableLevels || 0}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Bandwidth:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{formatBytes(hlsMetrics.bandwidthEstimate || 0)}/s</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Dropped:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{hlsMetrics.droppedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render plugin info\n\tconst renderPluginInfo = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Total:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{pluginInfo.pluginCount || 0} plugins</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t<span className=\"text-blue-400\">Active:</span>\n\t\t\t\t\t<div className=\"ml-2 space-y-1 font-mono text-xs\">\n\t\t\t\t\t\t{pluginInfo.activePlugins?.map((plugin, index) => (\n\t\t\t\t\t\t\t<div key={index} className=\"text-green-300\">\n\t\t\t\t\t\t\t\t• {plugin}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)) || <div className=\"text-gray-400\">None</div>}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{pluginInfo.loadedPlugins &&\n\t\t\t\t\tpluginInfo.loadedPlugins.length > pluginInfo.activePlugins?.length && (\n\t\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t\t<span className=\"text-yellow-400\">Loaded (inactive):</span>\n\t\t\t\t\t\t\t<div className=\"ml-2 space-y-1 font-mono text-xs\">\n\t\t\t\t\t\t\t\t{pluginInfo.loadedPlugins\n\t\t\t\t\t\t\t\t\t.filter((plugin) => !pluginInfo.activePlugins?.includes(plugin))\n\t\t\t\t\t\t\t\t\t.map((plugin, index) => (\n\t\t\t\t\t\t\t\t\t\t<div key={index} className=\"text-yellow-300\">\n\t\t\t\t\t\t\t\t\t\t\t• {plugin}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render debug info\n\tconst renderDebugInfo = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"space-y-1 font-mono text-xs\">\n\t\t\t\t{Object.entries(debugInfo).map(([key, value]) => (\n\t\t\t\t\t<div key={key}>\n\t\t\t\t\t\t<span className=\"text-yellow-400\">{key}:</span>\n\t\t\t\t\t\t<span className=\"ml-2 text-gray-300\">\n\t\t\t\t\t\t\t{typeof value === \"object\" ? JSON.stringify(value, null, 2) : String(value)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render tabs\n\tconst renderTabs = () => (\n\t\t<div className=\"flex space-x-1 border-gray-600 border-b\">\n\t\t\t{[\n\t\t\t\t{ id: \"performance\", label: \"Performance\" },\n\t\t\t\t{ id: \"hls\", label: \"HLS\" },\n\t\t\t\t{ id: \"plugins\", label: \"Plugins\" },\n\t\t\t\t{ id: \"debug\", label: \"Debug\" }\n\t\t\t].map((tab) => (\n\t\t\t\t<button\n\t\t\t\t\tkey={tab.id}\n\t\t\t\t\tonClick={() => setActiveTab(tab.id as any)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"px-2 py-1 font-medium text-xs transition-colors\",\n\t\t\t\t\t\tactiveTab === tab.id\n\t\t\t\t\t\t\t? \"border-blue-400 border-b text-blue-400\"\n\t\t\t\t\t\t\t: \"text-gray-400 hover:text-white\"\n\t\t\t\t\t)}>\n\t\t\t\t\t{tab.label}\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</div>\n\t)\n\n\t// Render active tab content\n\tconst renderTabContent = () => {\n\t\tswitch (activeTab) {\n\t\t\tcase \"performance\":\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t{renderPerformanceMetrics()}\n\t\t\t\t\t\t<hr className=\"border-gray-600\" />\n\t\t\t\t\t\t{renderPlaybackState()}\n\t\t\t\t\t\t<hr className=\"border-gray-600\" />\n\t\t\t\t\t\t{renderPreloadingStats()}\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\tcase \"hls\":\n\t\t\t\treturn renderHLSMetrics()\n\t\t\tcase \"plugins\":\n\t\t\t\treturn renderPluginInfo()\n\t\t\tcase \"debug\":\n\t\t\t\treturn renderDebugInfo()\n\t\t\tdefault:\n\t\t\t\treturn renderPerformanceMetrics()\n\t\t}\n\t}\n\n\t// Only render in development\n\tif (process.env.NODE_ENV !== \"development\") {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed z-50 min-w-80 max-w-96 rounded-lg border border-gray-700 bg-black/90 p-3 font-mono text-white text-xs backdrop-blur-sm\",\n\t\t\t\tpositionClasses,\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t{/* Header */}\n\t\t\t<div className=\"mb-3 flex items-center justify-between\">\n\t\t\t\t<h3 className=\"font-bold text-blue-400 text-sm\">{title}</h3>\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => setIsCollapsed(!isCollapsed)}\n\t\t\t\t\t\tclassName=\"text-gray-400 transition-colors hover:text-white\"\n\t\t\t\t\t\taria-label={isCollapsed ? \"Expand\" : \"Collapse\"}>\n\t\t\t\t\t\t{isCollapsed ? (\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M3 4.5L6 7.5L9 4.5\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M3 7.5L6 4.5L9 7.5\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Collapsed content */}\n\t\t\t{isCollapsed ? (\n\t\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span className=\"text-green-400\">FPS:</span>\n\t\t\t\t\t\t<span className=\"ml-1 font-mono\">{performanceMetrics.fps || 0}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span className=\"text-blue-400\">Memory:</span>\n\t\t\t\t\t\t<span className=\"ml-1 font-mono\">\n\t\t\t\t\t\t\t{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)}MB\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{/* Tabs */}\n\t\t\t\t\t{renderTabs()}\n\n\t\t\t\t\t{/* Tab Content */}\n\t\t\t\t\t<div className=\"mt-3 max-h-64 overflow-y-auto\">{renderTabContent()}</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n/**\n * Performance Debug Panel - simplified version focused on performance metrics\n */\nexport const PerformanceDebugPanel: React.FC<\n\tOmit<DebugPanelProps, \"position\" | \"defaultCollapsed\" | \"title\">\n> = (props) => {\n\treturn (\n\t\t<DebugPanel\n\t\t\t{...props}\n\t\t\tposition=\"top-right\"\n\t\t\tdefaultCollapsed={false}\n\t\t\ttitle=\"Performance Monitor\"\n\t\t/>\n\t)\n}\n\nexport default DebugPanel\n"],"names":["composeRefs","refs","node","ref","useAutoHideControls","autoHide","delay","showOnHover","showOnTouch","showControls","setShowControls","React","isHovering","setIsHovering","isTouching","setIsTouching","timeoutRef","resetTimeout","showControlsTemporarily","handleMouseEnter","handleMouseLeave","handleTouchStart","handleTouchEnd","useTouchGestures","enabled","dispatch","useMediaDispatch","isPlaying","useMediaSelector","state","currentTime","duration","volume","touchStart","setTouchStart","isDoubleTap","setIsDoubleTap","e","touch","now","MediaActionTypes","handleTouchMove","deltaX","deltaY","seekAmount","newTime","volumeChange","newVolume","EnhancedMediaPlayer","children","className","autoHideDelay","showControlsOnHover","showControlsOnTouch","enableKeyboardControls","enableTouchGestures","onPlay","onPause","onTimeUpdate","onVolumeChange","onFullscreenChange","context","useMediaContext","isFullscreen","error","handleControlsTouch","handleControlsTouchEnd","handleGestureStart","handleGestureMove","handleGestureEnd","handleClick","handleKeyDown","jsx","cn","QualitySelector","qualities","currentQuality","onQualityChange","isOpen","setIsOpen","currentQualityLabel","q","jsxs","quality","SubtitleSelector","subtitles","currentSubtitle","onSubtitleChange","currentSubtitleLabel","s","subtitle","PlaybackSpeedSelector","playbackRate","speeds","handleSpeedChange","speed","ChaptersPanel","chapters","onChapterSelect","currentChapter","chapter","formatTime","PictureInPictureButton","isPictureInPicture","handleTogglePiP","EnhancedPlayButton","size","isLoading","sizeClasses","iconSizes","EnhancedSeekBar","buffered","previewTime","isDragging","setIsDragging","hoverTime","setHoverTime","progressRef","progress","previewProgress","bufferedRanges","ranges","i","getTimeFromPosition","clientX","rect","handleMouseMove","time","handleMouseDown","handleMouseUp","range","index","EnhancedVolumeControl","isMuted","showSlider","setShowSlider","handleToggleMute","handleVolumeChange","VolumeIcon","EnhancedBackwardButton","skipTime","EnhancedForwardButton","EnhancedTimeDisplay","variant","displayTime","PerformanceIndicator","metrics","getPerformanceColor","fps","getBufferColor","health","EnhancedControlBar","showSkipButtons","showVolumeControl","showTimeDisplay","playButtonSize","skipButtonSize","showPerformanceIndicators","performanceMetrics","DebugPanel","preloadingStats","playbackState","hlsMetrics","pluginInfo","debugInfo","position","defaultCollapsed","title","isCollapsed","setIsCollapsed","activeTab","setActiveTab","positionClasses","useMemo","formatBytes","bytes","k","sizes","seconds","mins","secs","renderPerformanceMetrics","renderPlaybackState","renderPreloadingStats","renderHLSMetrics","renderPluginInfo","plugin","renderDebugInfo","key","value","renderTabs","tab","renderTabContent","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"enhanced-components-BspFs9OO.cjs","sources":["../src/components/enhanced/media-player-enhanced.tsx","../src/components/enhanced/advanced-features.tsx","../src/components/enhanced/enhanced-controls.tsx","../src/components/enhanced/debug-panel.tsx"],"sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport {\n\tMediaActionTypes,\n\tuseMediaContext,\n\tuseMediaDispatch,\n\tuseMediaSelector\n} from \"../../context/media-context\"\nimport { cn } from \"../../lib/utils\"\n\n// Utility function to compose refs\nfunction composeRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n\treturn (node: T) => {\n\t\trefs.forEach((ref) => {\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(node)\n\t\t\t} else if (ref) {\n\t\t\t\t;(ref as React.MutableRefObject<T>).current = node\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Enhanced media player with better performance and mobile support\nexport interface EnhancedMediaPlayerProps {\n\tchildren: React.ReactNode\n\tclassName?: string\n\tautoHide?: boolean\n\tautoHideDelay?: number\n\tshowControlsOnHover?: boolean\n\tshowControlsOnTouch?: boolean\n\tenableKeyboardControls?: boolean\n\tenableTouchGestures?: boolean\n\tonPlay?: () => void\n\tonPause?: () => void\n\tonTimeUpdate?: (time: number) => void\n\tonVolumeChange?: (volume: number) => void\n\tonFullscreenChange?: (isFullscreen: boolean) => void\n}\n\n// Custom hook for auto-hide controls\nfunction useAutoHideControls(\n\tautoHide: boolean,\n\tdelay: number,\n\tshowOnHover: boolean,\n\tshowOnTouch: boolean\n) {\n\tconst [showControls, setShowControls] = React.useState(true)\n\tconst [isHovering, setIsHovering] = React.useState(false)\n\tconst [isTouching, setIsTouching] = React.useState(false)\n\tconst timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n\n\tconst resetTimeout = React.useCallback(() => {\n\t\tif (timeoutRef.current) {\n\t\t\tclearTimeout(timeoutRef.current)\n\t\t}\n\t\tif (autoHide) {\n\t\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\t\tif (!isHovering && !isTouching) {\n\t\t\t\t\tsetShowControls(false)\n\t\t\t\t}\n\t\t\t}, delay)\n\t\t}\n\t}, [autoHide, delay, isHovering, isTouching])\n\n\tconst showControlsTemporarily = React.useCallback(() => {\n\t\tsetShowControls(true)\n\t\tresetTimeout()\n\t}, [resetTimeout])\n\n\tReact.useEffect(() => {\n\t\tif (autoHide) {\n\t\t\tresetTimeout()\n\t\t} else {\n\t\t\tsetShowControls(true)\n\t\t}\n\t\treturn () => {\n\t\t\tif (timeoutRef.current) {\n\t\t\t\tclearTimeout(timeoutRef.current)\n\t\t\t}\n\t\t}\n\t}, [autoHide, resetTimeout])\n\n\tconst handleMouseEnter = React.useCallback(() => {\n\t\tif (showOnHover) {\n\t\t\tsetIsHovering(true)\n\t\t\tsetShowControls(true)\n\t\t}\n\t}, [showOnHover])\n\n\tconst handleMouseLeave = React.useCallback(() => {\n\t\tif (showOnHover) {\n\t\t\tsetIsHovering(false)\n\t\t\tresetTimeout()\n\t\t}\n\t}, [showOnHover, resetTimeout])\n\n\tconst handleTouchStart = React.useCallback(() => {\n\t\tif (showOnTouch) {\n\t\t\tsetIsTouching(true)\n\t\t\tshowControlsTemporarily()\n\t\t}\n\t}, [showOnTouch, showControlsTemporarily])\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\tif (showOnTouch) {\n\t\t\tsetIsTouching(false)\n\t\t\tresetTimeout()\n\t\t}\n\t}, [showOnTouch, resetTimeout])\n\n\treturn {\n\t\tshowControls,\n\t\tshowControlsTemporarily,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave,\n\t\thandleTouchStart,\n\t\thandleTouchEnd\n\t}\n}\n\n// Custom hook for touch gestures\nfunction useTouchGestures(enabled: boolean) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPlaying = useMediaSelector((state) => state.isPlaying)\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\tconst volume = useMediaSelector((state) => state.volume)\n\n\tconst [touchStart, setTouchStart] = React.useState<{ x: number; y: number; time: number } | null>(\n\t\tnull\n\t)\n\tconst [isDoubleTap, setIsDoubleTap] = React.useState(false)\n\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!enabled) return\n\n\t\t\tconst touch = e.touches[0]\n\t\t\tif (!touch) return\n\n\t\t\tconst now = Date.now()\n\n\t\t\tif (touchStart && now - touchStart.time < 300) {\n\t\t\t\tsetIsDoubleTap(true)\n\t\t\t\t// Double tap to play/pause\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tsetTouchStart({\n\t\t\t\t\tx: touch.clientX,\n\t\t\t\t\ty: touch.clientY,\n\t\t\t\t\ttime: now\n\t\t\t\t})\n\t\t\t\tsetIsDoubleTap(false)\n\t\t\t}\n\t\t},\n\t\t[enabled, touchStart, isPlaying, dispatch]\n\t)\n\n\tconst handleTouchMove = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!enabled || !touchStart || isDoubleTap) return\n\n\t\t\tconst touch = e.touches[0]\n\t\t\tif (!touch) return\n\n\t\t\tconst deltaX = touch.clientX - touchStart.x\n\t\t\tconst deltaY = touch.clientY - touchStart.y\n\n\t\t\t// Horizontal swipe for seeking\n\t\t\tif (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 50) {\n\t\t\t\tconst seekAmount = (deltaX / window.innerWidth) * 30 // 30 seconds max\n\t\t\t\tconst newTime = Math.max(0, Math.min(duration, currentTime + seekAmount))\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\tdetail: newTime\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Vertical swipe for volume (right side of screen)\n\t\t\tif (\n\t\t\t\tMath.abs(deltaY) > Math.abs(deltaX) &&\n\t\t\t\tMath.abs(deltaY) > 50 &&\n\t\t\t\ttouchStart.x > window.innerWidth / 2\n\t\t\t) {\n\t\t\t\tconst volumeChange = -(deltaY / window.innerHeight) * 1 // Full range\n\t\t\t\tconst newVolume = Math.max(0, Math.min(1, volume + volumeChange))\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\tdetail: newVolume\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[enabled, touchStart, isDoubleTap, duration, currentTime, volume, dispatch]\n\t)\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\tif (!enabled) return\n\t\t// Reset touch state after a delay to allow for double tap detection\n\t\tsetTimeout(() => {\n\t\t\tsetTouchStart(null)\n\t\t\tsetIsDoubleTap(false)\n\t\t}, 300)\n\t}, [enabled])\n\n\treturn {\n\t\thandleTouchStart,\n\t\thandleTouchMove,\n\t\thandleTouchEnd\n\t}\n}\n\nexport const EnhancedMediaPlayer = function EnhancedMediaPlayer({\n\tchildren,\n\tclassName,\n\tautoHide = true,\n\tautoHideDelay = 3000,\n\tshowControlsOnHover = true,\n\tshowControlsOnTouch = true,\n\tenableKeyboardControls = true,\n\tenableTouchGestures = true,\n\tonPlay,\n\tonPause,\n\tonTimeUpdate,\n\tonVolumeChange,\n\tonFullscreenChange\n}: EnhancedMediaPlayerProps) {\n\tconst context = useMediaContext()\n\tconst dispatch = useMediaDispatch()\n\n\t// State selectors with memoization\n\tconst isPlaying = useMediaSelector(React.useCallback((state) => state.isPlaying, []))\n\tconst isFullscreen = useMediaSelector(React.useCallback((state) => state.isFullscreen, []))\n\tconst currentTime = useMediaSelector(React.useCallback((state) => state.currentTime, []))\n\tconst volume = useMediaSelector(React.useCallback((state) => state.volume, []))\n\tconst error = useMediaSelector(React.useCallback((state) => state.error, []))\n\n\t// Custom hooks\n\tconst {\n\t\tshowControls,\n\t\tshowControlsTemporarily,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave,\n\t\thandleTouchStart: handleControlsTouch,\n\t\thandleTouchEnd: handleControlsTouchEnd\n\t} = useAutoHideControls(autoHide, autoHideDelay, showControlsOnHover, showControlsOnTouch)\n\n\tconst {\n\t\thandleTouchStart: handleGestureStart,\n\t\thandleTouchMove: handleGestureMove,\n\t\thandleTouchEnd: handleGestureEnd\n\t} = useTouchGestures(enableTouchGestures)\n\n\t// Combine touch handlers\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\thandleControlsTouch()\n\t\t\thandleGestureStart(e)\n\t\t},\n\t\t[handleControlsTouch, handleGestureStart]\n\t)\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\thandleControlsTouchEnd()\n\t\thandleGestureEnd()\n\t}, [handleControlsTouchEnd, handleGestureEnd])\n\n\t// Event handlers with memoization\n\tconst handleClick = React.useCallback(() => {\n\t\tshowControlsTemporarily()\n\t}, [showControlsTemporarily])\n\n\t// Keyboard controls\n\tReact.useEffect(() => {\n\t\tif (!enableKeyboardControls) return\n\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Space\":\n\t\t\t\tcase \"KeyK\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"KeyF\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: isFullscreen\n\t\t\t\t\t\t\t? MediaActionTypes.EXIT_FULLSCREEN\n\t\t\t\t\t\t\t: MediaActionTypes.ENTER_FULLSCREEN\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"KeyM\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({ type: MediaActionTypes.TOGGLE_MUTE })\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: Math.max(0, currentTime - 10)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: currentTime + 10\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\t\tdetail: Math.min(1, volume + 0.1)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\t\tdetail: Math.max(0, volume - 0.1)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown)\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown)\n\t}, [enableKeyboardControls, dispatch, isPlaying, isFullscreen, currentTime, volume])\n\n\t// Event callbacks\n\tReact.useEffect(() => {\n\t\tif (isPlaying) onPlay?.()\n\t\telse onPause?.()\n\t}, [isPlaying, onPlay, onPause])\n\n\tReact.useEffect(() => {\n\t\tonTimeUpdate?.(currentTime)\n\t}, [currentTime, onTimeUpdate])\n\n\tReact.useEffect(() => {\n\t\tonVolumeChange?.(volume)\n\t}, [volume, onVolumeChange])\n\n\tReact.useEffect(() => {\n\t\tonFullscreenChange?.(isFullscreen)\n\t}, [isFullscreen, onFullscreenChange])\n\n\treturn (\n\t\t<div\n\t\t\tref={composeRefs(context.rootRef)}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative isolate flex flex-col overflow-hidden rounded-lg bg-black outline-none\",\n\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n\t\t\t\t\"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\t\t\t\tisFullscreen && \"fixed inset-0 z-50 rounded-none\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-state={isFullscreen ? \"fullscreen\" : \"inline\"}\n\t\t\tdata-disabled={error ? \"\" : undefined}\n\t\t\tdata-controls-visible={showControls ? \"\" : undefined}\n\t\t\ttabIndex={0}\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\tonTouchStart={handleTouchStart}\n\t\t\tonTouchMove={handleGestureMove}\n\t\t\tonTouchEnd={handleTouchEnd}\n\t\t\tonClick={handleClick}>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nEnhancedMediaPlayer.displayName = \"EnhancedMediaPlayer\"\n","\"use client\"\n\nimport React from \"react\"\nimport { MediaActionTypes, useMediaDispatch, useMediaSelector } from \"../../context/media-context\"\nimport { formatTime } from \"../../lib/format-time\"\nimport { cn } from \"../../lib/utils\"\n\n// Types for advanced features\nexport interface Chapter {\n\tid: string\n\ttitle: string\n\tstartTime: number\n\tendTime: number\n\tthumbnail?: string\n}\n\nexport interface QualityLevel {\n\tid: string\n\tlabel: string\n\twidth: number\n\theight: number\n\tbitrate?: number\n}\n\nexport interface Subtitle {\n\tid: string\n\tlabel: string\n\tlanguage: string\n\tsrc: string\n\tdefault?: boolean\n}\n\n// Quality selector component\nexport const QualitySelector = function QualitySelector({\n\tqualities,\n\tcurrentQuality,\n\tonQualityChange,\n\tclassName\n}: {\n\tqualities: QualityLevel[]\n\tcurrentQuality: string\n\tonQualityChange: (qualityId: string) => void\n\tclassName?: string\n}) {\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst currentQualityLabel = React.useMemo(() => {\n\t\treturn qualities.find((q) => q.id === currentQuality)?.label || \"Auto\"\n\t}, [qualities, currentQuality])\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select quality\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{currentQualityLabel}</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t{qualities.map((quality) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={quality.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonQualityChange(quality.id)\n\t\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tquality.id === currentQuality && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{quality.label}\n\t\t\t\t\t\t\t{quality.bitrate && (\n\t\t\t\t\t\t\t\t<span className=\"ml-2 text-white/60 text-xs\">\n\t\t\t\t\t\t\t\t\t({Math.round(quality.bitrate / 1000)}k)\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Subtitle selector component\nexport const SubtitleSelector = function SubtitleSelector({\n\tsubtitles,\n\tcurrentSubtitle,\n\tonSubtitleChange,\n\tclassName\n}: {\n\tsubtitles: Subtitle[]\n\tcurrentSubtitle: string | null\n\tonSubtitleChange: (subtitleId: string | null) => void\n\tclassName?: string\n}) {\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst currentSubtitleLabel = React.useMemo(() => {\n\t\tif (!currentSubtitle) return \"Off\"\n\t\treturn subtitles.find((s) => s.id === currentSubtitle)?.label || \"Off\"\n\t}, [subtitles, currentSubtitle])\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select subtitles\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{currentSubtitleLabel}</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tonSubtitleChange(null)\n\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t!currentSubtitle && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\tOff\n\t\t\t\t\t</button>\n\t\t\t\t\t{subtitles.map((subtitle) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={subtitle.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonSubtitleChange(subtitle.id)\n\t\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tsubtitle.id === currentSubtitle && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{subtitle.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Playback speed selector\nexport const PlaybackSpeedSelector = function PlaybackSpeedSelector({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst playbackRate = useMediaSelector((state) => state.playbackRate)\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst speeds = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n\n\tconst handleSpeedChange = React.useCallback(\n\t\t(speed: number) => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_PLAYBACK_RATE, detail: speed })\n\t\t\tsetIsOpen(false)\n\t\t},\n\t\t[dispatch]\n\t)\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select playback speed\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M13,8A4,4 0 0,0 9,12A4,4 0 0,0 13,16A4,4 0 0,0 17,12A4,4 0 0,0 13,8M13,14A2,2 0 0,1 11,12A2,2 0 0,1 13,10A2,2 0 0,1 15,12A2,2 0 0,1 13,14M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4Z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{playbackRate}x</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-20 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t{speeds.map((speed) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={speed}\n\t\t\t\t\t\t\tonClick={() => handleSpeedChange(speed)}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tspeed === playbackRate && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{speed}x\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Chapters component\nexport const ChaptersPanel = function ChaptersPanel({\n\tchapters,\n\tonChapterSelect,\n\tclassName\n}: {\n\tchapters: Chapter[]\n\tonChapterSelect: (chapter: Chapter) => void\n\tclassName?: string\n}) {\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\n\tconst currentChapter = React.useMemo(() => {\n\t\treturn chapters.find(\n\t\t\t(chapter) => currentTime >= chapter.startTime && currentTime < chapter.endTime\n\t\t)\n\t}, [chapters, currentTime])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-lg border border-white/20 bg-black/90 p-4 backdrop-blur-sm\",\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<h3 className=\"mb-3 font-semibold text-white\">Chapters</h3>\n\t\t\t<div className=\"max-h-64 space-y-2 overflow-y-auto\">\n\t\t\t\t{chapters.map((chapter) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={chapter.id}\n\t\t\t\t\t\tonClick={() => onChapterSelect(chapter)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-full items-center gap-3 rounded-lg p-3 text-left transition-colors\",\n\t\t\t\t\t\t\t\"hover:bg-white/10\",\n\t\t\t\t\t\t\tchapter.id === currentChapter?.id && \"border border-primary/30 bg-primary/20\"\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\t{chapter.thumbnail && (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={chapter.thumbnail}\n\t\t\t\t\t\t\t\talt={chapter.title}\n\t\t\t\t\t\t\t\tclassName=\"h-9 w-16 rounded object-cover\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<div className=\"truncate font-medium text-white\">{chapter.title}</div>\n\t\t\t\t\t\t\t<div className=\"text-sm text-white/60\">\n\t\t\t\t\t\t\t\t{formatTime(chapter.startTime)} - {formatTime(chapter.endTime)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Picture-in-Picture button\nexport const PictureInPictureButton = function PictureInPictureButton({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPictureInPicture = useMediaSelector((state) => state.isPictureInPicture)\n\n\tconst handleTogglePiP = React.useCallback(() => {\n\t\tdispatch({\n\t\t\ttype: isPictureInPicture ? MediaActionTypes.EXIT_PIP : MediaActionTypes.ENTER_PIP\n\t\t})\n\t}, [dispatch, isPictureInPicture])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleTogglePiP}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex h-10 w-10 items-center justify-center rounded-full text-white\",\n\t\t\t\t\"transition-colors hover:bg-white/10\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={isPictureInPicture ? \"Exit Picture-in-Picture\" : \"Enter Picture-in-Picture\"}>\n\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t<path d=\"M19 7h-8v6h8V7zm2-4H3c-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\" />\n\t\t\t</svg>\n\t\t</button>\n\t)\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { MediaActionTypes, useMediaDispatch, useMediaSelector } from \"../../context/media-context\"\nimport { formatTime } from \"../../lib/format-time\"\nimport { cn } from \"../../lib/utils\"\n\n// Enhanced play button with better animations\nexport const EnhancedPlayButton = function EnhancedPlayButton({\n\tclassName,\n\tsize = \"md\"\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPlaying = useMediaSelector((state) => state.isPlaying)\n\tconst isLoading = useMediaSelector((state) => state.isLoading)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\",\n\t\txl: \"h-16 w-16\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\",\n\t\txl: \"h-8 w-8\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tdispatch({\n\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t})\n\t}, [dispatch, isPlaying])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tdisabled={isLoading}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={isPlaying ? \"Pause\" : \"Play\"}>\n\t\t\t{isLoading ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"animate-spin rounded-full border-2 border-white/30 border-t-white\",\n\t\t\t\t\t\ticonSizes[size]\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className={cn(\"transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t\t{isPlaying ? (\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t\t\t<path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"ml-0.5 h-full w-full\">\n\t\t\t\t\t\t\t<path d=\"M8 5v14l11-7z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</button>\n\t)\n}\n\n// Enhanced seek bar with preview and better touch support\nexport const EnhancedSeekBar = function EnhancedSeekBar({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\tconst buffered = useMediaSelector((state) => state.buffered)\n\tconst previewTime = useMediaSelector((state) => state.previewTime)\n\n\tconst [isDragging, setIsDragging] = React.useState(false)\n\tconst [hoverTime, setHoverTime] = React.useState<number | null>(null)\n\tconst progressRef = React.useRef<HTMLDivElement>(null)\n\n\tconst progress = duration > 0 ? (currentTime / duration) * 100 : 0\n\tconst previewProgress =\n\t\tduration > 0 && previewTime !== null ? (previewTime / duration) * 100 : null\n\n\t// Calculate buffered ranges\n\tconst bufferedRanges = React.useMemo(() => {\n\t\tif (!buffered || duration === 0) return []\n\t\tconst ranges = []\n\t\tfor (let i = 0; i < buffered.length; i++) {\n\t\t\tranges.push({\n\t\t\t\tstart: (buffered.start(i) / duration) * 100,\n\t\t\t\tend: (buffered.end(i) / duration) * 100\n\t\t\t})\n\t\t}\n\t\treturn ranges\n\t}, [buffered, duration])\n\n\tconst getTimeFromPosition = React.useCallback(\n\t\t(clientX: number) => {\n\t\t\tif (!progressRef.current) return 0\n\t\t\tconst rect = progressRef.current.getBoundingClientRect()\n\t\t\tconst position = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n\t\t\treturn position * duration\n\t\t},\n\t\t[duration]\n\t)\n\n\tconst handleMouseMove = React.useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\t\tsetHoverTime(time)\n\t\t\t\tdispatch({ type: MediaActionTypes.PREVIEW_TIME, detail: time })\n\t\t\t}\n\t\t},\n\t\t[isDragging, getTimeFromPosition, dispatch]\n\t)\n\n\tconst handleMouseLeave = React.useCallback(() => {\n\t\tif (!isDragging) {\n\t\t\tsetHoverTime(null)\n\t\t\tdispatch({ type: MediaActionTypes.CLEAR_PREVIEW })\n\t\t}\n\t}, [isDragging, dispatch])\n\n\tconst handleMouseDown = React.useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tsetIsDragging(true)\n\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t},\n\t\t[getTimeFromPosition, dispatch]\n\t)\n\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tsetIsDragging(true)\n\t\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t},\n\t\t[getTimeFromPosition, dispatch]\n\t)\n\n\tReact.useEffect(() => {\n\t\tconst handleMouseMove = (e: MouseEvent) => {\n\t\t\tif (isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t\t}\n\t\t}\n\n\t\tconst handleMouseUp = () => {\n\t\t\tsetIsDragging(false)\n\t\t\tsetHoverTime(null)\n\t\t\tdispatch({ type: MediaActionTypes.CLEAR_PREVIEW })\n\t\t}\n\n\t\tconst handleTouchMove = (e: TouchEvent) => {\n\t\t\tif (isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t\t}\n\t\t}\n\n\t\tif (isDragging) {\n\t\t\tdocument.addEventListener(\"mousemove\", handleMouseMove)\n\t\t\tdocument.addEventListener(\"mouseup\", handleMouseUp)\n\t\t\tdocument.addEventListener(\"touchmove\", handleTouchMove)\n\t\t\tdocument.addEventListener(\"touchend\", handleMouseUp)\n\t\t}\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousemove\", handleMouseMove)\n\t\t\tdocument.removeEventListener(\"mouseup\", handleMouseUp)\n\t\t\tdocument.removeEventListener(\"touchmove\", handleTouchMove)\n\t\t\tdocument.removeEventListener(\"touchend\", handleMouseUp)\n\t\t}\n\t}, [isDragging, getTimeFromPosition, dispatch])\n\n\treturn (\n\t\t<div className={cn(\"group relative flex items-center\", className)}>\n\t\t\t{/* Time preview tooltip */}\n\t\t\t{(hoverTime !== null || previewTime !== null) && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"pointer-events-none absolute bottom-full mb-2 rounded bg-black/80 px-2 py-1 text-white text-xs\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tleft: `${previewProgress || ((hoverTime || 0) / duration) * 100}%`,\n\t\t\t\t\t\ttransform: \"translateX(-50%)\"\n\t\t\t\t\t}}>\n\t\t\t\t\t{formatTime(hoverTime || previewTime || 0)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tref={progressRef}\n\t\t\t\tclassName=\"relative h-2 w-full cursor-pointer rounded-full bg-white/20 transition-all duration-200 group-hover:h-3\"\n\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\tonTouchStart={handleTouchStart}>\n\t\t\t\t{/* Buffered ranges */}\n\t\t\t\t{bufferedRanges.map((range, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName=\"absolute top-0 h-full rounded-full bg-white/30\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tleft: `${range.start}%`,\n\t\t\t\t\t\t\twidth: `${range.end - range.start}%`\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\n\t\t\t\t{/* Progress bar */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute top-0 h-full rounded-full bg-primary transition-all duration-100\"\n\t\t\t\t\tstyle={{ width: `${progress}%` }}\n\t\t\t\t/>\n\n\t\t\t\t{/* Preview indicator */}\n\t\t\t\t{previewProgress !== null && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute top-0 h-full w-1 rounded-full bg-white/80\"\n\t\t\t\t\t\tstyle={{ left: `${previewProgress}%` }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* Thumb */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 h-4 w-4 rounded-full border-2 border-white bg-primary opacity-0 shadow-lg transition-all duration-200 group-hover:opacity-100\"\n\t\t\t\t\tstyle={{ left: `${progress}%`, transform: \"translateX(-50%) translateY(-50%)\" }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Enhanced volume control with better UX\nexport const EnhancedVolumeControl = function EnhancedVolumeControl({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst volume = useMediaSelector((state) => state.volume)\n\tconst isMuted = useMediaSelector((state) => state.isMuted)\n\n\tconst [showSlider, setShowSlider] = React.useState(false)\n\n\tconst handleToggleMute = React.useCallback(() => {\n\t\tdispatch({ type: MediaActionTypes.TOGGLE_MUTE })\n\t}, [dispatch])\n\n\tconst handleVolumeChange = React.useCallback(\n\t\t(newVolume: number) => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_VOLUME, detail: newVolume })\n\t\t},\n\t\t[dispatch]\n\t)\n\n\tconst VolumeIcon = React.useMemo(() => {\n\t\tif (isMuted || volume === 0) {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<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.51C20.63 14.91 21 13.5 21 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\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t} else if (volume < 0.5) {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<path d=\"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t} else {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<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\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t}\n\t}, [isMuted, volume])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"relative flex items-center\", className)}\n\t\t\tonMouseEnter={() => setShowSlider(true)}\n\t\t\tonMouseLeave={() => setShowSlider(false)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={handleToggleMute}\n\t\t\t\tclassName=\"flex h-10 w-10 items-center justify-center rounded-full text-white transition-colors hover:bg-white/10\"\n\t\t\t\taria-label={isMuted ? \"Unmute\" : \"Mute\"}>\n\t\t\t\t{VolumeIcon}\n\t\t\t</button>\n\n\t\t\t{/* Volume slider */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute left-full ml-2 flex items-center transition-all duration-200\",\n\t\t\t\t\tshowSlider ? \"translate-x-0 opacity-100\" : \"-translate-x-2 pointer-events-none opacity-0\"\n\t\t\t\t)}>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"range\"\n\t\t\t\t\tmin=\"0\"\n\t\t\t\t\tmax=\"1\"\n\t\t\t\t\tstep=\"0.01\"\n\t\t\t\t\tvalue={isMuted ? 0 : volume}\n\t\t\t\t\tonChange={(e) => handleVolumeChange(parseFloat(e.target.value))}\n\t\t\t\t\tclassName=\"slider h-1 w-20 cursor-pointer appearance-none rounded-lg bg-white/20\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Enhanced backward skip button\nexport const EnhancedBackwardButton = function EnhancedBackwardButton({\n\tclassName,\n\tsize = \"md\",\n\tskipTime = 10\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tconst newTime = Math.max(0, currentTime - skipTime)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: newTime })\n\t}, [dispatch, currentTime, skipTime])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={`Backward ${skipTime} seconds`}\n\t\t\ttitle={`Backward ${skipTime}s`}>\n\t\t\t<div className={cn(\"flex items-center transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t<path d=\"M7 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM15.5 7.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v9c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-9z\" />\n\t\t\t\t\t<path d=\"M5.5 12l7-4.5v9l-7-4.5z\" opacity=\"0.8\" />\n\t\t\t\t</svg>\n\t\t\t\t{skipTime && <span className=\"-bottom-1 absolute font-bold text-[10px]\">{skipTime}</span>}\n\t\t\t</div>\n\t\t</button>\n\t)\n}\n\n// Enhanced forward skip button\nexport const EnhancedForwardButton = function EnhancedForwardButton({\n\tclassName,\n\tsize = \"md\",\n\tskipTime = 10\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tconst newTime = Math.min(duration, currentTime + skipTime)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: newTime })\n\t}, [dispatch, currentTime, duration, skipTime])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={`Forward ${skipTime} seconds`}\n\t\t\ttitle={`Forward ${skipTime}s`}>\n\t\t\t<div className={cn(\"flex items-center transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t<path d=\"M17 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM8.5 7.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v9c0 .83-.67 1.5-1.5 1.5s-1.5-.67-1.5-1.5v-9z\" />\n\t\t\t\t\t<path d=\"M18.5 12l-7-4.5v9l7-4.5z\" opacity=\"0.8\" />\n\t\t\t\t</svg>\n\t\t\t\t{skipTime && <span className=\"-bottom-1 absolute font-bold text-[10px]\">{skipTime}</span>}\n\t\t\t</div>\n\t\t</button>\n\t)\n}\n\n// Enhanced time display\nexport const EnhancedTimeDisplay = function EnhancedTimeDisplay({\n\tvariant = \"current\",\n\tclassName\n}: {\n\tvariant?: \"current\" | \"duration\" | \"remaining\"\n\tclassName?: string\n}) {\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\n\tconst displayTime = React.useMemo(() => {\n\t\tswitch (variant) {\n\t\t\tcase \"current\":\n\t\t\t\treturn formatTime(currentTime)\n\t\t\tcase \"duration\":\n\t\t\t\treturn formatTime(duration)\n\t\t\tcase \"remaining\":\n\t\t\t\treturn `-${formatTime(duration - currentTime)}`\n\t\t\tdefault:\n\t\t\t\treturn formatTime(currentTime)\n\t\t}\n\t}, [variant, currentTime, duration])\n\n\treturn (\n\t\t<div className={cn(\"font-mono text-sm text-white tabular-nums\", className)}>{displayTime}</div>\n\t)\n}\n\n// Performance indicator component\nexport const PerformanceIndicator = function PerformanceIndicator({\n\tmetrics,\n\tclassName\n}: {\n\tmetrics?: {\n\t\tfps?: number\n\t\tbufferHealth?: number\n\t\tquality?: number\n\t\tbandwidth?: number\n\t}\n\tclassName?: string\n}) {\n\tif (!metrics || process.env.NODE_ENV !== \"development\") {\n\t\treturn null\n\t}\n\n\tconst getPerformanceColor = (fps: number) => {\n\t\tif (fps >= 50) return \"text-green-400\"\n\t\tif (fps >= 30) return \"text-yellow-400\"\n\t\treturn \"text-red-400\"\n\t}\n\n\tconst getBufferColor = (health: number) => {\n\t\tif (health >= 5) return \"text-green-400\"\n\t\tif (health >= 2) return \"text-yellow-400\"\n\t\treturn \"text-red-400\"\n\t}\n\n\treturn (\n\t\t<div className={cn(\"flex items-center gap-3 font-mono text-xs\", className)}>\n\t\t\t{metrics.fps !== undefined && (\n\t\t\t\t<div className={cn(\"flex items-center gap-1\", getPerformanceColor(metrics.fps))}>\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.fps} FPS</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{metrics.bufferHealth !== undefined && (\n\t\t\t\t<div className={cn(\"flex items-center gap-1\", getBufferColor(metrics.bufferHealth))}>\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.bufferHealth.toFixed(1)}s</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{metrics.quality !== undefined && (\n\t\t\t\t<div className=\"flex items-center gap-1 text-blue-400\">\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.quality}p</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Enhanced control bar that combines all controls\nexport const EnhancedControlBar = function EnhancedControlBar({\n\tclassName,\n\tshowSkipButtons = true,\n\tshowVolumeControl = true,\n\tshowTimeDisplay = true,\n\tplayButtonSize = \"xl\",\n\tskipButtonSize = \"md\",\n\tskipTime = 10,\n\tshowPerformanceIndicators = process.env.NODE_ENV === \"development\",\n\tperformanceMetrics\n}: {\n\tclassName?: string\n\tshowSkipButtons?: boolean\n\tshowVolumeControl?: boolean\n\tshowTimeDisplay?: boolean\n\tplayButtonSize?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n\tskipButtonSize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n\tshowPerformanceIndicators?: boolean\n\tperformanceMetrics?: {\n\t\tfps?: number\n\t\tbufferHealth?: number\n\t\tquality?: number\n\t\tbandwidth?: number\n\t}\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-4 bg-gradient-to-t from-black/80 to-transparent p-4\",\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t{/* Seek Bar */}\n\t\t\t<EnhancedSeekBar className=\"w-full\" />\n\n\t\t\t{/* Control Buttons */}\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t{/* Left side - Media controls */}\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedBackwardButton\n\t\t\t\t\t\t\tsize={skipButtonSize}\n\t\t\t\t\t\t\tskipTime={skipTime}\n\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<EnhancedPlayButton size={playButtonSize} className=\"shrink-0\" />\n\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedForwardButton size={skipButtonSize} skipTime={skipTime} className=\"shrink-0\" />\n\t\t\t\t\t)}\n\n\t\t\t\t\t{showVolumeControl && <EnhancedVolumeControl className=\"shrink-0\" />}\n\n\t\t\t\t\t{showTimeDisplay && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1 font-mono text-sm\">\n\t\t\t\t\t\t\t<EnhancedTimeDisplay variant=\"current\" />\n\t\t\t\t\t\t\t<span className=\"text-white/60\">/</span>\n\t\t\t\t\t\t\t<EnhancedTimeDisplay variant=\"duration\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Right side - Performance indicators and additional controls */}\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{showPerformanceIndicators && (\n\t\t\t\t\t\t<PerformanceIndicator metrics={performanceMetrics} className=\"text-white/80\" />\n\t\t\t\t\t)}\n\t\t\t\t\t{/* Future: Settings, Fullscreen, etc. */}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","/**\n * Debug Panel Component for Performance Monitoring\n * Development-only component for displaying performance metrics\n */\n\nimport React, { useMemo } from \"react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface PerformanceMetrics {\n\tfps: number\n\tmemoryUsage: number\n\tbufferHealth: number\n\tnetworkBandwidth: number\n\tdroppedFrames: number\n\tdecodedFrames: number\n\tpresentationTime: number\n}\n\ninterface PreloadingStats {\n\tpreloadedItems: number\n\tengagementScore: number\n\tqueueLength: number\n\thitRate: number\n\ttotalSaved: number\n}\n\ninterface DebugPanelProps {\n\t/** Performance metrics to display */\n\tperformanceMetrics?: Partial<PerformanceMetrics>\n\t/** Preloading statistics */\n\tpreloadingStats?: PreloadingStats\n\t/** Current playback state */\n\tplaybackState?: {\n\t\tcurrentTime: number\n\t\tduration: number\n\t\tvolume: number\n\t\tisPlaying: boolean\n\t\tquality: number\n\t\tisBuffering: boolean\n\t\terror?: string\n\t}\n\t/** HLS-specific metrics */\n\thlsMetrics?: {\n\t\tcurrentLevel: number\n\t\tavailableLevels: number\n\t\tbandwidthEstimate: number\n\t\tdroppedFrames: number\n\t}\n\t/** Plugin information */\n\tpluginInfo?: {\n\t\tloadedPlugins: string[]\n\t\tactivePlugins: string[]\n\t\tpluginCount: number\n\t}\n\t/** Additional debug information */\n\tdebugInfo?: Record<string, any>\n\t/** Custom className */\n\tclassName?: string\n\t/** Panel position */\n\tposition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\"\n\t/** Whether the panel is collapsed by default */\n\tdefaultCollapsed?: boolean\n\t/** Custom title */\n\ttitle?: string\n}\n\n/**\n * Debug Panel Component\n */\nexport const DebugPanel: React.FC<DebugPanelProps> = ({\n\tperformanceMetrics = {},\n\tpreloadingStats = {} as PreloadingStats,\n\tplaybackState = {} as any,\n\thlsMetrics = {},\n\tpluginInfo = {},\n\tdebugInfo = {},\n\tclassName,\n\tposition = \"top-right\",\n\tdefaultCollapsed = false,\n\ttitle = \"BaroiPlayer Debug Panel\"\n}) => {\n\tconst [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed)\n\tconst [activeTab, setActiveTab] = React.useState<\"performance\" | \"hls\" | \"plugins\" | \"debug\">(\n\t\t\"performance\"\n\t)\n\n\t// Position classes\n\tconst positionClasses = useMemo(() => {\n\t\tswitch (position) {\n\t\t\tcase \"top-left\":\n\t\t\t\treturn \"top-4 left-4\"\n\t\t\tcase \"top-right\":\n\t\t\t\treturn \"top-4 right-4\"\n\t\t\tcase \"bottom-left\":\n\t\t\t\treturn \"bottom-4 left-4\"\n\t\t\tcase \"bottom-right\":\n\t\t\t\treturn \"bottom-4 right-4\"\n\t\t\tdefault:\n\t\t\t\treturn \"top-4 right-4\"\n\t\t}\n\t}, [position])\n\n\t// Format bytes\n\tconst formatBytes = (bytes: number): string => {\n\t\tif (bytes === 0) return \"0 B\"\n\t\tconst k = 1024\n\t\tconst sizes = [\"B\", \"KB\", \"MB\", \"GB\"]\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\n\t\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i]\n\t}\n\n\t// Format time\n\tconst formatTime = (seconds: number): string => {\n\t\tconst mins = Math.floor(seconds / 60)\n\t\tconst secs = Math.floor(seconds % 60)\n\t\treturn `${mins}:${secs.toString().padStart(2, \"0\")}`\n\t}\n\n\t// Render performance metrics\n\tconst renderPerformanceMetrics = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">FPS:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.fps || 0}</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Memory:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)} MB\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Buffer:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{(performanceMetrics.bufferHealth || 0).toFixed(2)}s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Bandwidth:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{formatBytes(performanceMetrics.networkBandwidth || 0)}/s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Dropped:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.droppedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-cyan-400\">Decoded:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.decodedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render playback state\n\tconst renderPlaybackState = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Status:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{playbackState.isPlaying ? (\n\t\t\t\t\t\t\t<span className=\"text-green-300\">Playing</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"text-red-300\">Paused</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Time:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{formatTime(playbackState.currentTime || 0)} / {formatTime(playbackState.duration || 0)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Volume:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{Math.round((playbackState.volume || 0) * 100)}%</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Quality:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{playbackState.quality || 0}p</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Buffering:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{playbackState.isBuffering ? (\n\t\t\t\t\t\t\t<span className=\"text-yellow-300\">Yes</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"text-green-300\">No</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t{playbackState.error && (\n\t\t\t\t\t<div className=\"col-span-2\">\n\t\t\t\t\t\t<span className=\"text-red-400\">Error:</span>\n\t\t\t\t\t\t<span className=\"ml-2 break-all font-mono text-red-300 text-xs\">\n\t\t\t\t\t\t\t{playbackState.error}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render preloading stats\n\tconst renderPreloadingStats = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Preloaded:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{preloadingStats.preloadedItems || 0} items</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Engagement:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{(preloadingStats.engagementScore || 0).toFixed(1)}%\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Queue:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{preloadingStats.queueLength || 0} items</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Hit Rate:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{(preloadingStats.hitRate || 0).toFixed(1)}%</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"col-span-2\">\n\t\t\t\t\t<span className=\"text-cyan-400\">Saved:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{formatBytes(preloadingStats.totalSaved || 0)}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render HLS metrics\n\tconst renderHLSMetrics = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Level:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{hlsMetrics.currentLevel || 0} / {hlsMetrics.availableLevels || 0}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Bandwidth:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{formatBytes(hlsMetrics.bandwidthEstimate || 0)}/s</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Dropped:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{hlsMetrics.droppedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render plugin info\n\tconst renderPluginInfo = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Total:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{pluginInfo.pluginCount || 0} plugins</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t<span className=\"text-blue-400\">Active:</span>\n\t\t\t\t\t<div className=\"ml-2 space-y-1 font-mono text-xs\">\n\t\t\t\t\t\t{pluginInfo.activePlugins?.map((plugin, index) => (\n\t\t\t\t\t\t\t<div key={index} className=\"text-green-300\">\n\t\t\t\t\t\t\t\t• {plugin}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)) || <div className=\"text-gray-400\">None</div>}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{pluginInfo.loadedPlugins &&\n\t\t\t\t\tpluginInfo.loadedPlugins.length > (pluginInfo.activePlugins?.length || 0) && (\n\t\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t\t<span className=\"text-yellow-400\">Loaded (inactive):</span>\n\t\t\t\t\t\t\t<div className=\"ml-2 space-y-1 font-mono text-xs\">\n\t\t\t\t\t\t\t\t{pluginInfo.loadedPlugins\n\t\t\t\t\t\t\t\t\t.filter((plugin) => !pluginInfo.activePlugins?.includes(plugin))\n\t\t\t\t\t\t\t\t\t.map((plugin, index) => (\n\t\t\t\t\t\t\t\t\t\t<div key={index} className=\"text-yellow-300\">\n\t\t\t\t\t\t\t\t\t\t\t• {plugin}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render debug info\n\tconst renderDebugInfo = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"space-y-1 font-mono text-xs\">\n\t\t\t\t{Object.entries(debugInfo).map(([key, value]) => (\n\t\t\t\t\t<div key={key}>\n\t\t\t\t\t\t<span className=\"text-yellow-400\">{key}:</span>\n\t\t\t\t\t\t<span className=\"ml-2 text-gray-300\">\n\t\t\t\t\t\t\t{typeof value === \"object\" ? JSON.stringify(value, null, 2) : String(value)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render tabs\n\tconst renderTabs = () => (\n\t\t<div className=\"flex space-x-1 border-gray-600 border-b\">\n\t\t\t{[\n\t\t\t\t{ id: \"performance\", label: \"Performance\" },\n\t\t\t\t{ id: \"hls\", label: \"HLS\" },\n\t\t\t\t{ id: \"plugins\", label: \"Plugins\" },\n\t\t\t\t{ id: \"debug\", label: \"Debug\" }\n\t\t\t].map((tab) => (\n\t\t\t\t<button\n\t\t\t\t\tkey={tab.id}\n\t\t\t\t\tonClick={() => setActiveTab(tab.id as any)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"px-2 py-1 font-medium text-xs transition-colors\",\n\t\t\t\t\t\tactiveTab === tab.id\n\t\t\t\t\t\t\t? \"border-blue-400 border-b text-blue-400\"\n\t\t\t\t\t\t\t: \"text-gray-400 hover:text-white\"\n\t\t\t\t\t)}>\n\t\t\t\t\t{tab.label}\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</div>\n\t)\n\n\t// Render active tab content\n\tconst renderTabContent = () => {\n\t\tswitch (activeTab) {\n\t\t\tcase \"performance\":\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t{renderPerformanceMetrics()}\n\t\t\t\t\t\t<hr className=\"border-gray-600\" />\n\t\t\t\t\t\t{renderPlaybackState()}\n\t\t\t\t\t\t<hr className=\"border-gray-600\" />\n\t\t\t\t\t\t{renderPreloadingStats()}\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\tcase \"hls\":\n\t\t\t\treturn renderHLSMetrics()\n\t\t\tcase \"plugins\":\n\t\t\t\treturn renderPluginInfo()\n\t\t\tcase \"debug\":\n\t\t\t\treturn renderDebugInfo()\n\t\t\tdefault:\n\t\t\t\treturn renderPerformanceMetrics()\n\t\t}\n\t}\n\n\t// Only render in development\n\tif (process.env.NODE_ENV !== \"development\") {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed z-50 min-w-80 max-w-96 rounded-lg border border-gray-700 bg-black/90 p-3 font-mono text-white text-xs backdrop-blur-sm\",\n\t\t\t\tpositionClasses,\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t{/* Header */}\n\t\t\t<div className=\"mb-3 flex items-center justify-between\">\n\t\t\t\t<h3 className=\"font-bold text-blue-400 text-sm\">{title}</h3>\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => setIsCollapsed(!isCollapsed)}\n\t\t\t\t\t\tclassName=\"text-gray-400 transition-colors hover:text-white\"\n\t\t\t\t\t\taria-label={isCollapsed ? \"Expand\" : \"Collapse\"}>\n\t\t\t\t\t\t{isCollapsed ? (\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M3 4.5L6 7.5L9 4.5\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M3 7.5L6 4.5L9 7.5\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Collapsed content */}\n\t\t\t{isCollapsed ? (\n\t\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span className=\"text-green-400\">FPS:</span>\n\t\t\t\t\t\t<span className=\"ml-1 font-mono\">{performanceMetrics.fps || 0}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span className=\"text-blue-400\">Memory:</span>\n\t\t\t\t\t\t<span className=\"ml-1 font-mono\">\n\t\t\t\t\t\t\t{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)}MB\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{/* Tabs */}\n\t\t\t\t\t{renderTabs()}\n\n\t\t\t\t\t{/* Tab Content */}\n\t\t\t\t\t<div className=\"mt-3 max-h-64 overflow-y-auto\">{renderTabContent()}</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n/**\n * Performance Debug Panel - simplified version focused on performance metrics\n */\nexport const PerformanceDebugPanel: React.FC<\n\tOmit<DebugPanelProps, \"position\" | \"defaultCollapsed\" | \"title\">\n> = (props) => {\n\treturn (\n\t\t<DebugPanel\n\t\t\t{...props}\n\t\t\tposition=\"top-right\"\n\t\t\tdefaultCollapsed={false}\n\t\t\ttitle=\"Performance Monitor\"\n\t\t/>\n\t)\n}\n\nexport default DebugPanel\n"],"names":["composeRefs","refs","node","ref","useAutoHideControls","autoHide","delay","showOnHover","showOnTouch","showControls","setShowControls","React","isHovering","setIsHovering","isTouching","setIsTouching","timeoutRef","resetTimeout","showControlsTemporarily","handleMouseEnter","handleMouseLeave","handleTouchStart","handleTouchEnd","useTouchGestures","enabled","dispatch","useMediaDispatch","isPlaying","useMediaSelector","state","currentTime","duration","volume","touchStart","setTouchStart","isDoubleTap","setIsDoubleTap","e","touch","now","MediaActionTypes","handleTouchMove","deltaX","deltaY","seekAmount","newTime","volumeChange","newVolume","EnhancedMediaPlayer","children","className","autoHideDelay","showControlsOnHover","showControlsOnTouch","enableKeyboardControls","enableTouchGestures","onPlay","onPause","onTimeUpdate","onVolumeChange","onFullscreenChange","context","useMediaContext","isFullscreen","error","handleControlsTouch","handleControlsTouchEnd","handleGestureStart","handleGestureMove","handleGestureEnd","handleClick","handleKeyDown","jsx","cn","QualitySelector","qualities","currentQuality","onQualityChange","isOpen","setIsOpen","currentQualityLabel","q","jsxs","quality","SubtitleSelector","subtitles","currentSubtitle","onSubtitleChange","currentSubtitleLabel","s","subtitle","PlaybackSpeedSelector","playbackRate","speeds","handleSpeedChange","speed","ChaptersPanel","chapters","onChapterSelect","currentChapter","chapter","formatTime","PictureInPictureButton","isPictureInPicture","handleTogglePiP","EnhancedPlayButton","size","isLoading","sizeClasses","iconSizes","EnhancedSeekBar","buffered","previewTime","isDragging","setIsDragging","hoverTime","setHoverTime","progressRef","progress","previewProgress","bufferedRanges","ranges","i","getTimeFromPosition","clientX","rect","handleMouseMove","time","handleMouseDown","handleMouseUp","range","index","EnhancedVolumeControl","isMuted","showSlider","setShowSlider","handleToggleMute","handleVolumeChange","VolumeIcon","EnhancedBackwardButton","skipTime","EnhancedForwardButton","EnhancedTimeDisplay","variant","displayTime","PerformanceIndicator","metrics","getPerformanceColor","fps","getBufferColor","health","EnhancedControlBar","showSkipButtons","showVolumeControl","showTimeDisplay","playButtonSize","skipButtonSize","showPerformanceIndicators","performanceMetrics","DebugPanel","preloadingStats","playbackState","hlsMetrics","pluginInfo","debugInfo","position","defaultCollapsed","title","isCollapsed","setIsCollapsed","activeTab","setActiveTab","positionClasses","useMemo","formatBytes","bytes","k","sizes","seconds","mins","secs","renderPerformanceMetrics","renderPlaybackState","renderPreloadingStats","renderHLSMetrics","renderPluginInfo","plugin","renderDebugInfo","key","value","renderTabs","tab","renderTabContent","Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";const s=require("react"),A=require("./context-eNS62_ac.cjs"),le=require("./utils-CFOue_9K.cjs");function be(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const j=be(s);function $(e,t){return((n,a=!1)=>{const m={type:e,detail:n,optimistic:a,timestamp:Date.now()};return a?t.dispatchOptimistic(m):(t.dispatch(m),Promise.resolve())})}function de(e){const[t,n]=s.useState(e.getActionState());return s.useEffect(()=>e.subscribe(()=>{const m=e.getActionState();n(l=>JSON.stringify(l)!==JSON.stringify(m)?m:l)}),[e]),t}function me(e){const t=s.useMemo(()=>({play:$(A.MediaActionTypes.PLAY,e),pause:$(A.MediaActionTypes.PAUSE,e),seek:$(A.MediaActionTypes.SEEK,e),setVolume:$(A.MediaActionTypes.SET_VOLUME,e),mute:$(A.MediaActionTypes.MUTE,e),unmute:$(A.MediaActionTypes.UNMUTE,e),toggleMute:$(A.MediaActionTypes.TOGGLE_MUTE,e),setDuration:$(A.MediaActionTypes.SET_DURATION,e),setCurrentTime:$(A.MediaActionTypes.SET_CURRENT_TIME,e),setBuffered:$(A.MediaActionTypes.SET_BUFFERED,e),setLoading:$(A.MediaActionTypes.SET_LOADING,e),setError:$(A.MediaActionTypes.SET_ERROR,e),enterFullscreen:$(A.MediaActionTypes.ENTER_FULLSCREEN,e),exitFullscreen:$(A.MediaActionTypes.EXIT_FULLSCREEN,e),enterPiP:$(A.MediaActionTypes.ENTER_PIP,e),exitPiP:$(A.MediaActionTypes.EXIT_PIP,e),setPlaybackRate:$(A.MediaActionTypes.SET_PLAYBACK_RATE,e),setSubtitleTrack:$(A.MediaActionTypes.SET_SUBTITLE_TRACK,e),setRendition:$(A.MediaActionTypes.SET_RENDITION,e),toggleSubtitles:$(A.MediaActionTypes.TOGGLE_SUBTITLES,e),previewTime:$(A.MediaActionTypes.PREVIEW_TIME,e),clearPreview:$(A.MediaActionTypes.CLEAR_PREVIEW,e)}),[e]),n=de(e),a=s.useMemo(()=>({togglePlayPause:async l=>{l?await t.pause(!0):await t.play(!0)},seekWithPreview:async l=>{await t.previewTime(l,!0),await t.seek(l,!0)},adjustVolume:async(l,i)=>{const d=Math.max(0,Math.min(1,i+l));await t.setVolume(d,!0)},toggleFullscreenOptimistic:async l=>{l?await t.exitFullscreen(!0):await t.enterFullscreen(!0)}}),[t]),m=s.useCallback(async()=>{const{lastAction:l}=n;l&&n.error&&await e.dispatchOptimistic({...l,retryCount:(l.retryCount||0)+1})},[e,n]);return{...t,...a,actionState:n,retryLastAction:m,isLoading:n.pending,hasError:!!n.error,errorMessage:n.error,retryCount:n.retryCount}}function ye(e,t){if(!t.optimistic)return e;switch(t.type){case"PLAY":return{...e,isPlaying:!0,error:null};case"PAUSE":return{...e,isPlaying:!1};case"SEEK":return{...e,currentTime:t.detail};case"SET_VOLUME":return{...e,volume:Math.max(0,Math.min(1,t.detail))};case"MUTE":return{...e,isMuted:!0};case"UNMUTE":return{...e,isMuted:!1};case"TOGGLE_MUTE":return{...e,isMuted:!e.isMuted};case"ENTER_FULLSCREEN":return{...e,isFullscreen:!0};case"EXIT_FULLSCREEN":return{...e,isFullscreen:!1};case"SET_PLAYBACK_RATE":return{...e,playbackRate:t.detail};case"TOGGLE_SUBTITLES":return{...e,subtitlesShowing:!e.subtitlesShowing};case"PREVIEW_TIME":return{...e,previewTime:t.detail};case"CLEAR_PREVIEW":return{...e,previewTime:null,previewImage:null,previewCoords:null};default:return e}}function we(e){const t=s.useSyncExternalStore(e.subscribe,e.getState,e.getState),[n,a]=s.useOptimistic(t,ye),m=s.useCallback(async d=>{d.optimistic&&a(d),await e.dispatchOptimistic(d)},[e,a]),l=s.useMemo(()=>({togglePlayPause:async()=>{const d={type:n.isPlaying?"PAUSE":"PLAY",optimistic:!0,timestamp:Date.now()};await m(d)},setVolumeOptimistic:async d=>{const E={type:"SET_VOLUME",detail:Math.max(0,Math.min(1,d)),optimistic:!0,timestamp:Date.now()};await m(E)},seekOptimistic:async d=>{const E={type:"SEEK",detail:d,optimistic:!0,timestamp:Date.now()};await m(E)},toggleMuteOptimistic:async()=>{const d={type:"TOGGLE_MUTE",optimistic:!0,timestamp:Date.now()};await m(d)},toggleFullscreenOptimistic:async()=>{const d={type:n.isFullscreen?"EXIT_FULLSCREEN":"ENTER_FULLSCREEN",optimistic:!0,timestamp:Date.now()};await m(d)},setPlaybackRateOptimistic:async d=>{const E={type:"SET_PLAYBACK_RATE",detail:d,optimistic:!0,timestamp:Date.now()};await m(E)},toggleSubtitlesOptimistic:async()=>{const d={type:"TOGGLE_SUBTITLES",optimistic:!0,timestamp:Date.now()};await m(d)}}),[n,m]),i=s.useMemo(()=>({isPlaying:n.isPlaying,currentTime:n.currentTime,volume:n.volume,isMuted:n.isMuted,isFullscreen:n.isFullscreen,playbackRate:n.playbackRate,subtitlesShowing:n.subtitlesShowing,previewTime:n.previewTime,progress:n.duration>0?n.currentTime/n.duration:0,formattedTime:se(n.currentTime),formattedDuration:se(n.duration),canPlay:!n.isLoading&&!n.error,hasError:!!n.error,isBuffering:n.isLoading}),[n]);return{state:n,actualState:t,...i,...l,dispatchOptimistic:m}}function se(e){if(!e||!isFinite(e))return"0:00";const t=Math.floor(e/60),n=Math.floor(e%60),a=Math.floor(t/60);return a>0?`${a}:${String(t%60).padStart(2,"0")}:${String(n).padStart(2,"0")}`:`${t}:${String(n).padStart(2,"0")}`}function ae(e,t){if(!Number.isFinite(t))return console.warn(`Attempted to set non-finite currentTime: ${t}`),!1;if(t<0)return console.warn(`Attempted to set negative currentTime: ${t}`),!1;try{return e.currentTime=t,!0}catch(n){return console.error(`Failed to set currentTime to ${t}:`,n),!1}}function Ee(e){const t=s.useRef(null),n=s.useRef(null),[a,m]=s.useTransition(),[l,i]=s.useTransition();s.useRef(0);const d=s.useRef(0),E=s.useRef(0);s.useRef(void 0);const M=s.useRef(0),L=A.useMediaStore(),y="getOptimisticState"in L,r=A.useMediaSelector(w=>w.isPlaying),v=A.useMediaSelector(w=>w.currentTime),f=A.useMediaSelector(w=>w.duration),o=A.useMediaSelector(w=>w.volume),p=A.useMediaSelector(w=>w.isMuted),P=A.useMediaSelector(w=>w.isLoading),h=A.useMediaSelector(w=>w.isBuffering),c=A.useMediaSelector(w=>w.error),T=A.useMediaSelector(w=>w.buffered),g=A.useMediaSelector(w=>w.isFullscreen),S=L,k=we(S),b=me(S),[B,F]=s.useState({frameRate:0,averageRenderTime:0,droppedFrames:0,bufferHealth:0}),[I,D]=s.useOptimistic(o,(w,U)=>Math.max(0,Math.min(1,U)));s.useOptimistic(v,(w,U)=>Math.max(0,Math.min(f||0,U))),s.useEffect(()=>{const w=t.current;if(!w)return;const U={volume:e.volume,muted:e.muted,autoplay:e.autoPlay,loop:e.loop,preload:e.preload,crossOrigin:e.crossOrigin};Object.entries(U).forEach(([G,W])=>{W!==void 0&&(w[G]=W)}),w.setAttribute("preload",e.preloadStrategy==="eager"?"auto":"metadata"),e.bufferingStrategy==="aggressive"&&w.setAttribute("buffered","auto"),w instanceof HTMLVideoElement&&(w.style.willChange="transform",w.style.transform="translateZ(0)")},[e.volume,e.muted,e.autoPlay,e.loop,e.preload,e.crossOrigin,e.preloadStrategy,e.bufferingStrategy]);const C=s.useCallback(()=>{const w=t.current;if(!w)return;const U=performance.now();if(e.enableTimeUpdateThrottling!==!1){if(U-M.current<(e.timeUpdateThrottleMs||100))return;M.current=U}m(()=>{y&&b&&b.setCurrentTime(w.currentTime)})},[e.enableTimeUpdateThrottling,e.timeUpdateThrottleMs,y,b]),R=s.useCallback(()=>{m(()=>{y&&b&&b.play(!0)}),e.onPlay?.()},[y,b,e.onPlay]),V=s.useCallback(()=>{m(()=>{y&&b&&b.pause(!0)}),e.onPause?.()},[y,b,e.onPause]),N=s.useCallback(()=>{const w=t.current;w&&m(()=>{y&&b&&(b.setVolume(w.volume,!0),w.muted?b.mute(!0):b.unmute(!0))})},[y,b]),x=s.useCallback(()=>{i(()=>{})},[]),Q=s.useCallback(()=>{},[]),u=s.useCallback(()=>{const w=t.current;w&&m(()=>{y&&b&&b.setBuffered(w.buffered)})},[y,b]),_=s.useCallback(()=>{const w=performance.now();if(w-E.current>0&&(d.current++,d.current>=60)){const G=Math.round(d.current*1e3/(w-E.current));F(W=>({...W,frameRate:G,droppedFrames:Math.max(0,60-G)})),d.current=0,E.current=w}},[]);s.useEffect(()=>{const w=t.current;if(!w)return;const U=[{event:"timeupdate",handler:C,passive:!0},{event:"play",handler:R},{event:"pause",handler:V},{event:"volumechange",handler:N},{event:"seeking",handler:x},{event:"seeked",handler:Q},{event:"progress",handler:u,passive:!0},{event:"loadedmetadata",handler:()=>_()},{event:"loadeddata",handler:()=>_()}];U.forEach(({event:Z,handler:J,passive:ee})=>{const te=ee?{passive:!0}:{};w.addEventListener(Z,J,te)});let G;const W=()=>{_(),G=requestAnimationFrame(W)};return e.enablePerformanceMonitoring&&W(),()=>{U.forEach(({event:Z,handler:J})=>{w.removeEventListener(Z,J)}),G&&cancelAnimationFrame(G)}},[C,R,V,N,x,Q,u,_,e.enablePerformanceMonitoring]);const z=s.useMemo(()=>{const w=async()=>{const O=t.current;if(O)if(y&&b)await b.play(!0);else try{await O.play()}catch(H){console.error("Failed to play media:",H)}},U=()=>{const O=t.current;O&&(y&&b?b.pause(!0):O.pause())},G=()=>{r?U():w()},W=O=>{const H=t.current;if(!H)return;const q=Number.isFinite(f)&&f>0?f:Number.isFinite(H.duration)?H.duration:0;if(q===0){console.warn("Cannot seek: duration is not available");return}const Y=Math.max(0,Math.min(O,q));if(!Number.isFinite(Y)){console.warn(`Computed non-finite seek time: ${Y}`);return}y&&b?i(()=>{b.seek(Y,!0)}):ae(H,Y)},Z=O=>{const H=t.current;if(!H)return;const q=Math.max(0,Math.min(1,O));y&&b?(D(q),m(()=>{b.setVolume(q,!0)})):H.volume=q},J=()=>{const O=t.current;O&&(y&&b?b.toggleMute(!0):O.muted=!O.muted)},ee=async()=>{const O=n.current;if(!(!O||!document.fullscreenEnabled))try{await O.requestFullscreen(),y&&b&&b.enterFullscreen(!0)}catch(H){console.error("Failed to enter fullscreen:",H)}},te=async()=>{if(document.fullscreenElement)try{await document.exitFullscreen(),y&&b&&b.exitFullscreen(!0)}catch(O){console.error("Failed to exit fullscreen:",O)}};return{play:w,pause:U,toggle:G,seek:W,setCurrentTime:O=>{const H=t.current;if(!H)return;const q=Number.isFinite(f)&&f>0?f:Number.isFinite(H.duration)?H.duration:0;if(q===0){console.warn("Cannot set currentTime: duration is not available");return}const Y=Math.max(0,Math.min(O,q));if(!Number.isFinite(Y)){console.warn(`Computed non-finite currentTime: ${Y}`);return}ae(H,Y)},setVolume:Z,mute:()=>{const O=t.current;O&&(y&&b?b.mute(!0):O.muted=!0)},unmute:()=>{const O=t.current;O&&(y&&b?b.unmute(!0):O.muted=!1)},toggleMute:J,enterFullscreen:ee,exitFullscreen:te,toggleFullscreen:async()=>{g?await te():await ee()}}},[r,g,f,y,b,m,i,D]),X=s.useMemo(()=>({isPlaying:k?.isPlaying??r,currentTime:k?.currentTime??v,duration:k?.actualState?.duration??f,volume:k?.volume??I,isMuted:k?.isMuted??p,isLoading:k?.isBuffering??P,isBuffering:k?.isBuffering??h,error:k?.actualState?.error??c,buffered:k?.actualState?.buffered??T,isFullscreen:k?.isFullscreen??g,progress:f>0?v/f:0,isTransitioning:a||l,canPlay:!P&&!h&&!c}),[k,r,v,f,I,p,P,h,c,T,g,a,l]);return{mediaRef:t,containerRef:n,state:X,actualState:k?.actualState,controls:z,performanceMetrics:B,isTransitioning:a||l,actions:k,actionState:k,optimisticState:k,isEnhanced:y}}function fe({enabled:e=!0,state:t,controls:n,seekStep:a=10,volumeStep:m=.1}){const l=i=>{if(!e)return;const d=i.target;if(!(d.tagName==="INPUT"||d.tagName==="TEXTAREA"||d.contentEditable==="true"))switch(i.code){case"Space":case"KeyK":i.preventDefault(),n.toggle();break;case"KeyM":i.preventDefault(),n.toggleMute();break;case"KeyF":i.preventDefault(),n.toggleFullscreen();break;case"ArrowLeft":i.preventDefault(),n.seek(Math.max(0,t.currentTime-a));break;case"ArrowRight":i.preventDefault(),n.seek(Math.min(t.duration,t.currentTime+a));break;case"ArrowUp":i.preventDefault(),n.setVolume(Math.min(1,t.volume+m));break;case"ArrowDown":i.preventDefault(),n.setVolume(Math.max(0,t.volume-m));break;case"Digit0":case"Digit1":case"Digit2":case"Digit3":case"Digit4":case"Digit5":case"Digit6":case"Digit7":case"Digit8":case"Digit9":i.preventDefault();const M=parseInt(i.code.replace("Digit",""),10)/10;n.seek(t.duration*M);break;case"Home":i.preventDefault(),n.seek(0);break;case"End":i.preventDefault(),n.seek(t.duration);break}};return s.useEffect(()=>{if(e)return document.addEventListener("keydown",l),()=>{document.removeEventListener("keydown",l)}},[e,l]),{handleKeyDown:l}}const Se=Object.freeze(Object.defineProperty({__proto__:null,useKeyboardControls:fe},Symbol.toStringTag,{value:"Module"}));function ke(e={}){const{maxMemoryUsage:t=100,cleanupInterval:n=3e4,enableGC:a=!0,monitorMemory:m=!0}=e;s.useRef(void 0);const l=s.useRef(new Set),i=s.useRef(new Map),d=s.useRef(new Set),E=s.useRef(new Set),M=s.useCallback(()=>{if(typeof window>"u"||!("memory"in performance))return{used:0,total:0,limit:0};const h=performance.memory;return{used:h.usedJSHeapSize,total:h.totalJSHeapSize,limit:h.jsHeapSizeLimit}},[]),[L,y]=s.useState({used:0,total:0,limit:0,usage:0,isHighUsage:!1}),r=s.useCallback(()=>{d.current.forEach(h=>{clearTimeout(h)}),d.current.clear(),E.current.forEach(h=>{cancelAnimationFrame(h)}),E.current.clear(),l.current.forEach(h=>{h.disconnect()}),l.current.clear(),i.current.forEach((h,c)=>{h.forEach(({event:T,handler:g})=>{c.removeEventListener(T,g)})}),i.current.clear(),typeof window<"u"&&"gc"in window&&window.gc()},[]),v=s.useCallback((h,c)=>{const T=globalThis.setInterval(h,c);return d.current.add(T),()=>{globalThis.clearInterval(T),d.current.delete(T)}},[]);s.useEffect(()=>{if(!m)return;const h=()=>{const c=M(),T=c.used/1024/1024,g=T>t;y({...c,usage:T,isHighUsage:g}),g&&a&&r()};return h(),v(h,n)},[m,M,t,a,n,r]);const f=s.useCallback((h,c,T,g)=>(h.addEventListener(c,T,g),i.current.has(h)||i.current.set(h,[]),i.current.get(h).push({event:c,handler:T}),()=>{h.removeEventListener(c,T);const S=i.current.get(h);if(S){const k=S.findIndex(b=>b.event===c&&b.handler===T);k>-1&&S.splice(k,1),S.length===0&&i.current.delete(h)}}),[]),o=s.useCallback((h,c)=>{const T=globalThis.setTimeout(h,c);return d.current.add(T),()=>{globalThis.clearTimeout(T),d.current.delete(T)}},[]),p=s.useCallback(h=>{const c=globalThis.requestAnimationFrame(h);return E.current.add(c),()=>{globalThis.cancelAnimationFrame(c),E.current.delete(c)}},[]),P=s.useCallback(h=>(l.current.add(h),()=>{h.disconnect(),l.current.delete(h)}),[]);return s.useEffect(()=>()=>{r()},[r]),{memoryStats:L,getMemoryUsage:M,performCleanup:r,addEventListener:f,setInterval:v,setTimeout:o,requestAnimationFrame:p,addObserver:P,formatBytes:h=>{if(h===0)return"0 Bytes";const c=1024,T=["Bytes","KB","MB","GB"],g=Math.floor(Math.log(h)/Math.log(c));return parseFloat((h/Math.pow(c,g)).toFixed(2))+" "+T[g]}}}function he(){const[e,t]=s.useState({isPlaying:!1,currentTime:0,duration:0,volume:1,isMuted:!1,isLoading:!1,isFullscreen:!1,error:null,buffered:null}),n=r=>{t(v=>({...v,...r}))};return{state:e,updateState:n,setPlaying:r=>{n({isPlaying:r})},setCurrentTime:r=>{n({currentTime:r})},setDuration:r=>{n({duration:r})},setVolume:r=>{n({volume:Math.max(0,Math.min(1,r))})},setMuted:r=>{n({isMuted:r})},setLoading:r=>{n({isLoading:r})},setFullscreen:r=>{n({isFullscreen:r})},setError:r=>{n({error:r})},setBuffered:r=>{n({buffered:r})}}}function Me(e,t){if(!Number.isFinite(t))return console.warn(`Attempted to set non-finite currentTime: ${t}`),!1;if(t<0)return console.warn(`Attempted to set negative currentTime: ${t}`),!1;try{return e.currentTime=t,!0}catch(n){return console.error(`Failed to set currentTime to ${t}:`,n),!1}}function pe(e){const t=s.useRef(null),n=s.useRef(null),{state:a,setPlaying:m,setCurrentTime:l,setDuration:i,setVolume:d,setMuted:E,setLoading:M,setFullscreen:L,setError:y,setBuffered:r}=he();s.useEffect(()=>{const u=t.current;u&&(e.volume!==void 0&&(u.volume=e.volume,d(e.volume)),e.muted!==void 0&&(u.muted=e.muted,E(e.muted)),e.autoPlay!==void 0&&(u.autoplay=e.autoPlay),e.loop!==void 0&&(u.loop=e.loop),e.preload!==void 0&&(u.preload=e.preload),e.crossOrigin!==void 0&&(u.crossOrigin=e.crossOrigin))},[e,d,E]);const v=s.useCallback(()=>{m(!0),e.onPlay?.()},[m,e]),f=s.useCallback(()=>{m(!1),e.onPause?.()},[m,e]),o=s.useCallback(()=>{const u=t.current;u&&(l(u.currentTime),e.onTimeUpdate?.(u.currentTime))},[l,e]),p=s.useCallback(()=>{const u=t.current;u&&(i(u.duration),e.onDurationChange?.(u.duration))},[i,e]),P=s.useCallback(()=>{const u=t.current;u&&(d(u.volume),E(u.muted),e.onVolumeChange?.(u.volume))},[d,E,e]),h=s.useCallback(()=>{M(!0),y(null),e.onLoadStart?.()},[M,y,e]),c=s.useCallback(()=>{M(!1),e.onLoadedData?.()},[M,e]),T=s.useCallback(()=>{const u=t.current;if(!u)return;const _=u.error?.message||"An error occurred while loading the media";y(_),M(!1),e.onError?.(_)},[y,M,e]),g=s.useCallback(()=>{m(!1),e.onEnded?.()},[m,e]),S=s.useCallback(()=>{const u=t.current;u&&r(u.buffered)},[r]);s.useEffect(()=>{const u=t.current;if(u)return u.addEventListener("play",v),u.addEventListener("pause",f),u.addEventListener("timeupdate",o),u.addEventListener("durationchange",p),u.addEventListener("volumechange",P),u.addEventListener("loadstart",h),u.addEventListener("loadeddata",c),u.addEventListener("error",T),u.addEventListener("ended",g),u.addEventListener("progress",S),()=>{u.removeEventListener("play",v),u.removeEventListener("pause",f),u.removeEventListener("timeupdate",o),u.removeEventListener("durationchange",p),u.removeEventListener("volumechange",P),u.removeEventListener("loadstart",h),u.removeEventListener("loadeddata",c),u.removeEventListener("error",T),u.removeEventListener("ended",g),u.removeEventListener("progress",S)}},[v,f,o,p,P,h,c,T,g,S]);const k=s.useCallback(async()=>{const u=t.current;if(u)try{await u.play()}catch(_){console.error("Failed to play media:",_),y("Failed to play media")}},[y]),b=s.useCallback(()=>{const u=t.current;u&&u.pause()},[]),B=s.useCallback(()=>{a.isPlaying?b():k()},[a.isPlaying,b,k]),F=s.useCallback(u=>{const _=t.current;if(!_)return;const z=Number.isFinite(_.duration)?_.duration:0;if(z===0){console.warn("Cannot seek: duration is not available");return}const X=Math.max(0,Math.min(u,z));Me(_,X)},[]),I=s.useCallback(u=>{const _=t.current;if(!_)return;const z=Math.max(0,Math.min(1,u));_.volume=z},[]),D=s.useCallback(()=>{const u=t.current;u&&(u.muted=!0)},[]),C=s.useCallback(()=>{const u=t.current;u&&(u.muted=!1)},[]),R=s.useCallback(()=>{const u=t.current;u&&(u.muted=!u.muted)},[]),V=s.useCallback(async()=>{const u=n.current;if(!(!u||!document.fullscreenEnabled))try{await u.requestFullscreen(),L(!0)}catch(_){console.error("Failed to enter fullscreen:",_)}},[L]),N=s.useCallback(async()=>{if(document.fullscreenElement)try{await document.exitFullscreen(),L(!1)}catch(u){console.error("Failed to exit fullscreen:",u)}},[L]),x=s.useCallback(()=>{document.fullscreenElement?N():V()},[N,V]);return s.useEffect(()=>{const u=()=>{L(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",u),()=>{document.removeEventListener("fullscreenchange",u)}},[L]),{state:a,controls:{play:k,pause:b,toggle:B,seek:F,setCurrentTime:F,setVolume:I,mute:D,unmute:C,toggleMute:R,enterFullscreen:V,exitFullscreen:N,toggleFullscreen:x},mediaRef:t,containerRef:n}}const K={mobile:768,desktop:1280};function ie(){if(typeof window>"u")return"unknown";const e=window.navigator.userAgent.toLowerCase();return/iphone|ipad|ipod/.test(e)?"ios":/android/.test(e)?"android":/windows|mac|linux/.test(e)?"desktop":"unknown"}function oe(){return typeof window>"u"?!1:"ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0}function ce(){return typeof window>"u"?!1:"vibrate"in navigator||"vibration"in navigator||"ondevicemotion"in window}function ne(){const[e,t]=j.useState(()=>{if(typeof window>"u")return{isMobile:!1,isTablet:!1,isDesktop:!0,isTouchDevice:!1,platform:"unknown",supportsHaptics:!1,screenSize:{width:1920,height:1080},orientation:"landscape"};const n=window.innerWidth,a=window.innerHeight;return{isMobile:n<K.mobile,isTablet:n>=K.mobile&&n<K.desktop,isDesktop:n>=K.desktop,isTouchDevice:oe(),platform:ie(),supportsHaptics:ce(),screenSize:{width:n,height:a},orientation:n>a?"landscape":"portrait"}});return j.useEffect(()=>{const n=()=>{const i=window.innerWidth,d=window.innerHeight;t({isMobile:i<K.mobile,isTablet:i>=K.mobile&&i<K.desktop,isDesktop:i>=K.desktop,isTouchDevice:oe(),platform:ie(),supportsHaptics:ce(),screenSize:{width:i,height:d},orientation:i>d?"landscape":"portrait"})};window.addEventListener("resize",n),window.addEventListener("orientationchange",n);const a=window.matchMedia(`(max-width: ${K.mobile-1}px)`),m=window.matchMedia(`(min-width: ${K.mobile}px) and (max-width: ${K.desktop-1}px)`),l=window.matchMedia(`(min-width: ${K.desktop}px)`);return a.addEventListener("change",n),m.addEventListener("change",n),l.addEventListener("change",n),()=>{window.removeEventListener("resize",n),window.removeEventListener("orientationchange",n),a.removeEventListener("change",n),m.removeEventListener("change",n),l.removeEventListener("change",n)}},[]),e}function Le(){const{platform:e,isMobile:t}=ne();j.useEffect(()=>{if(t){if(e==="ios"){const n=a=>{a.touches.length>1&&a.preventDefault()};return document.addEventListener("touchstart",n,{passive:!1}),document.body.style.webkitOverflowScrolling="touch",()=>{document.removeEventListener("touchstart",n)}}e==="android"&&(document.body.style.touchAction="manipulation"),document.documentElement.style.setProperty("--webkit-transform","translateZ(0)"),document.documentElement.style.setProperty("--transform","translateZ(0)")}},[e,t])}function Ce(){const{supportsHaptics:e}=ne();return{triggerHaptic:j.useCallback((n="light")=>{if(!e)return;const m={light:[10],medium:[20],heavy:[30],success:[10,10,10],warning:[20,20],error:[50,20,50]}[n];"vibrate"in navigator&&navigator.vibrate(m)},[e]),supportsHaptics:e}}const Pe={enabledGestures:["tap","double-tap","long-press","swipe-left","swipe-right","swipe-up","swipe-down","pinch-in","pinch-out"],tapThreshold:200,doubleTapThreshold:300,longPressThreshold:500,swipeThreshold:50,swipeVelocityThreshold:.5,pinchThreshold:.1,rotationThreshold:15,enableHapticFeedback:!0};function ge(e,t,n={}){const a={...Pe,...n},{isTouchDevice:m}=ne(),{triggerHaptic:l}=Ce(),i=j.useRef({isTracking:!1,touches:[],startTouches:[]}),d=f=>({id:f.identifier,x:f.clientX,y:f.clientY,timestamp:Date.now()}),E=(f,o)=>Math.sqrt(Math.pow(o.x-f.x,2)+Math.pow(o.y-f.y,2)),M=(f,o)=>{const p=Math.max(o.timestamp-f.timestamp,1);return{x:(o.x-f.x)/p,y:(o.y-f.y)/p}},L=(f,o,p,P={})=>({type:f,startPoint:{x:o.x,y:o.y},currentPoint:{x:p.x,y:p.y},duration:p.timestamp-o.timestamp,target:e.current,preventDefault:()=>{},...P}),y=j.useCallback(f=>{if(!a.enabledGestures.length)return;const o=Array.from(f.touches).map(d),p=i.current;p.isTracking=!0,p.touches=o,p.startTouches=[...o],p.longPressTimer&&clearTimeout(p.longPressTimer),o.length===1&&a.enabledGestures.includes("long-press")&&(p.longPressTimer=setTimeout(()=>{if(p.touches.length===1&&o[0]){const P=L("long-press",o[0],o[0]);t(P),a.enableHapticFeedback&&l("heavy")}},a.longPressThreshold)),o.length===2&&o[0]&&o[1]&&(p.initialDistance=E(o[0],o[1]),p.initialScale=1,p.lastScale=1)},[a,t,l]),r=j.useCallback(f=>{const o=i.current;if(!o.isTracking)return;const p=Array.from(f.touches).map(d);if(o.touches=p,p.length===2&&o.initialDistance&&p[0]&&p[1]){const P=E(p[0],p[1]),h=P/o.initialDistance;if(Math.abs(h-(o.lastScale||1))>a.pinchThreshold){const T=h>(o.lastScale||1)?"pinch-out":"pinch-in";if(a.enabledGestures.includes(T)){const g={x:(p[0].x+p[1].x)/2,y:(p[0].y+p[1].y)/2,timestamp:Date.now()},S={x:((o.startTouches[0]?.x??0)+(o.startTouches[1]?.x??0))/2,y:((o.startTouches[0]?.y??0)+(o.startTouches[1]?.y??0))/2,timestamp:o.startTouches[0]?.timestamp??Date.now()},k=L(T,S,g,{scale:h,distance:P});t(k),o.lastScale=h}}}if(o.longPressTimer&&p.length===1&&o.startTouches[0]&&p[0]){const P=o.startTouches[0],h=p[0];E(P,h)>a.swipeThreshold&&(clearTimeout(o.longPressTimer),o.longPressTimer=void 0)}},[a,t]),v=j.useCallback(f=>{const o=i.current;if(!o.isTracking)return;const p=Array.from(f.changedTouches).map(d),P=Date.now();if(o.longPressTimer&&(clearTimeout(o.longPressTimer),o.longPressTimer=void 0),o.startTouches.length===1&&p.length===1&&o.startTouches[0]&&p[0]){const h=o.startTouches[0],c=p[0],T=E(h,c),g=c.timestamp-h.timestamp;if(T>a.swipeThreshold){const S=M(h,c),k=Math.abs(S.x),b=Math.abs(S.y);if(k>a.swipeVelocityThreshold||b>a.swipeVelocityThreshold){let B;if(k>b?B=S.x>0?"swipe-right":"swipe-left":B=S.y>0?"swipe-down":"swipe-up",a.enabledGestures.includes(B)){const F=L(B,h,c,{velocity:S,distance:T});t(F),a.enableHapticFeedback&&l("light")}}}else if(g<a.tapThreshold&&T<a.swipeThreshold)if(o.lastTap&&P-o.lastTap.timestamp<a.doubleTapThreshold&&E({...o.lastTap.point},c)<a.swipeThreshold){if(a.enabledGestures.includes("double-tap")){const S=L("double-tap",h,c);t(S),a.enableHapticFeedback&&l("medium")}o.lastTap=void 0}else{if(a.enabledGestures.includes("tap")){const S=L("tap",h,c);t(S),a.enableHapticFeedback&&l("light")}o.lastTap={timestamp:P,point:{x:c.x,y:c.y}}}}f.touches.length===0&&(o.isTracking=!1,o.touches=[],o.startTouches=[],o.initialDistance=void 0,o.initialScale=void 0,o.lastScale=void 0)},[a,t,l]);return j.useEffect(()=>{const f=e.current;if(!(!f||!m))return f.addEventListener("touchstart",y,{passive:!1}),f.addEventListener("touchmove",r,{passive:!1}),f.addEventListener("touchend",v,{passive:!1}),f.addEventListener("touchcancel",v,{passive:!1}),()=>{f.removeEventListener("touchstart",y),f.removeEventListener("touchmove",r),f.removeEventListener("touchend",v),f.removeEventListener("touchcancel",v)}},[y,r,v,m]),{isGestureEnabled:m&&a.enabledGestures.length>0}}function Fe(e,t){const n=j.useCallback(m=>{const{type:l,distance:i,scale:d}=m;switch(l){case"double-tap":t.onPlayPause?.();break;case"swipe-left":const E=Math.min((i||0)/10,30);t.onSeek?.("backward",E);break;case"swipe-right":const M=Math.min((i||0)/10,30);t.onSeek?.("forward",M);break;case"swipe-up":if(m.startPoint.x>(e.current?.clientWidth||0)/2){const L=Math.min((i||0)/100,.2);t.onVolumeChange?.("up",L)}break;case"swipe-down":if(m.startPoint.x>(e.current?.clientWidth||0)/2){const L=Math.min((i||0)/100,.2);t.onVolumeChange?.("down",L)}break;case"pinch-out":t.onZoom?.(d||1);break;case"pinch-in":t.onZoom?.(d||1);break;case"long-press":t.onToggleFullscreen?.();break}},[t,e]);return ge(e,n,{enabledGestures:["tap","double-tap","long-press","swipe-left","swipe-right","swipe-up","swipe-down","pinch-in","pinch-out"],enableHapticFeedback:!0,swipeThreshold:30,swipeVelocityThreshold:.3})}function ve({subtitleSrc:e,subtitleTracks:t=[],defaultFontSize:n="medium",onLoadError:a}={}){const[m,l]=s.useState(!1),[i,d]=s.useState([]),[E,M]=s.useState(""),[L,y]=s.useState(null),[r,v]=s.useState(n),[f,o]=s.useState(null),[p,P]=s.useState(!1),h={small:"text-sm",medium:"text-base",large:"text-lg"},c=!!(e||t&&t.length>0),T=D=>{const C=D.split(":"),R=C[2]?parseFloat(C[2]):0,V=C[1]?parseInt(C[1],10)*60:0;return(C[0]?parseInt(C[0],10)*3600:0)+V+R},g=D=>{const[C,R]=D.split(","),V=(C||"").split(":"),N=R?parseInt(R,10)/1e3:0,x=V[2]?parseInt(V[2],10):0,Q=V[1]?parseInt(V[1],10)*60:0;return(V[0]?parseInt(V[0],10)*3600:0)+Q+x+N},S=async D=>{P(!0),o(null);try{const C=await fetch(D);if(!C.ok)throw new Error(`Failed to load subtitles: ${C.status} ${C.statusText}`);const R=await C.text(),V=[],N=R.split(`
|
|
2
|
+
`);let x=0;const Q=R.includes("WEBVTT")||D.endsWith(".vtt"),u=D.endsWith(".srt")||/^\d+$/.test(N[0]?.trim()||"");if(Q)for(;x<N.length;){if(N[x]?.includes("-->")){const[_,z]=(N[x]||"").split("-->").map(G=>G.trim()),X=T(_||""),w=T(z||"");x++;let U="";for(;x<N.length&&N[x]?.trim()!=="";)U+=(U?" ":"")+N[x]?.trim(),x++;U&&V.push({start:X,end:w,text:U})}x++}else if(u)for(;x<N.length;){if(/^\d+$/.test(N[x]?.trim()||"")&&(x++,N[x]?.includes("-->"))){const[_,z]=(N[x]||"").split("-->").map(G=>G.trim()),X=g(_||""),w=g(z||"");x++;let U="";for(;x<N.length&&N[x]?.trim()!=="";)U+=(U?" ":"")+N[x]?.trim(),x++;U&&V.push({start:X,end:w,text:U})}x++}else throw new Error("Unsupported subtitle format. Only VTT and SRT are supported.");if(V.length===0)throw new Error("No subtitle cues found in file");d(V),P(!1)}catch(C){const R=C instanceof Error?C:new Error("Failed to load subtitles");console.error("Failed to load subtitles:",R),o(R),P(!1),d([]),a?.(R)}},k=D=>!m||i.length===0?"":i.find(R=>D>=R.start&&D<=R.end)?.text||"",b=()=>{l(D=>{const C=!D;if(C&&!f){if(i.length===0&&!p){const R=e||t[0]?.src;R&&(S(R),t[0]&&y(t[0].id))}}else C||M("");return C})},B=D=>{if(!D){l(!1),y(null),M("");return}const C=t.find(R=>R.id===D);C?.src&&(y(D),S(C.src),l(!0))},F=D=>{v(D)},I={fontSize:h[r],className:`${h[r]} font-medium`};return s.useEffect(()=>{m||M("")},[m]),s.useEffect(()=>{},[]),{subtitlesEnabled:m,currentSubtitle:E,subtitleCues:i,currentTrackId:L,fontSize:r,loadError:f,isLoading:p,hasSubtitles:c,toggleSubtitles:b,selectSubtitleTrack:B,changeSubtitleFontSize:F,setCurrentSubtitle:M,getCurrentSubtitle:k,getSubtitleStyles:I,availableTracks:t}}const De=Object.freeze(Object.defineProperty({__proto__:null,useEnhancedSubtitles:ve},Symbol.toStringTag,{value:"Module"}));function ue(e,t){if(!Number.isFinite(t))return console.warn(`Attempted to set non-finite currentTime: ${t}`),!1;if(t<0)return console.warn(`Attempted to set negative currentTime: ${t}`),!1;try{return e.currentTime=t,!0}catch(n){return console.error(`Failed to set currentTime to ${t}:`,n),!1}}function Re({videoControls:e,toggleSubtitles:t,takeScreenshot:n,duration:a}){const m=l=>{const i=document.querySelector("video");if(i)switch(l.key.toLowerCase()){case" ":case"k":l.preventDefault(),e.togglePlay();break;case"j":l.preventDefault(),e.seekBackward();break;case"l":l.preventDefault(),e.seekForward();break;case"arrowleft":l.preventDefault();const d=Number.isFinite(i.currentTime)?i.currentTime:0,E=Math.max(0,d-5);ue(i,E);break;case"arrowright":l.preventDefault();const M=Number.isFinite(a)&&a>0?a:Number.isFinite(i.duration)?i.duration:0;if(M===0){console.warn("Cannot seek: duration is not available");break}const L=Number.isFinite(i.currentTime)?i.currentTime:0,y=Math.min(M,L+5);ue(i,y);break;case"arrowup":l.preventDefault(),i.volume=Math.min(1,i.volume+.1);break;case"arrowdown":l.preventDefault(),i.volume=Math.max(0,i.volume-.1);break;case"m":l.preventDefault(),e.toggleMute();break;case"f":l.preventDefault(),e.toggleFullscreen();break;case"c":l.preventDefault(),t();break;case"s":l.preventDefault(),n(l.ctrlKey||l.metaKey);break}};s.useEffect(()=>(document.addEventListener("keydown",m),()=>document.removeEventListener("keydown",m)),[m])}function Ae(e,t){const[n,a]=s.useState(!0),[m,l]=s.useState(!1),i=s.useRef(null),d=()=>{a(!0),i.current&&clearTimeout(i.current),e&&!t&&(i.current=setTimeout(()=>{a(!1)},3e3))},E=()=>{d()},M=()=>{a(!0)},L=()=>{e&&a(!1)};return s.useEffect(()=>(d(),()=>{i.current&&clearTimeout(i.current)}),[d]),{controlsVisible:n,showVolumeSlider:m,setShowVolumeSlider:l,handleMouseMove:E,handleMouseEnter:M,handleMouseLeave:L}}function xe(e){return{takeScreenshot:(n=!1)=>{if(!e.current)return;const a=e.current,m=document.createElement("canvas");m.width=a.videoWidth,m.height=a.videoHeight;const l=m.getContext("2d");if(l)try{l.drawImage(a,0,0),m.toBlob(i=>{if(!i){console.error("Failed to create blob from canvas");return}if(n)if(navigator.clipboard&&window.ClipboardItem){const d=new ClipboardItem({"image/png":i});navigator.clipboard.write([d]).catch(E=>{console.error("Failed to copy to clipboard:",E)})}else console.warn("Clipboard API not supported");else{const d=URL.createObjectURL(i),E=document.createElement("a");E.href=d,E.download=`screenshot-${Date.now()}.png`,E.click(),URL.revokeObjectURL(d)}},"image/png")}catch(i){i instanceof Error&&i.message.includes("tainted")?(console.error("Canvas is tainted - video source may not have proper CORS headers. Try setting crossOrigin='anonymous' on the video element."),alert("Screenshot failed: The video source doesn't allow screenshots due to CORS policy. Please ensure the video server includes proper CORS headers or set crossOrigin='anonymous' on the video player.")):(console.error("Screenshot failed:",i),alert("Screenshot failed: "+(i instanceof Error?i.message:"Unknown error")))}}}}function re(e,t){if(!Number.isFinite(t))return console.warn(`Attempted to set non-finite currentTime: ${t}`),!1;if(t<0)return console.warn(`Attempted to set negative currentTime: ${t}`),!1;try{return e.currentTime=t,!0}catch(n){return console.error(`Failed to set currentTime to ${t}:`,n),!1}}function Oe(e){const t=s.useRef(null),[n,a]=s.useState({isPlaying:!1,currentTime:0,duration:0,volume:1,isMuted:!1,isFullscreen:!1,isLoading:!0,isSeeking:!1,isBuffering:!1,bufferedRanges:[]});return s.useEffect(()=>{const r=t.current;if(!r)return;const v=()=>{a(F=>({...F,currentTime:r.currentTime}))},f=()=>{a(F=>({...F,duration:r.duration}))},o=()=>{a(F=>({...F,isPlaying:!0,isBuffering:!1}))},p=()=>{a(F=>({...F,isPlaying:!1}))},P=()=>{a(F=>({...F,volume:r.volume,isMuted:r.muted}))},h=()=>{a(F=>({...F,isLoading:!0}))},c=()=>{a(F=>({...F,isLoading:!1}))},T=()=>{a(F=>({...F,isSeeking:!0}))},g=()=>{a(F=>({...F,isSeeking:!1}))},S=()=>{a(F=>({...F,isBuffering:!0}))},k=()=>{a(F=>({...F,isBuffering:!1,isLoading:!1}))},b=()=>{a(F=>({...F,isLoading:!1,isBuffering:!1}))},B=()=>{if(!r.buffered||r.buffered.length===0||r.duration===0){a(I=>({...I,bufferedRanges:[]}));return}const F=[];for(let I=0;I<r.buffered.length;I++){const D=r.buffered.start(I),C=r.buffered.end(I);F.push({start:D,end:C,percentage:(C-D)/r.duration*100})}a(I=>({...I,bufferedRanges:F}))};return r.addEventListener("timeupdate",v),r.addEventListener("loadedmetadata",f),r.addEventListener("play",o),r.addEventListener("pause",p),r.addEventListener("volumechange",P),r.addEventListener("loadstart",h),r.addEventListener("loadeddata",c),r.addEventListener("seeking",T),r.addEventListener("seeked",g),r.addEventListener("waiting",S),r.addEventListener("playing",k),r.addEventListener("canplay",b),r.addEventListener("progress",B),()=>{r.removeEventListener("timeupdate",v),r.removeEventListener("loadedmetadata",f),r.removeEventListener("play",o),r.removeEventListener("pause",p),r.removeEventListener("volumechange",P),r.removeEventListener("loadstart",h),r.removeEventListener("loadeddata",c),r.removeEventListener("seeking",T),r.removeEventListener("seeked",g),r.removeEventListener("waiting",S),r.removeEventListener("playing",k),r.removeEventListener("canplay",b),r.removeEventListener("progress",B)}},[]),{videoRef:t,state:n,controls:{togglePlay:()=>{const r=t.current;r&&(n.isPlaying?r.pause():r.play())},seekForward:(r=10)=>{const v=t.current;if(!v)return;const f=Number.isFinite(v.duration)?v.duration:Number.isFinite(n.duration)?n.duration:0;if(f===0){console.warn("Cannot seek forward: duration is not available");return}const o=Number.isFinite(v.currentTime)?v.currentTime:0,p=Math.min(f,o+r);re(v,p)},seekBackward:(r=10)=>{const v=t.current;if(!v)return;const f=Number.isFinite(v.currentTime)?v.currentTime:0,o=Math.max(0,f-r);re(v,o)},toggleMute:()=>{const r=t.current;r&&(r.muted=!n.isMuted)},setVolume:r=>{const v=t.current;v&&(v.volume=r,r>0&&n.isMuted&&(v.muted=!1))},toggleFullscreen:()=>{const r=e.current;r&&(n.isFullscreen?document.exitFullscreen&&document.exitFullscreen():r.requestFullscreen&&r.requestFullscreen(),a(v=>({...v,isFullscreen:!v.isFullscreen})))},seekTo:r=>{const v=t.current;if(!v)return;const f=Number.isFinite(v.duration)?v.duration:Number.isFinite(n.duration)?n.duration:0;if(f===0){console.warn("Cannot seek: duration is not available");return}const o=Math.max(0,Math.min(f,r));re(v,o)}}}}const Ie=(e,t={})=>{const{trackUserBehavior:n=!0,adaptToNetwork:a=!0,strategy:m="balanced",maxPreloadItems:l=3,preloadRadius:i=2}=t,d=s.useRef({mouseMovements:0,scrollEvents:0,keyPresses:0,focusEvents:0,timeOnPage:0,engagementScore:0,lastInteraction:Date.now()}),E=s.useRef(null),M=s.useRef(new Set),L=s.useRef([]),y=s.useCallback(()=>{const c=d.current,T=Math.min(c.timeOnPage/6e4,1),g=Math.min((c.mouseMovements+c.scrollEvents+c.keyPresses)/100,1);return(T*.4+g*.6)*100},[]),r=s.useCallback((c,T=1)=>{const g=d.current;g[c]=typeof g[c]=="number"?g[c]+T:Date.now(),g.engagementScore=y(),g.lastInteraction=Date.now()},[y]),v=s.useCallback(()=>{if(!E.current||!a)return{type:"unknown",downlink:10,effectiveType:"4g",saveData:!1};const c=E.current;return{type:c.type,downlink:c.downlink||10,effectiveType:c.effectiveType||"4g",saveData:c.saveData||!1,rtt:c.rtt||100}},[a]),f=s.useCallback((c,T,g=0)=>{if(M.current.has(c.src))return{shouldPreload:!1,priority:"low",reason:"Already preloaded"};const S=Math.abs(T-g);if(S>i)return{shouldPreload:!1,priority:"low",reason:"Outside preload radius"};const k=d.current,b=v(),B=k.engagementScore,F=Date.now()-k.lastInteraction;if(b.saveData)return{shouldPreload:!1,priority:"low",reason:"Data saver mode"};let I=!1,D="medium",C="";switch(m){case"conservative":I=B>70&&b.effectiveType!=="2g"&&S===1,D=I?"medium":"low",C=I?"High engagement and optimal network":"Conservative strategy";break;case"aggressive":I=B>30&&b.effectiveType!=="slow-2g",D=B>70?"high":B>50?"medium":"low",C=I?"Aggressive preloading":"Low engagement";break;case"balanced":default:const R=b.effectiveType==="4g"?1:b.effectiveType==="3g"?.7:.3,V=B*R;I=V>40&&S<=2,D=V>70?"high":V>55?"medium":"low",C=I?`Balanced: score ${V.toFixed(1)}`:"Low adjusted score";break}if(I){const R=c.type;(R==="hls"||R==="m3u8"||R==="application/x-mpegURL")&&(D=D==="low"?"medium":"high"),F<5e3&&(D="high",C+=" + Recent interaction"),(R==="mp4"||R==="webm"||R==="video/mp4"||R==="video/webm")&&(D=D==="low"?"medium":D)}return{shouldPreload:I,priority:D,reason:C}},[m,i,v,y]),o=s.useCallback(async(c,T)=>{try{const g=document.createElement("link");switch(g.rel="preload",g.href=c.src,c.type){case"hls":case"m3u8":case"application/x-mpegURL":g.as="fetch";break;case"mp4":case"webm":case"video/mp4":case"video/webm":g.as="video";break;case"mp3":case"wav":case"ogg":case"audio/mpeg":case"audio/wav":case"audio/ogg":g.as="audio";break;default:g.as="fetch"}g.crossOrigin="anonymous",document.head.appendChild(g),M.current.add(c.src),console.debug(`Preloaded: ${c.src} (${T})`),setTimeout(()=>{document.head.contains(g)&&document.head.removeChild(g)},3e4)}catch(g){console.warn("Failed to preload source:",c.src,g)}},[]),p=s.useCallback(()=>{if(L.current.length===0)return;const T=[...L.current].sort((g,S)=>S.priority-g.priority).slice(0,l);L.current=[],T.forEach(({source:g,priority:S})=>{o(g,S)})},[l,o]),P=s.useCallback((c=0)=>{L.current=[],e.forEach((T,g)=>{const S=f(T,g,c);if(S.shouldPreload){const k=S.priority==="high"?3:S.priority==="medium"?2:1;L.current.push({source:T,priority:k})}}),p()},[e,f,p]);return s.useEffect(()=>{if(!n)return;const c=()=>r("mouseMovements"),T=()=>r("scrollEvents"),g=()=>r("keyPresses"),S=()=>r("focusEvents");document.addEventListener("mousemove",c,{passive:!0}),document.addEventListener("scroll",T,{passive:!0}),document.addEventListener("keydown",g,{passive:!0}),document.addEventListener("focusin",S,{passive:!0});const k=setInterval(()=>{r("timeOnPage",1)},1e3);return()=>{document.removeEventListener("mousemove",c),document.removeEventListener("scroll",T),document.removeEventListener("keydown",g),document.removeEventListener("focusin",S),clearInterval(k)}},[n,r]),s.useEffect(()=>{if(!a||!("connection"in navigator))return;const c=navigator.connection;E.current=c;const T=()=>{P()};return c.addEventListener("change",T),()=>{c.removeEventListener("change",T)}},[a,P]),s.useEffect(()=>{P()},[P]),s.useMemo(()=>({preloadAtIndex:c=>{P(c)},getUserBehavior:()=>({...d.current}),getNetworkConditions:v,clearCache:()=>{M.current.clear()},getStats:()=>({preloadedItems:M.current.size,engagementScore:d.current.engagementScore,queueLength:L.current.length,maxPreloadItems:l})}),[P,v,l])};function Te(e){const[t,n]=s.useState(!1),[a,m]=s.useState([]),[l,i]=s.useState(""),d=y=>{const r=y.split(":"),v=r[2]?parseFloat(r[2]):0,f=r[1]?parseInt(r[1],10)*60:0;return(r[0]?parseInt(r[0],10)*3600:0)+f+v},E=async y=>{try{const v=await(await fetch(y)).text(),f=[],o=v.split(`
|
|
3
|
+
`);let p=0;for(;p<o.length;){if(o[p]?.includes("-->")){const[P,h]=(o[p]||"").split("-->").map(S=>S.trim()),c=d(P||""),T=d(h||"");p++;let g="";for(;p<o.length&&o[p]?.trim()!=="";)g+=(g?" ":"")+o[p]?.trim(),p++;g&&f.push({start:c,end:T,text:g})}p++}m(f)}catch(r){console.error("Failed to load subtitles:",r)}},M=y=>!t||a.length===0?"":a.find(v=>y>=v.start&&y<=v.end)?.text||"",L=()=>{n(y=>{const r=!y;return r&&e&&a.length===0?E(e):r||i(""),r})};return s.useEffect(()=>{t||i("")},[t]),{subtitlesEnabled:t,currentSubtitle:l,toggleSubtitles:L,getCurrentSubtitle:M,setCurrentSubtitle:i}}function Ve(e){return le.showDeprecationWarning("useVideoPlayer","useMediaPlayer (the primary media player hook)"),pe(e)}function Ue(e){return le.showDeprecationWarning("useEnhancedSubtitles","useSubtitles (the current subtitle hook)"),Te(e)}exports.useDeviceInfo=ne;exports.useEnhancedMediaPlayer=Ee;exports.useEnhancedSubtitles=ve;exports.useEnhancedSubtitles$1=Ue;exports.useEnhancedSubtitles$2=De;exports.useIntelligentPreloading=Ie;exports.useKeyboardControls=fe;exports.useKeyboardControls$1=Se;exports.useKeyboardShortcuts=Re;exports.useMediaActionState=de;exports.useMediaActions=me;exports.useMediaControls=Ae;exports.useMediaGestures=Fe;exports.useMediaPlayer=pe;exports.useMediaState=he;exports.useMemoryOptimization=ke;exports.useMobileOptimizations=Le;exports.useScreenshot=xe;exports.useSubtitles=Te;exports.useTouchGestures=ge;exports.useVideoPlayer=Oe;exports.useVideoPlayer$1=Ve;
|
|
4
|
+
//# sourceMappingURL=hooks-BXwI8QG6.cjs.map
|