@therealtinhtute/baroiplayer 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/package.json +1 -1
- package/dist/src/components/media-player-error.tsx +2 -2
- package/dist/src/components/media-player-fullscreen.tsx +2 -2
- package/dist/src/components/media-player-play.tsx +2 -2
- package/dist/src/components/media-player-seek.tsx +1 -1
- package/dist/src/components/media-player-tooltip.tsx +1 -1
- package/dist/src/components/media-player-volume.tsx +3 -3
- package/dist/src/components/react-player-wrapper.tsx +5 -5
- package/dist/src/hooks/use-touch-gestures.ts +1 -1
- package/package.json +1 -1
- package/src/components/media-player-error.tsx +2 -2
- package/src/components/media-player-fullscreen.tsx +2 -2
- package/src/components/media-player-play.tsx +2 -2
- package/src/components/media-player-seek.tsx +1 -1
- package/src/components/media-player-tooltip.tsx +1 -1
- package/src/components/media-player-volume.tsx +3 -3
- package/src/components/react-player-wrapper.tsx +5 -5
- package/src/hooks/use-touch-gestures.ts +1 -1
- package/dist/context/media.js +0 -2
- package/dist/context/media.js.map +0 -1
- package/dist/context/media.mjs +0 -15
- package/dist/context/media.mjs.map +0 -1
- package/dist/context/store.js +0 -2
- package/dist/context/store.js.map +0 -1
- package/dist/context/store.mjs +0 -5
- package/dist/context/store.mjs.map +0 -1
- package/dist/context-Af84FynT.js +0 -1179
- package/dist/context-Af84FynT.js.map +0 -1
- package/dist/context-CwZnPdz0.cjs +0 -23
- package/dist/context-CwZnPdz0.cjs.map +0 -1
- package/dist/core-events-B5W_j8yU.js +0 -480
- package/dist/core-events-B5W_j8yU.js.map +0 -1
- package/dist/core-events-CN0-Vhhq.cjs +0 -2
- package/dist/core-events-CN0-Vhhq.cjs.map +0 -1
- package/dist/core-plugins-Bq9KLany.js +0 -696
- package/dist/core-plugins-Bq9KLany.js.map +0 -1
- package/dist/core-plugins-CPDSHMiQ.cjs +0 -2
- package/dist/core-plugins-CPDSHMiQ.cjs.map +0 -1
- package/dist/core.js +0 -37
- package/dist/core.js.map +0 -1
- package/dist/core.mjs +0 -1217
- package/dist/core.mjs.map +0 -1
- package/dist/enhanced-components-CXnYiOt6.cjs +0 -2
- package/dist/enhanced-components-CXnYiOt6.cjs.map +0 -1
- package/dist/enhanced-components-Da0TSvKe.js +0 -1073
- package/dist/enhanced-components-Da0TSvKe.js.map +0 -1
- package/dist/hooks-BCMilGRf.cjs +0 -4
- package/dist/hooks-BCMilGRf.cjs.map +0 -1
- package/dist/hooks-BPtHV1ZT.js +0 -2042
- package/dist/hooks-BPtHV1ZT.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/minimal-components-BHJMuaL7.cjs +0 -2
- package/dist/minimal-components-BHJMuaL7.cjs.map +0 -1
- package/dist/minimal-components-BmqRefl1.js +0 -2002
- package/dist/minimal-components-BmqRefl1.js.map +0 -1
- package/dist/mona-loading.gif +0 -0
- package/dist/performance-monitor--rzKTlbj.js +0 -302
- package/dist/performance-monitor--rzKTlbj.js.map +0 -1
- package/dist/performance-monitor-cjIvZE2D.cjs +0 -2
- package/dist/performance-monitor-cjIvZE2D.cjs.map +0 -1
- package/dist/src/adapters/videojs-adapter.d.ts.map +0 -1
- package/dist/src/adapters/videojs-adapter.js +0 -350
- package/dist/src/assets/mona-loading.gif +0 -0
- package/dist/src/components/AnimateLoading.d.ts.map +0 -1
- package/dist/src/components/AnimateLoading.js +0 -41
- package/dist/src/components/LoadingState.d.ts.map +0 -1
- package/dist/src/components/LoadingState.js +0 -111
- package/dist/src/components/accessibility/keyboard-help-overlay.d.ts.map +0 -1
- package/dist/src/components/accessibility/keyboard-help-overlay.js +0 -90
- package/dist/src/components/audio-player.d.ts.map +0 -1
- package/dist/src/components/audio-player.js +0 -31
- package/dist/src/components/basic/index.d.ts.map +0 -1
- package/dist/src/components/basic/index.js +0 -29
- package/dist/src/components/enhanced/advanced-features.d.ts.map +0 -1
- package/dist/src/components/enhanced/advanced-features.js +0 -64
- package/dist/src/components/enhanced/debug-panel.d.ts.map +0 -1
- package/dist/src/components/enhanced/debug-panel.js +0 -94
- package/dist/src/components/enhanced/enhanced-controls.d.ts.map +0 -1
- package/dist/src/components/enhanced/enhanced-controls.js +0 -233
- package/dist/src/components/enhanced/enhanced-media-player.d.ts.map +0 -1
- package/dist/src/components/enhanced/enhanced-media-player.js +0 -316
- package/dist/src/components/enhanced/error-handling.d.ts.map +0 -1
- package/dist/src/components/enhanced/error-handling.js +0 -153
- package/dist/src/components/enhanced/index.d.ts.map +0 -1
- package/dist/src/components/enhanced/index.js +0 -10
- package/dist/src/components/enhanced/media-player-enhanced.d.ts.map +0 -1
- package/dist/src/components/enhanced/media-player-enhanced.js +0 -250
- package/dist/src/components/examples/basic-video-player.d.ts.map +0 -1
- package/dist/src/components/examples/basic-video-player.js +0 -16
- package/dist/src/components/examples/custom-controls-example.d.ts.map +0 -1
- package/dist/src/components/examples/custom-controls-example.js +0 -12
- package/dist/src/components/examples/enhanced-controls-example.d.ts.map +0 -1
- package/dist/src/components/examples/enhanced-controls-example.js +0 -18
- package/dist/src/components/examples/enhanced-media-player-example.d.ts.map +0 -1
- package/dist/src/components/examples/enhanced-media-player-example.js +0 -13
- package/dist/src/components/examples/loading-states-demo.d.ts.map +0 -1
- package/dist/src/components/examples/loading-states-demo.js +0 -41
- package/dist/src/components/examples/react-19-demo.d.ts.map +0 -1
- package/dist/src/components/examples/react-19-demo.js +0 -104
- package/dist/src/components/examples/volume-orientation-demo.d.ts.map +0 -1
- package/dist/src/components/examples/volume-orientation-demo.js +0 -31
- package/dist/src/components/icon-demo.d.ts.map +0 -1
- package/dist/src/components/icon-demo.js +0 -16
- package/dist/src/components/icons/index.d.ts.map +0 -1
- package/dist/src/components/icons/index.js +0 -59
- package/dist/src/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/ArrowLeftIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/ArrowRightIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/ArrowRightIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/AudioIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/AudioIcon.js +0 -4
- package/dist/src/components/icons/svg-icons/BackwardIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/BackwardIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/CameraIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/CameraIcon.js +0 -4
- package/dist/src/components/icons/svg-icons/CheckIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/CheckIcon.js +0 -4
- package/dist/src/components/icons/svg-icons/EnablePiPIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/EnablePiPIcon.js +0 -5
- package/dist/src/components/icons/svg-icons/ForwardIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/ForwardIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/FullscreenExitIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/LoadingIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/LoadingIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/PauseIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/PauseIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/PlayIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/PlayIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/QualityIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/QualityIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/SettingsIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/SettingsIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/SliderIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/SliderIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/SubtitleIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/SubtitleIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/SubtitleOffIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/UnPiPIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/UnPiPIcon.js +0 -5
- package/dist/src/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/VolumeMutedIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/VolumeOneIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/VolumeOneIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/VolumeThreeIcon.js +0 -3
- package/dist/src/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +0 -1
- package/dist/src/components/icons/svg-icons/VolumeTwoIcon.js +0 -3
- package/dist/src/components/legacy.d.ts.map +0 -1
- package/dist/src/components/legacy.js +0 -52
- package/dist/src/components/media-metadata-display.d.ts.map +0 -1
- package/dist/src/components/media-metadata-display.js +0 -20
- package/dist/src/components/media-player-audio.d.ts.map +0 -1
- package/dist/src/components/media-player-audio.js +0 -18
- package/dist/src/components/media-player-controls.d.ts.map +0 -1
- package/dist/src/components/media-player-controls.js +0 -150
- package/dist/src/components/media-player-error.d.ts.map +0 -1
- package/dist/src/components/media-player-error.js +0 -85
- package/dist/src/components/media-player-fullscreen.d.ts.map +0 -1
- package/dist/src/components/media-player-fullscreen.js +0 -68
- package/dist/src/components/media-player-hls.d.ts.map +0 -1
- package/dist/src/components/media-player-hls.js +0 -20
- package/dist/src/components/media-player-loading.d.ts.map +0 -1
- package/dist/src/components/media-player-loading.js +0 -53
- package/dist/src/components/media-player-play.d.ts.map +0 -1
- package/dist/src/components/media-player-play.js +0 -44
- package/dist/src/components/media-player-root.d.ts.map +0 -1
- package/dist/src/components/media-player-root.js +0 -243
- package/dist/src/components/media-player-seek.d.ts.map +0 -1
- package/dist/src/components/media-player-seek.js +0 -92
- package/dist/src/components/media-player-time.d.ts.map +0 -1
- package/dist/src/components/media-player-time.js +0 -57
- package/dist/src/components/media-player-tooltip.d.ts.map +0 -1
- package/dist/src/components/media-player-tooltip.js +0 -14
- package/dist/src/components/media-player-video.d.ts.map +0 -1
- package/dist/src/components/media-player-video.js +0 -18
- package/dist/src/components/media-player-volume.d.ts.map +0 -1
- package/dist/src/components/media-player-volume.js +0 -88
- package/dist/src/components/media-player.d.ts.map +0 -1
- package/dist/src/components/media-player.js +0 -67
- package/dist/src/components/media-suspense.d.ts.map +0 -1
- package/dist/src/components/media-suspense.js +0 -173
- package/dist/src/components/player-settings-form.d.ts.map +0 -1
- package/dist/src/components/player-settings-form.js +0 -46
- package/dist/src/components/react-player-wrapper.d.ts.map +0 -1
- package/dist/src/components/react-player-wrapper.js +0 -163
- package/dist/src/components/simple-video-player.d.ts.map +0 -1
- package/dist/src/components/simple-video-player.js +0 -41
- package/dist/src/components/ui/enhanced-seek-bar.d.ts.map +0 -1
- package/dist/src/components/ui/enhanced-seek-bar.js +0 -112
- package/dist/src/components/ui/fullscreen-button.d.ts.map +0 -1
- package/dist/src/components/ui/fullscreen-button.js +0 -21
- package/dist/src/components/ui/media-resource-preloader.d.ts.map +0 -1
- package/dist/src/components/ui/media-resource-preloader.js +0 -295
- package/dist/src/components/ui/play-button.d.ts.map +0 -1
- package/dist/src/components/ui/play-button.js +0 -26
- package/dist/src/components/ui/seek-bar.d.ts.map +0 -1
- package/dist/src/components/ui/seek-bar.js +0 -54
- package/dist/src/components/ui/time-display.d.ts.map +0 -1
- package/dist/src/components/ui/time-display.js +0 -18
- package/dist/src/components/ui/volume-control.d.ts.map +0 -1
- package/dist/src/components/ui/volume-control.js +0 -71
- package/dist/src/components/unified/base-media-player.d.ts.map +0 -1
- package/dist/src/components/unified/base-media-player.js +0 -104
- package/dist/src/components/unified/media-player.d.ts.map +0 -1
- package/dist/src/components/unified/media-player.js +0 -41
- package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.js +0 -322
- package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.js +0 -280
- package/dist/src/components/variants/minimal/MinimalControls.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/MinimalControls.js +0 -19
- package/dist/src/components/variants/minimal/MinimalLoading.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/MinimalLoading.js +0 -6
- package/dist/src/components/variants/minimal/MinimalMediaPlayer.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/MinimalMediaPlayer.js +0 -135
- package/dist/src/components/variants/minimal/MinimalOverlay.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/MinimalOverlay.js +0 -15
- package/dist/src/components/variants/minimal/MinimalPlayButton.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/MinimalPlayButton.js +0 -29
- package/dist/src/components/variants/minimal/MinimalSeekBar.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/MinimalSeekBar.js +0 -73
- package/dist/src/components/variants/minimal/MinimalVolumeControl.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/MinimalVolumeControl.js +0 -29
- package/dist/src/components/variants/minimal/SimpleMinimalPlayer.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/SimpleMinimalPlayer.js +0 -51
- package/dist/src/components/variants/minimal/components/CenterPlayButton.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/CenterPlayButton.js +0 -8
- package/dist/src/components/variants/minimal/components/ControlBar.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/ControlBar.js +0 -10
- package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.js +0 -68
- package/dist/src/components/variants/minimal/components/PlaybackControls.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/PlaybackControls.js +0 -9
- package/dist/src/components/variants/minimal/components/RightControls.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/RightControls.js +0 -40
- package/dist/src/components/variants/minimal/components/SeekBar.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/SeekBar.js +0 -43
- package/dist/src/components/variants/minimal/components/SettingsDropdown.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/SettingsDropdown.js +0 -18
- package/dist/src/components/variants/minimal/components/SubtitleDisplay.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/SubtitleDisplay.js +0 -6
- package/dist/src/components/variants/minimal/components/TimeDisplay.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/TimeDisplay.js +0 -5
- package/dist/src/components/variants/minimal/components/VideoElement.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/VideoElement.js +0 -4
- package/dist/src/components/variants/minimal/components/VolumeControl.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/components/VolumeControl.js +0 -99
- package/dist/src/components/variants/minimal/index.d.ts.map +0 -1
- package/dist/src/components/variants/minimal/index.js +0 -8
- package/dist/src/components/video-player.d.ts.map +0 -1
- package/dist/src/components/video-player.js +0 -38
- package/dist/src/context/error-handling.d.ts.map +0 -1
- package/dist/src/context/error-handling.js +0 -300
- package/dist/src/context/media-context.d.ts.map +0 -1
- package/dist/src/context/media-context.js +0 -121
- package/dist/src/context/media-provider.d.ts.map +0 -1
- package/dist/src/context/media-provider.js +0 -164
- package/dist/src/context/media-store.d.ts.map +0 -1
- package/dist/src/context/media-store.js +0 -273
- package/dist/src/context/persistence.d.ts.map +0 -1
- package/dist/src/context/persistence.js +0 -356
- package/dist/src/core/events/event-system.d.ts.map +0 -1
- package/dist/src/core/events/event-system.js +0 -288
- package/dist/src/core/events/hooks.d.ts.map +0 -1
- package/dist/src/core/events/hooks.js +0 -198
- package/dist/src/core/events/index.d.ts.map +0 -1
- package/dist/src/core/events/index.js +0 -7
- package/dist/src/core/events/middleware.d.ts.map +0 -1
- package/dist/src/core/events/middleware.js +0 -219
- package/dist/src/core/index.d.ts.map +0 -1
- package/dist/src/core/index.js +0 -15
- package/dist/src/core/optimization/bundle-optimizer.d.ts.map +0 -1
- package/dist/src/core/optimization/bundle-optimizer.js +0 -217
- package/dist/src/core/performance/cicd.d.ts.map +0 -1
- package/dist/src/core/performance/cicd.js +0 -83
- package/dist/src/core/performance/index.d.ts.map +0 -1
- package/dist/src/core/performance/index.js +0 -14
- package/dist/src/core/performance/media-loading-optimizer.d.ts.map +0 -1
- package/dist/src/core/performance/media-loading-optimizer.js +0 -404
- package/dist/src/core/performance/performance-budgets.d.ts.map +0 -1
- package/dist/src/core/performance/performance-budgets.js +0 -326
- package/dist/src/core/performance/performance-monitor.d.ts.map +0 -1
- package/dist/src/core/performance/performance-monitor.js +0 -297
- package/dist/src/core/performance/performance-testing.d.ts.map +0 -1
- package/dist/src/core/performance/performance-testing.js +0 -314
- package/dist/src/core/plugins/base-plugin.d.ts.map +0 -1
- package/dist/src/core/plugins/base-plugin.js +0 -151
- package/dist/src/core/plugins/enhanced-plugin-system.d.ts.map +0 -1
- package/dist/src/core/plugins/enhanced-plugin-system.js +0 -305
- package/dist/src/core/plugins/examples/analytics-plugin.d.ts.map +0 -1
- package/dist/src/core/plugins/examples/analytics-plugin.js +0 -191
- package/dist/src/core/plugins/index.d.ts.map +0 -1
- package/dist/src/core/plugins/index.js +0 -9
- package/dist/src/core/plugins/registry.d.ts.map +0 -1
- package/dist/src/core/plugins/registry.js +0 -261
- package/dist/src/core/plugins/types.d.ts.map +0 -1
- package/dist/src/core/plugins/types.js +0 -31
- package/dist/src/core/plugins/utils.d.ts.map +0 -1
- package/dist/src/core/plugins/utils.js +0 -274
- package/dist/src/core/progressive-loading.d.ts.map +0 -1
- package/dist/src/core/progressive-loading.js +0 -239
- package/dist/src/core/providers/enhanced-hls-provider.d.ts.map +0 -1
- package/dist/src/core/providers/enhanced-hls-provider.js +0 -273
- package/dist/src/core/providers/service-provider.d.ts.map +0 -1
- package/dist/src/core/providers/service-provider.js +0 -105
- package/dist/src/core/utils.d.ts.map +0 -1
- package/dist/src/core/utils.js +0 -21
- package/dist/src/features/media-session/media-session-manager.d.ts.map +0 -1
- package/dist/src/features/media-session/media-session-manager.js +0 -331
- package/dist/src/features/picture-in-picture/pip-manager.d.ts.map +0 -1
- package/dist/src/features/picture-in-picture/pip-manager.js +0 -353
- package/dist/src/features/playlist/playlist-manager.d.ts.map +0 -1
- package/dist/src/features/playlist/playlist-manager.js +0 -475
- package/dist/src/features/subtitles/subtitle-manager.d.ts.map +0 -1
- package/dist/src/features/subtitles/subtitle-manager.js +0 -335
- package/dist/src/features/subtitles/subtitle-parser.d.ts.map +0 -1
- package/dist/src/features/subtitles/subtitle-parser.js +0 -217
- package/dist/src/features/thumbnails/thumbnail-generator.d.ts.map +0 -1
- package/dist/src/features/thumbnails/thumbnail-generator.js +0 -388
- package/dist/src/hooks/accessibility/index.d.ts.map +0 -1
- package/dist/src/hooks/accessibility/index.js +0 -4
- package/dist/src/hooks/accessibility/use-accessibility-preferences.d.ts.map +0 -1
- package/dist/src/hooks/accessibility/use-accessibility-preferences.js +0 -156
- package/dist/src/hooks/accessibility/use-focus-management.d.ts.map +0 -1
- package/dist/src/hooks/accessibility/use-focus-management.js +0 -142
- package/dist/src/hooks/accessibility/use-keyboard-shortcuts.d.ts.map +0 -1
- package/dist/src/hooks/accessibility/use-keyboard-shortcuts.js +0 -101
- package/dist/src/hooks/accessibility/use-screen-reader.d.ts.map +0 -1
- package/dist/src/hooks/accessibility/use-screen-reader.js +0 -148
- package/dist/src/hooks/core/index.d.ts.map +0 -1
- package/dist/src/hooks/core/index.js +0 -19
- package/dist/src/hooks/legacy.d.ts.map +0 -1
- package/dist/src/hooks/legacy.js +0 -17
- package/dist/src/hooks/use-enhanced-media-player.d.ts.map +0 -1
- package/dist/src/hooks/use-enhanced-media-player.js +0 -395
- package/dist/src/hooks/use-intelligent-preloading.d.ts.map +0 -1
- package/dist/src/hooks/use-intelligent-preloading.js +0 -258
- package/dist/src/hooks/use-keyboard-controls.d.ts.map +0 -1
- package/dist/src/hooks/use-keyboard-controls.js +0 -83
- package/dist/src/hooks/use-media-actions.d.ts.map +0 -1
- package/dist/src/hooks/use-media-actions.js +0 -121
- package/dist/src/hooks/use-media-metadata.d.ts.map +0 -1
- package/dist/src/hooks/use-media-metadata.js +0 -74
- package/dist/src/hooks/use-media-optimistic.d.ts.map +0 -1
- package/dist/src/hooks/use-media-optimistic.js +0 -205
- package/dist/src/hooks/use-media-player.d.ts.map +0 -1
- package/dist/src/hooks/use-media-player.js +0 -251
- package/dist/src/hooks/use-media-state.d.ts.map +0 -1
- package/dist/src/hooks/use-media-state.js +0 -162
- package/dist/src/hooks/use-memory-optimization.d.ts.map +0 -1
- package/dist/src/hooks/use-memory-optimization.js +0 -288
- package/dist/src/hooks/use-optimistic-controls.d.ts.map +0 -1
- package/dist/src/hooks/use-optimistic-controls.js +0 -60
- package/dist/src/hooks/use-optimized-media.d.ts.map +0 -1
- package/dist/src/hooks/use-optimized-media.js +0 -211
- package/dist/src/hooks/use-touch-gestures.d.ts.map +0 -1
- package/dist/src/hooks/use-touch-gestures.js +0 -289
- package/dist/src/hooks/useEnhancedSubtitles.d.ts.map +0 -1
- package/dist/src/hooks/useEnhancedSubtitles.js +0 -205
- package/dist/src/hooks/useKeyboardShortcuts.d.ts.map +0 -1
- package/dist/src/hooks/useKeyboardShortcuts.js +0 -59
- package/dist/src/hooks/useMediaControls.d.ts.map +0 -1
- package/dist/src/hooks/useMediaControls.js +0 -44
- package/dist/src/hooks/useScreenshot.d.ts.map +0 -1
- package/dist/src/hooks/useScreenshot.js +0 -56
- package/dist/src/hooks/useSubtitles.d.ts.map +0 -1
- package/dist/src/hooks/useSubtitles.js +0 -73
- package/dist/src/hooks/useVideoPlayer.d.ts.map +0 -1
- package/dist/src/hooks/useVideoPlayer.js +0 -184
- package/dist/src/icons/components/FullscreenIcon.d.ts.map +0 -1
- package/dist/src/icons/components/FullscreenIcon.js +0 -11
- package/dist/src/icons/components/SettingsIcon.d.ts.map +0 -1
- package/dist/src/icons/components/SettingsIcon.js +0 -11
- package/dist/src/icons/components/animated/LoadingIcon.d.ts.map +0 -1
- package/dist/src/icons/components/animated/LoadingIcon.js +0 -11
- package/dist/src/icons/components/animated/PlayPauseIcon.d.ts.map +0 -1
- package/dist/src/icons/components/animated/PlayPauseIcon.js +0 -9
- package/dist/src/icons/components/media/PauseIcon.d.ts.map +0 -1
- package/dist/src/icons/components/media/PauseIcon.js +0 -12
- package/dist/src/icons/components/media/PlayIcon.d.ts.map +0 -1
- package/dist/src/icons/components/media/PlayIcon.js +0 -12
- package/dist/src/icons/components/volume/VolumeIcon.d.ts.map +0 -1
- package/dist/src/icons/components/volume/VolumeIcon.js +0 -11
- package/dist/src/icons/components/volume/VolumeOffIcon.d.ts.map +0 -1
- package/dist/src/icons/components/volume/VolumeOffIcon.js +0 -11
- package/dist/src/icons/index.d.ts.map +0 -1
- package/dist/src/icons/index.js +0 -45
- package/dist/src/icons/provider.d.ts.map +0 -1
- package/dist/src/icons/provider.js +0 -37
- package/dist/src/icons/types.d.ts.map +0 -1
- package/dist/src/icons/types.js +0 -1
- package/dist/src/index-enhanced.d.ts.map +0 -1
- package/dist/src/index-enhanced.js +0 -16
- package/dist/src/index-legacy.d.ts.map +0 -1
- package/dist/src/index-legacy.js +0 -97
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -90
- package/dist/src/index.minimal.d.ts.map +0 -1
- package/dist/src/index.minimal.js +0 -3
- package/dist/src/lib/deprecation.d.ts.map +0 -1
- package/dist/src/lib/deprecation.js +0 -31
- package/dist/src/lib/format-time.d.ts.map +0 -1
- package/dist/src/lib/format-time.js +0 -32
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js +0 -3
- package/dist/src/lib/utils.d.ts.map +0 -1
- package/dist/src/lib/utils.js +0 -5
- package/dist/src/test/setup.d.ts.map +0 -1
- package/dist/src/test/setup.js +0 -65
- package/dist/src/types/events.d.ts.map +0 -1
- package/dist/src/types/events.js +0 -2
- package/dist/src/types/formats.d.ts.map +0 -1
- package/dist/src/types/formats.js +0 -63
- package/dist/src/types/index.d.ts.map +0 -1
- package/dist/src/types/index.js +0 -4
- package/dist/utils-Db13763z.cjs +0 -9
- package/dist/utils-Db13763z.cjs.map +0 -1
- package/dist/utils-nTO4AnHo.js +0 -2809
- package/dist/utils-nTO4AnHo.js.map +0 -1
- package/dist/utils.js +0 -2
- package/dist/utils.js.map +0 -1
- package/dist/utils.mjs +0 -7
- package/dist/utils.mjs.map +0 -1
- package/src/adapters/videojs-adapter.js +0 -350
- package/src/components/AnimateLoading.js +0 -41
- package/src/components/LoadingState.js +0 -111
- package/src/components/accessibility/keyboard-help-overlay.js +0 -90
- package/src/components/audio-player.js +0 -31
- package/src/components/basic/index.js +0 -29
- package/src/components/enhanced/advanced-features.js +0 -64
- package/src/components/enhanced/debug-panel.js +0 -94
- package/src/components/enhanced/enhanced-controls.js +0 -233
- package/src/components/enhanced/enhanced-media-player.js +0 -316
- package/src/components/enhanced/error-handling.js +0 -153
- package/src/components/enhanced/index.js +0 -10
- package/src/components/enhanced/media-player-enhanced.js +0 -250
- package/src/components/examples/basic-video-player.js +0 -16
- package/src/components/examples/custom-controls-example.js +0 -12
- package/src/components/examples/enhanced-controls-example.js +0 -18
- package/src/components/examples/enhanced-media-player-example.js +0 -13
- package/src/components/examples/loading-states-demo.js +0 -41
- package/src/components/examples/react-19-demo.js +0 -104
- package/src/components/examples/volume-orientation-demo.js +0 -31
- package/src/components/icon-demo.js +0 -16
- package/src/components/icons/index.js +0 -59
- package/src/components/icons/svg-icons/ArrowLeftIcon.js +0 -3
- package/src/components/icons/svg-icons/ArrowRightIcon.js +0 -3
- package/src/components/icons/svg-icons/AudioIcon.js +0 -4
- package/src/components/icons/svg-icons/BackwardIcon.js +0 -3
- package/src/components/icons/svg-icons/CameraIcon.js +0 -4
- package/src/components/icons/svg-icons/CheckIcon.js +0 -4
- package/src/components/icons/svg-icons/EnablePiPIcon.js +0 -5
- package/src/components/icons/svg-icons/ForwardIcon.js +0 -3
- package/src/components/icons/svg-icons/FullscreenEnterIcon.js +0 -3
- package/src/components/icons/svg-icons/FullscreenExitIcon.js +0 -3
- package/src/components/icons/svg-icons/LoadingIcon.js +0 -3
- package/src/components/icons/svg-icons/PauseIcon.js +0 -3
- package/src/components/icons/svg-icons/PlayIcon.js +0 -3
- package/src/components/icons/svg-icons/PlaybackSpeedIcon.js +0 -3
- package/src/components/icons/svg-icons/QualityIcon.js +0 -3
- package/src/components/icons/svg-icons/SettingsIcon.js +0 -3
- package/src/components/icons/svg-icons/SliderIcon.js +0 -3
- package/src/components/icons/svg-icons/SubtitleIcon.js +0 -3
- package/src/components/icons/svg-icons/SubtitleOffIcon.js +0 -3
- package/src/components/icons/svg-icons/UnPiPIcon.js +0 -5
- package/src/components/icons/svg-icons/VolumeMutedIcon.js +0 -3
- package/src/components/icons/svg-icons/VolumeOneIcon.js +0 -3
- package/src/components/icons/svg-icons/VolumeThreeIcon.js +0 -3
- package/src/components/icons/svg-icons/VolumeTwoIcon.js +0 -3
- package/src/components/legacy.js +0 -52
- package/src/components/media-metadata-display.js +0 -20
- package/src/components/media-player-audio.js +0 -18
- package/src/components/media-player-controls.js +0 -150
- package/src/components/media-player-error.js +0 -85
- package/src/components/media-player-fullscreen.js +0 -68
- package/src/components/media-player-hls.js +0 -20
- package/src/components/media-player-loading.js +0 -53
- package/src/components/media-player-play.js +0 -44
- package/src/components/media-player-root.js +0 -243
- package/src/components/media-player-seek.js +0 -92
- package/src/components/media-player-time.js +0 -57
- package/src/components/media-player-tooltip.js +0 -14
- package/src/components/media-player-video.js +0 -18
- package/src/components/media-player-volume.js +0 -88
- package/src/components/media-player.js +0 -67
- package/src/components/media-suspense.js +0 -173
- package/src/components/player-settings-form.js +0 -46
- package/src/components/react-player-wrapper.js +0 -163
- package/src/components/simple-video-player.js +0 -41
- package/src/components/ui/enhanced-seek-bar.js +0 -112
- package/src/components/ui/fullscreen-button.js +0 -21
- package/src/components/ui/media-resource-preloader.js +0 -295
- package/src/components/ui/play-button.js +0 -26
- package/src/components/ui/seek-bar.js +0 -54
- package/src/components/ui/time-display.js +0 -18
- package/src/components/ui/volume-control.js +0 -71
- package/src/components/unified/base-media-player.js +0 -104
- package/src/components/unified/media-player.js +0 -41
- package/src/components/variants/minimal/AccessibleMinimalPlayer.js +0 -322
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.js +0 -280
- package/src/components/variants/minimal/MinimalControls.js +0 -19
- package/src/components/variants/minimal/MinimalLoading.js +0 -6
- package/src/components/variants/minimal/MinimalMediaPlayer.js +0 -135
- package/src/components/variants/minimal/MinimalOverlay.js +0 -15
- package/src/components/variants/minimal/MinimalPlayButton.js +0 -29
- package/src/components/variants/minimal/MinimalSeekBar.js +0 -73
- package/src/components/variants/minimal/MinimalVolumeControl.js +0 -29
- package/src/components/variants/minimal/SimpleMinimalPlayer.js +0 -51
- package/src/components/variants/minimal/components/CenterPlayButton.js +0 -8
- package/src/components/variants/minimal/components/ControlBar.js +0 -10
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.js +0 -68
- package/src/components/variants/minimal/components/PlaybackControls.js +0 -9
- package/src/components/variants/minimal/components/RightControls.js +0 -40
- package/src/components/variants/minimal/components/SeekBar.js +0 -43
- package/src/components/variants/minimal/components/SettingsDropdown.js +0 -18
- package/src/components/variants/minimal/components/SubtitleDisplay.js +0 -6
- package/src/components/variants/minimal/components/TimeDisplay.js +0 -5
- package/src/components/variants/minimal/components/VideoElement.js +0 -4
- package/src/components/variants/minimal/components/VolumeControl.js +0 -99
- package/src/components/variants/minimal/index.js +0 -8
- package/src/components/video-player.js +0 -38
- package/src/context/error-handling.js +0 -300
- package/src/context/media-context.js +0 -121
- package/src/context/media-provider.js +0 -164
- package/src/context/media-store.js +0 -273
- package/src/context/persistence.js +0 -356
- package/src/core/events/event-system.js +0 -288
- package/src/core/events/hooks.js +0 -198
- package/src/core/events/index.js +0 -7
- package/src/core/events/middleware.js +0 -219
- package/src/core/index.js +0 -15
- package/src/core/optimization/bundle-optimizer.js +0 -217
- package/src/core/performance/cicd.js +0 -83
- package/src/core/performance/index.js +0 -14
- package/src/core/performance/media-loading-optimizer.js +0 -404
- package/src/core/performance/performance-budgets.js +0 -326
- package/src/core/performance/performance-monitor.js +0 -297
- package/src/core/performance/performance-testing.js +0 -314
- package/src/core/plugins/base-plugin.js +0 -151
- package/src/core/plugins/enhanced-plugin-system.js +0 -305
- package/src/core/plugins/examples/analytics-plugin.js +0 -191
- package/src/core/plugins/index.js +0 -9
- package/src/core/plugins/registry.js +0 -261
- package/src/core/plugins/types.js +0 -31
- package/src/core/plugins/utils.js +0 -274
- package/src/core/progressive-loading.js +0 -239
- package/src/core/providers/enhanced-hls-provider.js +0 -273
- package/src/core/providers/service-provider.js +0 -105
- package/src/core/utils.js +0 -21
- package/src/features/media-session/media-session-manager.js +0 -331
- package/src/features/picture-in-picture/pip-manager.js +0 -353
- package/src/features/playlist/playlist-manager.js +0 -475
- package/src/features/subtitles/subtitle-manager.js +0 -335
- package/src/features/subtitles/subtitle-parser.js +0 -217
- package/src/features/thumbnails/thumbnail-generator.js +0 -388
- package/src/hooks/accessibility/index.js +0 -4
- package/src/hooks/accessibility/use-accessibility-preferences.js +0 -156
- package/src/hooks/accessibility/use-focus-management.js +0 -142
- package/src/hooks/accessibility/use-keyboard-shortcuts.js +0 -101
- package/src/hooks/accessibility/use-screen-reader.js +0 -148
- package/src/hooks/core/index.js +0 -19
- package/src/hooks/legacy.js +0 -17
- package/src/hooks/use-enhanced-media-player.js +0 -395
- package/src/hooks/use-intelligent-preloading.js +0 -258
- package/src/hooks/use-keyboard-controls.js +0 -83
- package/src/hooks/use-media-actions.js +0 -121
- package/src/hooks/use-media-metadata.js +0 -74
- package/src/hooks/use-media-optimistic.js +0 -205
- package/src/hooks/use-media-player.js +0 -251
- package/src/hooks/use-media-state.js +0 -162
- package/src/hooks/use-memory-optimization.js +0 -288
- package/src/hooks/use-optimistic-controls.js +0 -60
- package/src/hooks/use-optimized-media.js +0 -211
- package/src/hooks/use-touch-gestures.js +0 -289
- package/src/hooks/useEnhancedSubtitles.js +0 -205
- package/src/hooks/useKeyboardShortcuts.js +0 -59
- package/src/hooks/useMediaControls.js +0 -44
- package/src/hooks/useScreenshot.js +0 -56
- package/src/hooks/useSubtitles.js +0 -73
- package/src/hooks/useVideoPlayer.js +0 -184
- package/src/icons/components/FullscreenIcon.js +0 -11
- package/src/icons/components/SettingsIcon.js +0 -11
- package/src/icons/components/animated/LoadingIcon.js +0 -11
- package/src/icons/components/animated/PlayPauseIcon.js +0 -9
- package/src/icons/components/media/PauseIcon.js +0 -12
- package/src/icons/components/media/PlayIcon.js +0 -12
- package/src/icons/components/volume/VolumeIcon.js +0 -11
- package/src/icons/components/volume/VolumeOffIcon.js +0 -11
- package/src/icons/index.js +0 -45
- package/src/icons/provider.js +0 -37
- package/src/icons/types.js +0 -1
- package/src/index-enhanced.js +0 -16
- package/src/index-legacy.js +0 -97
- package/src/index.js +0 -90
- package/src/index.minimal.js +0 -3
- package/src/lib/deprecation.js +0 -31
- package/src/lib/format-time.js +0 -32
- package/src/lib/index.js +0 -3
- package/src/lib/utils.js +0 -5
- package/src/test/setup.js +0 -65
- package/src/types/events.js +0 -2
- package/src/types/formats.js +0 -63
- package/src/types/index.js +0 -4
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enhanced-components-Da0TSvKe.js","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 { useMediaContext, useMediaSelector, useMediaDispatch, MediaActionTypes } from \"../../context/media-context\"\nimport { cn } from \"../../lib/utils\"\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 const 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>(null)\n\tconst [isDoubleTap, setIsDoubleTap] = React.useState(false)\n\n\tconst handleTouchStart = React.useCallback((e: React.TouchEvent) => {\n\t\tif (!enabled) return\n\t\t\n\t\tconst touch = e.touches[0]\n\t\tif (!touch) return\n\t\t\n\t\tconst now = Date.now()\n\t\t\n\t\tif (touchStart && now - touchStart.time < 300) {\n\t\t\tsetIsDoubleTap(true)\n\t\t\t// Double tap to play/pause\n\t\t\tdispatch({\n\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t})\n\t\t} else {\n\t\t\tsetTouchStart({\n\t\t\t\tx: touch.clientX,\n\t\t\t\ty: touch.clientY,\n\t\t\t\ttime: now\n\t\t\t})\n\t\t\tsetIsDoubleTap(false)\n\t\t}\n\t}, [enabled, touchStart, isPlaying, dispatch])\n\n\tconst handleTouchMove = React.useCallback((e: React.TouchEvent) => {\n\t\tif (!enabled || !touchStart || isDoubleTap) return\n\n\t\tconst touch = e.touches[0]\n\t\tif (!touch) return\n\t\t\n\t\tconst deltaX = touch.clientX - touchStart.x\n\t\tconst deltaY = touch.clientY - touchStart.y\n\n\t\t// Horizontal swipe for seeking\n\t\tif (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 50) {\n\t\t\tconst seekAmount = (deltaX / window.innerWidth) * 30 // 30 seconds max\n\t\t\tconst newTime = Math.max(0, Math.min(duration, currentTime + seekAmount))\n\t\t\tdispatch({\n\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\tdetail: newTime\n\t\t\t})\n\t\t}\n\n\t\t// Vertical swipe for volume (right side of screen)\n\t\tif (Math.abs(deltaY) > Math.abs(deltaX) && Math.abs(deltaY) > 50 && touchStart.x > window.innerWidth / 2) {\n\t\t\tconst volumeChange = -(deltaY / window.innerHeight) * 1 // Full range\n\t\t\tconst newVolume = Math.max(0, Math.min(1, volume + volumeChange))\n\t\t\tdispatch({\n\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\tdetail: newVolume\n\t\t\t})\n\t\t}\n\t}, [enabled, touchStart, isDoubleTap, duration, currentTime, volume, dispatch])\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\t\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((e: React.TouchEvent) => {\n\t\thandleControlsTouch()\n\t\thandleGestureStart(e)\n\t}, [handleControlsTouch, handleGestureStart])\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 ? MediaActionTypes.EXIT_FULLSCREEN : 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={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>\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 { useMediaSelector, useMediaDispatch, MediaActionTypes } from \"../../context/media-context\"\nimport { cn } from \"../../lib/utils\"\nimport { formatTime } from \"../../lib/format-time\"\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>\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>\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>\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>\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>\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>\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>\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((speed: number) => {\n\t\tdispatch({ type: MediaActionTypes.SET_PLAYBACK_RATE, detail: speed })\n\t\tsetIsOpen(false)\n\t}, [dispatch])\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>\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>\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>\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(chapter => \n\t\t\tcurrentTime >= chapter.startTime && currentTime < chapter.endTime\n\t\t)\n\t}, [chapters, currentTime])\n\n\treturn (\n\t\t<div className={cn(\"rounded-lg border border-white/20 bg-black/90 p-4 backdrop-blur-sm\", className)}>\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>\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>\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 { useMediaSelector, useMediaDispatch, MediaActionTypes } from \"../../context/media-context\"\nimport { cn } from \"../../lib/utils\"\nimport { formatTime } from \"../../lib/format-time\"\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>\n\t\t\t{isLoading ? (\n\t\t\t\t<div className={cn(\"animate-spin rounded-full border-2 border-white/30 border-t-white\", iconSizes[size])} />\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 = duration > 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((clientX: number) => {\n\t\tif (!progressRef.current) return 0\n\t\tconst rect = progressRef.current.getBoundingClientRect()\n\t\tconst position = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n\t\treturn position * duration\n\t}, [duration])\n\n\tconst handleMouseMove = React.useCallback((e: React.MouseEvent) => {\n\t\tif (!isDragging) {\n\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\tsetHoverTime(time)\n\t\t\tdispatch({ type: MediaActionTypes.PREVIEW_TIME, detail: time })\n\t\t}\n\t}, [isDragging, getTimeFromPosition, dispatch])\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((e: React.MouseEvent) => {\n\t\tsetIsDragging(true)\n\t\tconst time = getTimeFromPosition(e.clientX)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t}, [getTimeFromPosition, dispatch])\n\n\tconst handleTouchStart = React.useCallback((e: React.TouchEvent) => {\n\t\tsetIsDragging(true)\n\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t}, [getTimeFromPosition, dispatch])\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>\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>\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((newVolume: number) => {\n\t\tdispatch({ type: MediaActionTypes.SET_VOLUME, detail: newVolume })\n\t}, [dispatch])\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>\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>\n\t\t\t\t{VolumeIcon}\n\t\t\t</button>\n\n\t\t\t{/* Volume slider */}\n\t\t\t<div className={cn(\n\t\t\t\t\"absolute left-full ml-2 flex items-center transition-all duration-200\",\n\t\t\t\tshowSlider ? \"translate-x-0 opacity-100\" : \"-translate-x-2 pointer-events-none opacity-0\"\n\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>\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 && (\n\t\t\t\t\t<span className=\"-bottom-1 absolute font-bold text-[10px]\">\n\t\t\t\t\t\t{skipTime}\n\t\t\t\t\t</span>\n\t\t\t\t)}\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>\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 && (\n\t\t\t\t\t<span className=\"-bottom-1 absolute font-bold text-[10px]\">\n\t\t\t\t\t\t{skipTime}\n\t\t\t\t\t</span>\n\t\t\t\t)}\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)}>\n\t\t\t{displayTime}\n\t\t</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 className={cn(\"flex flex-col gap-4 bg-gradient-to-t from-black/80 to-transparent p-4\", className)}>\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 \n\t\t\t\t\t\tsize={playButtonSize}\n\t\t\t\t\t\tclassName=\"shrink-0\" \n\t\t\t\t\t/>\n\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedForwardButton \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{showVolumeControl && (\n\t\t\t\t\t\t<EnhancedVolumeControl className=\"shrink-0\" />\n\t\t\t\t\t)}\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\n\t\t\t\t\t\t\tmetrics={performanceMetrics}\n\t\t\t\t\t\t\tclassName=\"text-white/80\"\n\t\t\t\t\t\t/>\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'>('performance');\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\">{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)} MB</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\">{(performanceMetrics.bufferHealth || 0).toFixed(2)}s</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\">{formatBytes(performanceMetrics.networkBandwidth || 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\">{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\">{(preloadingStats.engagementScore || 0).toFixed(1)}%</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\">• {plugin}</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 && pluginInfo.loadedPlugins.length > (pluginInfo.activePlugins?.length ?? 0) && (\n\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t<span className=\"text-yellow-400\">Loaded (inactive):</span>\n\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{pluginInfo.loadedPlugins\n\t\t\t\t\t\t\t\t.filter(plugin => !pluginInfo.activePlugins?.includes(plugin))\n\t\t\t\t\t\t\t\t.map((plugin, index) => (\n\t\t\t\t\t\t\t\t\t<div key={index} className=\"text-yellow-300\">• {plugin}</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\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 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>\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>\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>\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 d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\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 d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\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\">{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)}MB</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\">\n\t\t\t\t\t\t{renderTabContent()}\n\t\t\t\t\t</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<Omit<DebugPanelProps, 'position' | 'defaultCollapsed' | 'title'>> = (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;"],"names":["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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"}
|
package/dist/hooks-BCMilGRf.cjs
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
"use strict";const s=require("react"),E=require("./context-CwZnPdz0.cjs"),oe=require("./utils-Db13763z.cjs");function he(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 Q=he(s);function ve({enabled:e=!0,state:t,controls:n,seekStep:a=10,volumeStep:l=.1}){const c=i=>{if(!e)return;const f=i.target;if(!(f.tagName==="INPUT"||f.tagName==="TEXTAREA"||f.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+l));break;case"ArrowDown":i.preventDefault(),n.setVolume(Math.max(0,t.volume-l));break;case"Digit0":case"Digit1":case"Digit2":case"Digit3":case"Digit4":case"Digit5":case"Digit6":case"Digit7":case"Digit8":case"Digit9":i.preventDefault();const F=parseInt(i.code.replace("Digit",""),10)/10;n.seek(t.duration*F);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",c),()=>{document.removeEventListener("keydown",c)}},[e,c]),{handleKeyDown:c}}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 ce(e){const t=s.useSyncExternalStore(e.subscribe,e.getState,e.getState),[n,a]=s.useOptimistic(t,ye),l=s.useCallback(async f=>{f.optimistic&&a(f),await e.dispatchOptimistic(f)},[e,a]),c=s.useMemo(()=>({togglePlayPause:async()=>{const f={type:n.isPlaying?"PAUSE":"PLAY",optimistic:!0,timestamp:Date.now()};await l(f)},setVolumeOptimistic:async f=>{const k={type:"SET_VOLUME",detail:Math.max(0,Math.min(1,f)),optimistic:!0,timestamp:Date.now()};await l(k)},seekOptimistic:async f=>{const k={type:"SEEK",detail:f,optimistic:!0,timestamp:Date.now()};await l(k)},toggleMuteOptimistic:async()=>{const f={type:"TOGGLE_MUTE",optimistic:!0,timestamp:Date.now()};await l(f)},toggleFullscreenOptimistic:async()=>{const f={type:n.isFullscreen?"EXIT_FULLSCREEN":"ENTER_FULLSCREEN",optimistic:!0,timestamp:Date.now()};await l(f)},setPlaybackRateOptimistic:async f=>{const k={type:"SET_PLAYBACK_RATE",detail:f,optimistic:!0,timestamp:Date.now()};await l(k)},toggleSubtitlesOptimistic:async()=>{const f={type:"TOGGLE_SUBTITLES",optimistic:!0,timestamp:Date.now()};await l(f)}}),[n,l]),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:re(n.currentTime),formattedDuration:re(n.duration),canPlay:!n.isLoading&&!n.error,hasError:!!n.error,isBuffering:n.isLoading}),[n]);return{state:n,actualState:t,...i,...c,dispatchOptimistic:l}}function re(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 B(e,t){return((n,a=!1)=>{const l={type:e,detail:n,optimistic:a,timestamp:Date.now()};return a?t.dispatchOptimistic(l):(t.dispatch(l),Promise.resolve())})}function Te(e){const[t,n]=s.useState(e.getActionState());return s.useEffect(()=>e.subscribe(()=>{const l=e.getActionState();n(c=>JSON.stringify(c)!==JSON.stringify(l)?l:c)}),[e]),t}function ue(e){const t=s.useMemo(()=>({play:B(E.MediaActionTypes$1.PLAY,e),pause:B(E.MediaActionTypes$1.PAUSE,e),seek:B(E.MediaActionTypes$1.SEEK,e),setVolume:B(E.MediaActionTypes$1.SET_VOLUME,e),mute:B(E.MediaActionTypes$1.MUTE,e),unmute:B(E.MediaActionTypes$1.UNMUTE,e),toggleMute:B(E.MediaActionTypes$1.TOGGLE_MUTE,e),setDuration:B(E.MediaActionTypes$1.SET_DURATION,e),setCurrentTime:B(E.MediaActionTypes$1.SET_CURRENT_TIME,e),setBuffered:B(E.MediaActionTypes$1.SET_BUFFERED,e),setLoading:B(E.MediaActionTypes$1.SET_LOADING,e),setError:B(E.MediaActionTypes$1.SET_ERROR,e),enterFullscreen:B(E.MediaActionTypes$1.ENTER_FULLSCREEN,e),exitFullscreen:B(E.MediaActionTypes$1.EXIT_FULLSCREEN,e),enterPiP:B(E.MediaActionTypes$1.ENTER_PIP,e),exitPiP:B(E.MediaActionTypes$1.EXIT_PIP,e),setPlaybackRate:B(E.MediaActionTypes$1.SET_PLAYBACK_RATE,e),setSubtitleTrack:B(E.MediaActionTypes$1.SET_SUBTITLE_TRACK,e),setRendition:B(E.MediaActionTypes$1.SET_RENDITION,e),toggleSubtitles:B(E.MediaActionTypes$1.TOGGLE_SUBTITLES,e),previewTime:B(E.MediaActionTypes$1.PREVIEW_TIME,e),clearPreview:B(E.MediaActionTypes$1.CLEAR_PREVIEW,e)}),[e]),n=Te(e),a=s.useMemo(()=>({togglePlayPause:async c=>{c?await t.pause(!0):await t.play(!0)},seekWithPreview:async c=>{await t.previewTime(c,!0),await t.seek(c,!0)},adjustVolume:async(c,i)=>{const f=Math.max(0,Math.min(1,i+c));await t.setVolume(f,!0)},toggleFullscreenOptimistic:async c=>{c?await t.exitFullscreen(!0):await t.enterFullscreen(!0)}}),[t]),l=s.useCallback(async()=>{const{lastAction:c}=n;c&&n.error&&await e.dispatchOptimistic({...c,retryCount:(c.retryCount||0)+1})},[e,n]);return{...t,...a,actionState:n,retryLastAction:l,isLoading:n.pending,hasError:!!n.error,errorMessage:n.error,retryCount:n.retryCount}}function Ee(e){const t=s.useRef(null),n=s.useRef(null),[a,l]=s.useTransition(),[c,i]=s.useTransition();s.useRef(0);const f=s.useRef(0),k=s.useRef(0);s.useRef();const F=s.useRef(0),D=E.useMediaStore(),g="getOptimisticState"in D,r=E.useMediaSelector$1(o=>o.isPlaying),w=E.useMediaSelector$1(o=>o.currentTime),v=E.useMediaSelector$1(o=>o.duration),m=E.useMediaSelector$1(o=>o.volume),y=E.useMediaSelector$1(o=>o.isMuted),P=E.useMediaSelector$1(o=>o.isLoading),h=E.useMediaSelector$1(o=>o.isBuffering),d=E.useMediaSelector$1(o=>o.error),b=E.useMediaSelector$1(o=>o.buffered),T=E.useMediaSelector$1(o=>o.isFullscreen),M=D,S=g?ce(M):null,p=g?ue(M):null,[K,R]=s.useState({frameRate:0,averageRenderTime:0,droppedFrames:0,bufferHealth:0}),[I,A]=s.useOptimistic(m,(o,C)=>Math.max(0,Math.min(1,C)));s.useOptimistic(w,(o,C)=>Math.max(0,Math.min(v||0,C))),s.useEffect(()=>{const o=t.current;if(!o)return;const C={volume:e.volume,muted:e.muted,autoplay:e.autoPlay,loop:e.loop,preload:e.preload,crossOrigin:e.crossOrigin};Object.entries(C).forEach(([U,G])=>{G!==void 0&&(o[U]=G)}),o.setAttribute("preload",e.preloadStrategy==="eager"?"auto":"metadata"),e.bufferingStrategy==="aggressive"&&o.setAttribute("buffered","auto"),o instanceof HTMLVideoElement&&(o.style.willChange="transform",o.style.transform="translateZ(0)")},[e.volume,e.muted,e.autoPlay,e.loop,e.preload,e.crossOrigin,e.preloadStrategy,e.bufferingStrategy]);const L=s.useCallback(()=>{const o=t.current;if(!o)return;const C=performance.now();if(e.enableTimeUpdateThrottling!==!1){if(C-F.current<(e.timeUpdateThrottleMs||100))return;F.current=C}l(()=>{g&&p&&p.setCurrentTime(o.currentTime)})},[e.enableTimeUpdateThrottling,e.timeUpdateThrottleMs,g,p]),O=s.useCallback(()=>{l(()=>{g&&p&&p.play(!0)}),e.onPlay?.()},[g,p,e.onPlay]),V=s.useCallback(()=>{l(()=>{g&&p&&p.pause(!0)}),e.onPause?.()},[g,p,e.onPause]),$=s.useCallback(()=>{const o=t.current;o&&l(()=>{g&&p&&(p.setVolume(o.volume,!0),o.muted?p.mute(!0):p.unmute(!0))})},[g,p]),u=s.useCallback(()=>{i(()=>{})},[]),_=s.useCallback(()=>{},[]),q=s.useCallback(()=>{const o=t.current;o&&l(()=>{g&&p&&p.setBuffered(o.buffered)})},[g,p]),z=s.useCallback(()=>{const o=performance.now();if(o-k.current>0&&(f.current++,f.current>=60)){const U=Math.round(f.current*1e3/(o-k.current));R(G=>({...G,frameRate:U,droppedFrames:Math.max(0,60-U)})),f.current=0,k.current=o}},[]);s.useEffect(()=>{const o=t.current;if(!o)return;const C=[{event:"timeupdate",handler:L,passive:!0},{event:"play",handler:O},{event:"pause",handler:V},{event:"volumechange",handler:$},{event:"seeking",handler:u},{event:"seeked",handler:_},{event:"progress",handler:q,passive:!0},{event:"loadedmetadata",handler:()=>z()},{event:"loadeddata",handler:()=>z()}];C.forEach(({event:X,handler:Y,passive:ee})=>{const te=ee?{passive:!0}:{};o.addEventListener(X,Y,te)});let U;const G=()=>{z(),U=requestAnimationFrame(G)};return e.enablePerformanceMonitoring&&G(),()=>{C.forEach(({event:X,handler:Y})=>{o.removeEventListener(X,Y)}),U&&cancelAnimationFrame(U)}},[L,O,V,$,u,_,q,z,e.enablePerformanceMonitoring]);const Z=s.useMemo(()=>{const o=async()=>{const x=t.current;if(x)if(g&&p)await p.play(!0);else try{await x.play()}catch(H){console.error("Failed to play media:",H)}},C=()=>{const x=t.current;x&&(g&&p?p.pause(!0):x.pause())};return{play:o,pause:C,toggle:()=>{r?C():o()},seek:x=>{const H=t.current;if(!H)return;const W=Math.max(0,Math.min(x,v||0));g&&p?i(()=>{p.seek(W,!0)}):H.currentTime=W},setVolume:x=>{const H=t.current;if(!H)return;const W=Math.max(0,Math.min(1,x));g&&p?(A(W),l(()=>{p.setVolume(W,!0)})):H.volume=W},toggleMute:()=>{const x=t.current;x&&(g&&p?p.toggleMute(!0):x.muted=!x.muted)},enterFullscreen:async()=>{const x=n.current;if(!(!x||!document.fullscreenEnabled))try{await x.requestFullscreen(),g&&p&&p.enterFullscreen(!0)}catch(H){console.error("Failed to enter fullscreen:",H)}},exitFullscreen:async()=>{if(document.fullscreenElement)try{await document.exitFullscreen(),g&&p&&p.exitFullscreen(!0)}catch(x){console.error("Failed to exit fullscreen:",x)}}}},[r,v,g,p,l,i,A]),J=s.useMemo(()=>({isPlaying:S?.isPlaying??r,currentTime:S?.currentTime??w,duration:S?.duration??v,volume:S?.volume??I,isMuted:S?.isMuted??y,isLoading:S?.isBuffering??P,isBuffering:S?.isBuffering??h,error:S?.error??d,buffered:S?.buffered??b,isFullscreen:S?.isFullscreen??T,progress:v>0?w/v:0,isTransitioning:a||c,canPlay:!P&&!h&&!d}),[S,r,w,v,I,y,P,h,d,b,T,a,c]);return{mediaRef:t,containerRef:n,state:J,actualState:S?.actualState,controls:Z,performanceMetrics:K,isTransitioning:a||c,actions:S?.actions,actionState:S?.actionState,optimisticState:S,isEnhanced:g}}function be(e={}){const{maxMemoryUsage:t=100,cleanupInterval:n=3e4,enableGC:a=!0,monitorMemory:l=!0}=e;s.useRef();const c=s.useRef(new Set),i=s.useRef(new Map),f=s.useRef(new Set),k=s.useRef(new Set),F=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}},[]),[D,g]=s.useState({used:0,total:0,limit:0,usage:0,isHighUsage:!1});s.useEffect(()=>{if(!l)return;const h=()=>{const b=F(),T=b.used/1024/1024,M=T>t;g({...b,usage:T,isHighUsage:M}),M&&a&&r()};h();const d=v(h,n);return f.current.add(d),()=>{clearInterval(d),f.current.delete(d)}},[l,F,t,a,n]);const r=s.useCallback(()=>{f.current.forEach(h=>{clearTimeout(h)}),f.current.clear(),k.current.forEach(h=>{cancelAnimationFrame(h)}),k.current.clear(),c.current.forEach(h=>{h.disconnect()}),c.current.clear(),i.current.forEach((h,d)=>{h.forEach(({event:b,handler:T})=>{d.removeEventListener(b,T)})}),i.current.clear(),a&&"gc"in window&&window.gc()},[a]),w=s.useCallback((h,d,b,T)=>(h.addEventListener(d,b,T),i.current.has(h)||i.current.set(h,[]),i.current.get(h).push({event:d,handler:b}),()=>{h.removeEventListener(d,b);const M=i.current.get(h);if(M){const S=M.findIndex(p=>p.event===d&&p.handler===b);S>-1&&M.splice(S,1),M.length===0&&i.current.delete(h)}}),[]),v=s.useCallback((h,d)=>{const b=v(h,d);return f.current.add(b),()=>{clearInterval(b),f.current.delete(b)}},[]),m=s.useCallback((h,d)=>{const b=m(h,d);return f.current.add(b),()=>{clearTimeout(b),f.current.delete(b)}},[]),y=s.useCallback(h=>{const d=y(h);return k.current.add(d),()=>{cancelAnimationFrame(d),k.current.delete(d)}},[]),P=s.useCallback(h=>(c.current.add(h),()=>{h.disconnect(),c.current.delete(h)}),[]);return s.useEffect(()=>()=>{r()},[r]),{memoryStats:D,getMemoryUsage:F,performCleanup:r,addEventListener:w,setInterval:v,setTimeout:m,requestAnimationFrame:y,addObserver:P,formatBytes:h=>{if(h===0)return"0 Bytes";const d=1024,b=["Bytes","KB","MB","GB"],T=Math.floor(Math.log(h)/Math.log(d));return parseFloat((h/Math.pow(d,T)).toFixed(2))+" "+b[T]}}}function le({enabled:e=!0,state:t,controls:n,seekStep:a=10,volumeStep:l=.1}){const c=i=>{if(!e)return;const f=i.target;if(!(f.tagName==="INPUT"||f.tagName==="TEXTAREA"||f.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+l));break;case"ArrowDown":i.preventDefault(),n.setVolume(Math.max(0,t.volume-l));break;case"Digit0":case"Digit1":case"Digit2":case"Digit3":case"Digit4":case"Digit5":case"Digit6":case"Digit7":case"Digit8":case"Digit9":i.preventDefault();const F=parseInt(i.code.replace("Digit",""),10)/10;n.seek(t.duration*F);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",c),()=>{document.removeEventListener("keydown",c)}},[e,c]),{handleKeyDown:c}}const we=Object.freeze(Object.defineProperty({__proto__:null,useKeyboardControls:le},Symbol.toStringTag,{value:"Module"}));function Me(){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(w=>({...w,...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 de(e){const t=s.useRef(null),n=s.useRef(null),{state:a,setPlaying:l,setCurrentTime:c,setDuration:i,setVolume:f,setMuted:k,setLoading:F,setFullscreen:D,setError:g,setBuffered:r}=Me();s.useEffect(()=>{const u=t.current;u&&(e.volume!==void 0&&(u.volume=e.volume,f(e.volume)),e.muted!==void 0&&(u.muted=e.muted,k(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,f,k]);const w=()=>{l(!0),e.onPlay?.()},v=()=>{l(!1),e.onPause?.()},m=()=>{const u=t.current;u&&(c(u.currentTime),e.onTimeUpdate?.(u.currentTime))},y=()=>{const u=t.current;u&&(i(u.duration),e.onDurationChange?.(u.duration))},P=()=>{const u=t.current;u&&(f(u.volume),k(u.muted),e.onVolumeChange?.(u.volume))},h=()=>{F(!0),g(null),e.onLoadStart?.()},d=()=>{F(!1),e.onLoadedData?.()},b=()=>{const u=t.current;if(!u)return;const _=u.error?.message||"An error occurred while loading the media";g(_),F(!1),e.onError?.(_)},T=()=>{l(!1),e.onEnded?.()},M=()=>{const u=t.current;u&&r(u.buffered)};s.useEffect(()=>{const u=t.current;if(u)return u.addEventListener("play",w),u.addEventListener("pause",v),u.addEventListener("timeupdate",m),u.addEventListener("durationchange",y),u.addEventListener("volumechange",P),u.addEventListener("loadstart",h),u.addEventListener("loadeddata",d),u.addEventListener("error",b),u.addEventListener("ended",T),u.addEventListener("progress",M),()=>{u.removeEventListener("play",w),u.removeEventListener("pause",v),u.removeEventListener("timeupdate",m),u.removeEventListener("durationchange",y),u.removeEventListener("volumechange",P),u.removeEventListener("loadstart",h),u.removeEventListener("loadeddata",d),u.removeEventListener("error",b),u.removeEventListener("ended",T),u.removeEventListener("progress",M)}},[w,v,m,y,P,h,d,b,T,M]);const S=async()=>{const u=t.current;if(u)try{await u.play()}catch(_){console.error("Failed to play media:",_),g("Failed to play media")}},p=()=>{const u=t.current;u&&u.pause()},K=()=>{a.isPlaying?p():S()},R=u=>{const _=t.current;_&&(_.currentTime=Math.max(0,Math.min(u,_.duration||0)))},I=u=>{const _=t.current;if(!_)return;const q=Math.max(0,Math.min(1,u));_.volume=q},A=()=>{const u=t.current;u&&(u.muted=!u.muted)},L=async()=>{const u=n.current;if(!(!u||!document.fullscreenEnabled))try{await u.requestFullscreen(),D(!0)}catch(_){console.error("Failed to enter fullscreen:",_)}},O=async()=>{if(document.fullscreenElement)try{await document.exitFullscreen(),D(!1)}catch(u){console.error("Failed to exit fullscreen:",u)}},V=()=>{document.fullscreenElement?O():L()};return s.useEffect(()=>{const u=()=>{D(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",u),()=>{document.removeEventListener("fullscreenchange",u)}},[D]),{state:a,controls:{play:S,pause:p,toggle:K,seek:R,setVolume:I,toggleMute:A,enterFullscreen:L,exitFullscreen:O,toggleFullscreen:V},mediaRef:t,containerRef:n}}const j={mobile:768,desktop:1280};function se(){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 ae(){return typeof window>"u"?!1:"ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0}function ie(){return typeof window>"u"?!1:"vibrate"in navigator||"vibration"in navigator||"ondevicemotion"in window}function ne(){const[e,t]=Q.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<j.mobile,isTablet:n>=j.mobile&&n<j.desktop,isDesktop:n>=j.desktop,isTouchDevice:ae(),platform:se(),supportsHaptics:ie(),screenSize:{width:n,height:a},orientation:n>a?"landscape":"portrait"}});return Q.useEffect(()=>{const n=()=>{const i=window.innerWidth,f=window.innerHeight;t({isMobile:i<j.mobile,isTablet:i>=j.mobile&&i<j.desktop,isDesktop:i>=j.desktop,isTouchDevice:ae(),platform:se(),supportsHaptics:ie(),screenSize:{width:i,height:f},orientation:i>f?"landscape":"portrait"})};window.addEventListener("resize",n),window.addEventListener("orientationchange",n);const a=window.matchMedia(`(max-width: ${j.mobile-1}px)`),l=window.matchMedia(`(min-width: ${j.mobile}px) and (max-width: ${j.desktop-1}px)`),c=window.matchMedia(`(min-width: ${j.desktop}px)`);return a.addEventListener("change",n),l.addEventListener("change",n),c.addEventListener("change",n),()=>{window.removeEventListener("resize",n),window.removeEventListener("orientationchange",n),a.removeEventListener("change",n),l.removeEventListener("change",n),c.removeEventListener("change",n)}},[]),e}function Se(){const{platform:e,isMobile:t}=ne();Q.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 ke(){const{supportsHaptics:e}=ne();return{triggerHaptic:Q.useCallback((n="light")=>{if(!e)return;const l={light:[10],medium:[20],heavy:[30],success:[10,10,10],warning:[20,20],error:[50,20,50]}[n];"vibrate"in navigator&&navigator.vibrate(l)},[e]),supportsHaptics:e}}const Le={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 me(e,t,n={}){const a={...Le,...n},{isTouchDevice:l}=ne(),{triggerHaptic:c}=ke(),i=Q.useRef({isTracking:!1,touches:[],startTouches:[]}),f=v=>({id:v.identifier,x:v.clientX,y:v.clientY,timestamp:Date.now()}),k=(v,m)=>Math.sqrt(Math.pow(m.x-v.x,2)+Math.pow(m.y-v.y,2)),F=(v,m)=>{const y=Math.max(m.timestamp-v.timestamp,1);return{x:(m.x-v.x)/y,y:(m.y-v.y)/y}},D=(v,m,y,P={})=>({type:v,startPoint:{x:m.x,y:m.y},currentPoint:{x:y.x,y:y.y},duration:y.timestamp-m.timestamp,target:e.current,preventDefault:()=>{},...P}),g=Q.useCallback(v=>{if(!a.enabledGestures.length)return;const m=Array.from(v.touches).map(f),y=i.current;y.isTracking=!0,y.touches=m,y.startTouches=[...m],y.longPressTimer&&clearTimeout(y.longPressTimer),m.length===1&&a.enabledGestures.includes("long-press")&&(y.longPressTimer=setTimeout(()=>{if(y.touches.length===1&&m[0]){const P=D("long-press",m[0],m[0]);t(P),a.enableHapticFeedback&&c("heavy")}},a.longPressThreshold)),m.length===2&&m[0]&&m[1]&&(y.initialDistance=k(m[0],m[1]),y.initialScale=1,y.lastScale=1)},[a,t,c]),r=Q.useCallback(v=>{const m=i.current;if(!m.isTracking)return;const y=Array.from(v.touches).map(f);if(m.touches=y,y.length===2&&m.initialDistance&&y[0]&&y[1]){const P=k(y[0],y[1]),h=P/m.initialDistance;if(Math.abs(h-(m.lastScale||1))>a.pinchThreshold){const b=h>(m.lastScale||1)?"pinch-out":"pinch-in";if(a.enabledGestures.includes(b)){const T={x:(y[0].x+y[1].x)/2,y:(y[0].y+y[1].y)/2,timestamp:Date.now()},M={x:((m.startTouches[0]?.x??0)+(m.startTouches[1]?.x??0))/2,y:((m.startTouches[0]?.y??0)+(m.startTouches[1]?.y??0))/2,timestamp:m.startTouches[0]?.timestamp??Date.now()},S=D(b,M,T,{scale:h,distance:P});t(S),m.lastScale=h}}}if(m.longPressTimer&&y.length===1&&m.startTouches[0]&&y[0]){const P=m.startTouches[0],h=y[0];k(P,h)>a.swipeThreshold&&(clearTimeout(m.longPressTimer),m.longPressTimer=void 0)}},[a,t]),w=Q.useCallback(v=>{const m=i.current;if(!m.isTracking)return;const y=Array.from(v.changedTouches).map(f),P=Date.now();if(m.longPressTimer&&(clearTimeout(m.longPressTimer),m.longPressTimer=void 0),m.startTouches.length===1&&y.length===1&&m.startTouches[0]&&y[0]){const h=m.startTouches[0],d=y[0],b=k(h,d),T=d.timestamp-h.timestamp;if(b>a.swipeThreshold){const M=F(h,d),S=Math.abs(M.x),p=Math.abs(M.y);if(S>a.swipeVelocityThreshold||p>a.swipeVelocityThreshold){let K;if(S>p?K=M.x>0?"swipe-right":"swipe-left":K=M.y>0?"swipe-down":"swipe-up",a.enabledGestures.includes(K)){const R=D(K,h,d,{velocity:M,distance:b});t(R),a.enableHapticFeedback&&c("light")}}}else if(T<a.tapThreshold&&b<a.swipeThreshold)if(m.lastTap&&P-m.lastTap.timestamp<a.doubleTapThreshold&&k({...m.lastTap.point},d)<a.swipeThreshold){if(a.enabledGestures.includes("double-tap")){const M=D("double-tap",h,d);t(M),a.enableHapticFeedback&&c("medium")}m.lastTap=void 0}else{if(a.enabledGestures.includes("tap")){const M=D("tap",h,d);t(M),a.enableHapticFeedback&&c("light")}m.lastTap={timestamp:P,point:{x:d.x,y:d.y}}}}v.touches.length===0&&(m.isTracking=!1,m.touches=[],m.startTouches=[],m.initialDistance=void 0,m.initialScale=void 0,m.lastScale=void 0)},[a,t,c]);return Q.useEffect(()=>{const v=e.current;if(!(!v||!l))return v.addEventListener("touchstart",g,{passive:!1}),v.addEventListener("touchmove",r,{passive:!1}),v.addEventListener("touchend",w,{passive:!1}),v.addEventListener("touchcancel",w,{passive:!1}),()=>{v.removeEventListener("touchstart",g),v.removeEventListener("touchmove",r),v.removeEventListener("touchend",w),v.removeEventListener("touchcancel",w)}},[g,r,w,l]),{isGestureEnabled:l&&a.enabledGestures.length>0}}function Pe(e,t){const n=Q.useCallback(l=>{const{type:c,distance:i,scale:f}=l;switch(c){case"double-tap":t.onPlayPause?.();break;case"swipe-left":const k=Math.min((i||0)/10,30);t.onSeek?.("backward",k);break;case"swipe-right":const F=Math.min((i||0)/10,30);t.onSeek?.("forward",F);break;case"swipe-up":if(l.startPoint.x>(e.current?.clientWidth||0)/2){const D=Math.min((i||0)/100,.2);t.onVolumeChange?.("up",D)}break;case"swipe-down":if(l.startPoint.x>(e.current?.clientWidth||0)/2){const D=Math.min((i||0)/100,.2);t.onVolumeChange?.("down",D)}break;case"pinch-out":t.onZoom?.(f||1);break;case"pinch-in":t.onZoom?.(f||1);break;case"long-press":t.onToggleFullscreen?.();break}},[t,e]);return me(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 Ce(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 w=()=>{a(R=>({...R,currentTime:r.currentTime}))},v=()=>{a(R=>({...R,duration:r.duration}))},m=()=>{a(R=>({...R,isPlaying:!0,isBuffering:!1}))},y=()=>{a(R=>({...R,isPlaying:!1}))},P=()=>{a(R=>({...R,volume:r.volume,isMuted:r.muted}))},h=()=>{a(R=>({...R,isLoading:!0}))},d=()=>{a(R=>({...R,isLoading:!1}))},b=()=>{a(R=>({...R,isSeeking:!0}))},T=()=>{a(R=>({...R,isSeeking:!1}))},M=()=>{a(R=>({...R,isBuffering:!0}))},S=()=>{a(R=>({...R,isBuffering:!1,isLoading:!1}))},p=()=>{a(R=>({...R,isLoading:!1,isBuffering:!1}))},K=()=>{if(!r.buffered||r.buffered.length===0||r.duration===0){a(I=>({...I,bufferedRanges:[]}));return}const R=[];for(let I=0;I<r.buffered.length;I++){const A=r.buffered.start(I),L=r.buffered.end(I);R.push({start:A,end:L,percentage:(L-A)/r.duration*100})}a(I=>({...I,bufferedRanges:R}))};return r.addEventListener("timeupdate",w),r.addEventListener("loadedmetadata",v),r.addEventListener("play",m),r.addEventListener("pause",y),r.addEventListener("volumechange",P),r.addEventListener("loadstart",h),r.addEventListener("loadeddata",d),r.addEventListener("seeking",b),r.addEventListener("seeked",T),r.addEventListener("waiting",M),r.addEventListener("playing",S),r.addEventListener("canplay",p),r.addEventListener("progress",K),()=>{r.removeEventListener("timeupdate",w),r.removeEventListener("loadedmetadata",v),r.removeEventListener("play",m),r.removeEventListener("pause",y),r.removeEventListener("volumechange",P),r.removeEventListener("loadstart",h),r.removeEventListener("loadeddata",d),r.removeEventListener("seeking",b),r.removeEventListener("seeked",T),r.removeEventListener("waiting",M),r.removeEventListener("playing",S),r.removeEventListener("canplay",p),r.removeEventListener("progress",K)}},[]),{videoRef:t,state:n,controls:{togglePlay:()=>{const r=t.current;r&&(n.isPlaying?r.pause():r.play())},seekForward:(r=10)=>{const w=t.current;w&&(w.currentTime=Math.min(n.duration,w.currentTime+r))},seekBackward:(r=10)=>{const w=t.current;w&&(w.currentTime=Math.max(0,w.currentTime-r))},toggleMute:()=>{const r=t.current;r&&(r.muted=!n.isMuted)},setVolume:r=>{const w=t.current;w&&(w.volume=r,r>0&&n.isMuted&&(w.muted=!1))},toggleFullscreen:()=>{const r=e.current;r&&(n.isFullscreen?document.exitFullscreen&&document.exitFullscreen():r.requestFullscreen&&r.requestFullscreen(),a(w=>({...w,isFullscreen:!w.isFullscreen})))},seekTo:r=>{const w=t.current;!w||n.duration===0||(w.currentTime=Math.max(0,Math.min(n.duration,r)))}}}}function fe({subtitleSrc:e,subtitleTracks:t=[],defaultFontSize:n="medium",onLoadError:a}={}){const[l,c]=s.useState(!1),[i,f]=s.useState([]),[k,F]=s.useState(""),[D,g]=s.useState(null),[r,w]=s.useState(n),[v,m]=s.useState(null),[y,P]=s.useState(!1),h={small:"text-sm",medium:"text-base",large:"text-lg"},d=!!(e||t&&t.length>0),b=A=>{const L=A.split(":"),O=L[2]?parseFloat(L[2]):0,V=L[1]?parseInt(L[1],10)*60:0;return(L[0]?parseInt(L[0],10)*3600:0)+V+O},T=A=>{const[L,O]=A.split(","),V=(L||"").split(":"),$=O?parseInt(O,10)/1e3:0,u=V[2]?parseInt(V[2],10):0,_=V[1]?parseInt(V[1],10)*60:0;return(V[0]?parseInt(V[0],10)*3600:0)+_+u+$},M=async A=>{P(!0),m(null);try{const L=await fetch(A);if(!L.ok)throw new Error(`Failed to load subtitles: ${L.status} ${L.statusText}`);const O=await L.text(),V=[],$=O.split(`
|
|
2
|
-
`);let u=0;const _=O.includes("WEBVTT")||A.endsWith(".vtt"),q=A.endsWith(".srt")||/^\d+$/.test($[0]?.trim()||"");if(_)for(;u<$.length;){if($[u]?.includes("-->")){const[z,Z]=($[u]||"").split("-->").map(U=>U.trim()),J=b(z||""),o=b(Z||"");u++;let C="";for(;u<$.length&&$[u]?.trim()!=="";)C+=(C?" ":"")+$[u]?.trim(),u++;C&&V.push({start:J,end:o,text:C})}u++}else if(q)for(;u<$.length;){if(/^\d+$/.test($[u]?.trim()||"")&&(u++,$[u]?.includes("-->"))){const[z,Z]=($[u]||"").split("-->").map(U=>U.trim()),J=T(z||""),o=T(Z||"");u++;let C="";for(;u<$.length&&$[u]?.trim()!=="";)C+=(C?" ":"")+$[u]?.trim(),u++;C&&V.push({start:J,end:o,text:C})}u++}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");f(V),P(!1)}catch(L){const O=L instanceof Error?L:new Error("Failed to load subtitles");console.error("Failed to load subtitles:",O),m(O),P(!1),f([]),a?.(O)}},S=A=>!l||i.length===0?"":i.find(O=>A>=O.start&&A<=O.end)?.text||"",p=()=>{c(A=>{const L=!A;if(L&&!v){if(i.length===0&&!y){const O=e||t[0]?.src;O&&(M(O),t[0]&&g(t[0].id))}}else L||F("");return L})},K=A=>{if(!A){c(!1),g(null),F("");return}const L=t.find(O=>O.id===A);L?.src&&(g(A),M(L.src),c(!0))},R=A=>{w(A)},I={fontSize:h[r],className:`${h[r]} font-medium`};return s.useEffect(()=>{l||F("")},[l]),s.useEffect(()=>{},[]),{subtitlesEnabled:l,currentSubtitle:k,subtitleCues:i,currentTrackId:D,fontSize:r,loadError:v,isLoading:y,hasSubtitles:d,toggleSubtitles:p,selectSubtitleTrack:K,changeSubtitleFontSize:R,setCurrentSubtitle:F,getCurrentSubtitle:S,getSubtitleStyles:I,availableTracks:t}}const Ae=Object.freeze(Object.defineProperty({__proto__:null,useEnhancedSubtitles:fe},Symbol.toStringTag,{value:"Module"}));function Fe(e,t){const[n,a]=s.useState(!0),[l,c]=s.useState(!1),i=s.useRef(null),f=()=>{a(!0),i.current&&clearTimeout(i.current),e&&!t&&(i.current=setTimeout(()=>{a(!1)},3e3))},k=()=>{f()},F=()=>{a(!0)},D=()=>{e&&a(!1)};return s.useEffect(()=>(f(),()=>{i.current&&clearTimeout(i.current)}),[f]),{controlsVisible:n,showVolumeSlider:l,setShowVolumeSlider:c,handleMouseMove:k,handleMouseEnter:F,handleMouseLeave:D}}function De({videoControls:e,toggleSubtitles:t,takeScreenshot:n,duration:a}){const l=c=>{const i=document.querySelector("video");if(i)switch(c.key.toLowerCase()){case" ":case"k":c.preventDefault(),e.togglePlay();break;case"j":c.preventDefault(),e.seekBackward();break;case"l":c.preventDefault(),e.seekForward();break;case"arrowleft":c.preventDefault(),i.currentTime=Math.max(0,i.currentTime-5);break;case"arrowright":c.preventDefault(),i.currentTime=Math.min(a,i.currentTime+5);break;case"arrowup":c.preventDefault(),i.volume=Math.min(1,i.volume+.1);break;case"arrowdown":c.preventDefault(),i.volume=Math.max(0,i.volume-.1);break;case"m":c.preventDefault(),e.toggleMute();break;case"f":c.preventDefault(),e.toggleFullscreen();break;case"c":c.preventDefault(),t();break;case"s":c.preventDefault(),n(c.ctrlKey||c.metaKey);break}};s.useEffect(()=>(document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)),[l])}function Re(e){return{takeScreenshot:(n=!1)=>{if(!e.current)return;const a=e.current,l=document.createElement("canvas");l.width=a.videoWidth,l.height=a.videoHeight;const c=l.getContext("2d");if(c)try{c.drawImage(a,0,0),l.toBlob(i=>{if(!i){console.error("Failed to create blob from canvas");return}if(n)if(navigator.clipboard&&window.ClipboardItem){const f=new ClipboardItem({"image/png":i});navigator.clipboard.write([f]).catch(k=>{console.error("Failed to copy to clipboard:",k)})}else console.warn("Clipboard API not supported");else{const f=URL.createObjectURL(i),k=document.createElement("a");k.href=f,k.download=`screenshot-${Date.now()}.png`,k.click(),URL.revokeObjectURL(f)}},"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 N(e,t){return((n,a=!1)=>{const l={type:e,detail:n,optimistic:a,timestamp:Date.now()};return a?t.dispatchOptimistic(l):(t.dispatch(l),Promise.resolve())})}function pe(e){const[t,n]=s.useState(e.getActionState());return s.useEffect(()=>e.subscribe(()=>{const l=e.getActionState();n(c=>JSON.stringify(c)!==JSON.stringify(l)?l:c)}),[e]),t}function xe(e){const t=s.useMemo(()=>({play:N(E.MediaActionTypes.PLAY,e),pause:N(E.MediaActionTypes.PAUSE,e),seek:N(E.MediaActionTypes.SEEK,e),setVolume:N(E.MediaActionTypes.SET_VOLUME,e),mute:N(E.MediaActionTypes.MUTE,e),unmute:N(E.MediaActionTypes.UNMUTE,e),toggleMute:N(E.MediaActionTypes.TOGGLE_MUTE,e),setDuration:N(E.MediaActionTypes.SET_DURATION,e),setCurrentTime:N(E.MediaActionTypes.SET_CURRENT_TIME,e),setBuffered:N(E.MediaActionTypes.SET_BUFFERED,e),setLoading:N(E.MediaActionTypes.SET_LOADING,e),setError:N(E.MediaActionTypes.SET_ERROR,e),enterFullscreen:N(E.MediaActionTypes.ENTER_FULLSCREEN,e),exitFullscreen:N(E.MediaActionTypes.EXIT_FULLSCREEN,e),enterPiP:N(E.MediaActionTypes.ENTER_PIP,e),exitPiP:N(E.MediaActionTypes.EXIT_PIP,e),setPlaybackRate:N(E.MediaActionTypes.SET_PLAYBACK_RATE,e),setSubtitleTrack:N(E.MediaActionTypes.SET_SUBTITLE_TRACK,e),setRendition:N(E.MediaActionTypes.SET_RENDITION,e),toggleSubtitles:N(E.MediaActionTypes.TOGGLE_SUBTITLES,e),previewTime:N(E.MediaActionTypes.PREVIEW_TIME,e),clearPreview:N(E.MediaActionTypes.CLEAR_PREVIEW,e)}),[e]),n=pe(e),a=s.useMemo(()=>({togglePlayPause:async c=>{c?await t.pause(!0):await t.play(!0)},seekWithPreview:async c=>{await t.previewTime(c,!0),await t.seek(c,!0)},adjustVolume:async(c,i)=>{const f=Math.max(0,Math.min(1,i+c));await t.setVolume(f,!0)},toggleFullscreenOptimistic:async c=>{c?await t.exitFullscreen(!0):await t.enterFullscreen(!0)}}),[t]),l=s.useCallback(async()=>{const{lastAction:c}=n;c&&n.error&&await e.dispatchOptimistic({...c,retryCount:(c.retryCount||0)+1})},[e,n]);return{...t,...a,actionState:n,retryLastAction:l,isLoading:n.pending,hasError:!!n.error,errorMessage:n.error,retryCount:n.retryCount}}function Oe(){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(w=>({...w,...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 Ie(e){const t=s.useRef(null),n=s.useRef(null),[a,l]=s.useTransition(),[c,i]=s.useTransition();s.useRef(0);const f=s.useRef(0),k=s.useRef(0);s.useRef(void 0);const F=s.useRef(0),D=E.useMediaStore(),g="getOptimisticState"in D,r=E.useMediaSelector$1(o=>o.isPlaying),w=E.useMediaSelector$1(o=>o.currentTime),v=E.useMediaSelector$1(o=>o.duration),m=E.useMediaSelector$1(o=>o.volume),y=E.useMediaSelector$1(o=>o.isMuted),P=E.useMediaSelector$1(o=>o.isLoading),h=E.useMediaSelector$1(o=>o.isBuffering),d=E.useMediaSelector$1(o=>o.error),b=E.useMediaSelector$1(o=>o.buffered),T=E.useMediaSelector$1(o=>o.isFullscreen),M=D,S=g?ce(M):null,p=g?ue(M):null,[K,R]=s.useState({frameRate:0,averageRenderTime:0,droppedFrames:0,bufferHealth:0}),[I,A]=s.useOptimistic(m,(o,C)=>Math.max(0,Math.min(1,C)));s.useOptimistic(w,(o,C)=>Math.max(0,Math.min(v||0,C))),s.useEffect(()=>{const o=t.current;if(!o)return;const C={volume:e.volume,muted:e.muted,autoplay:e.autoPlay,loop:e.loop,preload:e.preload,crossOrigin:e.crossOrigin};Object.entries(C).forEach(([U,G])=>{G!==void 0&&(o[U]=G)}),o.setAttribute("preload",e.preloadStrategy==="eager"?"auto":"metadata"),e.bufferingStrategy==="aggressive"&&o.setAttribute("buffered","auto"),o instanceof HTMLVideoElement&&(o.style.willChange="transform",o.style.transform="translateZ(0)")},[e.volume,e.muted,e.autoPlay,e.loop,e.preload,e.crossOrigin,e.preloadStrategy,e.bufferingStrategy]);const L=s.useCallback(()=>{const o=t.current;if(!o)return;const C=performance.now();if(e.enableTimeUpdateThrottling!==!1){if(C-F.current<(e.timeUpdateThrottleMs||100))return;F.current=C}l(()=>{g&&p&&p.setCurrentTime(o.currentTime)})},[e.enableTimeUpdateThrottling,e.timeUpdateThrottleMs,g,p]),O=s.useCallback(()=>{l(()=>{g&&p&&p.play(!0)}),e.onPlay?.()},[g,p,e.onPlay]),V=s.useCallback(()=>{l(()=>{g&&p&&p.pause(!0)}),e.onPause?.()},[g,p,e.onPause]),$=s.useCallback(()=>{const o=t.current;o&&l(()=>{g&&p&&(p.setVolume(o.volume,!0),o.muted?p.mute(!0):p.unmute(!0))})},[g,p]),u=s.useCallback(()=>{i(()=>{})},[]),_=s.useCallback(()=>{},[]),q=s.useCallback(()=>{const o=t.current;o&&l(()=>{g&&p&&p.setBuffered(o.buffered)})},[g,p]),z=s.useCallback(()=>{const o=performance.now();if(o-k.current>0&&(f.current++,f.current>=60)){const U=Math.round(f.current*1e3/(o-k.current));R(G=>({...G,frameRate:U,droppedFrames:Math.max(0,60-U)})),f.current=0,k.current=o}},[]);s.useEffect(()=>{const o=t.current;if(!o)return;const C=[{event:"timeupdate",handler:L,passive:!0},{event:"play",handler:O},{event:"pause",handler:V},{event:"volumechange",handler:$},{event:"seeking",handler:u},{event:"seeked",handler:_},{event:"progress",handler:q,passive:!0},{event:"loadedmetadata",handler:()=>z()},{event:"loadeddata",handler:()=>z()}];C.forEach(({event:X,handler:Y,passive:ee})=>{const te=ee?{passive:!0}:{};o.addEventListener(X,Y,te)});let U;const G=()=>{z(),U=requestAnimationFrame(G)};return e.enablePerformanceMonitoring&&G(),()=>{C.forEach(({event:X,handler:Y})=>{o.removeEventListener(X,Y)}),U&&cancelAnimationFrame(U)}},[L,O,V,$,u,_,q,z,e.enablePerformanceMonitoring]);const Z=s.useMemo(()=>{const o=async()=>{const x=t.current;if(x)if(g&&p)await p.play(!0);else try{await x.play()}catch(H){console.error("Failed to play media:",H)}},C=()=>{const x=t.current;x&&(g&&p?p.pause(!0):x.pause())},U=()=>{r?C():o()},G=x=>{const H=t.current;if(!H)return;const W=Math.max(0,Math.min(x,v||0));g&&p?i(()=>{p.seek(W,!0)}):H.currentTime=W},X=x=>{const H=t.current;if(!H)return;const W=Math.max(0,Math.min(1,x));g&&p?(A(W),l(()=>{p.setVolume(W,!0)})):H.volume=W},Y=()=>{const x=t.current;x&&(g&&p?p.toggleMute(!0):x.muted=!x.muted)},ee=async()=>{const x=n.current;if(!(!x||!document.fullscreenEnabled))try{await x.requestFullscreen(),g&&p&&p.enterFullscreen(!0)}catch(H){console.error("Failed to enter fullscreen:",H)}},te=async()=>{if(document.fullscreenElement)try{await document.exitFullscreen(),g&&p&&p.exitFullscreen(!0)}catch(x){console.error("Failed to exit fullscreen:",x)}};return{play:o,pause:C,toggle:U,seek:G,setVolume:X,toggleMute:Y,enterFullscreen:ee,exitFullscreen:te,toggleFullscreen:()=>{document.fullscreenElement?te():ee()}}},[r,v,g,p,l,i,A]),J=s.useMemo(()=>({isPlaying:S?.state?.isPlaying??r,currentTime:S?.state?.currentTime??w,duration:S?.state?.duration??v,volume:S?.state?.volume??I,isMuted:S?.state?.isMuted??y,isLoading:S?.state?.isBuffering??P,isBuffering:S?.state?.isBuffering??h,error:S?.state?.error??d,buffered:S?.state?.buffered??b,isFullscreen:S?.state?.isFullscreen??T,progress:v>0?w/v:0,isTransitioning:a||c,canPlay:!P&&!h&&!d}),[S,r,w,v,I,y,P,h,d,b,T,a,c]);return{mediaRef:t,containerRef:n,state:J,actualState:S?.actualState,controls:Z,performanceMetrics:K,isTransitioning:a||c,actions:S,actionState:S?.state,optimisticState:S,isEnhanced:g}}const Ve=(e,t={})=>{const{trackUserBehavior:n=!0,adaptToNetwork:a=!0,strategy:l="balanced",maxPreloadItems:c=3,preloadRadius:i=2}=t,f=s.useRef({mouseMovements:0,scrollEvents:0,keyPresses:0,focusEvents:0,timeOnPage:0,engagementScore:0,lastInteraction:Date.now()}),k=s.useRef(null),F=s.useRef(new Set),D=s.useRef([]),g=s.useCallback(()=>{const d=f.current,b=Math.min(d.timeOnPage/6e4,1),T=Math.min((d.mouseMovements+d.scrollEvents+d.keyPresses)/100,1);return(b*.4+T*.6)*100},[]),r=s.useCallback((d,b=1)=>{const T=f.current;T[d]=typeof T[d]=="number"?T[d]+b:Date.now(),T.engagementScore=g(),T.lastInteraction=Date.now()},[g]),w=s.useCallback(()=>{if(!k.current||!a)return{type:"unknown",downlink:10,effectiveType:"4g",saveData:!1};const d=k.current;return{type:d.effectiveType||"4g",downlink:d.downlink||10,effectiveType:d.effectiveType||"4g",saveData:d.saveData||!1,rtt:d.rtt||100}},[a]),v=s.useCallback((d,b,T=0)=>{if(F.current.has(d.src))return{shouldPreload:!1,priority:"low",reason:"Already preloaded"};const M=Math.abs(b-T);if(M>i)return{shouldPreload:!1,priority:"low",reason:"Outside preload radius"};const S=f.current,p=w(),K=S.engagementScore,R=Date.now()-S.lastInteraction;if(p.saveData)return{shouldPreload:!1,priority:"low",reason:"Data saver mode"};let I=!1,A="medium",L="";switch(l){case"conservative":I=K>70&&p.effectiveType!=="2g"&&M===1,A=I?"medium":"low",L=I?"High engagement and optimal network":"Conservative strategy";break;case"aggressive":I=K>30&&p.effectiveType!=="slow-2g",A=K>70?"high":K>50?"medium":"low",L=I?"Aggressive preloading":"Low engagement";break;case"balanced":default:const O=p.effectiveType==="4g"?1:p.effectiveType==="3g"?.7:.3,V=K*O;I=V>40&&M<=2,A=V>70?"high":V>55?"medium":"low",L=I?`Balanced: score ${V.toFixed(1)}`:"Low adjusted score";break}if(I){const O=d.src.toLowerCase();(O.includes(".m3u8")||O.includes("hls"))&&(A=A==="low"?"medium":"high"),R<5e3&&(A="high",L+=" + Recent interaction"),(d.type?.includes("mp4")||d.type?.includes("webm")||O.includes(".mp4")||O.includes(".webm"))&&(A=A==="low"?"medium":A)}return{shouldPreload:I,priority:A,reason:L}},[l,i,w,g]),m=s.useCallback(async(d,b)=>{try{const T=document.createElement("link");T.rel="preload",T.href=d.src;const M=d.src.toLowerCase(),S=d.type?.toLowerCase()||"";M.includes(".m3u8")||M.includes("hls")?T.as="fetch":S.includes("mp4")||S.includes("webm")||M.includes(".mp4")||M.includes(".webm")?T.as="video":S.includes("mp3")||S.includes("wav")||S.includes("ogg")||M.includes(".mp3")||M.includes(".wav")||M.includes(".ogg")?T.as="audio":T.as="fetch",T.crossOrigin="anonymous",document.head.appendChild(T),F.current.add(d.src),console.debug(`Preloaded: ${d.src} (${b})`),setTimeout(()=>{document.head.contains(T)&&document.head.removeChild(T)},3e4)}catch(T){console.warn("Failed to preload source:",d.src,T)}},[]),y=s.useCallback(()=>{if(D.current.length===0)return;const b=[...D.current].sort((T,M)=>M.priority-T.priority).slice(0,c);D.current=[],b.forEach(({source:T,priority:M})=>{m(T,M)})},[c,m]),P=s.useCallback((d=0)=>{D.current=[],e.forEach((b,T)=>{const M=v(b,T,d);if(M.shouldPreload){const S=M.priority==="high"?3:M.priority==="medium"?2:1;D.current.push({source:b,priority:S})}}),y()},[e,v,y]);return s.useEffect(()=>{if(!n)return;const d=()=>r("mouseMovements"),b=()=>r("scrollEvents"),T=()=>r("keyPresses"),M=()=>r("focusEvents");document.addEventListener("mousemove",d,{passive:!0}),document.addEventListener("scroll",b,{passive:!0}),document.addEventListener("keydown",T,{passive:!0}),document.addEventListener("focusin",M,{passive:!0});const S=setInterval(()=>{r("timeOnPage",1)},1e3);return()=>{document.removeEventListener("mousemove",d),document.removeEventListener("scroll",b),document.removeEventListener("keydown",T),document.removeEventListener("focusin",M),clearInterval(S)}},[n,r]),s.useEffect(()=>{if(!a||!("connection"in navigator))return;const d=navigator.connection;k.current=d;const b=()=>{P()};return d.addEventListener("change",b),()=>{d.removeEventListener("change",b)}},[a,P]),s.useEffect(()=>{P()},[P]),s.useMemo(()=>({preloadAtIndex:d=>{P(d)},getUserBehavior:()=>({...f.current}),getNetworkConditions:w,clearCache:()=>{F.current.clear()},getStats:()=>({preloadedItems:F.current.size,engagementScore:f.current.engagementScore,queueLength:D.current.length,maxPreloadItems:c})}),[P,w,c])};function ge(e){const[t,n]=s.useState(!1),[a,l]=s.useState([]),[c,i]=s.useState(""),f=g=>{const r=g.split(":"),w=r[2]?parseFloat(r[2]):0,v=r[1]?parseInt(r[1],10)*60:0;return(r[0]?parseInt(r[0],10)*3600:0)+v+w},k=async g=>{try{const w=await(await fetch(g)).text(),v=[],m=w.split(`
|
|
3
|
-
`);let y=0;for(;y<m.length;){if(m[y]?.includes("-->")){const[P,h]=(m[y]||"").split("-->").map(M=>M.trim()),d=f(P||""),b=f(h||"");y++;let T="";for(;y<m.length&&m[y]?.trim()!=="";)T+=(T?" ":"")+m[y]?.trim(),y++;T&&v.push({start:d,end:b,text:T})}y++}l(v)}catch(r){console.error("Failed to load subtitles:",r)}},F=g=>!t||a.length===0?"":a.find(w=>g>=w.start&&g<=w.end)?.text||"",D=()=>{n(g=>{const r=!g;return r&&e&&a.length===0?k(e):r||i(""),r})};return s.useEffect(()=>{t||i("")},[t]),{subtitlesEnabled:t,currentSubtitle:c,toggleSubtitles:D,getCurrentSubtitle:F,setCurrentSubtitle:i}}function $e(e){return oe.showDeprecationWarning("useVideoPlayer","useMediaPlayer (the primary media player hook)"),de(e)}function Ue(e){return oe.showDeprecationWarning("useEnhancedSubtitles","useSubtitles (the current subtitle hook)"),ge(e)}exports.useDeviceInfo=ne;exports.useEnhancedMediaPlayer=Ee;exports.useEnhancedMediaPlayer$1=Ie;exports.useEnhancedSubtitles=fe;exports.useEnhancedSubtitles$1=Ue;exports.useEnhancedSubtitles$2=Ae;exports.useIntelligentPreloading=Ve;exports.useKeyboardControls=ve;exports.useKeyboardControls$1=le;exports.useKeyboardControls$2=we;exports.useKeyboardShortcuts=De;exports.useMediaActionState=pe;exports.useMediaActions=xe;exports.useMediaControls=Fe;exports.useMediaGestures=Pe;exports.useMediaPlayer=de;exports.useMediaState=Oe;exports.useMemoryOptimization=be;exports.useMobileOptimizations=Se;exports.useScreenshot=Re;exports.useSubtitles=ge;exports.useTouchGestures=me;exports.useVideoPlayer=Ce;exports.useVideoPlayer$1=$e;
|
|
4
|
-
//# sourceMappingURL=hooks-BCMilGRf.cjs.map
|