@therealtinhtute/baroiplayer 1.0.0 → 1.0.2
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/context/media.js +1 -1
- package/dist/context/media.mjs +5 -5
- package/dist/context/store.js +1 -1
- package/dist/context/store.mjs +1 -1
- package/dist/{context-BMteAJDN.js → context-Af84FynT.js} +304 -265
- package/dist/context-Af84FynT.js.map +1 -0
- package/dist/context-CwZnPdz0.cjs +23 -0
- package/dist/context-CwZnPdz0.cjs.map +1 -0
- package/dist/core.js +2 -2
- package/dist/core.mjs +27 -27
- package/dist/{enhanced-components-DTIObgB7.cjs → enhanced-components-CXnYiOt6.cjs} +2 -2
- package/dist/{enhanced-components-DTIObgB7.cjs.map → enhanced-components-CXnYiOt6.cjs.map} +1 -1
- package/dist/{enhanced-components-DHv0MFvG.js → enhanced-components-Da0TSvKe.js} +158 -158
- package/dist/{enhanced-components-DHv0MFvG.js.map → enhanced-components-Da0TSvKe.js.map} +1 -1
- package/dist/hooks-BhW_i-9L.js +2013 -0
- package/dist/hooks-BhW_i-9L.js.map +1 -0
- package/dist/hooks-DTXeB5Z-.cjs +4 -0
- package/dist/hooks-DTXeB5Z-.cjs.map +1 -0
- package/dist/index.css +102 -1
- package/dist/index.d.ts +1388 -0
- package/dist/index.js +27 -112
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -6126
- package/dist/index.mjs.map +1 -1
- package/dist/{minimal-components-DSq5sQpy.js → minimal-components-B0bILe18.js} +236 -236
- package/dist/{minimal-components-DSq5sQpy.js.map → minimal-components-B0bILe18.js.map} +1 -1
- package/dist/{minimal-components-DflWiihN.cjs → minimal-components-BsqodtY8.cjs} +2 -2
- package/dist/{minimal-components-DflWiihN.cjs.map → minimal-components-BsqodtY8.cjs.map} +1 -1
- package/dist/minimal-components.css +589 -1
- package/dist/package.json +28 -0
- package/dist/{performance-monitor-rMW1RgV3.js → performance-monitor--rzKTlbj.js} +2 -2
- package/dist/{performance-monitor-rMW1RgV3.js.map → performance-monitor--rzKTlbj.js.map} +1 -1
- package/dist/{performance-monitor-CUW6f5ll.cjs → performance-monitor-cjIvZE2D.cjs} +2 -2
- package/dist/{performance-monitor-CUW6f5ll.cjs.map → performance-monitor-cjIvZE2D.cjs.map} +1 -1
- package/dist/src/adapters/videojs-adapter.d.ts +38 -0
- package/dist/src/adapters/videojs-adapter.d.ts.map +1 -0
- package/dist/src/adapters/videojs-adapter.js +350 -0
- package/dist/src/adapters/videojs-adapter.tsx +470 -0
- package/dist/src/assets/mona-loading.gif +0 -0
- package/dist/src/components/AnimateLoading.d.ts +9 -0
- package/dist/src/components/AnimateLoading.d.ts.map +1 -0
- package/dist/src/components/AnimateLoading.js +41 -0
- package/dist/src/components/AnimateLoading.tsx +115 -0
- package/dist/src/components/LoadingState.d.ts +33 -0
- package/dist/src/components/LoadingState.d.ts.map +1 -0
- package/dist/src/components/LoadingState.js +111 -0
- package/dist/src/components/LoadingState.tsx +248 -0
- package/dist/src/components/accessibility/keyboard-help-overlay.d.ts +17 -0
- package/dist/src/components/accessibility/keyboard-help-overlay.d.ts.map +1 -0
- package/dist/src/components/accessibility/keyboard-help-overlay.js +90 -0
- package/dist/src/components/accessibility/keyboard-help-overlay.tsx +213 -0
- package/dist/src/components/audio-player.d.ts +3 -0
- package/dist/src/components/audio-player.d.ts.map +1 -0
- package/dist/src/components/audio-player.js +31 -0
- package/dist/src/components/audio-player.tsx +85 -0
- package/dist/src/components/basic/index.d.ts +26 -0
- package/dist/src/components/basic/index.d.ts.map +1 -0
- package/dist/src/components/basic/index.js +29 -0
- package/dist/src/components/basic/index.ts +37 -0
- package/dist/src/components/enhanced/advanced-features.d.ts +45 -0
- package/dist/src/components/enhanced/advanced-features.d.ts.map +1 -0
- package/dist/src/components/enhanced/advanced-features.js +64 -0
- package/dist/src/components/enhanced/advanced-features.tsx +316 -0
- package/dist/src/components/enhanced/debug-panel.d.ts +70 -0
- package/dist/src/components/enhanced/debug-panel.d.ts.map +1 -0
- package/dist/src/components/enhanced/debug-panel.js +94 -0
- package/dist/src/components/enhanced/debug-panel.tsx +422 -0
- package/dist/src/components/enhanced/enhanced-controls.d.ts +50 -0
- package/dist/src/components/enhanced/enhanced-controls.d.ts.map +1 -0
- package/dist/src/components/enhanced/enhanced-controls.js +233 -0
- package/dist/src/components/enhanced/enhanced-controls.tsx +600 -0
- package/dist/src/components/enhanced/enhanced-media-player.d.ts +26 -0
- package/dist/src/components/enhanced/enhanced-media-player.d.ts.map +1 -0
- package/dist/src/components/enhanced/enhanced-media-player.js +316 -0
- package/dist/src/components/enhanced/enhanced-media-player.tsx +509 -0
- package/dist/src/components/enhanced/error-handling.d.ts +36 -0
- package/dist/src/components/enhanced/error-handling.d.ts.map +1 -0
- package/dist/src/components/enhanced/error-handling.js +153 -0
- package/dist/src/components/enhanced/error-handling.tsx +345 -0
- package/dist/src/components/enhanced/index.d.ts +7 -0
- package/dist/src/components/enhanced/index.d.ts.map +1 -0
- package/dist/src/components/enhanced/index.js +10 -0
- package/dist/src/components/enhanced/index.ts +39 -0
- package/dist/src/components/enhanced/media-player-enhanced.d.ts +21 -0
- package/dist/src/components/enhanced/media-player-enhanced.d.ts.map +1 -0
- package/dist/src/components/enhanced/media-player-enhanced.js +250 -0
- package/dist/src/components/enhanced/media-player-enhanced.tsx +349 -0
- package/dist/src/components/examples/basic-video-player.d.ts +10 -0
- package/dist/src/components/examples/basic-video-player.d.ts.map +1 -0
- package/dist/src/components/examples/basic-video-player.js +16 -0
- package/dist/src/components/examples/basic-video-player.tsx +55 -0
- package/dist/src/components/examples/custom-controls-example.d.ts +10 -0
- package/dist/src/components/examples/custom-controls-example.d.ts.map +1 -0
- package/dist/src/components/examples/custom-controls-example.js +12 -0
- package/dist/src/components/examples/custom-controls-example.tsx +63 -0
- package/dist/src/components/examples/enhanced-controls-example.d.ts +9 -0
- package/dist/src/components/examples/enhanced-controls-example.d.ts.map +1 -0
- package/dist/src/components/examples/enhanced-controls-example.js +18 -0
- package/dist/src/components/examples/enhanced-controls-example.tsx +114 -0
- package/dist/src/components/examples/enhanced-media-player-example.d.ts +9 -0
- package/dist/src/components/examples/enhanced-media-player-example.d.ts.map +1 -0
- package/dist/src/components/examples/enhanced-media-player-example.js +13 -0
- package/dist/src/components/examples/enhanced-media-player-example.tsx +293 -0
- package/dist/src/components/examples/loading-states-demo.d.ts +2 -0
- package/dist/src/components/examples/loading-states-demo.d.ts.map +1 -0
- package/dist/src/components/examples/loading-states-demo.js +41 -0
- package/dist/src/components/examples/loading-states-demo.tsx +142 -0
- package/dist/src/components/examples/react-19-demo.d.ts +10 -0
- package/dist/src/components/examples/react-19-demo.d.ts.map +1 -0
- package/dist/src/components/examples/react-19-demo.js +104 -0
- package/dist/src/components/examples/react-19-demo.tsx +381 -0
- package/dist/src/components/examples/volume-orientation-demo.d.ts +2 -0
- package/dist/src/components/examples/volume-orientation-demo.d.ts.map +1 -0
- package/dist/src/components/examples/volume-orientation-demo.js +31 -0
- package/dist/src/components/examples/volume-orientation-demo.tsx +114 -0
- package/dist/src/components/icon-demo.d.ts +2 -0
- package/dist/src/components/icon-demo.d.ts.map +1 -0
- package/dist/src/components/icon-demo.js +16 -0
- package/dist/src/components/icon-demo.tsx +209 -0
- package/dist/src/components/icons/index.d.ts +36 -0
- package/dist/src/components/icons/index.d.ts.map +1 -0
- package/dist/src/components/icons/index.js +59 -0
- package/dist/src/components/icons/index.tsx +166 -0
- package/dist/src/components/icons/svg-icons/ArrowLeftIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/ArrowLeftIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/ArrowLeftIcon.tsx +18 -0
- package/dist/src/components/icons/svg-icons/ArrowRightIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/ArrowRightIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/ArrowRightIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/ArrowRightIcon.tsx +18 -0
- package/dist/src/components/icons/svg-icons/AudioIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/AudioIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/AudioIcon.js +4 -0
- package/dist/src/components/icons/svg-icons/AudioIcon.tsx +22 -0
- package/dist/src/components/icons/svg-icons/BackwardIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/BackwardIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/BackwardIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/BackwardIcon.tsx +12 -0
- package/dist/src/components/icons/svg-icons/CameraIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/CameraIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/CameraIcon.js +4 -0
- package/dist/src/components/icons/svg-icons/CameraIcon.tsx +19 -0
- package/dist/src/components/icons/svg-icons/CheckIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/CheckIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/CheckIcon.js +4 -0
- package/dist/src/components/icons/svg-icons/CheckIcon.tsx +19 -0
- package/dist/src/components/icons/svg-icons/EnablePiPIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/EnablePiPIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/EnablePiPIcon.js +5 -0
- package/dist/src/components/icons/svg-icons/EnablePiPIcon.tsx +17 -0
- package/dist/src/components/icons/svg-icons/ForwardIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/ForwardIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/ForwardIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/ForwardIcon.tsx +12 -0
- package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.tsx +23 -0
- package/dist/src/components/icons/svg-icons/FullscreenExitIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/FullscreenExitIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/FullscreenExitIcon.tsx +23 -0
- package/dist/src/components/icons/svg-icons/LoadingIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/LoadingIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/LoadingIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/LoadingIcon.tsx +32 -0
- package/dist/src/components/icons/svg-icons/PauseIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/PauseIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/PauseIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/PauseIcon.tsx +23 -0
- package/dist/src/components/icons/svg-icons/PlayIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/PlayIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/PlayIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/PlayIcon.tsx +21 -0
- package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.tsx +23 -0
- package/dist/src/components/icons/svg-icons/QualityIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/QualityIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/QualityIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/QualityIcon.tsx +21 -0
- package/dist/src/components/icons/svg-icons/SettingsIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/SettingsIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/SettingsIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/SettingsIcon.tsx +12 -0
- package/dist/src/components/icons/svg-icons/SliderIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/SliderIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/SliderIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/SliderIcon.tsx +21 -0
- package/dist/src/components/icons/svg-icons/SubtitleIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/SubtitleIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/SubtitleIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/SubtitleIcon.tsx +21 -0
- package/dist/src/components/icons/svg-icons/SubtitleOffIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/SubtitleOffIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/SubtitleOffIcon.tsx +25 -0
- package/dist/src/components/icons/svg-icons/UnPiPIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/UnPiPIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/UnPiPIcon.js +5 -0
- package/dist/src/components/icons/svg-icons/UnPiPIcon.tsx +17 -0
- package/dist/src/components/icons/svg-icons/VolumeMutedIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/VolumeMutedIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/VolumeMutedIcon.tsx +16 -0
- package/dist/src/components/icons/svg-icons/VolumeOneIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/VolumeOneIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/VolumeOneIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/VolumeOneIcon.tsx +22 -0
- package/dist/src/components/icons/svg-icons/VolumeThreeIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/VolumeThreeIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/VolumeThreeIcon.tsx +16 -0
- package/dist/src/components/icons/svg-icons/VolumeTwoIcon.d.ts +4 -0
- package/dist/src/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +1 -0
- package/dist/src/components/icons/svg-icons/VolumeTwoIcon.js +3 -0
- package/dist/src/components/icons/svg-icons/VolumeTwoIcon.tsx +16 -0
- package/dist/src/components/legacy.d.ts +13 -0
- package/dist/src/components/legacy.d.ts.map +1 -0
- package/dist/src/components/legacy.js +52 -0
- package/dist/src/components/legacy.tsx +93 -0
- package/dist/src/components/media-metadata-display.d.ts +11 -0
- package/dist/src/components/media-metadata-display.d.ts.map +1 -0
- package/dist/src/components/media-metadata-display.js +20 -0
- package/dist/src/components/media-metadata-display.tsx +100 -0
- package/dist/src/components/media-player-audio.d.ts +9 -0
- package/dist/src/components/media-player-audio.d.ts.map +1 -0
- package/dist/src/components/media-player-audio.js +18 -0
- package/dist/src/components/media-player-audio.tsx +39 -0
- package/dist/src/components/media-player-controls.d.ts +23 -0
- package/dist/src/components/media-player-controls.d.ts.map +1 -0
- package/dist/src/components/media-player-controls.js +150 -0
- package/dist/src/components/media-player-controls.tsx +226 -0
- package/dist/src/components/media-player-error.d.ts +16 -0
- package/dist/src/components/media-player-error.d.ts.map +1 -0
- package/dist/src/components/media-player-error.js +85 -0
- package/dist/src/components/media-player-error.tsx +163 -0
- package/dist/src/components/media-player-fullscreen.d.ts +12 -0
- package/dist/src/components/media-player-fullscreen.d.ts.map +1 -0
- package/dist/src/components/media-player-fullscreen.js +68 -0
- package/dist/src/components/media-player-fullscreen.tsx +109 -0
- package/dist/src/components/media-player-hls.d.ts +23 -0
- package/dist/src/components/media-player-hls.d.ts.map +1 -0
- package/dist/src/components/media-player-hls.js +20 -0
- package/dist/src/components/media-player-hls.tsx +111 -0
- package/dist/src/components/media-player-loading.d.ts +12 -0
- package/dist/src/components/media-player-loading.d.ts.map +1 -0
- package/dist/src/components/media-player-loading.js +53 -0
- package/dist/src/components/media-player-loading.tsx +76 -0
- package/dist/src/components/media-player-play.d.ts +11 -0
- package/dist/src/components/media-player-play.d.ts.map +1 -0
- package/dist/src/components/media-player-play.js +44 -0
- package/dist/src/components/media-player-play.tsx +75 -0
- package/dist/src/components/media-player-root.d.ts +28 -0
- package/dist/src/components/media-player-root.d.ts.map +1 -0
- package/dist/src/components/media-player-root.js +243 -0
- package/dist/src/components/media-player-root.tsx +340 -0
- package/dist/src/components/media-player-seek.d.ts +15 -0
- package/dist/src/components/media-player-seek.d.ts.map +1 -0
- package/dist/src/components/media-player-seek.js +92 -0
- package/dist/src/components/media-player-seek.tsx +168 -0
- package/dist/src/components/media-player-time.d.ts +12 -0
- package/dist/src/components/media-player-time.d.ts.map +1 -0
- package/dist/src/components/media-player-time.js +57 -0
- package/dist/src/components/media-player-time.tsx +99 -0
- package/dist/src/components/media-player-tooltip.d.ts +13 -0
- package/dist/src/components/media-player-tooltip.d.ts.map +1 -0
- package/dist/src/components/media-player-tooltip.js +14 -0
- package/dist/src/components/media-player-tooltip.tsx +58 -0
- package/dist/src/components/media-player-video.d.ts +9 -0
- package/dist/src/components/media-player-video.d.ts.map +1 -0
- package/dist/src/components/media-player-video.js +18 -0
- package/dist/src/components/media-player-video.tsx +39 -0
- package/dist/src/components/media-player-volume.d.ts +13 -0
- package/dist/src/components/media-player-volume.d.ts.map +1 -0
- package/dist/src/components/media-player-volume.js +88 -0
- package/dist/src/components/media-player-volume.tsx +155 -0
- package/dist/src/components/media-player.d.ts +3 -0
- package/dist/src/components/media-player.d.ts.map +1 -0
- package/dist/src/components/media-player.js +67 -0
- package/dist/src/components/media-player.tsx +257 -0
- package/dist/src/components/media-suspense.d.ts +78 -0
- package/dist/src/components/media-suspense.d.ts.map +1 -0
- package/dist/src/components/media-suspense.js +173 -0
- package/dist/src/components/media-suspense.tsx +362 -0
- package/dist/src/components/player-settings-form.d.ts +8 -0
- package/dist/src/components/player-settings-form.d.ts.map +1 -0
- package/dist/src/components/player-settings-form.js +46 -0
- package/dist/src/components/player-settings-form.tsx +163 -0
- package/dist/src/components/react-player-wrapper.d.ts +64 -0
- package/dist/src/components/react-player-wrapper.d.ts.map +1 -0
- package/dist/src/components/react-player-wrapper.js +163 -0
- package/dist/src/components/react-player-wrapper.tsx +651 -0
- package/dist/src/components/simple-video-player.d.ts +9 -0
- package/dist/src/components/simple-video-player.d.ts.map +1 -0
- package/dist/src/components/simple-video-player.js +41 -0
- package/dist/src/components/simple-video-player.tsx +60 -0
- package/dist/src/components/ui/enhanced-seek-bar.d.ts +3 -0
- package/dist/src/components/ui/enhanced-seek-bar.d.ts.map +1 -0
- package/dist/src/components/ui/enhanced-seek-bar.js +112 -0
- package/dist/src/components/ui/enhanced-seek-bar.tsx +235 -0
- package/dist/src/components/ui/fullscreen-button.d.ts +3 -0
- package/dist/src/components/ui/fullscreen-button.d.ts.map +1 -0
- package/dist/src/components/ui/fullscreen-button.js +21 -0
- package/dist/src/components/ui/fullscreen-button.tsx +60 -0
- package/dist/src/components/ui/media-resource-preloader.d.ts +21 -0
- package/dist/src/components/ui/media-resource-preloader.d.ts.map +1 -0
- package/dist/src/components/ui/media-resource-preloader.js +295 -0
- package/dist/src/components/ui/media-resource-preloader.tsx +393 -0
- package/dist/src/components/ui/play-button.d.ts +3 -0
- package/dist/src/components/ui/play-button.d.ts.map +1 -0
- package/dist/src/components/ui/play-button.js +26 -0
- package/dist/src/components/ui/play-button.tsx +107 -0
- package/dist/src/components/ui/seek-bar.d.ts +3 -0
- package/dist/src/components/ui/seek-bar.d.ts.map +1 -0
- package/dist/src/components/ui/seek-bar.js +54 -0
- package/dist/src/components/ui/seek-bar.tsx +161 -0
- package/dist/src/components/ui/time-display.d.ts +3 -0
- package/dist/src/components/ui/time-display.d.ts.map +1 -0
- package/dist/src/components/ui/time-display.js +18 -0
- package/dist/src/components/ui/time-display.tsx +40 -0
- package/dist/src/components/ui/volume-control.d.ts +3 -0
- package/dist/src/components/ui/volume-control.d.ts.map +1 -0
- package/dist/src/components/ui/volume-control.js +71 -0
- package/dist/src/components/ui/volume-control.tsx +143 -0
- package/dist/src/components/unified/base-media-player.d.ts +18 -0
- package/dist/src/components/unified/base-media-player.d.ts.map +1 -0
- package/dist/src/components/unified/base-media-player.js +104 -0
- package/dist/src/components/unified/base-media-player.tsx +246 -0
- package/dist/src/components/unified/media-player.d.ts +37 -0
- package/dist/src/components/unified/media-player.d.ts.map +1 -0
- package/dist/src/components/unified/media-player.js +41 -0
- package/dist/src/components/unified/media-player.tsx +75 -0
- package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts +42 -0
- package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.js +322 -0
- package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +561 -0
- package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts +44 -0
- package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.js +280 -0
- package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +552 -0
- package/dist/src/components/variants/minimal/MinimalControls.d.ts +19 -0
- package/dist/src/components/variants/minimal/MinimalControls.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/MinimalControls.js +19 -0
- package/dist/src/components/variants/minimal/MinimalControls.tsx +142 -0
- package/dist/src/components/variants/minimal/MinimalLoading.d.ts +10 -0
- package/dist/src/components/variants/minimal/MinimalLoading.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/MinimalLoading.js +6 -0
- package/dist/src/components/variants/minimal/MinimalLoading.tsx +32 -0
- package/dist/src/components/variants/minimal/MinimalMediaPlayer.d.ts +38 -0
- package/dist/src/components/variants/minimal/MinimalMediaPlayer.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/MinimalMediaPlayer.js +135 -0
- package/dist/src/components/variants/minimal/MinimalMediaPlayer.tsx +315 -0
- package/dist/src/components/variants/minimal/MinimalOverlay.d.ts +11 -0
- package/dist/src/components/variants/minimal/MinimalOverlay.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/MinimalOverlay.js +15 -0
- package/dist/src/components/variants/minimal/MinimalOverlay.tsx +64 -0
- package/dist/src/components/variants/minimal/MinimalPlayButton.d.ts +9 -0
- package/dist/src/components/variants/minimal/MinimalPlayButton.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/MinimalPlayButton.js +29 -0
- package/dist/src/components/variants/minimal/MinimalPlayButton.tsx +65 -0
- package/dist/src/components/variants/minimal/MinimalSeekBar.d.ts +7 -0
- package/dist/src/components/variants/minimal/MinimalSeekBar.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/MinimalSeekBar.js +73 -0
- package/dist/src/components/variants/minimal/MinimalSeekBar.tsx +150 -0
- package/dist/src/components/variants/minimal/MinimalVolumeControl.d.ts +7 -0
- package/dist/src/components/variants/minimal/MinimalVolumeControl.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/MinimalVolumeControl.js +29 -0
- package/dist/src/components/variants/minimal/MinimalVolumeControl.tsx +80 -0
- package/dist/src/components/variants/minimal/SimpleMinimalPlayer.d.ts +22 -0
- package/dist/src/components/variants/minimal/SimpleMinimalPlayer.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/SimpleMinimalPlayer.js +51 -0
- package/dist/src/components/variants/minimal/SimpleMinimalPlayer.tsx +209 -0
- package/dist/src/components/variants/minimal/components/CenterPlayButton.d.ts +7 -0
- package/dist/src/components/variants/minimal/components/CenterPlayButton.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/CenterPlayButton.js +8 -0
- package/dist/src/components/variants/minimal/components/CenterPlayButton.tsx +22 -0
- package/dist/src/components/variants/minimal/components/ControlBar.d.ts +43 -0
- package/dist/src/components/variants/minimal/components/ControlBar.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/ControlBar.js +10 -0
- package/dist/src/components/variants/minimal/components/ControlBar.tsx +146 -0
- package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts +24 -0
- package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.js +68 -0
- package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +361 -0
- package/dist/src/components/variants/minimal/components/PlaybackControls.d.ts +9 -0
- package/dist/src/components/variants/minimal/components/PlaybackControls.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/PlaybackControls.js +9 -0
- package/dist/src/components/variants/minimal/components/PlaybackControls.tsx +51 -0
- package/dist/src/components/variants/minimal/components/RightControls.d.ts +25 -0
- package/dist/src/components/variants/minimal/components/RightControls.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/RightControls.js +40 -0
- package/dist/src/components/variants/minimal/components/RightControls.tsx +173 -0
- package/dist/src/components/variants/minimal/components/SeekBar.d.ts +11 -0
- package/dist/src/components/variants/minimal/components/SeekBar.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/SeekBar.js +43 -0
- package/dist/src/components/variants/minimal/components/SeekBar.tsx +131 -0
- package/dist/src/components/variants/minimal/components/SettingsDropdown.d.ts +9 -0
- package/dist/src/components/variants/minimal/components/SettingsDropdown.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/SettingsDropdown.js +18 -0
- package/dist/src/components/variants/minimal/components/SettingsDropdown.tsx +70 -0
- package/dist/src/components/variants/minimal/components/SubtitleDisplay.d.ts +7 -0
- package/dist/src/components/variants/minimal/components/SubtitleDisplay.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/SubtitleDisplay.js +6 -0
- package/dist/src/components/variants/minimal/components/SubtitleDisplay.tsx +21 -0
- package/dist/src/components/variants/minimal/components/TimeDisplay.d.ts +7 -0
- package/dist/src/components/variants/minimal/components/TimeDisplay.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/TimeDisplay.js +5 -0
- package/dist/src/components/variants/minimal/components/TimeDisplay.tsx +18 -0
- package/dist/src/components/variants/minimal/components/VideoElement.d.ts +13 -0
- package/dist/src/components/variants/minimal/components/VideoElement.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/VideoElement.js +4 -0
- package/dist/src/components/variants/minimal/components/VideoElement.tsx +40 -0
- package/dist/src/components/variants/minimal/components/VolumeControl.d.ts +13 -0
- package/dist/src/components/variants/minimal/components/VolumeControl.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/components/VolumeControl.js +99 -0
- package/dist/src/components/variants/minimal/components/VolumeControl.tsx +217 -0
- package/dist/src/components/variants/minimal/index.d.ts +17 -0
- package/dist/src/components/variants/minimal/index.d.ts.map +1 -0
- package/dist/src/components/variants/minimal/index.js +8 -0
- package/dist/src/components/variants/minimal/index.ts +23 -0
- package/dist/src/components/video-player.d.ts +3 -0
- package/dist/src/components/video-player.d.ts.map +1 -0
- package/dist/src/components/video-player.js +38 -0
- package/dist/src/components/video-player.tsx +100 -0
- package/dist/src/context/error-handling.d.ts +72 -0
- package/dist/src/context/error-handling.d.ts.map +1 -0
- package/dist/src/context/error-handling.js +300 -0
- package/dist/src/context/error-handling.ts +394 -0
- package/dist/src/context/media-context.d.ts +104 -0
- package/dist/src/context/media-context.d.ts.map +1 -0
- package/dist/src/context/media-context.js +121 -0
- package/dist/src/context/media-context.tsx +208 -0
- package/dist/src/context/media-provider.d.ts +26 -0
- package/dist/src/context/media-provider.d.ts.map +1 -0
- package/dist/src/context/media-provider.js +164 -0
- package/dist/src/context/media-provider.tsx +265 -0
- package/dist/src/context/media-store.d.ts +33 -0
- package/dist/src/context/media-store.d.ts.map +1 -0
- package/dist/src/context/media-store.js +273 -0
- package/dist/src/context/media-store.ts +379 -0
- package/dist/src/context/persistence.d.ts +83 -0
- package/dist/src/context/persistence.d.ts.map +1 -0
- package/dist/src/context/persistence.js +356 -0
- package/dist/src/context/persistence.ts +453 -0
- package/dist/src/core/events/event-system.d.ts +170 -0
- package/dist/src/core/events/event-system.d.ts.map +1 -0
- package/dist/src/core/events/event-system.js +288 -0
- package/dist/src/core/events/event-system.ts +442 -0
- package/dist/src/core/events/hooks.d.ts +33 -0
- package/dist/src/core/events/hooks.d.ts.map +1 -0
- package/dist/src/core/events/hooks.js +198 -0
- package/dist/src/core/events/hooks.ts +302 -0
- package/dist/src/core/events/index.d.ts +6 -0
- package/dist/src/core/events/index.d.ts.map +1 -0
- package/dist/src/core/events/index.js +7 -0
- package/dist/src/core/events/index.ts +22 -0
- package/dist/src/core/events/middleware.d.ts +39 -0
- package/dist/src/core/events/middleware.d.ts.map +1 -0
- package/dist/src/core/events/middleware.js +219 -0
- package/dist/src/core/events/middleware.ts +269 -0
- package/dist/src/core/index.d.ts +8 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +15 -0
- package/dist/src/core/index.ts +22 -0
- package/dist/src/core/optimization/bundle-optimizer.d.ts +44 -0
- package/dist/src/core/optimization/bundle-optimizer.d.ts.map +1 -0
- package/dist/src/core/optimization/bundle-optimizer.js +217 -0
- package/dist/src/core/optimization/bundle-optimizer.tsx +308 -0
- package/dist/src/core/performance/cicd.d.ts +8 -0
- package/dist/src/core/performance/cicd.d.ts.map +1 -0
- package/dist/src/core/performance/cicd.js +83 -0
- package/dist/src/core/performance/cicd.ts +96 -0
- package/dist/src/core/performance/index.d.ts +10 -0
- package/dist/src/core/performance/index.d.ts.map +1 -0
- package/dist/src/core/performance/index.js +14 -0
- package/dist/src/core/performance/index.ts +38 -0
- package/dist/src/core/performance/media-loading-optimizer.d.ts +105 -0
- package/dist/src/core/performance/media-loading-optimizer.d.ts.map +1 -0
- package/dist/src/core/performance/media-loading-optimizer.js +404 -0
- package/dist/src/core/performance/media-loading-optimizer.ts +538 -0
- package/dist/src/core/performance/performance-budgets.d.ts +68 -0
- package/dist/src/core/performance/performance-budgets.d.ts.map +1 -0
- package/dist/src/core/performance/performance-budgets.js +326 -0
- package/dist/src/core/performance/performance-budgets.ts +432 -0
- package/dist/src/core/performance/performance-monitor.d.ts +95 -0
- package/dist/src/core/performance/performance-monitor.d.ts.map +1 -0
- package/dist/src/core/performance/performance-monitor.js +297 -0
- package/dist/src/core/performance/performance-monitor.tsx +476 -0
- package/dist/src/core/performance/performance-testing.d.ts +69 -0
- package/dist/src/core/performance/performance-testing.d.ts.map +1 -0
- package/dist/src/core/performance/performance-testing.js +314 -0
- package/dist/src/core/performance/performance-testing.ts +459 -0
- package/dist/src/core/plugins/base-plugin.d.ts +52 -0
- package/dist/src/core/plugins/base-plugin.d.ts.map +1 -0
- package/dist/src/core/plugins/base-plugin.js +151 -0
- package/dist/src/core/plugins/base-plugin.ts +224 -0
- package/dist/src/core/plugins/enhanced-plugin-system.d.ts +160 -0
- package/dist/src/core/plugins/enhanced-plugin-system.d.ts.map +1 -0
- package/dist/src/core/plugins/enhanced-plugin-system.js +305 -0
- package/dist/src/core/plugins/enhanced-plugin-system.ts +417 -0
- package/dist/src/core/plugins/examples/analytics-plugin.d.ts +30 -0
- package/dist/src/core/plugins/examples/analytics-plugin.d.ts.map +1 -0
- package/dist/src/core/plugins/examples/analytics-plugin.js +191 -0
- package/dist/src/core/plugins/examples/analytics-plugin.ts +242 -0
- package/dist/src/core/plugins/index.d.ts +8 -0
- package/dist/src/core/plugins/index.d.ts.map +1 -0
- package/dist/src/core/plugins/index.js +9 -0
- package/dist/src/core/plugins/index.ts +39 -0
- package/dist/src/core/plugins/registry.d.ts +31 -0
- package/dist/src/core/plugins/registry.d.ts.map +1 -0
- package/dist/src/core/plugins/registry.js +261 -0
- package/dist/src/core/plugins/registry.ts +327 -0
- package/dist/src/core/plugins/types.d.ts +101 -0
- package/dist/src/core/plugins/types.d.ts.map +1 -0
- package/dist/src/core/plugins/types.js +31 -0
- package/dist/src/core/plugins/types.ts +159 -0
- package/dist/src/core/plugins/utils.d.ts +38 -0
- package/dist/src/core/plugins/utils.d.ts.map +1 -0
- package/dist/src/core/plugins/utils.js +274 -0
- package/dist/src/core/plugins/utils.ts +316 -0
- package/dist/src/core/progressive-loading.d.ts +88 -0
- package/dist/src/core/progressive-loading.d.ts.map +1 -0
- package/dist/src/core/progressive-loading.js +239 -0
- package/dist/src/core/progressive-loading.tsx +322 -0
- package/dist/src/core/providers/enhanced-hls-provider.d.ts +50 -0
- package/dist/src/core/providers/enhanced-hls-provider.d.ts.map +1 -0
- package/dist/src/core/providers/enhanced-hls-provider.js +273 -0
- package/dist/src/core/providers/enhanced-hls-provider.ts +308 -0
- package/dist/src/core/providers/service-provider.d.ts +49 -0
- package/dist/src/core/providers/service-provider.d.ts.map +1 -0
- package/dist/src/core/providers/service-provider.js +105 -0
- package/dist/src/core/providers/service-provider.tsx +168 -0
- package/dist/src/core/utils.d.ts +25 -0
- package/dist/src/core/utils.d.ts.map +1 -0
- package/dist/src/core/utils.js +21 -0
- package/dist/src/core/utils.tsx +38 -0
- package/dist/src/features/media-session/media-session-manager.d.ts +132 -0
- package/dist/src/features/media-session/media-session-manager.d.ts.map +1 -0
- package/dist/src/features/media-session/media-session-manager.js +331 -0
- package/dist/src/features/media-session/media-session-manager.ts +429 -0
- package/dist/src/features/picture-in-picture/pip-manager.d.ts +94 -0
- package/dist/src/features/picture-in-picture/pip-manager.d.ts.map +1 -0
- package/dist/src/features/picture-in-picture/pip-manager.js +353 -0
- package/dist/src/features/picture-in-picture/pip-manager.ts +429 -0
- package/dist/src/features/playlist/playlist-manager.d.ts +208 -0
- package/dist/src/features/playlist/playlist-manager.d.ts.map +1 -0
- package/dist/src/features/playlist/playlist-manager.js +475 -0
- package/dist/src/features/playlist/playlist-manager.ts +606 -0
- package/dist/src/features/subtitles/subtitle-manager.d.ts +136 -0
- package/dist/src/features/subtitles/subtitle-manager.d.ts.map +1 -0
- package/dist/src/features/subtitles/subtitle-manager.js +335 -0
- package/dist/src/features/subtitles/subtitle-manager.ts +441 -0
- package/dist/src/features/subtitles/subtitle-parser.d.ts +60 -0
- package/dist/src/features/subtitles/subtitle-parser.d.ts.map +1 -0
- package/dist/src/features/subtitles/subtitle-parser.js +217 -0
- package/dist/src/features/subtitles/subtitle-parser.ts +280 -0
- package/dist/src/features/thumbnails/thumbnail-generator.d.ts +136 -0
- package/dist/src/features/thumbnails/thumbnail-generator.d.ts.map +1 -0
- package/dist/src/features/thumbnails/thumbnail-generator.js +388 -0
- package/dist/src/features/thumbnails/thumbnail-generator.ts +519 -0
- package/dist/src/hooks/accessibility/index.d.ts +5 -0
- package/dist/src/hooks/accessibility/index.d.ts.map +1 -0
- package/dist/src/hooks/accessibility/index.js +4 -0
- package/dist/src/hooks/accessibility/index.ts +27 -0
- package/dist/src/hooks/accessibility/use-accessibility-preferences.d.ts +14 -0
- package/dist/src/hooks/accessibility/use-accessibility-preferences.d.ts.map +1 -0
- package/dist/src/hooks/accessibility/use-accessibility-preferences.js +156 -0
- package/dist/src/hooks/accessibility/use-accessibility-preferences.ts +188 -0
- package/dist/src/hooks/accessibility/use-focus-management.d.ts +31 -0
- package/dist/src/hooks/accessibility/use-focus-management.d.ts.map +1 -0
- package/dist/src/hooks/accessibility/use-focus-management.js +142 -0
- package/dist/src/hooks/accessibility/use-focus-management.ts +176 -0
- package/dist/src/hooks/accessibility/use-keyboard-shortcuts.d.ts +38 -0
- package/dist/src/hooks/accessibility/use-keyboard-shortcuts.d.ts.map +1 -0
- package/dist/src/hooks/accessibility/use-keyboard-shortcuts.js +101 -0
- package/dist/src/hooks/accessibility/use-keyboard-shortcuts.ts +144 -0
- package/dist/src/hooks/accessibility/use-screen-reader.d.ts +22 -0
- package/dist/src/hooks/accessibility/use-screen-reader.d.ts.map +1 -0
- package/dist/src/hooks/accessibility/use-screen-reader.js +148 -0
- package/dist/src/hooks/accessibility/use-screen-reader.ts +182 -0
- package/dist/src/hooks/core/index.d.ts +18 -0
- package/dist/src/hooks/core/index.d.ts.map +1 -0
- package/dist/src/hooks/core/index.js +19 -0
- package/dist/src/hooks/core/index.ts +47 -0
- package/dist/src/hooks/legacy.d.ts +18 -0
- package/dist/src/hooks/legacy.d.ts.map +1 -0
- package/dist/src/hooks/legacy.js +17 -0
- package/dist/src/hooks/legacy.ts +27 -0
- package/dist/src/hooks/use-enhanced-media-player.d.ts +88 -0
- package/dist/src/hooks/use-enhanced-media-player.d.ts.map +1 -0
- package/dist/src/hooks/use-enhanced-media-player.js +395 -0
- package/dist/src/hooks/use-enhanced-media-player.ts +485 -0
- package/dist/src/hooks/use-intelligent-preloading.d.ts +66 -0
- package/dist/src/hooks/use-intelligent-preloading.d.ts.map +1 -0
- package/dist/src/hooks/use-intelligent-preloading.js +258 -0
- package/dist/src/hooks/use-intelligent-preloading.ts +358 -0
- package/dist/src/hooks/use-keyboard-controls.d.ts +13 -0
- package/dist/src/hooks/use-keyboard-controls.d.ts.map +1 -0
- package/dist/src/hooks/use-keyboard-controls.js +83 -0
- package/dist/src/hooks/use-keyboard-controls.ts +115 -0
- package/dist/src/hooks/use-media-actions.d.ts +62 -0
- package/dist/src/hooks/use-media-actions.d.ts.map +1 -0
- package/dist/src/hooks/use-media-actions.js +121 -0
- package/dist/src/hooks/use-media-actions.ts +175 -0
- package/dist/src/hooks/use-media-metadata.d.ts +11 -0
- package/dist/src/hooks/use-media-metadata.d.ts.map +1 -0
- package/dist/src/hooks/use-media-metadata.js +74 -0
- package/dist/src/hooks/use-media-metadata.ts +89 -0
- package/dist/src/hooks/use-media-optimistic.d.ts +36 -0
- package/dist/src/hooks/use-media-optimistic.d.ts.map +1 -0
- package/dist/src/hooks/use-media-optimistic.js +205 -0
- package/dist/src/hooks/use-media-optimistic.ts +270 -0
- package/dist/src/hooks/use-media-player.d.ts +31 -0
- package/dist/src/hooks/use-media-player.d.ts.map +1 -0
- package/dist/src/hooks/use-media-player.js +251 -0
- package/dist/src/hooks/use-media-player.ts +312 -0
- package/dist/src/hooks/use-media-state.d.ts +17 -0
- package/dist/src/hooks/use-media-state.d.ts.map +1 -0
- package/dist/src/hooks/use-media-state.js +162 -0
- package/dist/src/hooks/use-media-state.ts +190 -0
- package/dist/src/hooks/use-memory-optimization.d.ts +40 -0
- package/dist/src/hooks/use-memory-optimization.d.ts.map +1 -0
- package/dist/src/hooks/use-memory-optimization.js +288 -0
- package/dist/src/hooks/use-memory-optimization.ts +358 -0
- package/dist/src/hooks/use-optimistic-controls.d.ts +22 -0
- package/dist/src/hooks/use-optimistic-controls.d.ts.map +1 -0
- package/dist/src/hooks/use-optimistic-controls.js +60 -0
- package/dist/src/hooks/use-optimistic-controls.ts +92 -0
- package/dist/src/hooks/use-optimized-media.d.ts +46 -0
- package/dist/src/hooks/use-optimized-media.d.ts.map +1 -0
- package/dist/src/hooks/use-optimized-media.js +211 -0
- package/dist/src/hooks/use-optimized-media.ts +263 -0
- package/dist/src/hooks/use-touch-gestures.d.ts +47 -0
- package/dist/src/hooks/use-touch-gestures.d.ts.map +1 -0
- package/dist/src/hooks/use-touch-gestures.js +289 -0
- package/dist/src/hooks/use-touch-gestures.ts +417 -0
- package/dist/src/hooks/useEnhancedSubtitles.d.ts +39 -0
- package/dist/src/hooks/useEnhancedSubtitles.d.ts.map +1 -0
- package/dist/src/hooks/useEnhancedSubtitles.js +205 -0
- package/dist/src/hooks/useEnhancedSubtitles.ts +258 -0
- package/dist/src/hooks/useKeyboardShortcuts.d.ts +10 -0
- package/dist/src/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/src/hooks/useKeyboardShortcuts.js +59 -0
- package/dist/src/hooks/useKeyboardShortcuts.ts +74 -0
- package/dist/src/hooks/useMediaControls.d.ts +9 -0
- package/dist/src/hooks/useMediaControls.d.ts.map +1 -0
- package/dist/src/hooks/useMediaControls.js +44 -0
- package/dist/src/hooks/useMediaControls.ts +52 -0
- package/dist/src/hooks/useScreenshot.d.ts +4 -0
- package/dist/src/hooks/useScreenshot.d.ts.map +1 -0
- package/dist/src/hooks/useScreenshot.js +56 -0
- package/dist/src/hooks/useScreenshot.ts +57 -0
- package/dist/src/hooks/useSubtitles.d.ts +8 -0
- package/dist/src/hooks/useSubtitles.d.ts.map +1 -0
- package/dist/src/hooks/useSubtitles.js +73 -0
- package/dist/src/hooks/useSubtitles.ts +91 -0
- package/dist/src/hooks/useVideoPlayer.d.ts +32 -0
- package/dist/src/hooks/useVideoPlayer.d.ts.map +1 -0
- package/dist/src/hooks/useVideoPlayer.js +184 -0
- package/dist/src/hooks/useVideoPlayer.ts +232 -0
- package/dist/src/icons/components/FullscreenIcon.d.ts +3 -0
- package/dist/src/icons/components/FullscreenIcon.d.ts.map +1 -0
- package/dist/src/icons/components/FullscreenIcon.js +11 -0
- package/dist/src/icons/components/FullscreenIcon.tsx +37 -0
- package/dist/src/icons/components/SettingsIcon.d.ts +3 -0
- package/dist/src/icons/components/SettingsIcon.d.ts.map +1 -0
- package/dist/src/icons/components/SettingsIcon.js +11 -0
- package/dist/src/icons/components/SettingsIcon.tsx +38 -0
- package/dist/src/icons/components/animated/LoadingIcon.d.ts +3 -0
- package/dist/src/icons/components/animated/LoadingIcon.d.ts.map +1 -0
- package/dist/src/icons/components/animated/LoadingIcon.js +11 -0
- package/dist/src/icons/components/animated/LoadingIcon.tsx +43 -0
- package/dist/src/icons/components/animated/PlayPauseIcon.d.ts +7 -0
- package/dist/src/icons/components/animated/PlayPauseIcon.d.ts.map +1 -0
- package/dist/src/icons/components/animated/PlayPauseIcon.js +9 -0
- package/dist/src/icons/components/animated/PlayPauseIcon.tsx +50 -0
- package/dist/src/icons/components/media/PauseIcon.d.ts +3 -0
- package/dist/src/icons/components/media/PauseIcon.d.ts.map +1 -0
- package/dist/src/icons/components/media/PauseIcon.js +12 -0
- package/dist/src/icons/components/media/PauseIcon.tsx +39 -0
- package/dist/src/icons/components/media/PlayIcon.d.ts +3 -0
- package/dist/src/icons/components/media/PlayIcon.d.ts.map +1 -0
- package/dist/src/icons/components/media/PlayIcon.js +12 -0
- package/dist/src/icons/components/media/PlayIcon.tsx +38 -0
- package/dist/src/icons/components/volume/VolumeIcon.d.ts +3 -0
- package/dist/src/icons/components/volume/VolumeIcon.d.ts.map +1 -0
- package/dist/src/icons/components/volume/VolumeIcon.js +11 -0
- package/dist/src/icons/components/volume/VolumeIcon.tsx +39 -0
- package/dist/src/icons/components/volume/VolumeOffIcon.d.ts +3 -0
- package/dist/src/icons/components/volume/VolumeOffIcon.d.ts.map +1 -0
- package/dist/src/icons/components/volume/VolumeOffIcon.js +11 -0
- package/dist/src/icons/components/volume/VolumeOffIcon.tsx +39 -0
- package/dist/src/icons/index.d.ts +28 -0
- package/dist/src/icons/index.d.ts.map +1 -0
- package/dist/src/icons/index.js +45 -0
- package/dist/src/icons/index.ts +56 -0
- package/dist/src/icons/provider.d.ts +13 -0
- package/dist/src/icons/provider.d.ts.map +1 -0
- package/dist/src/icons/provider.js +37 -0
- package/dist/src/icons/provider.tsx +64 -0
- package/dist/src/icons/types.d.ts +18 -0
- package/dist/src/icons/types.d.ts.map +1 -0
- package/dist/src/icons/types.js +1 -0
- package/dist/src/icons/types.ts +40 -0
- package/dist/src/index-enhanced.d.ts +13 -0
- package/dist/src/index-enhanced.d.ts.map +1 -0
- package/dist/src/index-enhanced.js +16 -0
- package/dist/src/index-enhanced.ts +35 -0
- package/dist/src/index-legacy.d.ts +81 -0
- package/dist/src/index-legacy.d.ts.map +1 -0
- package/dist/src/index-legacy.js +97 -0
- package/dist/src/index-legacy.ts +326 -0
- package/dist/src/index.css +102 -0
- package/dist/src/index.d.ts +38 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +90 -0
- package/dist/src/index.minimal.d.ts +2 -0
- package/dist/src/index.minimal.d.ts.map +1 -0
- package/dist/src/index.minimal.js +3 -0
- package/dist/src/index.minimal.ts +4 -0
- package/dist/src/index.ts +216 -0
- package/dist/src/lib/deprecation.d.ts +7 -0
- package/dist/src/lib/deprecation.d.ts.map +1 -0
- package/dist/src/lib/deprecation.js +31 -0
- package/dist/src/lib/deprecation.ts +51 -0
- package/dist/src/lib/format-time.d.ts +9 -0
- package/dist/src/lib/format-time.d.ts.map +1 -0
- package/dist/src/lib/format-time.js +32 -0
- package/dist/src/lib/format-time.ts +37 -0
- package/dist/src/lib/index.d.ts +3 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +3 -0
- package/dist/src/lib/index.ts +3 -0
- package/dist/src/lib/utils.d.ts +3 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +5 -0
- package/dist/src/lib/utils.ts +6 -0
- package/dist/src/styles/globals.css +462 -0
- package/dist/src/styles/minimal-player.css +589 -0
- package/dist/src/styles/pixel-art.css +46 -0
- package/dist/src/styles/videojs.css +100 -0
- package/dist/src/test/setup.d.ts +2 -0
- package/dist/src/test/setup.d.ts.map +1 -0
- package/dist/src/test/setup.js +65 -0
- package/dist/src/test/setup.ts +79 -0
- package/dist/src/types/events.d.ts +41 -0
- package/dist/src/types/events.d.ts.map +1 -0
- package/dist/src/types/events.js +2 -0
- package/dist/src/types/events.ts +47 -0
- package/dist/src/types/formats.d.ts +45 -0
- package/dist/src/types/formats.d.ts.map +1 -0
- package/dist/src/types/formats.js +63 -0
- package/dist/src/types/formats.ts +95 -0
- package/dist/src/types/index.d.ts +128 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +4 -0
- package/dist/src/types/index.ts +225 -0
- package/dist/src/types/videojs-plugins.d.ts +14 -0
- package/dist/styles/minimal-player.css +589 -0
- package/dist/utils-Db13763z.cjs +9 -0
- package/dist/utils-Db13763z.cjs.map +1 -0
- package/dist/{utils-BnscpYYd.js → utils-nTO4AnHo.js} +210 -199
- package/dist/utils-nTO4AnHo.js.map +1 -0
- package/dist/utils.js +1 -1
- package/dist/utils.mjs +1 -1
- package/package.json +7 -4
- package/src/adapters/videojs-adapter.d.ts +38 -0
- package/src/adapters/videojs-adapter.d.ts.map +1 -0
- package/src/adapters/videojs-adapter.js +350 -0
- package/src/components/AnimateLoading.d.ts +9 -0
- package/src/components/AnimateLoading.d.ts.map +1 -0
- package/src/components/AnimateLoading.js +41 -0
- package/src/components/AnimateLoading.tsx +1 -1
- package/src/components/LoadingState.d.ts +33 -0
- package/src/components/LoadingState.d.ts.map +1 -0
- package/src/components/LoadingState.js +111 -0
- package/src/components/accessibility/keyboard-help-overlay.d.ts +17 -0
- package/src/components/accessibility/keyboard-help-overlay.d.ts.map +1 -0
- package/src/components/accessibility/keyboard-help-overlay.js +90 -0
- package/src/components/audio-player.d.ts +3 -0
- package/src/components/audio-player.d.ts.map +1 -0
- package/src/components/audio-player.js +31 -0
- package/src/components/basic/index.d.ts +26 -0
- package/src/components/basic/index.d.ts.map +1 -0
- package/src/components/basic/index.js +29 -0
- package/src/components/enhanced/advanced-features.d.ts +45 -0
- package/src/components/enhanced/advanced-features.d.ts.map +1 -0
- package/src/components/enhanced/advanced-features.js +64 -0
- package/src/components/enhanced/debug-panel.d.ts +70 -0
- package/src/components/enhanced/debug-panel.d.ts.map +1 -0
- package/src/components/enhanced/debug-panel.js +94 -0
- package/src/components/enhanced/debug-panel.tsx +1 -1
- package/src/components/enhanced/enhanced-controls.d.ts +50 -0
- package/src/components/enhanced/enhanced-controls.d.ts.map +1 -0
- package/src/components/enhanced/enhanced-controls.js +233 -0
- package/src/components/enhanced/enhanced-media-player.d.ts +26 -0
- package/src/components/enhanced/enhanced-media-player.d.ts.map +1 -0
- package/src/components/enhanced/enhanced-media-player.js +316 -0
- package/src/components/enhanced/error-handling.d.ts +36 -0
- package/src/components/enhanced/error-handling.d.ts.map +1 -0
- package/src/components/enhanced/error-handling.js +153 -0
- package/src/components/enhanced/index.d.ts +7 -0
- package/src/components/enhanced/index.d.ts.map +1 -0
- package/src/components/enhanced/index.js +10 -0
- package/src/components/enhanced/media-player-enhanced.d.ts +21 -0
- package/src/components/enhanced/media-player-enhanced.d.ts.map +1 -0
- package/src/components/enhanced/media-player-enhanced.js +250 -0
- package/src/components/examples/basic-video-player.d.ts +10 -0
- package/src/components/examples/basic-video-player.d.ts.map +1 -0
- package/src/components/examples/basic-video-player.js +16 -0
- package/src/components/examples/custom-controls-example.d.ts +10 -0
- package/src/components/examples/custom-controls-example.d.ts.map +1 -0
- package/src/components/examples/custom-controls-example.js +12 -0
- package/src/components/examples/enhanced-controls-example.d.ts +9 -0
- package/src/components/examples/enhanced-controls-example.d.ts.map +1 -0
- package/src/components/examples/enhanced-controls-example.js +18 -0
- package/src/components/examples/enhanced-media-player-example.d.ts +9 -0
- package/src/components/examples/enhanced-media-player-example.d.ts.map +1 -0
- package/src/components/examples/enhanced-media-player-example.js +13 -0
- package/src/components/examples/loading-states-demo.d.ts +2 -0
- package/src/components/examples/loading-states-demo.d.ts.map +1 -0
- package/src/components/examples/loading-states-demo.js +41 -0
- package/src/components/examples/react-19-demo.d.ts +10 -0
- package/src/components/examples/react-19-demo.d.ts.map +1 -0
- package/src/components/examples/react-19-demo.js +104 -0
- package/src/components/examples/volume-orientation-demo.d.ts +2 -0
- package/src/components/examples/volume-orientation-demo.d.ts.map +1 -0
- package/src/components/examples/volume-orientation-demo.js +31 -0
- package/src/components/icon-demo.d.ts +2 -0
- package/src/components/icon-demo.d.ts.map +1 -0
- package/src/components/icon-demo.js +16 -0
- package/src/components/icons/index.d.ts +36 -0
- package/src/components/icons/index.d.ts.map +1 -0
- package/src/components/icons/index.js +59 -0
- package/src/components/icons/svg-icons/ArrowLeftIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/ArrowLeftIcon.js +3 -0
- package/src/components/icons/svg-icons/ArrowRightIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/ArrowRightIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/ArrowRightIcon.js +3 -0
- package/src/components/icons/svg-icons/AudioIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/AudioIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/AudioIcon.js +4 -0
- package/src/components/icons/svg-icons/BackwardIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/BackwardIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/BackwardIcon.js +3 -0
- package/src/components/icons/svg-icons/CameraIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/CameraIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/CameraIcon.js +4 -0
- package/src/components/icons/svg-icons/CheckIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/CheckIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/CheckIcon.js +4 -0
- package/src/components/icons/svg-icons/EnablePiPIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/EnablePiPIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/EnablePiPIcon.js +5 -0
- package/src/components/icons/svg-icons/ForwardIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/ForwardIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/ForwardIcon.js +3 -0
- package/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/FullscreenEnterIcon.js +3 -0
- package/src/components/icons/svg-icons/FullscreenExitIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/FullscreenExitIcon.js +3 -0
- package/src/components/icons/svg-icons/LoadingIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/LoadingIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/LoadingIcon.js +3 -0
- package/src/components/icons/svg-icons/PauseIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/PauseIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/PauseIcon.js +3 -0
- package/src/components/icons/svg-icons/PlayIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/PlayIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/PlayIcon.js +3 -0
- package/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/PlaybackSpeedIcon.js +3 -0
- package/src/components/icons/svg-icons/QualityIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/QualityIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/QualityIcon.js +3 -0
- package/src/components/icons/svg-icons/SettingsIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/SettingsIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/SettingsIcon.js +3 -0
- package/src/components/icons/svg-icons/SliderIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/SliderIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/SliderIcon.js +3 -0
- package/src/components/icons/svg-icons/SubtitleIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/SubtitleIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/SubtitleIcon.js +3 -0
- package/src/components/icons/svg-icons/SubtitleOffIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/SubtitleOffIcon.js +3 -0
- package/src/components/icons/svg-icons/UnPiPIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/UnPiPIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/UnPiPIcon.js +5 -0
- package/src/components/icons/svg-icons/VolumeMutedIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/VolumeMutedIcon.js +3 -0
- package/src/components/icons/svg-icons/VolumeOneIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/VolumeOneIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/VolumeOneIcon.js +3 -0
- package/src/components/icons/svg-icons/VolumeThreeIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/VolumeThreeIcon.js +3 -0
- package/src/components/icons/svg-icons/VolumeTwoIcon.d.ts +4 -0
- package/src/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +1 -0
- package/src/components/icons/svg-icons/VolumeTwoIcon.js +3 -0
- package/src/components/legacy.d.ts +13 -0
- package/src/components/legacy.d.ts.map +1 -0
- package/src/components/legacy.js +52 -0
- package/src/components/media-metadata-display.d.ts +11 -0
- package/src/components/media-metadata-display.d.ts.map +1 -0
- package/src/components/media-metadata-display.js +20 -0
- package/src/components/media-player-audio.d.ts +9 -0
- package/src/components/media-player-audio.d.ts.map +1 -0
- package/src/components/media-player-audio.js +18 -0
- package/src/components/media-player-controls.d.ts +23 -0
- package/src/components/media-player-controls.d.ts.map +1 -0
- package/src/components/media-player-controls.js +150 -0
- package/src/components/media-player-error.d.ts +16 -0
- package/src/components/media-player-error.d.ts.map +1 -0
- package/src/components/media-player-error.js +85 -0
- package/src/components/media-player-fullscreen.d.ts +12 -0
- package/src/components/media-player-fullscreen.d.ts.map +1 -0
- package/src/components/media-player-fullscreen.js +68 -0
- package/src/components/media-player-hls.d.ts +23 -0
- package/src/components/media-player-hls.d.ts.map +1 -0
- package/src/components/media-player-hls.js +20 -0
- package/src/components/media-player-loading.d.ts +12 -0
- package/src/components/media-player-loading.d.ts.map +1 -0
- package/src/components/media-player-loading.js +53 -0
- package/src/components/media-player-play.d.ts +11 -0
- package/src/components/media-player-play.d.ts.map +1 -0
- package/src/components/media-player-play.js +44 -0
- package/src/components/media-player-root.d.ts +28 -0
- package/src/components/media-player-root.d.ts.map +1 -0
- package/src/components/media-player-root.js +243 -0
- package/src/components/media-player-seek.d.ts +15 -0
- package/src/components/media-player-seek.d.ts.map +1 -0
- package/src/components/media-player-seek.js +92 -0
- package/src/components/media-player-time.d.ts +12 -0
- package/src/components/media-player-time.d.ts.map +1 -0
- package/src/components/media-player-time.js +57 -0
- package/src/components/media-player-tooltip.d.ts +13 -0
- package/src/components/media-player-tooltip.d.ts.map +1 -0
- package/src/components/media-player-tooltip.js +14 -0
- package/src/components/media-player-video.d.ts +9 -0
- package/src/components/media-player-video.d.ts.map +1 -0
- package/src/components/media-player-video.js +18 -0
- package/src/components/media-player-volume.d.ts +13 -0
- package/src/components/media-player-volume.d.ts.map +1 -0
- package/src/components/media-player-volume.js +88 -0
- package/src/components/media-player.d.ts +3 -0
- package/src/components/media-player.d.ts.map +1 -0
- package/src/components/media-player.js +67 -0
- package/src/components/media-player.tsx +2 -2
- package/src/components/media-suspense.d.ts +78 -0
- package/src/components/media-suspense.d.ts.map +1 -0
- package/src/components/media-suspense.js +173 -0
- package/src/components/player-settings-form.d.ts +8 -0
- package/src/components/player-settings-form.d.ts.map +1 -0
- package/src/components/player-settings-form.js +46 -0
- package/src/components/react-player-wrapper.d.ts +64 -0
- package/src/components/react-player-wrapper.d.ts.map +1 -0
- package/src/components/react-player-wrapper.js +163 -0
- package/src/components/simple-video-player.d.ts +9 -0
- package/src/components/simple-video-player.d.ts.map +1 -0
- package/src/components/simple-video-player.js +41 -0
- package/src/components/ui/enhanced-seek-bar.d.ts +3 -0
- package/src/components/ui/enhanced-seek-bar.d.ts.map +1 -0
- package/src/components/ui/enhanced-seek-bar.js +112 -0
- package/src/components/ui/fullscreen-button.d.ts +3 -0
- package/src/components/ui/fullscreen-button.d.ts.map +1 -0
- package/src/components/ui/fullscreen-button.js +21 -0
- package/src/components/ui/media-resource-preloader.d.ts +21 -0
- package/src/components/ui/media-resource-preloader.d.ts.map +1 -0
- package/src/components/ui/media-resource-preloader.js +295 -0
- package/src/components/ui/media-resource-preloader.tsx +9 -11
- package/src/components/ui/play-button.d.ts +3 -0
- package/src/components/ui/play-button.d.ts.map +1 -0
- package/src/components/ui/play-button.js +26 -0
- package/src/components/ui/seek-bar.d.ts +3 -0
- package/src/components/ui/seek-bar.d.ts.map +1 -0
- package/src/components/ui/seek-bar.js +54 -0
- package/src/components/ui/seek-bar.tsx +1 -1
- package/src/components/ui/time-display.d.ts +3 -0
- package/src/components/ui/time-display.d.ts.map +1 -0
- package/src/components/ui/time-display.js +18 -0
- package/src/components/ui/volume-control.d.ts +3 -0
- package/src/components/ui/volume-control.d.ts.map +1 -0
- package/src/components/ui/volume-control.js +71 -0
- package/src/components/unified/base-media-player.d.ts +18 -0
- package/src/components/unified/base-media-player.d.ts.map +1 -0
- package/src/components/unified/base-media-player.js +104 -0
- package/src/components/unified/media-player.d.ts +37 -0
- package/src/components/unified/media-player.d.ts.map +1 -0
- package/src/components/unified/media-player.js +41 -0
- package/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts +42 -0
- package/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts.map +1 -0
- package/src/components/variants/minimal/AccessibleMinimalPlayer.js +322 -0
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts +44 -0
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts.map +1 -0
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.js +280 -0
- package/src/components/variants/minimal/MinimalControls.d.ts +19 -0
- package/src/components/variants/minimal/MinimalControls.d.ts.map +1 -0
- package/src/components/variants/minimal/MinimalControls.js +19 -0
- package/src/components/variants/minimal/MinimalLoading.d.ts +10 -0
- package/src/components/variants/minimal/MinimalLoading.d.ts.map +1 -0
- package/src/components/variants/minimal/MinimalLoading.js +6 -0
- package/src/components/variants/minimal/MinimalMediaPlayer.d.ts +38 -0
- package/src/components/variants/minimal/MinimalMediaPlayer.d.ts.map +1 -0
- package/src/components/variants/minimal/MinimalMediaPlayer.js +135 -0
- package/src/components/variants/minimal/MinimalOverlay.d.ts +11 -0
- package/src/components/variants/minimal/MinimalOverlay.d.ts.map +1 -0
- package/src/components/variants/minimal/MinimalOverlay.js +15 -0
- package/src/components/variants/minimal/MinimalPlayButton.d.ts +9 -0
- package/src/components/variants/minimal/MinimalPlayButton.d.ts.map +1 -0
- package/src/components/variants/minimal/MinimalPlayButton.js +29 -0
- package/src/components/variants/minimal/MinimalSeekBar.d.ts +7 -0
- package/src/components/variants/minimal/MinimalSeekBar.d.ts.map +1 -0
- package/src/components/variants/minimal/MinimalSeekBar.js +73 -0
- package/src/components/variants/minimal/MinimalVolumeControl.d.ts +7 -0
- package/src/components/variants/minimal/MinimalVolumeControl.d.ts.map +1 -0
- package/src/components/variants/minimal/MinimalVolumeControl.js +29 -0
- package/src/components/variants/minimal/SimpleMinimalPlayer.d.ts +22 -0
- package/src/components/variants/minimal/SimpleMinimalPlayer.d.ts.map +1 -0
- package/src/components/variants/minimal/SimpleMinimalPlayer.js +51 -0
- package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +0 -1
- package/src/components/variants/minimal/components/CenterPlayButton.d.ts +7 -0
- package/src/components/variants/minimal/components/CenterPlayButton.d.ts.map +1 -0
- package/src/components/variants/minimal/components/CenterPlayButton.js +8 -0
- package/src/components/variants/minimal/components/ControlBar.d.ts +43 -0
- package/src/components/variants/minimal/components/ControlBar.d.ts.map +1 -0
- package/src/components/variants/minimal/components/ControlBar.js +10 -0
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts +24 -0
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts.map +1 -0
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.js +68 -0
- package/src/components/variants/minimal/components/PlaybackControls.d.ts +9 -0
- package/src/components/variants/minimal/components/PlaybackControls.d.ts.map +1 -0
- package/src/components/variants/minimal/components/PlaybackControls.js +9 -0
- package/src/components/variants/minimal/components/RightControls.d.ts +25 -0
- package/src/components/variants/minimal/components/RightControls.d.ts.map +1 -0
- package/src/components/variants/minimal/components/RightControls.js +40 -0
- package/src/components/variants/minimal/components/SeekBar.d.ts +11 -0
- package/src/components/variants/minimal/components/SeekBar.d.ts.map +1 -0
- package/src/components/variants/minimal/components/SeekBar.js +43 -0
- package/src/components/variants/minimal/components/SettingsDropdown.d.ts +9 -0
- package/src/components/variants/minimal/components/SettingsDropdown.d.ts.map +1 -0
- package/src/components/variants/minimal/components/SettingsDropdown.js +18 -0
- package/src/components/variants/minimal/components/SubtitleDisplay.d.ts +7 -0
- package/src/components/variants/minimal/components/SubtitleDisplay.d.ts.map +1 -0
- package/src/components/variants/minimal/components/SubtitleDisplay.js +6 -0
- package/src/components/variants/minimal/components/TimeDisplay.d.ts +7 -0
- package/src/components/variants/minimal/components/TimeDisplay.d.ts.map +1 -0
- package/src/components/variants/minimal/components/TimeDisplay.js +5 -0
- package/src/components/variants/minimal/components/VideoElement.d.ts +13 -0
- package/src/components/variants/minimal/components/VideoElement.d.ts.map +1 -0
- package/src/components/variants/minimal/components/VideoElement.js +4 -0
- package/src/components/variants/minimal/components/VolumeControl.d.ts +13 -0
- package/src/components/variants/minimal/components/VolumeControl.d.ts.map +1 -0
- package/src/components/variants/minimal/components/VolumeControl.js +99 -0
- package/src/components/variants/minimal/index.d.ts +17 -0
- package/src/components/variants/minimal/index.d.ts.map +1 -0
- package/src/components/variants/minimal/index.js +8 -0
- package/src/components/video-player.d.ts +3 -0
- package/src/components/video-player.d.ts.map +1 -0
- package/src/components/video-player.js +38 -0
- package/src/context/error-handling.d.ts +72 -0
- package/src/context/error-handling.d.ts.map +1 -0
- package/src/context/error-handling.js +300 -0
- package/src/context/media-context.d.ts +104 -0
- package/src/context/media-context.d.ts.map +1 -0
- package/src/context/media-context.js +121 -0
- package/src/context/media-provider.d.ts +26 -0
- package/src/context/media-provider.d.ts.map +1 -0
- package/src/context/media-provider.js +164 -0
- package/src/context/media-store.d.ts +33 -0
- package/src/context/media-store.d.ts.map +1 -0
- package/src/context/media-store.js +273 -0
- package/src/context/persistence.d.ts +83 -0
- package/src/context/persistence.d.ts.map +1 -0
- package/src/context/persistence.js +356 -0
- package/src/core/events/event-system.d.ts +170 -0
- package/src/core/events/event-system.d.ts.map +1 -0
- package/src/core/events/event-system.js +288 -0
- package/src/core/events/hooks.d.ts +33 -0
- package/src/core/events/hooks.d.ts.map +1 -0
- package/src/core/events/hooks.js +198 -0
- package/src/core/events/index.d.ts +6 -0
- package/src/core/events/index.d.ts.map +1 -0
- package/src/core/events/index.js +7 -0
- package/src/core/events/middleware.d.ts +39 -0
- package/src/core/events/middleware.d.ts.map +1 -0
- package/src/core/events/middleware.js +219 -0
- package/src/core/index.d.ts +8 -0
- package/src/core/index.d.ts.map +1 -0
- package/src/core/index.js +15 -0
- package/src/core/optimization/bundle-optimizer.d.ts +44 -0
- package/src/core/optimization/bundle-optimizer.d.ts.map +1 -0
- package/src/core/optimization/bundle-optimizer.js +217 -0
- package/src/core/performance/cicd.d.ts +8 -0
- package/src/core/performance/cicd.d.ts.map +1 -0
- package/src/core/performance/cicd.js +83 -0
- package/src/core/performance/index.d.ts +10 -0
- package/src/core/performance/index.d.ts.map +1 -0
- package/src/core/performance/index.js +14 -0
- package/src/core/performance/media-loading-optimizer.d.ts +105 -0
- package/src/core/performance/media-loading-optimizer.d.ts.map +1 -0
- package/src/core/performance/media-loading-optimizer.js +404 -0
- package/src/core/performance/performance-budgets.d.ts +68 -0
- package/src/core/performance/performance-budgets.d.ts.map +1 -0
- package/src/core/performance/performance-budgets.js +326 -0
- package/src/core/performance/performance-monitor.d.ts +95 -0
- package/src/core/performance/performance-monitor.d.ts.map +1 -0
- package/src/core/performance/performance-monitor.js +297 -0
- package/src/core/performance/performance-testing.d.ts +69 -0
- package/src/core/performance/performance-testing.d.ts.map +1 -0
- package/src/core/performance/performance-testing.js +314 -0
- package/src/core/plugins/base-plugin.d.ts +52 -0
- package/src/core/plugins/base-plugin.d.ts.map +1 -0
- package/src/core/plugins/base-plugin.js +151 -0
- package/src/core/plugins/enhanced-plugin-system.d.ts +160 -0
- package/src/core/plugins/enhanced-plugin-system.d.ts.map +1 -0
- package/src/core/plugins/enhanced-plugin-system.js +305 -0
- package/src/core/plugins/enhanced-plugin-system.ts +14 -8
- package/src/core/plugins/examples/analytics-plugin.d.ts +30 -0
- package/src/core/plugins/examples/analytics-plugin.d.ts.map +1 -0
- package/src/core/plugins/examples/analytics-plugin.js +191 -0
- package/src/core/plugins/index.d.ts +8 -0
- package/src/core/plugins/index.d.ts.map +1 -0
- package/src/core/plugins/index.js +9 -0
- package/src/core/plugins/registry.d.ts +31 -0
- package/src/core/plugins/registry.d.ts.map +1 -0
- package/src/core/plugins/registry.js +261 -0
- package/src/core/plugins/types.d.ts +101 -0
- package/src/core/plugins/types.d.ts.map +1 -0
- package/src/core/plugins/types.js +31 -0
- package/src/core/plugins/utils.d.ts +38 -0
- package/src/core/plugins/utils.d.ts.map +1 -0
- package/src/core/plugins/utils.js +274 -0
- package/src/core/progressive-loading.d.ts +88 -0
- package/src/core/progressive-loading.d.ts.map +1 -0
- package/src/core/progressive-loading.js +239 -0
- package/src/core/providers/enhanced-hls-provider.d.ts +50 -0
- package/src/core/providers/enhanced-hls-provider.d.ts.map +1 -0
- package/src/core/providers/enhanced-hls-provider.js +273 -0
- package/src/core/providers/enhanced-hls-provider.ts +22 -53
- package/src/core/providers/service-provider.d.ts +49 -0
- package/src/core/providers/service-provider.d.ts.map +1 -0
- package/src/core/providers/service-provider.js +105 -0
- package/src/core/utils.d.ts +25 -0
- package/src/core/utils.d.ts.map +1 -0
- package/src/core/utils.js +21 -0
- package/src/features/media-session/media-session-manager.d.ts +132 -0
- package/src/features/media-session/media-session-manager.d.ts.map +1 -0
- package/src/features/media-session/media-session-manager.js +331 -0
- package/src/features/picture-in-picture/pip-manager.d.ts +94 -0
- package/src/features/picture-in-picture/pip-manager.d.ts.map +1 -0
- package/src/features/picture-in-picture/pip-manager.js +353 -0
- package/src/features/playlist/playlist-manager.d.ts +208 -0
- package/src/features/playlist/playlist-manager.d.ts.map +1 -0
- package/src/features/playlist/playlist-manager.js +475 -0
- package/src/features/subtitles/subtitle-manager.d.ts +136 -0
- package/src/features/subtitles/subtitle-manager.d.ts.map +1 -0
- package/src/features/subtitles/subtitle-manager.js +335 -0
- package/src/features/subtitles/subtitle-parser.d.ts +60 -0
- package/src/features/subtitles/subtitle-parser.d.ts.map +1 -0
- package/src/features/subtitles/subtitle-parser.js +217 -0
- package/src/features/thumbnails/thumbnail-generator.d.ts +136 -0
- package/src/features/thumbnails/thumbnail-generator.d.ts.map +1 -0
- package/src/features/thumbnails/thumbnail-generator.js +388 -0
- package/src/hooks/accessibility/index.d.ts +5 -0
- package/src/hooks/accessibility/index.d.ts.map +1 -0
- package/src/hooks/accessibility/index.js +4 -0
- package/src/hooks/accessibility/use-accessibility-preferences.d.ts +14 -0
- package/src/hooks/accessibility/use-accessibility-preferences.d.ts.map +1 -0
- package/src/hooks/accessibility/use-accessibility-preferences.js +156 -0
- package/src/hooks/accessibility/use-focus-management.d.ts +31 -0
- package/src/hooks/accessibility/use-focus-management.d.ts.map +1 -0
- package/src/hooks/accessibility/use-focus-management.js +142 -0
- package/src/hooks/accessibility/use-keyboard-shortcuts.d.ts +38 -0
- package/src/hooks/accessibility/use-keyboard-shortcuts.d.ts.map +1 -0
- package/src/hooks/accessibility/use-keyboard-shortcuts.js +101 -0
- package/src/hooks/accessibility/use-screen-reader.d.ts +22 -0
- package/src/hooks/accessibility/use-screen-reader.d.ts.map +1 -0
- package/src/hooks/accessibility/use-screen-reader.js +148 -0
- package/src/hooks/core/index.d.ts +18 -0
- package/src/hooks/core/index.d.ts.map +1 -0
- package/src/hooks/core/index.js +19 -0
- package/src/hooks/legacy.d.ts +18 -0
- package/src/hooks/legacy.d.ts.map +1 -0
- package/src/hooks/legacy.js +17 -0
- package/src/hooks/use-enhanced-media-player.d.ts +88 -0
- package/src/hooks/use-enhanced-media-player.d.ts.map +1 -0
- package/src/hooks/use-enhanced-media-player.js +395 -0
- package/src/hooks/use-enhanced-media-player.ts +19 -2
- package/src/hooks/use-intelligent-preloading.d.ts +66 -0
- package/src/hooks/use-intelligent-preloading.d.ts.map +1 -0
- package/src/hooks/use-intelligent-preloading.js +258 -0
- package/src/hooks/use-keyboard-controls.d.ts +13 -0
- package/src/hooks/use-keyboard-controls.d.ts.map +1 -0
- package/src/hooks/use-keyboard-controls.js +83 -0
- package/src/hooks/use-media-actions.d.ts +62 -0
- package/src/hooks/use-media-actions.d.ts.map +1 -0
- package/src/hooks/use-media-actions.js +121 -0
- package/src/hooks/use-media-metadata.d.ts +11 -0
- package/src/hooks/use-media-metadata.d.ts.map +1 -0
- package/src/hooks/use-media-metadata.js +74 -0
- package/src/hooks/use-media-optimistic.d.ts +36 -0
- package/src/hooks/use-media-optimistic.d.ts.map +1 -0
- package/src/hooks/use-media-optimistic.js +205 -0
- package/src/hooks/use-media-player.d.ts +31 -0
- package/src/hooks/use-media-player.d.ts.map +1 -0
- package/src/hooks/use-media-player.js +251 -0
- package/src/hooks/use-media-state.d.ts +17 -0
- package/src/hooks/use-media-state.d.ts.map +1 -0
- package/src/hooks/use-media-state.js +162 -0
- package/src/hooks/use-memory-optimization.d.ts +40 -0
- package/src/hooks/use-memory-optimization.d.ts.map +1 -0
- package/src/hooks/use-memory-optimization.js +288 -0
- package/src/hooks/use-optimistic-controls.d.ts +22 -0
- package/src/hooks/use-optimistic-controls.d.ts.map +1 -0
- package/src/hooks/use-optimistic-controls.js +60 -0
- package/src/hooks/use-optimized-media.d.ts +46 -0
- package/src/hooks/use-optimized-media.d.ts.map +1 -0
- package/src/hooks/use-optimized-media.js +211 -0
- package/src/hooks/use-touch-gestures.d.ts +47 -0
- package/src/hooks/use-touch-gestures.d.ts.map +1 -0
- package/src/hooks/use-touch-gestures.js +289 -0
- package/src/hooks/useEnhancedSubtitles.d.ts +39 -0
- package/src/hooks/useEnhancedSubtitles.d.ts.map +1 -0
- package/src/hooks/useEnhancedSubtitles.js +205 -0
- package/src/hooks/useKeyboardShortcuts.d.ts +10 -0
- package/src/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/src/hooks/useKeyboardShortcuts.js +59 -0
- package/src/hooks/useMediaControls.d.ts +9 -0
- package/src/hooks/useMediaControls.d.ts.map +1 -0
- package/src/hooks/useMediaControls.js +44 -0
- package/src/hooks/useScreenshot.d.ts +4 -0
- package/src/hooks/useScreenshot.d.ts.map +1 -0
- package/src/hooks/useScreenshot.js +56 -0
- package/src/hooks/useSubtitles.d.ts +8 -0
- package/src/hooks/useSubtitles.d.ts.map +1 -0
- package/src/hooks/useSubtitles.js +73 -0
- package/src/hooks/useVideoPlayer.d.ts +32 -0
- package/src/hooks/useVideoPlayer.d.ts.map +1 -0
- package/src/hooks/useVideoPlayer.js +184 -0
- package/src/icons/components/FullscreenIcon.d.ts +3 -0
- package/src/icons/components/FullscreenIcon.d.ts.map +1 -0
- package/src/icons/components/FullscreenIcon.js +11 -0
- package/src/icons/components/SettingsIcon.d.ts +3 -0
- package/src/icons/components/SettingsIcon.d.ts.map +1 -0
- package/src/icons/components/SettingsIcon.js +11 -0
- package/src/icons/components/animated/LoadingIcon.d.ts +3 -0
- package/src/icons/components/animated/LoadingIcon.d.ts.map +1 -0
- package/src/icons/components/animated/LoadingIcon.js +11 -0
- package/src/icons/components/animated/PlayPauseIcon.d.ts +7 -0
- package/src/icons/components/animated/PlayPauseIcon.d.ts.map +1 -0
- package/src/icons/components/animated/PlayPauseIcon.js +9 -0
- package/src/icons/components/media/PauseIcon.d.ts +3 -0
- package/src/icons/components/media/PauseIcon.d.ts.map +1 -0
- package/src/icons/components/media/PauseIcon.js +12 -0
- package/src/icons/components/media/PlayIcon.d.ts +3 -0
- package/src/icons/components/media/PlayIcon.d.ts.map +1 -0
- package/src/icons/components/media/PlayIcon.js +12 -0
- package/src/icons/components/volume/VolumeIcon.d.ts +3 -0
- package/src/icons/components/volume/VolumeIcon.d.ts.map +1 -0
- package/src/icons/components/volume/VolumeIcon.js +11 -0
- package/src/icons/components/volume/VolumeOffIcon.d.ts +3 -0
- package/src/icons/components/volume/VolumeOffIcon.d.ts.map +1 -0
- package/src/icons/components/volume/VolumeOffIcon.js +11 -0
- package/src/icons/index.d.ts +28 -0
- package/src/icons/index.d.ts.map +1 -0
- package/src/icons/index.js +45 -0
- package/src/icons/provider.d.ts +13 -0
- package/src/icons/provider.d.ts.map +1 -0
- package/src/icons/provider.js +37 -0
- package/src/icons/types.d.ts +18 -0
- package/src/icons/types.d.ts.map +1 -0
- package/src/icons/types.js +1 -0
- package/src/index-enhanced.d.ts +13 -0
- package/src/index-enhanced.d.ts.map +1 -0
- package/src/index-enhanced.js +16 -0
- package/src/index-legacy.d.ts +81 -0
- package/src/index-legacy.d.ts.map +1 -0
- package/src/index-legacy.js +97 -0
- package/src/index.d.ts +38 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +90 -0
- package/src/index.minimal.d.ts +2 -0
- package/src/index.minimal.d.ts.map +1 -0
- package/src/index.minimal.js +3 -0
- package/src/index.minimal.ts +4 -0
- package/src/lib/deprecation.d.ts +7 -0
- package/src/lib/deprecation.d.ts.map +1 -0
- package/src/lib/deprecation.js +31 -0
- package/src/lib/format-time.d.ts +9 -0
- package/src/lib/format-time.d.ts.map +1 -0
- package/src/lib/format-time.js +32 -0
- package/src/lib/index.d.ts +3 -0
- package/src/lib/index.d.ts.map +1 -0
- package/src/lib/index.js +3 -0
- package/src/lib/utils.d.ts +3 -0
- package/src/lib/utils.d.ts.map +1 -0
- package/src/lib/utils.js +5 -0
- package/src/test/setup.d.ts +2 -0
- package/src/test/setup.d.ts.map +1 -0
- package/src/test/setup.js +65 -0
- package/src/types/events.d.ts +41 -0
- package/src/types/events.d.ts.map +1 -0
- package/src/types/events.js +2 -0
- package/src/types/formats.d.ts +45 -0
- package/src/types/formats.d.ts.map +1 -0
- package/src/types/formats.js +63 -0
- package/src/types/index.d.ts +128 -0
- package/src/types/index.d.ts.map +1 -0
- package/src/types/index.js +4 -0
- package/src/types/index.ts +40 -5
- package/dist/context-BMteAJDN.js.map +0 -1
- package/dist/context-DCJ_scmO.cjs +0 -23
- package/dist/context-DCJ_scmO.cjs.map +0 -1
- package/dist/hooks-C_r8wexn.cjs +0 -4
- package/dist/hooks-C_r8wexn.cjs.map +0 -1
- package/dist/hooks-Da2wVXlF.js +0 -1630
- package/dist/hooks-Da2wVXlF.js.map +0 -1
- package/dist/utils-BnscpYYd.js.map +0 -1
- package/dist/utils-D_czS_0K.cjs +0 -9
- package/dist/utils-D_czS_0K.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-Da2wVXlF.js","sources":["../src/hooks/use-keyboard-controls.ts","../src/hooks/use-media-optimistic.ts","../src/hooks/use-media-actions.ts","../src/hooks/use-enhanced-media-player.ts","../src/hooks/use-memory-optimization.ts","../src/hooks/use-media-state.ts","../src/hooks/use-media-player.ts","../../ui/src/hooks/use-mobile.ts","../src/hooks/use-touch-gestures.ts","../src/hooks/useVideoPlayer.ts","../src/hooks/useEnhancedSubtitles.ts","../src/hooks/useMediaControls.ts","../src/hooks/useKeyboardShortcuts.ts","../src/hooks/useScreenshot.ts","../src/hooks/use-intelligent-preloading.ts","../src/hooks/useSubtitles.ts","../src/hooks/legacy.ts"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useEffect } from \"react\"\nimport type { MediaPlayerControls, MediaPlayerState } from \"../types/index\"\n\ninterface UseKeyboardControlsOptions {\n\tenabled?: boolean\n\tstate: MediaPlayerState\n\tcontrols: MediaPlayerControls\n\tseekStep?: number // seconds to seek forward/backward\n\tvolumeStep?: number // volume step (0-1)\n}\n\nexport function useKeyboardControls({\n\tenabled = true,\n\tstate,\n\tcontrols,\n\tseekStep = 10,\n\tvolumeStep = 0.1\n}: UseKeyboardControlsOptions) {\n\tconst handleKeyDown = (event: KeyboardEvent) => {\n \t\t\tif (!enabled) return\n\n \t\t\t// Don't handle keyboard events if user is typing in an input\n \t\t\tconst target = event.target as HTMLElement\n \t\t\tif (\n \t\t\t\ttarget.tagName === \"INPUT\" ||\n \t\t\t\ttarget.tagName === \"TEXTAREA\" ||\n \t\t\t\ttarget.contentEditable === \"true\"\n \t\t\t) {\n \t\t\t\treturn\n \t\t\t}\n\n \t\t\tswitch (event.code) {\n \t\t\t\tcase \"Space\":\n \t\t\t\tcase \"KeyK\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tcontrols.toggle()\n \t\t\t\t\tbreak\n\n \t\t\t\tcase \"KeyM\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tcontrols.toggleMute()\n \t\t\t\t\tbreak\n\n \t\t\t\tcase \"KeyF\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tcontrols.toggleFullscreen()\n \t\t\t\t\tbreak\n\n \t\t\t\tcase \"ArrowLeft\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tcontrols.seek(Math.max(0, state.currentTime - seekStep))\n \t\t\t\t\tbreak\n\n \t\t\t\tcase \"ArrowRight\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tcontrols.seek(Math.min(state.duration, state.currentTime + seekStep))\n \t\t\t\t\tbreak\n\n \t\t\t\tcase \"ArrowUp\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tcontrols.setVolume(Math.min(1, state.volume + volumeStep))\n \t\t\t\t\tbreak\n\n \t\t\t\tcase \"ArrowDown\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tcontrols.setVolume(Math.max(0, state.volume - volumeStep))\n \t\t\t\t\tbreak\n\n \t\t\t\tcase \"Digit0\":\n \t\t\t\tcase \"Digit1\":\n \t\t\t\tcase \"Digit2\":\n \t\t\t\tcase \"Digit3\":\n \t\t\t\tcase \"Digit4\":\n \t\t\t\tcase \"Digit5\":\n \t\t\t\tcase \"Digit6\":\n \t\t\t\tcase \"Digit7\":\n \t\t\t\tcase \"Digit8\":\n \t\t\t\tcase \"Digit9\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tconst digit = parseInt(event.code.replace(\"Digit\", \"\"), 10)\n \t\t\t\t\tconst percentage = digit / 10\n \t\t\t\t\tcontrols.seek(state.duration * percentage)\n \t\t\t\t\tbreak\n\n \t\t\t\tcase \"Home\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tcontrols.seek(0)\n \t\t\t\t\tbreak\n\n \t\t\t\tcase \"End\":\n \t\t\t\t\tevent.preventDefault()\n \t\t\t\t\tcontrols.seek(state.duration)\n \t\t\t\t\tbreak\n\n \t\t\t\tdefault:\n \t\t\t\t\t// Don't prevent default for unhandled keys\n \t\t\t\t\tbreak\n \t\t\t}\n \t\t}\n\n\tuseEffect(() => {\n\t\tif (!enabled) return\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown)\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown)\n\t\t}\n\t}, [enabled, handleKeyDown])\n\n\treturn {\n\t\thandleKeyDown\n\t}\n}\n","\"use client\"\n\nimport React, { useOptimistic } from \"react\"\nimport type { MediaState } from \"../context/media-context\"\nimport type { OptimisticMediaAction, EnhancedMediaStore } from \"../context/media-store\"\n\n// Optimistic update reducer function\nfunction optimisticMediaReducer(\n\tstate: MediaState, \n\taction: OptimisticMediaAction\n): MediaState {\n\tif (!action.optimistic) return state\n\n\t// Apply immediate optimistic updates for better UX\n\tswitch (action.type) {\n\t\tcase \"PLAY\":\n\t\t\treturn { ...state, isPlaying: true, error: null }\n\t\t\n\t\tcase \"PAUSE\":\n\t\t\treturn { ...state, isPlaying: false }\n\t\t\n\t\tcase \"SEEK\":\n\t\t\treturn { ...state, currentTime: action.detail }\n\t\t\n\t\tcase \"SET_VOLUME\":\n\t\t\treturn { ...state, volume: Math.max(0, Math.min(1, action.detail)) }\n\t\t\n\t\tcase \"MUTE\":\n\t\t\treturn { ...state, isMuted: true }\n\t\t\n\t\tcase \"UNMUTE\":\n\t\t\treturn { ...state, isMuted: false }\n\t\t\n\t\tcase \"TOGGLE_MUTE\":\n\t\t\treturn { ...state, isMuted: !state.isMuted }\n\t\t\n\t\tcase \"ENTER_FULLSCREEN\":\n\t\t\treturn { ...state, isFullscreen: true }\n\t\t\n\t\tcase \"EXIT_FULLSCREEN\":\n\t\t\treturn { ...state, isFullscreen: false }\n\t\t\n\t\tcase \"SET_PLAYBACK_RATE\":\n\t\t\treturn { ...state, playbackRate: action.detail }\n\t\t\n\t\tcase \"TOGGLE_SUBTITLES\":\n\t\t\treturn { ...state, subtitlesShowing: !state.subtitlesShowing }\n\t\t\n\t\tcase \"PREVIEW_TIME\":\n\t\t\treturn { ...state, previewTime: action.detail }\n\t\t\n\t\tcase \"CLEAR_PREVIEW\":\n\t\t\treturn { \n\t\t\t\t...state, \n\t\t\t\tpreviewTime: null, \n\t\t\t\tpreviewImage: null, \n\t\t\t\tpreviewCoords: null \n\t\t\t}\n\t\t\n\t\tdefault:\n\t\t\treturn state\n\t}\n}\n\n// Media optimistic state hook using React 19's useOptimistic\nexport function useMediaOptimistic(store: EnhancedMediaStore) {\n\tconst actualState = React.useSyncExternalStore(\n\t\tstore.subscribe,\n\t\tstore.getState,\n\t\tstore.getState\n\t)\n\n\tconst [optimisticState, addOptimistic] = useOptimistic(\n\t\tactualState,\n\t\toptimisticMediaReducer\n\t)\n\n\t// Enhanced dispatch that uses optimistic updates\n\tconst dispatchOptimistic = React.useCallback(async (action: OptimisticMediaAction) => {\n\t\t// Add optimistic update immediately\n\t\tif (action.optimistic) {\n\t\t\taddOptimistic(action)\n\t\t}\n\t\t\n\t\t// Dispatch the actual action\n\t\tawait store.dispatchOptimistic(action)\n\t}, [store, addOptimistic])\n\n\t// Quick actions with optimistic updates\n\tconst optimisticActions = React.useMemo(() => ({\n\t\t// Play/Pause with immediate feedback\n\t\ttogglePlayPause: async () => {\n\t\t\tconst action: OptimisticMediaAction = {\n\t\t\t\ttype: optimisticState.isPlaying ? \"PAUSE\" : \"PLAY\",\n\t\t\t\toptimistic: true,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t}\n\t\t\tawait dispatchOptimistic(action)\n\t\t},\n\n\t\t// Volume control with immediate slider feedback\n\t\tsetVolumeOptimistic: async (volume: number) => {\n\t\t\tconst action: OptimisticMediaAction = {\n\t\t\t\ttype: \"SET_VOLUME\",\n\t\t\t\tdetail: Math.max(0, Math.min(1, volume)),\n\t\t\t\toptimistic: true,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t}\n\t\t\tawait dispatchOptimistic(action)\n\t\t},\n\n\t\t// Seek with immediate scrub feedback\n\t\tseekOptimistic: async (time: number) => {\n\t\t\tconst action: OptimisticMediaAction = {\n\t\t\t\ttype: \"SEEK\",\n\t\t\t\tdetail: time,\n\t\t\t\toptimistic: true,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t}\n\t\t\tawait dispatchOptimistic(action)\n\t\t},\n\n\t\t// Mute toggle with immediate icon change\n\t\ttoggleMuteOptimistic: async () => {\n\t\t\tconst action: OptimisticMediaAction = {\n\t\t\t\ttype: \"TOGGLE_MUTE\",\n\t\t\t\toptimistic: true,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t}\n\t\t\tawait dispatchOptimistic(action)\n\t\t},\n\n\t\t// Fullscreen toggle with immediate layout change\n\t\ttoggleFullscreenOptimistic: async () => {\n\t\t\tconst action: OptimisticMediaAction = {\n\t\t\t\ttype: optimisticState.isFullscreen ? \"EXIT_FULLSCREEN\" : \"ENTER_FULLSCREEN\",\n\t\t\t\toptimistic: true,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t}\n\t\t\tawait dispatchOptimistic(action)\n\t\t},\n\n\t\t// Playback rate with immediate feedback\n\t\tsetPlaybackRateOptimistic: async (rate: number) => {\n\t\t\tconst action: OptimisticMediaAction = {\n\t\t\t\ttype: \"SET_PLAYBACK_RATE\",\n\t\t\t\tdetail: rate,\n\t\t\t\toptimistic: true,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t}\n\t\t\tawait dispatchOptimistic(action)\n\t\t},\n\n\t\t// Subtitle toggle with immediate visibility change\n\t\ttoggleSubtitlesOptimistic: async () => {\n\t\t\tconst action: OptimisticMediaAction = {\n\t\t\t\ttype: \"TOGGLE_SUBTITLES\",\n\t\t\t\toptimistic: true,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t}\n\t\t\tawait dispatchOptimistic(action)\n\t\t}\n\t}), [optimisticState, dispatchOptimistic])\n\n\t// State selectors that return optimistic values\n\tconst selectors = React.useMemo(() => ({\n\t\tisPlaying: optimisticState.isPlaying,\n\t\tcurrentTime: optimisticState.currentTime,\n\t\tvolume: optimisticState.volume,\n\t\tisMuted: optimisticState.isMuted,\n\t\tisFullscreen: optimisticState.isFullscreen,\n\t\tplaybackRate: optimisticState.playbackRate,\n\t\tsubtitlesShowing: optimisticState.subtitlesShowing,\n\t\tpreviewTime: optimisticState.previewTime,\n\t\t\n\t\t// Computed values\n\t\tprogress: optimisticState.duration > 0 \n\t\t\t? optimisticState.currentTime / optimisticState.duration \n\t\t\t: 0,\n\t\t\n\t\tformattedTime: formatTime(optimisticState.currentTime),\n\t\tformattedDuration: formatTime(optimisticState.duration),\n\t\t\n\t\t// State checks\n\t\tcanPlay: !optimisticState.isLoading && !optimisticState.error,\n\t\thasError: !!optimisticState.error,\n\t\tisBuffering: optimisticState.isLoading\n\t}), [optimisticState])\n\n\treturn {\n\t\tstate: optimisticState,\n\t\tactualState,\n\t\t...selectors,\n\t\t...optimisticActions,\n\t\tdispatchOptimistic\n\t}\n}\n\n// Time formatting utility\nfunction formatTime(seconds: number): string {\n\tif (!seconds || !isFinite(seconds)) return \"0:00\"\n\t\n\tconst mins = Math.floor(seconds / 60)\n\tconst secs = Math.floor(seconds % 60)\n\tconst hours = Math.floor(mins / 60)\n\t\n\tif (hours > 0) {\n\t\treturn `${hours}:${String(mins % 60).padStart(2, '0')}:${String(secs).padStart(2, '0')}`\n\t}\n\t\n\treturn `${mins}:${String(secs).padStart(2, '0')}`\n}\n\n// Hook for components that need to detect optimistic updates\nexport function useOptimisticUpdates(store: EnhancedMediaStore) {\n\tconst [hasOptimisticUpdates, setHasOptimisticUpdates] = React.useState(false)\n\t\n\tReact.useEffect(() => {\n\t\tconst unsubscribe = store.subscribe(() => {\n\t\t\tconst actualState = store.getState()\n\t\t\tconst optimisticState = store.getOptimisticState()\n\t\t\t\n\t\t\tconst hasUpdates = JSON.stringify(actualState) !== JSON.stringify(optimisticState)\n\t\t\tsetHasOptimisticUpdates(hasUpdates)\n\t\t})\n\t\t\n\t\treturn unsubscribe\n\t}, [store])\n\t\n\treturn hasOptimisticUpdates\n}\n\n// Hook to get both actual and optimistic state for debugging\nexport function useMediaStateComparison(store: EnhancedMediaStore) {\n\tconst actualState = React.useSyncExternalStore(\n\t\tstore.subscribe,\n\t\tstore.getState,\n\t\tstore.getState\n\t)\n\t\n\tconst optimisticState = React.useSyncExternalStore(\n\t\tstore.subscribe,\n\t\tstore.getOptimisticState,\n\t\tstore.getOptimisticState\n\t)\n\t\n\tconst differences = React.useMemo(() => {\n\t\tconst diffs: any[] = []\n\t\t\n\t\tconst stateKeys = Object.keys(actualState) as Array<keyof MediaState>\n\t\tstateKeys.forEach(key => {\n\t\t\tif (JSON.stringify(actualState[key]) !== JSON.stringify(optimisticState[key])) {\n\t\t\t\tdiffs.push({\n\t\t\t\t\tkey: key as string,\n\t\t\t\t\tactual: actualState[key],\n\t\t\t\t\toptimistic: optimisticState[key]\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\t\n\t\treturn diffs\n\t}, [actualState, optimisticState])\n\t\n\treturn {\n\t\tactualState,\n\t\toptimisticState,\n\t\tdifferences,\n\t\thasOptimisticUpdates: differences.length > 0\n\t}\n}\n","\"use client\"\n\nimport React from \"react\"\nimport type { MediaActionType, MediaState } from \"../context/media-context\"\nimport type { OptimisticMediaAction, MediaActionState, EnhancedMediaStore } from \"../context/media-store\"\nimport { MediaActionTypes } from \"../context/media-context\"\n\n// Action payload types\nexport interface MediaActionPayloads {\n\t[MediaActionTypes.PLAY]: void\n\t[MediaActionTypes.PAUSE]: void\n\t[MediaActionTypes.SEEK]: number\n\t[MediaActionTypes.SET_VOLUME]: number\n\t[MediaActionTypes.MUTE]: void\n\t[MediaActionTypes.UNMUTE]: void\n\t[MediaActionTypes.TOGGLE_MUTE]: void\n\t[MediaActionTypes.SET_DURATION]: number\n\t[MediaActionTypes.SET_CURRENT_TIME]: number\n\t[MediaActionTypes.SET_BUFFERED]: TimeRanges | null\n\t[MediaActionTypes.SET_LOADING]: boolean\n\t[MediaActionTypes.SET_ERROR]: string | null\n\t[MediaActionTypes.ENTER_FULLSCREEN]: void\n\t[MediaActionTypes.EXIT_FULLSCREEN]: void\n\t[MediaActionTypes.ENTER_PIP]: void\n\t[MediaActionTypes.EXIT_PIP]: void\n\t[MediaActionTypes.SET_PLAYBACK_RATE]: number\n\t[MediaActionTypes.SET_SUBTITLE_TRACK]: TextTrack | null\n\t[MediaActionTypes.SET_RENDITION]: string | null\n\t[MediaActionTypes.TOGGLE_SUBTITLES]: void\n\t[MediaActionTypes.PREVIEW_TIME]: number | null\n\t[MediaActionTypes.CLEAR_PREVIEW]: void\n}\n\n// Enhanced action creator that returns a Promise\ntype OptimisticActionCreator<T extends keyof MediaActionPayloads> = MediaActionPayloads[T] extends void\n\t? (optimistic?: boolean) => Promise<void>\n\t: (payload: MediaActionPayloads[T], optimistic?: boolean) => Promise<void>\n\n// Action creator factory\nfunction createOptimisticAction<T extends keyof MediaActionPayloads>(\n\ttype: T,\n\tstore: EnhancedMediaStore\n): OptimisticActionCreator<T> {\n\treturn ((payload?: any, optimistic = false) => {\n\t\tconst action: OptimisticMediaAction = {\n\t\t\ttype,\n\t\t\tdetail: payload,\n\t\t\toptimistic,\n\t\t\ttimestamp: Date.now()\n\t\t}\n\n\t\tif (optimistic) {\n\t\t\treturn store.dispatchOptimistic(action)\n\t\t} else {\n\t\t\tstore.dispatch(action)\n\t\t\treturn Promise.resolve()\n\t\t}\n\t}) as OptimisticActionCreator<T>\n}\n\n// React 19 useActionState integration\nexport function useMediaActionState(store: EnhancedMediaStore) {\n\tconst [actionState, setActionState] = React.useState<MediaActionState>(store.getActionState())\n\n\t// Subscribe to action state changes\n\tReact.useEffect(() => {\n\t\tconst unsubscribe = store.subscribe(() => {\n\t\t\tconst newActionState = store.getActionState()\n\t\t\tsetActionState(current => \n\t\t\t\tJSON.stringify(current) !== JSON.stringify(newActionState) \n\t\t\t\t\t? newActionState \n\t\t\t\t\t: current\n\t\t\t)\n\t\t})\n\t\treturn unsubscribe\n\t}, [store])\n\n\treturn actionState\n}\n\n// Media actions hook with React 19 optimistic updates\nexport function useMediaActions(store: EnhancedMediaStore) {\n\t// Create action creators with optimistic support\n\tconst actions = React.useMemo(() => ({\n\t\t// Playback actions\n\t\tplay: createOptimisticAction(MediaActionTypes.PLAY, store),\n\t\tpause: createOptimisticAction(MediaActionTypes.PAUSE, store),\n\t\tseek: createOptimisticAction(MediaActionTypes.SEEK, store),\n\t\t\n\t\t// Volume actions \n\t\tsetVolume: createOptimisticAction(MediaActionTypes.SET_VOLUME, store),\n\t\tmute: createOptimisticAction(MediaActionTypes.MUTE, store),\n\t\tunmute: createOptimisticAction(MediaActionTypes.UNMUTE, store),\n\t\ttoggleMute: createOptimisticAction(MediaActionTypes.TOGGLE_MUTE, store),\n\t\t\n\t\t// Media state actions\n\t\tsetDuration: createOptimisticAction(MediaActionTypes.SET_DURATION, store),\n\t\tsetCurrentTime: createOptimisticAction(MediaActionTypes.SET_CURRENT_TIME, store),\n\t\tsetBuffered: createOptimisticAction(MediaActionTypes.SET_BUFFERED, store),\n\t\tsetLoading: createOptimisticAction(MediaActionTypes.SET_LOADING, store),\n\t\tsetError: createOptimisticAction(MediaActionTypes.SET_ERROR, store),\n\t\t\n\t\t// Display actions\n\t\tenterFullscreen: createOptimisticAction(MediaActionTypes.ENTER_FULLSCREEN, store),\n\t\texitFullscreen: createOptimisticAction(MediaActionTypes.EXIT_FULLSCREEN, store),\n\t\tenterPiP: createOptimisticAction(MediaActionTypes.ENTER_PIP, store),\n\t\texitPiP: createOptimisticAction(MediaActionTypes.EXIT_PIP, store),\n\t\t\n\t\t// Advanced actions\n\t\tsetPlaybackRate: createOptimisticAction(MediaActionTypes.SET_PLAYBACK_RATE, store),\n\t\tsetSubtitleTrack: createOptimisticAction(MediaActionTypes.SET_SUBTITLE_TRACK, store),\n\t\tsetRendition: createOptimisticAction(MediaActionTypes.SET_RENDITION, store),\n\t\ttoggleSubtitles: createOptimisticAction(MediaActionTypes.TOGGLE_SUBTITLES, store),\n\t\t\n\t\t// Preview actions\n\t\tpreviewTime: createOptimisticAction(MediaActionTypes.PREVIEW_TIME, store),\n\t\tclearPreview: createOptimisticAction(MediaActionTypes.CLEAR_PREVIEW, store)\n\t}), [store])\n\n\t// Get action state for loading/error handling\n\tconst actionState = useMediaActionState(store)\n\n\t// Convenience methods that commonly use optimistic updates\n\tconst optimisticActions = React.useMemo(() => ({\n\t\t// These actions benefit from immediate UI feedback\n\t\ttogglePlayPause: async (isPlaying: boolean) => {\n\t\t\tif (isPlaying) {\n\t\t\t\tawait actions.pause(true) // optimistic\n\t\t\t} else {\n\t\t\t\tawait actions.play(true) // optimistic\n\t\t\t}\n\t\t},\n\t\t\n\t\tseekWithPreview: async (time: number) => {\n\t\t\t// Immediate preview update, then actual seek\n\t\t\tawait actions.previewTime(time, true)\n\t\t\tawait actions.seek(time, true)\n\t\t},\n\t\t\n\t\tadjustVolume: async (delta: number, currentVolume: number) => {\n\t\t\tconst newVolume = Math.max(0, Math.min(1, currentVolume + delta))\n\t\t\tawait actions.setVolume(newVolume, true)\n\t\t},\n\t\t\n\t\ttoggleFullscreenOptimistic: async (isFullscreen: boolean) => {\n\t\t\tif (isFullscreen) {\n\t\t\t\tawait actions.exitFullscreen(true)\n\t\t\t} else {\n\t\t\t\tawait actions.enterFullscreen(true)\n\t\t\t}\n\t\t}\n\t}), [actions])\n\n\t// Retry failed action\n\tconst retryLastAction = React.useCallback(async () => {\n\t\tconst { lastAction } = actionState\n\t\tif (lastAction && actionState.error) {\n\t\t\tawait store.dispatchOptimistic({\n\t\t\t\t...lastAction,\n\t\t\t\tretryCount: (lastAction.retryCount || 0) + 1\n\t\t\t})\n\t\t}\n\t}, [store, actionState])\n\n\treturn {\n\t\t...actions,\n\t\t...optimisticActions,\n\t\tactionState,\n\t\tretryLastAction,\n\t\tisLoading: actionState.pending,\n\t\thasError: !!actionState.error,\n\t\terrorMessage: actionState.error,\n\t\tretryCount: actionState.retryCount\n\t}\n}","\"use client\"\n\nimport React, {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseMemo,\n\tuseTransition,\n\tuseOptimistic,\n\tuseActionState\n} from \"react\"\nimport type { MediaPlayerControls, MediaPlayerState } from \"../types/index\"\nimport { useMediaStore, useMediaSelector } from \"../context/media-context\"\nimport { useMediaOptimistic } from \"./use-media-optimistic\"\nimport { useMediaActions } from \"./use-media-actions\"\nimport type { EnhancedMediaStore } from \"../context/media-store\"\n\ninterface UseEnhancedMediaPlayerOptions {\n\tsrc: string | string[]\n\tautoPlay?: boolean\n\tloop?: boolean\n\tmuted?: boolean\n\tvolume?: number\n\tpreload?: \"none\" | \"metadata\" | \"auto\"\n\tcrossOrigin?: \"anonymous\" | \"use-credentials\"\n\tplaybackRates?: number[]\n\tkeyboardControls?: boolean\n\tshowControls?: boolean\n\tcustomControls?: boolean\n\tenablePerformanceMonitoring?: boolean\n\tbufferingStrategy?: \"aggressive\" | \"conservative\" | \"adaptive\"\n\t// Performance optimizations\n\tenableTimeUpdateThrottling?: boolean\n\ttimeUpdateThrottleMs?: number\n\tenableSeekPreview?: boolean\n\tpreloadStrategy?: \"eager\" | \"lazy\" | \"progressive\"\n}\n\n// Performance-optimized media player hook with React 19 features\nexport function useEnhancedMediaPlayer(options: UseEnhancedMediaPlayerOptions) {\n\tconst mediaRef = useRef<HTMLVideoElement | HTMLAudioElement>(null)\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\n\t// React 19 concurrent features\n\tconst [isPending, startTransition] = useTransition()\n\tconst [isSeeking, startSeekTransition] = useTransition()\n\n\t// Performance monitoring\n\tconst renderStartTime = React.useRef<number>(0)\n\tconst frameCount = React.useRef<number>(0)\n\tconst lastFrameTime = React.useRef<number>(0)\n\n\t// Throttled time update\n\tconst timeUpdateTimeoutRef = useRef<NodeJS.Timeout>()\n\tconst lastTimeUpdate = useRef<number>(0)\n\n\t// Store integration\n\tconst store = useMediaStore()\n\tconst isEnhanced = 'getOptimisticState' in store\n\n\t// Select only the state we need to minimize re-renders\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\tconst isMuted = useMediaSelector(state => state.isMuted)\n\tconst isLoading = useMediaSelector(state => state.isLoading)\n\tconst isBuffering = useMediaSelector(state => state.isBuffering)\n\tconst error = useMediaSelector(state => state.error)\n\tconst buffered = useMediaSelector(state => state.buffered)\n\tconst isFullscreen = useMediaSelector(state => state.isFullscreen)\n\n\t// Enhanced features if available\n\tconst enhancedStore = store as unknown as EnhancedMediaStore\n\tconst optimisticState = isEnhanced ? useMediaOptimistic(enhancedStore) : null\n\tconst actions = isEnhanced ? useMediaActions(enhancedStore) : null\n\n\t// Performance state\n\tconst [performanceMetrics, setPerformanceMetrics] = React.useState({\n\t\tframeRate: 0,\n\t\taverageRenderTime: 0,\n\t\tdroppedFrames: 0,\n\t\tbufferHealth: 0\n\t})\n\n\t// Optimistic state updates for immediate UI feedback\n\tconst [optimisticVolume, setOptimisticVolume] = useOptimistic(volume, (state, newVolume: number) => {\n\t\treturn Math.max(0, Math.min(1, newVolume))\n\t})\n\n\tconst [optimisticTime, setOptimisticTime] = useOptimistic(currentTime, (state, newTime: number) => {\n\t\treturn Math.max(0, Math.min(duration || 0, newTime))\n\t})\n\n\t// Initialize media element with performance optimizations\n\tuseEffect(() => {\n\t\tconst media = mediaRef.current\n\t\tif (!media) return\n\n\t\t// Set initial properties\n\t\tconst initProps = {\n\t\t\tvolume: options.volume,\n\t\t\tmuted: options.muted,\n\t\t\tautoplay: options.autoPlay,\n\t\t\tloop: options.loop,\n\t\t\tpreload: options.preload,\n\t\t\tcrossOrigin: options.crossOrigin\n\t\t}\n\n\t\tObject.entries(initProps).forEach(([key, value]) => {\n\t\t\tif (value !== undefined) {\n\t\t\t\t(media as any)[key] = value\n\t\t\t}\n\t\t})\n\n\t\t// Performance optimizations\n\t\tmedia.setAttribute('preload', options.preloadStrategy === 'eager' ? 'auto' : 'metadata')\n\n\t\tif (options.bufferingStrategy === 'aggressive') {\n\t\t\tmedia.setAttribute('buffered', 'auto')\n\t\t}\n\n\t\t// Hardware acceleration\n\t\tif (media instanceof HTMLVideoElement) {\n\t\t\tmedia.style.willChange = 'transform'\n\t\t\tmedia.style.transform = 'translateZ(0)'\n\t\t}\n\t}, [\n\t\toptions.volume,\n\t\toptions.muted,\n\t\toptions.autoPlay,\n\t\toptions.loop,\n\t\toptions.preload,\n\t\toptions.crossOrigin,\n\t\toptions.preloadStrategy,\n\t\toptions.bufferingStrategy\n\t])\n\n\t// Optimized event handlers with React 19 patterns\n\tconst handleTimeUpdate = useCallback(() => {\n\t\tconst media = mediaRef.current\n\t\tif (!media) return\n\n\t\tconst now = performance.now()\n\n\t\t// Throttle time updates for performance\n\t\tif (options.enableTimeUpdateThrottling !== false) {\n\t\t\tif (now - lastTimeUpdate.current < (options.timeUpdateThrottleMs || 100)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlastTimeUpdate.current = now\n\t\t}\n\n\t\tstartTransition(() => {\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tactions.setCurrentTime(media.currentTime)\n\t\t\t}\n\t\t})\n\t}, [options.enableTimeUpdateThrottling, options.timeUpdateThrottleMs, isEnhanced, actions])\n\n\tconst handlePlay = useCallback(() => {\n\t\tstartTransition(() => {\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tactions.play(true) // Optimistic update\n\t\t\t}\n\t\t})\n\t\toptions.onPlay?.()\n\t}, [isEnhanced, actions, options.onPlay])\n\n\tconst handlePause = useCallback(() => {\n\t\tstartTransition(() => {\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tactions.pause(true) // Optimistic update\n\t\t\t}\n\t\t})\n\t\toptions.onPause?.()\n\t}, [isEnhanced, actions, options.onPause])\n\n\tconst handleVolumeChange = useCallback(() => {\n\t\tconst media = mediaRef.current\n\t\tif (!media) return\n\n\t\tstartTransition(() => {\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tactions.setVolume(media.volume, true) // Optimistic update\n\t\t\t\tmedia.muted ? actions.mute(true) : actions.unmute(true)\n\t\t\t}\n\t\t})\n\t}, [isEnhanced, actions])\n\n\tconst handleSeeking = useCallback(() => {\n\t\tstartSeekTransition(() => {\n\t\t\t// Seek operations get their own transition\n\t\t})\n\t}, [])\n\n\tconst handleSeeked = useCallback(() => {\n\t\t// Seek completed\n\t}, [])\n\n\tconst handleProgress = useCallback(() => {\n\t\tconst media = mediaRef.current\n\t\tif (!media) return\n\n\t\tstartTransition(() => {\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tactions.setBuffered(media.buffered)\n\t\t\t}\n\t\t})\n\t}, [isEnhanced, actions])\n\n\t// Performance monitoring\n\tconst measureRenderTime = useCallback(() => {\n\t\tconst now = performance.now()\n\t\tconst deltaTime = now - lastFrameTime.current\n\n\t\tif (deltaTime > 0) {\n\t\t\tframeCount.current++\n\n\t\t\t// Calculate frame rate every second\n\t\t\tif (frameCount.current >= 60) {\n\t\t\t\tconst fps = Math.round((frameCount.current * 1000) / (now - lastFrameTime.current))\n\t\t\t\tsetPerformanceMetrics(prev => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tframeRate: fps,\n\t\t\t\t\tdroppedFrames: Math.max(0, 60 - fps)\n\t\t\t\t}))\n\t\t\t\tframeCount.current = 0\n\t\t\t\tlastFrameTime.current = now\n\t\t\t}\n\t\t}\n\t}, [])\n\n\t// Attach event listeners with performance optimization\n\tuseEffect(() => {\n\t\tconst media = mediaRef.current\n\t\tif (!media) return\n\n\t\t// Use passive listeners where possible for better performance\n\t\tconst eventListeners = [\n\t\t\t{ event: \"timeupdate\", handler: handleTimeUpdate, passive: true },\n\t\t\t{ event: \"play\", handler: handlePlay },\n\t\t\t{ event: \"pause\", handler: handlePause },\n\t\t\t{ event: \"volumechange\", handler: handleVolumeChange },\n\t\t\t{ event: \"seeking\", handler: handleSeeking },\n\t\t\t{ event: \"seeked\", handler: handleSeeked },\n\t\t\t{ event: \"progress\", handler: handleProgress, passive: true },\n\t\t\t{ event: \"loadedmetadata\", handler: () => measureRenderTime() },\n\t\t\t{ event: \"loadeddata\", handler: () => measureRenderTime() }\n\t\t]\n\n\t\teventListeners.forEach(({ event, handler, passive }) => {\n\t\t\tconst options = passive ? { passive: true } : {}\n\t\t\tmedia.addEventListener(event, handler, options)\n\t\t})\n\n\t\t// Performance monitoring frame loop\n\t\tlet rafId: number\n\t\tconst performanceLoop = () => {\n\t\t\tmeasureRenderTime()\n\t\t\trafId = requestAnimationFrame(performanceLoop)\n\t\t}\n\n\t\tif (options.enablePerformanceMonitoring) {\n\t\t\tperformanceLoop()\n\t\t}\n\n\t\treturn () => {\n\t\t\teventListeners.forEach(({ event, handler }) => {\n\t\t\t\tmedia.removeEventListener(event, handler)\n\t\t\t})\n\t\t\tif (rafId) {\n\t\t\t\tcancelAnimationFrame(rafId)\n\t\t\t}\n\t\t}\n\t}, [\n\t\thandleTimeUpdate,\n\t\thandlePlay,\n\t\thandlePause,\n\t\thandleVolumeChange,\n\t\thandleSeeking,\n\t\thandleSeeked,\n\t\thandleProgress,\n\t\tmeasureRenderTime,\n\t\toptions.enablePerformanceMonitoring\n\t])\n\n\t// Optimized control functions with React 19 features\n\tconst controls = useMemo(() => {\n\t\tconst play = async () => {\n\t\t\tconst media = mediaRef.current\n\t\t\tif (!media) return\n\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tawait actions.play(true) // Optimistic\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tawait media.play()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\"Failed to play media:\", error)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst pause = () => {\n\t\t\tconst media = mediaRef.current\n\t\t\tif (!media) return\n\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tactions.pause(true) // Optimistic\n\t\t\t} else {\n\t\t\t\tmedia.pause()\n\t\t\t}\n\t\t}\n\n\t\tconst toggle = () => {\n\t\t\tif (isPlaying) {\n\t\t\t\tpause()\n\t\t\t} else {\n\t\t\t\tplay()\n\t\t\t}\n\t\t}\n\n\t\tconst seek = (time: number) => {\n\t\t\tconst media = mediaRef.current\n\t\t\tif (!media) return\n\n\t\t\tconst clampedTime = Math.max(0, Math.min(time, duration || 0))\n\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tstartSeekTransition(() => {\n\t\t\t\t\tactions.seek(clampedTime, true) // Optimistic\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tmedia.currentTime = clampedTime\n\t\t\t}\n\t\t}\n\n\t\tconst setVolume = (volume: number) => {\n\t\t\tconst media = mediaRef.current\n\t\t\tif (!media) return\n\n\t\t\tconst clampedVolume = Math.max(0, Math.min(1, volume))\n\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tsetOptimisticVolume(clampedVolume)\n\t\t\t\tstartTransition(() => {\n\t\t\t\t\tactions.setVolume(clampedVolume, true)\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tmedia.volume = clampedVolume\n\t\t\t}\n\t\t}\n\n\t\tconst toggleMute = () => {\n\t\t\tconst media = mediaRef.current\n\t\t\tif (!media) return\n\n\t\t\tif (isEnhanced && actions) {\n\t\t\t\tactions.toggleMute(true) // Optimistic\n\t\t\t} else {\n\t\t\t\tmedia.muted = !media.muted\n\t\t\t}\n\t\t}\n\n\t\tconst enterFullscreen = async () => {\n\t\t\tconst container = containerRef.current\n\t\t\tif (!container || !document.fullscreenEnabled) return\n\n\t\t\ttry {\n\t\t\t\tawait container.requestFullscreen()\n\t\t\t\tif (isEnhanced && actions) {\n\t\t\t\t\tactions.enterFullscreen(true)\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to enter fullscreen:\", error)\n\t\t\t}\n\t\t}\n\n\t\tconst exitFullscreen = async () => {\n\t\t\tif (!document.fullscreenElement) return\n\n\t\t\ttry {\n\t\t\t\tawait document.exitFullscreen()\n\t\t\t\tif (isEnhanced && actions) {\n\t\t\t\t\tactions.exitFullscreen(true)\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to exit fullscreen:\", error)\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tplay,\n\t\t\tpause,\n\t\t\ttoggle,\n\t\t\tseek,\n\t\t\tsetVolume,\n\t\t\ttoggleMute,\n\t\t\tenterFullscreen,\n\t\t\texitFullscreen\n\t\t}\n\t}, [\n\t\tisPlaying,\n\t\tduration,\n\t\tisEnhanced,\n\t\tactions,\n\t\tstartTransition,\n\t\tstartSeekTransition,\n\t\tsetOptimisticVolume\n\t])\n\n\t// Computed state\n\tconst computedState = useMemo(() => ({\n\t\tisPlaying: optimisticState?.isPlaying ?? isPlaying,\n\t\tcurrentTime: optimisticState?.currentTime ?? currentTime,\n\t\tduration: optimisticState?.duration ?? duration,\n\t\tvolume: optimisticState?.volume ?? optimisticVolume,\n\t\tisMuted: optimisticState?.isMuted ?? isMuted,\n\t\tisLoading: optimisticState?.isBuffering ?? isLoading,\n\t\tisBuffering: optimisticState?.isBuffering ?? isBuffering,\n\t\terror: optimisticState?.error ?? error,\n\t\tbuffered: optimisticState?.buffered ?? buffered,\n\t\tisFullscreen: optimisticState?.isFullscreen ?? isFullscreen,\n\t\tprogress: duration > 0 ? currentTime / duration : 0,\n\t\tisTransitioning: isPending || isSeeking,\n\t\tcanPlay: !isLoading && !isBuffering && !error\n\t}), [\n\t\toptimisticState,\n\t\tisPlaying,\n\t\tcurrentTime,\n\t\tduration,\n\t\toptimisticVolume,\n\t\tisMuted,\n\t\tisLoading,\n\t\tisBuffering,\n\t\terror,\n\t\tbuffered,\n\t\tisFullscreen,\n\t\tisPending,\n\t\tisSeeking\n\t])\n\n\treturn {\n\t\t// Refs\n\t\tmediaRef,\n\t\tcontainerRef,\n\n\t\t// State\n\t\tstate: computedState,\n\t\tactualState: optimisticState?.actualState,\n\n\t\t// Controls\n\t\tcontrols,\n\n\t\t// Performance metrics\n\t\tperformanceMetrics,\n\t\tisTransitioning: isPending || isSeeking,\n\n\t\t// Enhanced features\n\t\tactions: optimisticState?.actions,\n\t\tactionState: optimisticState?.actionState,\n\n\t\t// Optimistic features\n\t\toptimisticState,\n\t\tisEnhanced\n\t}\n}","\"use client\"\n\nimport React, { useEffect, useRef, useCallback, useMemo } from \"react\"\n\n// Memory optimization hook for media players\nexport function useMemoryOptimization(options: {\n\tmaxMemoryUsage?: number // in MB\n\tcleanupInterval?: number // in ms\n\tenableGC?: boolean\n\tmonitorMemory?: boolean\n} = {}) {\n\tconst {\n\t\tmaxMemoryUsage = 100, // 100MB default\n\t\tcleanupInterval = 30000, // 30 seconds default\n\t\tenableGC = true,\n\t\tmonitorMemory = true\n\t} = options\n\n\tconst cleanupTimeoutRef = useRef<NodeJS.Timeout>()\n\tconst observersRef = useRef<Set<MutationObserver>>(new Set())\n\tconst eventListenersRef = useRef<Map<Element, Array<{ event: string; handler: EventListener }>>>(new Map())\n\tconst intervalRefs = useRef<Set<NodeJS.Timeout>>(new Set())\n\tconst animationFrameRefs = useRef<Set<number>>(new Set())\n\n\t// Get current memory usage\n\tconst getMemoryUsage = useCallback(() => {\n\t\tif (typeof window === 'undefined' || !('memory' in performance)) {\n\t\t\treturn { used: 0, total: 0, limit: 0 }\n\t\t}\n\n\t\tconst memory = (performance as any).memory\n\t\treturn {\n\t\t\tused: memory.usedJSHeapSize,\n\t\t\ttotal: memory.totalJSHeapSize,\n\t\t\tlimit: memory.jsHeapSizeLimit\n\t\t}\n\t}, [])\n\n\t// Memory monitoring state\n\tconst [memoryStats, setMemoryStats] = React.useState({\n\t\tused: 0,\n\t\ttotal: 0,\n\t\tlimit: 0,\n\t\tusage: 0,\n\t\tisHighUsage: false\n\t})\n\n\t// Memory monitoring\n\tuseEffect(() => {\n\t\tif (!monitorMemory) return\n\n\t\tconst checkMemory = () => {\n\t\t\tconst memory = getMemoryUsage()\n\t\t\tconst usage = (memory.used / 1024 / 1024) // Convert to MB\n\t\t\tconst isHighUsage = usage > maxMemoryUsage\n\n\t\t\tsetMemoryStats({\n\t\t\t\t...memory,\n\t\t\t\tusage,\n\t\t\t\tisHighUsage\n\t\t\t})\n\n\t\t\t// Trigger cleanup if memory usage is high\n\t\t\tif (isHighUsage && enableGC) {\n\t\t\t\tperformCleanup()\n\t\t\t}\n\t\t}\n\n\t\tcheckMemory()\n\t\tconst interval = setInterval(checkMemory, cleanupInterval)\n\t\tintervalRefs.current.add(interval)\n\n\t\treturn () => {\n\t\t\tclearInterval(interval)\n\t\t\tintervalRefs.current.delete(interval)\n\t\t}\n\t}, [monitorMemory, getMemoryUsage, maxMemoryUsage, enableGC, cleanupInterval])\n\n\t// Cleanup function\n\tconst performCleanup = useCallback(() => {\n\t\t// Clear all timeouts\n\t\tintervalRefs.current.forEach(timeout => {\n\t\t\tclearTimeout(timeout)\n\t\t})\n\t\tintervalRefs.current.clear()\n\n\t\t// Cancel all animation frames\n\t\tanimationFrameRefs.current.forEach(frameId => {\n\t\t\tcancelAnimationFrame(frameId)\n\t\t})\n\t\tanimationFrameRefs.current.clear()\n\n\t\t// Disconnect all observers\n\t\tobserversRef.current.forEach(observer => {\n\t\t\tobserver.disconnect()\n\t\t})\n\t\tobserversRef.current.clear()\n\n\t\t// Remove all event listeners\n\t\teventListenersRef.current.forEach((listeners, element) => {\n\t\t\tlisteners.forEach(({ event, handler }) => {\n\t\t\t\telement.removeEventListener(event, handler)\n\t\t\t})\n\t\t})\n\t\teventListenersRef.current.clear()\n\n\t\t// Trigger garbage collection if available\n\t\tif (enableGC && 'gc' in window) {\n\t\t\t(window as any).gc()\n\t\t}\n\t}, [enableGC])\n\n\t// Safe event listener management\n\tconst addEventListener = useCallback((\n\t\telement: Element,\n\t\tevent: string,\n\t\thandler: EventListener,\n\t\toptions?: AddEventListenerOptions\n\t) => {\n\t\telement.addEventListener(event, handler, options)\n\n\t\tif (!eventListenersRef.current.has(element)) {\n\t\t\teventListenersRef.current.set(element, [])\n\t\t}\n\t\teventListenersRef.current.get(element)!.push({ event, handler })\n\n\t\t// Return cleanup function\n\t\treturn () => {\n\t\t\telement.removeEventListener(event, handler)\n\t\t\tconst listeners = eventListenersRef.current.get(element)\n\t\t\tif (listeners) {\n\t\t\t\tconst index = listeners.findIndex(l => l.event === event && l.handler === handler)\n\t\t\t\tif (index > -1) {\n\t\t\t\t\tlisteners.splice(index, 1)\n\t\t\t\t}\n\t\t\t\tif (listeners.length === 0) {\n\t\t\t\t\teventListenersRef.current.delete(element)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [])\n\n\t// Safe interval management\n\tconst setInterval = useCallback((callback: () => void, delay: number) => {\n\t\tconst timeoutId = setInterval(callback, delay)\n\t\tintervalRefs.current.add(timeoutId)\n\n\t\treturn () => {\n\t\t\tclearInterval(timeoutId)\n\t\t\tintervalRefs.current.delete(timeoutId)\n\t\t}\n\t}, [])\n\n\t// Safe timeout management\n\tconst setTimeout = useCallback((callback: () => void, delay: number) => {\n\t\tconst timeoutId = setTimeout(callback, delay)\n\t\tintervalRefs.current.add(timeoutId)\n\n\t\treturn () => {\n\t\t\tclearTimeout(timeoutId)\n\t\t\tintervalRefs.current.delete(timeoutId)\n\t\t}\n\t}, [])\n\n\t// Safe animation frame management\n\tconst requestAnimationFrame = useCallback((callback: FrameRequestCallback) => {\n\t\tconst frameId = requestAnimationFrame(callback)\n\t\tanimationFrameRefs.current.add(frameId)\n\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(frameId)\n\t\t\tanimationFrameRefs.current.delete(frameId)\n\t\t}\n\t}, [])\n\n\t// Safe observer management\n\tconst addObserver = useCallback((observer: MutationObserver) => {\n\t\tobserversRef.current.add(observer)\n\n\t\treturn () => {\n\t\t\tobserver.disconnect()\n\t\t\tobserversRef.current.delete(observer)\n\t\t}\n\t}, [])\n\n\t// Cleanup on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tperformCleanup()\n\t\t}\n\t}, [performCleanup])\n\n\treturn {\n\t\t// Memory stats\n\t\tmemoryStats,\n\t\tgetMemoryUsage,\n\n\t\t// Cleanup functions\n\t\tperformCleanup,\n\n\t\t// Safe API functions\n\t\taddEventListener,\n\t\tsetInterval,\n\t\tsetTimeout,\n\t\trequestAnimationFrame,\n\t\taddObserver,\n\n\t\t// Utilities\n\t\tformatBytes: (bytes: number) => {\n\t\t\tif (bytes === 0) return '0 Bytes'\n\t\t\tconst k = 1024\n\t\t\tconst sizes = ['Bytes', 'KB', 'MB', 'GB']\n\t\t\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\n\t\t\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n\t\t}\n\t}\n}\n\n// Resource cleanup hook for media elements\nexport function useMediaResourceCleanup(mediaRef: React.RefObject<HTMLVideoElement | HTMLAudioElement>) {\n\tconst { addEventListener, performCleanup } = useMemoryOptimization()\n\n\t// Track resource cleanup\n\tconst cleanupResources = useCallback(() => {\n\t\tconst media = mediaRef.current\n\t\tif (!media) return\n\n\t\t// Stop media playback\n\t\tif (!media.paused) {\n\t\t_media.pause()\n\t\t}\n\n\t\t// Clear source\n\t\tif (media.src) {\n\t\t\tmedia.src = ''\n\t\t\tmedia.load()\n\t\t}\n\n\t\t// Remove source elements\n\t\twhile (media.firstChild) {\n\t\t\tmedia.removeChild(media.firstChild)\n\t\t}\n\n\t\t// Clear any pending seeks\n\t\tmedia.currentTime = 0\n\n\t\t// Clear buffered data\n\t\tif ('clearBuffered' in media) {\n\t\t\t(media as any).clearBuffered()\n\t\t}\n\t}, [mediaRef])\n\n\t// Enhanced event listener registration\n\tconst registerMediaEventListener = useCallback((\n\t\tevent: string,\n\t\thandler: EventListener,\n\t\toptions?: AddEventListenerOptions\n\t) => {\n\t\tconst media = mediaRef.current\n\t\tif (!media) return () => {}\n\n\t\treturn addEventListener(media, event, handler, options)\n\t}, [mediaRef, addEventListener])\n\n\t// Cleanup on unmount\n\tuseEffect(() => {\n\t\treturn cleanupResources\n\t}, [cleanupResources])\n\n\treturn {\n\t\tcleanupResources,\n\t\tregisterMediaEventListener\n\t}\n}\n\n// Performance monitoring hook\nexport function usePerformanceMonitoring() {\n\tconst [metrics, setMetrics] = React.useState({\n\t\tfps: 0,\n\t\tframeDrops: 0,\n\t\tlongTasks: 0,\n\t\ttotalLongTaskDuration: 0\n\t})\n\n\tconst frameCountRef = useRef(0)\n\tconst lastFrameTimeRef = useRef(performance.now())\n\tconst longTaskObserverRef = useRef<PerformanceObserver>()\n\n\t// FPS monitoring\n\tuseEffect(() => {\n\t\tlet rafId: number\n\n\t\tconst measureFrame = () => {\n\t\t\tframeCountRef.current++\n\t\t\tconst now = performance.now()\n\n\t\t\t// Calculate FPS every second\n\t\t\tif (now - lastFrameTimeRef.current >= 1000) {\n\t\t\t\tconst fps = Math.round((frameCountRef.current * 1000) / (now - lastFrameTimeRef.current))\n\t\t\t\tconst expectedFrames = Math.round((now - lastFrameTimeRef.current) / 16.67) // 60fps\n\t\t\t\tconst frameDrops = Math.max(0, expectedFrames - frameCountRef.current)\n\n\t\t\t\tsetMetrics(prev => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tfps,\n\t\t\t\t\tframeDrops: prev.frameDrops + frameDrops\n\t\t\t\t}))\n\n\t\t\t\tframeCountRef.current = 0\n\t\t\t\tlastFrameTimeRef.current = now\n\t\t\t}\n\n\t\t\trafId = requestAnimationFrame(measureFrame)\n\t\t}\n\n\t\trafId = requestAnimationFrame(measureFrame)\n\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(rafId)\n\t\t}\n\t}, [])\n\n\t// Long task monitoring\n\tuseEffect(() => {\n\t\tif (!('PerformanceObserver' in window)) return\n\n\t\ttry {\n\t\t\tconst observer = new PerformanceObserver((list) => {\n\t\t\t\tfor (const entry of list.getEntries()) {\n\t\t\t\t\tif (entry.duration > 50) { // Long task threshold\n\t\t\t\t\t\tsetMetrics(prev => ({\n\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\tlongTasks: prev.longTasks + 1,\n\t\t\t\t\t\t\ttotalLongTaskDuration: prev.totalLongTaskDuration + entry.duration\n\t\t\t\t\t\t}))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tobserver.observe({ entryTypes: ['longtask'] })\n\t\t\tlongTaskObserverRef.current = observer\n\n\t\t\treturn () => {\n\t\t\t\tobserver.disconnect()\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('Long task monitoring not supported:', error)\n\t\t}\n\t}, [])\n\n\treturn {\n\t\t...metrics,\n\t\taverageLongTaskDuration: metrics.longTasks > 0\n\t\t\t? metrics.totalLongTaskDuration / metrics.longTasks\n\t\t\t: 0,\n\t\tisPerformanceGood: metrics.fps >= 50 && metrics.frameDrops < 5\n\t}\n}","\"use client\"\n\nimport { useCallback, useState, useActionState, useOptimistic } from \"react\"\nimport type { MediaPlayerState } from \"../types/index\"\nimport { useMediaStore, useMediaSelector } from \"../context/media-context\"\nimport { useMediaOptimistic } from \"./use-media-optimistic\"\nimport { useMediaActions } from \"./use-media-actions\"\nimport type { EnhancedMediaStore } from \"../context/media-store\"\n\n// Legacy hook for backward compatibility\nexport function useMediaState() {\n\tconst [state, setState] = useState<MediaPlayerState>({\n\t\tisPlaying: false,\n\t\tcurrentTime: 0,\n\t\tduration: 0,\n\t\tvolume: 1,\n\t\tisMuted: false,\n\t\tisLoading: false,\n\t\tisFullscreen: false,\n\t\terror: null,\n\t\tbuffered: null\n\t})\n\n\tconst updateState = (updates: Partial<MediaPlayerState>) => {\n \t\tsetState((prev: MediaPlayerState) => ({ ...prev, ...updates }))\n \t}\n\n\tconst setPlaying = (isPlaying: boolean) => {\n \t\t\tupdateState({ isPlaying })\n \t\t}\n\n\tconst setCurrentTime = (currentTime: number) => {\n \t\t\tupdateState({ currentTime })\n \t\t}\n\n\tconst setDuration = (duration: number) => {\n \t\t\tupdateState({ duration })\n \t\t}\n\n\tconst setVolume = (volume: number) => {\n \t\t\tupdateState({ volume: Math.max(0, Math.min(1, volume)) })\n \t\t}\n\n\tconst setMuted = (isMuted: boolean) => {\n \t\t\tupdateState({ isMuted })\n \t\t}\n\n\tconst setLoading = (isLoading: boolean) => {\n \t\t\tupdateState({ isLoading })\n \t\t}\n\n\tconst setFullscreen = (isFullscreen: boolean) => {\n \t\t\tupdateState({ isFullscreen })\n \t\t}\n\n\tconst setError = (error: string | null) => {\n \t\t\tupdateState({ error })\n \t\t}\n\n\tconst setBuffered = (buffered: TimeRanges | null) => {\n \t\t\tupdateState({ buffered })\n \t\t}\n\n\treturn {\n\t\tstate,\n\t\tupdateState,\n\t\tsetPlaying,\n\t\tsetCurrentTime,\n\t\tsetDuration,\n\t\tsetVolume,\n\t\tsetMuted,\n\t\tsetLoading,\n\t\tsetFullscreen,\n\t\tsetError,\n\t\tsetBuffered\n\t}\n}\n\n// React 19 enhanced media state hook\nexport function useEnhancedMediaState() {\n\tconst store = useMediaStore()\n\t\n\t// Check if this is an enhanced store\n\tconst isEnhanced = 'getOptimisticState' in store\n\t\n\tif (!isEnhanced) {\n\t\t// Fall back to regular media state if not enhanced\n\t\treturn useMediaState() as any\n\t}\n\t\n\t// Cast to enhanced store type\n\tconst enhancedStore = store as unknown as EnhancedMediaStore\n\t\n\t// Use React 19 optimistic updates\n\tconst optimisticState = useMediaOptimistic(enhancedStore)\n\t\n\t// Get action handlers with React 19 features\n\tconst actions = useMediaActions(enhancedStore)\n\t\n\treturn {\n\t\t// State (optimistic values for immediate UI feedback)\n\t\tstate: optimisticState.state,\n\t\tactualState: optimisticState.actualState,\n\t\t\n\t\t// Individual state selectors\n\t\tisPlaying: optimisticState.isPlaying,\n\t\tcurrentTime: optimisticState.currentTime,\n\t\tduration: optimisticState.state.duration,\n\t\tvolume: optimisticState.volume,\n\t\tisMuted: optimisticState.isMuted,\n\t\tisLoading: optimisticState.isBuffering,\n\t\tisFullscreen: optimisticState.isFullscreen,\n\t\terror: optimisticState.state.error,\n\t\tbuffered: optimisticState.state.buffered,\n\t\t\n\t\t// Computed values\n\t\tprogress: optimisticState.progress,\n\t\tformattedTime: optimisticState.formattedTime,\n\t\tformattedDuration: optimisticState.formattedDuration,\n\t\t\n\t\t// Actions with optimistic updates\n\t\tactions,\n\t\t\n\t\t// Action state for loading/error handling\n\t\tisActionLoading: actions.isLoading,\n\t\tactionError: actions.errorMessage,\n\t\tretryLastAction: actions.retryLastAction,\n\t\t\n\t\t// Legacy compatibility methods\n\t\tupdateState: (updates: Partial<MediaPlayerState>) => {\n\t\t\t// Map legacy updates to new actions\n\t\t\tif ('isPlaying' in updates) {\n\t\t\t\tupdates.isPlaying ? actions.play() : actions.pause()\n\t\t\t}\n\t\t\tif ('currentTime' in updates) {\n\t\t\t\tactions.setCurrentTime(updates.currentTime!)\n\t\t\t}\n\t\t\tif ('duration' in updates) {\n\t\t\t\tactions.setDuration(updates.duration!)\n\t\t\t}\n\t\t\tif ('volume' in updates) {\n\t\t\t\tactions.setVolume(updates.volume!)\n\t\t\t}\n\t\t\tif ('isMuted' in updates) {\n\t\t\t\tupdates.isMuted ? actions.mute() : actions.unmute()\n\t\t\t}\n\t\t\tif ('isLoading' in updates) {\n\t\t\t\tactions.setLoading(updates.isLoading!)\n\t\t\t}\n\t\t\tif ('isFullscreen' in updates) {\n\t\t\t\tupdates.isFullscreen ? actions.enterFullscreen() : actions.exitFullscreen()\n\t\t\t}\n\t\t\tif ('error' in updates) {\n\t\t\t\tactions.setError(updates.error ?? null)\n\t\t\t}\n\t\t\tif ('buffered' in updates) {\n\t\t\t\tactions.setBuffered(updates.buffered ?? null)\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Individual action methods for legacy compatibility\n\t\tsetPlaying: (isPlaying: boolean) => {\n\t\t\tisPlaying ? actions.play(true) : actions.pause(true) // Use optimistic updates\n\t\t},\n\t\tsetCurrentTime: (time: number) => actions.setCurrentTime(time),\n\t\tsetDuration: (duration: number) => actions.setDuration(duration),\n\t\tsetVolume: (volume: number) => actions.setVolume(volume, true),\n\t\tsetMuted: (muted: boolean) => {\n\t\t\tmuted ? actions.mute(true) : actions.unmute(true)\n\t\t},\n\t\tsetLoading: (loading: boolean) => actions.setLoading(loading),\n\t\tsetFullscreen: (fullscreen: boolean) => {\n\t\t\tfullscreen ? actions.enterFullscreen(true) : actions.exitFullscreen(true)\n\t\t},\n\t\tsetError: (error: string | null) => actions.setError(error),\n\t\tsetBuffered: (buffered: TimeRanges | null) => actions.setBuffered(buffered)\n\t}\n}\n\n// Hook that automatically chooses between legacy and enhanced based on context availability\nexport function useAdaptiveMediaState() {\n\ttry {\n\t\t// Try to use the enhanced version if MediaStore context is available\n\t\treturn useEnhancedMediaState()\n\t} catch (error) {\n\t\t// Fall back to legacy version if not in MediaProvider context\n\t\tconsole.warn('MediaStore context not available, using legacy state management')\n\t\treturn useMediaState()\n\t}\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useRef } from \"react\"\nimport type { MediaPlayerControls } from \"../types/index\"\nimport { useMediaState } from \"./use-media-state\"\n\ninterface UseMediaPlayerOptions {\n\tsrc: string | string[]\n\tautoPlay?: boolean\n\tloop?: boolean\n\tmuted?: boolean\n\tvolume?: number\n\tpreload?: \"none\" | \"metadata\" | \"auto\"\n\tcrossOrigin?: \"anonymous\" | \"use-credentials\"\n\tplaybackRates?: number[]\n\tkeyboardControls?: boolean\n\tshowControls?: boolean\n\tcustomControls?: boolean\n\tonPlay?: () => void\n\tonPause?: () => void\n\tonTimeUpdate?: (currentTime: number) => void\n\tonDurationChange?: (duration: number) => void\n\tonVolumeChange?: (volume: number) => void\n\tonError?: (error: string) => void\n\tonLoadStart?: () => void\n\tonLoadedData?: () => void\n\tonEnded?: () => void\n}\n\nexport function useMediaPlayer(options: UseMediaPlayerOptions) {\n\tconst mediaRef = useRef<HTMLVideoElement | HTMLAudioElement>(null)\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\n\tconst {\n\t\tstate,\n\t\tsetPlaying,\n\t\tsetCurrentTime,\n\t\tsetDuration,\n\t\tsetVolume,\n\t\tsetMuted,\n\t\tsetLoading,\n\t\tsetFullscreen,\n\t\tsetError,\n\t\tsetBuffered\n\t} = useMediaState()\n\n\t// Initialize media element with options\n\tuseEffect(() => {\n\t\tconst media = mediaRef.current\n\t\tif (!media) return\n\n\t\t// Set initial properties\n\t\tif (options.volume !== undefined) {\n\t\t\tmedia.volume = options.volume\n\t\t\tsetVolume(options.volume)\n\t\t}\n\t\tif (options.muted !== undefined) {\n\t\t\tmedia.muted = options.muted\n\t\t\tsetMuted(options.muted)\n\t\t}\n\t\tif (options.autoPlay !== undefined) {\n\t\t\tmedia.autoplay = options.autoPlay\n\t\t}\n\t\tif (options.loop !== undefined) {\n\t\t\tmedia.loop = options.loop\n\t\t}\n\t\tif (options.preload !== undefined) {\n\t\t\tmedia.preload = options.preload\n\t\t}\n\t\tif (options.crossOrigin !== undefined) {\n\t\t\tmedia.crossOrigin = options.crossOrigin\n\t\t}\n\t}, [options, setVolume, setMuted])\n\n\t// Event handlers\n\tconst handlePlay = () => {\n \t\tsetPlaying(true)\n \t\toptions.onPlay?.()\n \t}\n\n\tconst handlePause = () => {\n \t\tsetPlaying(false)\n \t\toptions.onPause?.()\n \t}\n\n\tconst handleTimeUpdate = () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tsetCurrentTime(media.currentTime)\n \t\toptions.onTimeUpdate?.(media.currentTime)\n \t}\n\n\tconst handleDurationChange = () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tsetDuration(media.duration)\n \t\toptions.onDurationChange?.(media.duration)\n \t}\n\n\tconst handleVolumeChange = () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tsetVolume(media.volume)\n \t\tsetMuted(media.muted)\n \t\toptions.onVolumeChange?.(media.volume)\n \t}\n\n\tconst handleLoadStart = () => {\n \t\tsetLoading(true)\n \t\tsetError(null)\n \t\toptions.onLoadStart?.()\n \t}\n\n\tconst handleLoadedData = () => {\n \t\tsetLoading(false)\n \t\toptions.onLoadedData?.()\n \t}\n\n\tconst handleError = () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tconst errorMessage = media.error?.message || \"An error occurred while loading the media\"\n \t\tsetError(errorMessage)\n \t\tsetLoading(false)\n \t\toptions.onError?.(errorMessage)\n \t}\n\n\tconst handleEnded = () => {\n \t\tsetPlaying(false)\n \t\toptions.onEnded?.()\n \t}\n\n\tconst handleProgress = () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tsetBuffered(media.buffered)\n \t}\n\n\t// Attach event listeners\n\tuseEffect(() => {\n\t\tconst media = mediaRef.current\n\t\tif (!media) return\n\n\t\tmedia.addEventListener(\"play\", handlePlay)\n\t\tmedia.addEventListener(\"pause\", handlePause)\n\t\tmedia.addEventListener(\"timeupdate\", handleTimeUpdate)\n\t\tmedia.addEventListener(\"durationchange\", handleDurationChange)\n\t\tmedia.addEventListener(\"volumechange\", handleVolumeChange)\n\t\tmedia.addEventListener(\"loadstart\", handleLoadStart)\n\t\tmedia.addEventListener(\"loadeddata\", handleLoadedData)\n\t\tmedia.addEventListener(\"error\", handleError)\n\t\tmedia.addEventListener(\"ended\", handleEnded)\n\t\tmedia.addEventListener(\"progress\", handleProgress)\n\n\t\treturn () => {\n\t\t\tmedia.removeEventListener(\"play\", handlePlay)\n\t\t\tmedia.removeEventListener(\"pause\", handlePause)\n\t\t\tmedia.removeEventListener(\"timeupdate\", handleTimeUpdate)\n\t\t\tmedia.removeEventListener(\"durationchange\", handleDurationChange)\n\t\t\tmedia.removeEventListener(\"volumechange\", handleVolumeChange)\n\t\t\tmedia.removeEventListener(\"loadstart\", handleLoadStart)\n\t\t\tmedia.removeEventListener(\"loadeddata\", handleLoadedData)\n\t\t\tmedia.removeEventListener(\"error\", handleError)\n\t\t\tmedia.removeEventListener(\"ended\", handleEnded)\n\t\t\tmedia.removeEventListener(\"progress\", handleProgress)\n\t\t}\n\t}, [\n\t\thandlePlay,\n\t\thandlePause,\n\t\thandleTimeUpdate,\n\t\thandleDurationChange,\n\t\thandleVolumeChange,\n\t\thandleLoadStart,\n\t\thandleLoadedData,\n\t\thandleError,\n\t\thandleEnded,\n\t\thandleProgress\n\t])\n\n\t// Control functions\n\tconst play = async () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\ttry {\n \t\t\tawait media.play()\n \t\t} catch (error) {\n \t\t\tconsole.error(\"Failed to play media:\", error)\n \t\t\tsetError(\"Failed to play media\")\n \t\t}\n \t}\n\n\tconst pause = () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tmedia.pause()\n \t}\n\n\tconst toggle = () => {\n \t\tif (state.isPlaying) {\n \t\t\tpause()\n \t\t} else {\n \t\t\tplay()\n \t\t}\n \t}\n\n\tconst seek = (time: number) => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tmedia.currentTime = Math.max(0, Math.min(time, media.duration || 0))\n \t}\n\n\tconst setVolumeControl = (volume: number) => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tconst clampedVolume = Math.max(0, Math.min(1, volume))\n \t\tmedia.volume = clampedVolume\n \t}\n\n\tconst mute = () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tmedia.muted = true\n \t}\n\n\tconst unmute = () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tmedia.muted = false\n \t}\n\n\tconst toggleMute = () => {\n \t\tconst media = mediaRef.current\n \t\tif (!media) return\n\n \t\tmedia.muted = !media.muted\n \t}\n\n\tconst enterFullscreen = async () => {\n \t\tconst container = containerRef.current\n \t\tif (!container || !document.fullscreenEnabled) return\n\n \t\ttry {\n \t\t\tawait container.requestFullscreen()\n \t\t\tsetFullscreen(true)\n \t\t} catch (error) {\n \t\t\tconsole.error(\"Failed to enter fullscreen:\", error)\n \t\t}\n \t}\n\n\tconst exitFullscreen = async () => {\n \t\tif (!document.fullscreenElement) return\n\n \t\ttry {\n \t\t\tawait document.exitFullscreen()\n \t\t\tsetFullscreen(false)\n \t\t} catch (error) {\n \t\t\tconsole.error(\"Failed to exit fullscreen:\", error)\n \t\t}\n \t}\n\n\tconst toggleFullscreen = () => {\n \t\tif (document.fullscreenElement) {\n \t\t\texitFullscreen()\n \t\t} else {\n \t\t\tenterFullscreen()\n \t\t}\n \t}\n\n\t// Listen for fullscreen changes\n\tuseEffect(() => {\n\t\tconst handleFullscreenChange = () => {\n\t\t\tsetFullscreen(!!document.fullscreenElement)\n\t\t}\n\n\t\tdocument.addEventListener(\"fullscreenchange\", handleFullscreenChange)\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"fullscreenchange\", handleFullscreenChange)\n\t\t}\n\t}, [setFullscreen])\n\n\tconst controls: MediaPlayerControls = {\n\t\tplay,\n\t\tpause,\n\t\ttoggle,\n\t\tseek,\n\t\tsetVolume: setVolumeControl,\n\t\tmute,\n\t\tunmute,\n\t\ttoggleMute,\n\t\tenterFullscreen,\n\t\texitFullscreen,\n\t\ttoggleFullscreen\n\t}\n\n\treturn {\n\t\tstate,\n\t\tcontrols,\n\t\tmediaRef,\n\t\tcontainerRef\n\t}\n}\n","import * as React from \"react\"\n\n// Mobile breakpoints following mobile-first approach\nconst BREAKPOINTS = {\n mobile: 768,\n tablet: 1024,\n desktop: 1280\n} as const\n\n// Device detection utilities\nfunction detectPlatform(): 'ios' | 'android' | 'desktop' | 'unknown' {\n if (typeof window === 'undefined') return 'unknown'\n \n const userAgent = window.navigator.userAgent.toLowerCase()\n \n if (/iphone|ipad|ipod/.test(userAgent)) return 'ios'\n if (/android/.test(userAgent)) return 'android'\n if (/windows|mac|linux/.test(userAgent)) return 'desktop'\n \n return 'unknown'\n}\n\nfunction isTouchDevice(): boolean {\n if (typeof window === 'undefined') return false\n \n return (\n 'ontouchstart' in window ||\n navigator.maxTouchPoints > 0 ||\n // @ts-ignore - for older browsers\n navigator.msMaxTouchPoints > 0\n )\n}\n\nfunction supportsHaptics(): boolean {\n if (typeof window === 'undefined') return false\n \n // Check for haptic feedback support\n return (\n 'vibrate' in navigator ||\n // @ts-ignore - for newer Vibration API\n 'vibration' in navigator ||\n // @ts-ignore - for iOS haptic feedback\n 'ondevicemotion' in window\n )\n}\n\n// Enhanced device information interface\nexport interface DeviceInfo {\n isMobile: boolean\n isTablet: boolean\n isDesktop: boolean\n isTouchDevice: boolean\n platform: 'ios' | 'android' | 'desktop' | 'unknown'\n supportsHaptics: boolean\n screenSize: {\n width: number\n height: number\n }\n orientation: 'portrait' | 'landscape'\n}\n\n// Legacy hook for backward compatibility\nexport function useIsMobile(): boolean {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${BREAKPOINTS.mobile - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < BREAKPOINTS.mobile)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < BREAKPOINTS.mobile)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n\n// Enhanced mobile detection hook with comprehensive device information\nexport function useDeviceInfo(): DeviceInfo {\n const [deviceInfo, setDeviceInfo] = React.useState<DeviceInfo>(() => {\n if (typeof window === 'undefined') {\n return {\n isMobile: false,\n isTablet: false,\n isDesktop: true,\n isTouchDevice: false,\n platform: 'unknown',\n supportsHaptics: false,\n screenSize: { width: 1920, height: 1080 },\n orientation: 'landscape'\n }\n }\n \n const width = window.innerWidth\n const height = window.innerHeight\n \n return {\n isMobile: width < BREAKPOINTS.mobile,\n isTablet: width >= BREAKPOINTS.mobile && width < BREAKPOINTS.desktop,\n isDesktop: width >= BREAKPOINTS.desktop,\n isTouchDevice: isTouchDevice(),\n platform: detectPlatform(),\n supportsHaptics: supportsHaptics(),\n screenSize: { width, height },\n orientation: width > height ? 'landscape' : 'portrait'\n }\n })\n\n React.useEffect(() => {\n const updateDeviceInfo = () => {\n const width = window.innerWidth\n const height = window.innerHeight\n \n setDeviceInfo({\n isMobile: width < BREAKPOINTS.mobile,\n isTablet: width >= BREAKPOINTS.mobile && width < BREAKPOINTS.desktop,\n isDesktop: width >= BREAKPOINTS.desktop,\n isTouchDevice: isTouchDevice(),\n platform: detectPlatform(),\n supportsHaptics: supportsHaptics(),\n screenSize: { width, height },\n orientation: width > height ? 'landscape' : 'portrait'\n })\n }\n\n // Listen for resize events\n window.addEventListener('resize', updateDeviceInfo)\n \n // Listen for orientation changes\n window.addEventListener('orientationchange', updateDeviceInfo)\n \n // Listen for media query changes for better performance\n const mobileQuery = window.matchMedia(`(max-width: ${BREAKPOINTS.mobile - 1}px)`)\n const tabletQuery = window.matchMedia(`(min-width: ${BREAKPOINTS.mobile}px) and (max-width: ${BREAKPOINTS.desktop - 1}px)`)\n const desktopQuery = window.matchMedia(`(min-width: ${BREAKPOINTS.desktop}px)`)\n \n mobileQuery.addEventListener('change', updateDeviceInfo)\n tabletQuery.addEventListener('change', updateDeviceInfo)\n desktopQuery.addEventListener('change', updateDeviceInfo)\n \n return () => {\n window.removeEventListener('resize', updateDeviceInfo)\n window.removeEventListener('orientationchange', updateDeviceInfo)\n mobileQuery.removeEventListener('change', updateDeviceInfo)\n tabletQuery.removeEventListener('change', updateDeviceInfo)\n desktopQuery.removeEventListener('change', updateDeviceInfo)\n }\n }, [])\n\n return deviceInfo\n}\n\n// Hook for container queries support (Tailwind CSS v4)\nexport function useContainerQuery(containerRef: React.RefObject<HTMLElement>, query: string) {\n const [matches, setMatches] = React.useState(false)\n\n React.useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const size = entry.contentBoxSize[0]\n const width = size?.inlineSize || 0\n const height = size?.blockSize || 0\n \n // Simple container query evaluation\n // This is a basic implementation - in production you might want to use a library\n const queryMatch = evaluateContainerQuery(query, { width, height })\n setMatches(queryMatch)\n }\n })\n\n observer.observe(container)\n\n return () => {\n observer.disconnect()\n }\n }, [query])\n\n return matches\n}\n\n// Simple container query evaluator\nfunction evaluateContainerQuery(query: string, dimensions: { width: number; height: number }): boolean {\n // Basic implementation - supports (min-width: Xpx) and (max-width: Xpx)\n const minWidthMatch = query.match(/\\(min-width:\\s*(\\d+)px\\)/)\n const maxWidthMatch = query.match(/\\(max-width:\\s*(\\d+)px\\)/)\n \n if (minWidthMatch && minWidthMatch[1]) {\n const minWidth = parseInt(minWidthMatch[1], 10)\n return dimensions.width >= minWidth\n }\n \n if (maxWidthMatch && maxWidthMatch[1]) {\n const maxWidth = parseInt(maxWidthMatch[1], 10)\n return dimensions.width <= maxWidth\n }\n \n return false\n}\n\n// Performance optimization hook for mobile devices\nexport function useMobileOptimizations() {\n const { platform, isMobile } = useDeviceInfo()\n \n React.useEffect(() => {\n if (!isMobile) return\n \n // iOS-specific optimizations\n if (platform === 'ios') {\n // Prevent zoom on double tap for iOS Safari\n const preventZoom = (e: TouchEvent) => {\n if (e.touches.length > 1) {\n e.preventDefault()\n }\n }\n \n document.addEventListener('touchstart', preventZoom, { passive: false })\n \n // Enable momentum scrolling\n ;(document.body.style as any).webkitOverflowScrolling = 'touch'\n \n return () => {\n document.removeEventListener('touchstart', preventZoom)\n }\n }\n \n // Android-specific optimizations\n if (platform === 'android') {\n // Improve touch responsiveness\n document.body.style.touchAction = 'manipulation'\n }\n \n // General mobile optimizations\n // Improve rendering performance\n document.documentElement.style.setProperty('--webkit-transform', 'translateZ(0)')\n document.documentElement.style.setProperty('--transform', 'translateZ(0)')\n \n }, [platform, isMobile])\n}\n\n// Haptic feedback utility\nexport function useHapticFeedback() {\n const { supportsHaptics } = useDeviceInfo()\n \n const triggerHaptic = React.useCallback((type: 'light' | 'medium' | 'heavy' | 'success' | 'warning' | 'error' = 'light') => {\n if (!supportsHaptics) return\n \n // Map haptic types to vibration patterns\n const patterns = {\n light: [10],\n medium: [20],\n heavy: [30],\n success: [10, 10, 10],\n warning: [20, 20],\n error: [50, 20, 50]\n }\n \n const pattern = patterns[type]\n \n if ('vibrate' in navigator) {\n navigator.vibrate(pattern)\n }\n }, [supportsHaptics])\n \n return { triggerHaptic, supportsHaptics }\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { useDeviceInfo, useHapticFeedback } from \"@rp/ui/hooks/use-mobile\"\n\n// Gesture types\nexport type GestureType = \n | 'tap' \n | 'double-tap' \n | 'long-press' \n | 'swipe-left' \n | 'swipe-right' \n | 'swipe-up' \n | 'swipe-down' \n | 'pinch-in' \n | 'pinch-out'\n\n// Gesture event data\nexport interface GestureEvent {\n type: GestureType\n startPoint: { x: number; y: number }\n currentPoint: { x: number; y: number }\n velocity?: { x: number; y: number }\n scale?: number\n rotation?: number\n distance?: number\n duration: number\n preventDefault: () => void\n target: HTMLElement\n}\n\n// Gesture configuration\nexport interface GestureConfig {\n enabledGestures?: GestureType[]\n tapThreshold?: number // ms\n doubleTapThreshold?: number // ms\n longPressThreshold?: number // ms\n swipeThreshold?: number // px\n swipeVelocityThreshold?: number // px/ms\n pinchThreshold?: number // scale difference\n rotationThreshold?: number // degrees\n enableHapticFeedback?: boolean\n}\n\n// Default configuration\nconst defaultConfig: Required<GestureConfig> = {\n enabledGestures: ['tap', 'double-tap', 'long-press', 'swipe-left', 'swipe-right', 'swipe-up', 'swipe-down', 'pinch-in', 'pinch-out'],\n tapThreshold: 200,\n doubleTapThreshold: 300,\n longPressThreshold: 500,\n swipeThreshold: 50,\n swipeVelocityThreshold: 0.5,\n pinchThreshold: 0.1,\n rotationThreshold: 15,\n enableHapticFeedback: true\n}\n\n// Touch point interface\ninterface TouchPoint {\n id: number\n x: number\n y: number\n timestamp: number\n}\n\n// Gesture state\ninterface GestureState {\n isTracking: boolean\n touches: TouchPoint[]\n startTouches: TouchPoint[]\n lastTap?: { timestamp: number; point: { x: number; y: number } }\n longPressTimer?: NodeJS.Timeout\n initialDistance?: number\n initialScale?: number\n lastScale?: number\n}\n\n// Touch gesture hook\nexport function useTouchGestures(\n ref: React.RefObject<HTMLElement>,\n onGesture: (event: GestureEvent) => void,\n config: GestureConfig = {}\n) {\n const mergedConfig = { ...defaultConfig, ...config }\n const { isTouchDevice } = useDeviceInfo()\n const { triggerHaptic } = useHapticFeedback()\n const gestureState = React.useRef<GestureState>({\n isTracking: false,\n touches: [],\n startTouches: []\n })\n\n // Helper functions\n const getTouchPoint = (touch: Touch): TouchPoint => ({\n id: touch.identifier,\n x: touch.clientX,\n y: touch.clientY,\n timestamp: Date.now()\n })\n\n const getDistance = (p1: TouchPoint, p2: TouchPoint): number => \n Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2))\n\n const getVelocity = (start: TouchPoint, end: TouchPoint): { x: number; y: number } => {\n const timeDiff = Math.max(end.timestamp - start.timestamp, 1)\n return {\n x: (end.x - start.x) / timeDiff,\n y: (end.y - start.y) / timeDiff\n }\n }\n\n const createGestureEvent = (\n type: GestureType,\n startPoint: TouchPoint,\n currentPoint: TouchPoint,\n additionalData: Partial<GestureEvent> = {}\n ): GestureEvent => ({\n type,\n startPoint: { x: startPoint.x, y: startPoint.y },\n currentPoint: { x: currentPoint.x, y: currentPoint.y },\n duration: currentPoint.timestamp - startPoint.timestamp,\n target: ref.current!,\n preventDefault: () => {},\n ...additionalData\n })\n\n // Handle touch start\n const handleTouchStart = React.useCallback((e: TouchEvent) => {\n if (!mergedConfig.enabledGestures.length) return\n\n const touches = Array.from(e.touches).map(getTouchPoint)\n const state = gestureState.current\n\n state.isTracking = true\n state.touches = touches\n state.startTouches = [...touches]\n\n // Clear any existing long press timer\n if (state.longPressTimer) {\n clearTimeout(state.longPressTimer)\n }\n\n // Set up long press detection for single touch\n if (touches.length === 1 && mergedConfig.enabledGestures.includes('long-press')) {\n state.longPressTimer = setTimeout(() => {\n if (state.touches.length === 1 && touches[0]) {\n const gestureEvent = createGestureEvent('long-press', touches[0], touches[0])\n onGesture(gestureEvent)\n \n if (mergedConfig.enableHapticFeedback) {\n triggerHaptic('heavy')\n }\n }\n }, mergedConfig.longPressThreshold)\n }\n\n // Handle multi-touch gestures\n if (touches.length === 2 && touches[0] && touches[1]) {\n state.initialDistance = getDistance(touches[0], touches[1])\n state.initialScale = 1\n state.lastScale = 1\n }\n }, [mergedConfig, onGesture, triggerHaptic])\n\n // Handle touch move\n const handleTouchMove = React.useCallback((e: TouchEvent) => {\n const state = gestureState.current\n if (!state.isTracking) return\n\n const touches = Array.from(e.touches).map(getTouchPoint)\n state.touches = touches\n\n // Handle pinch gesture\n if (touches.length === 2 && state.initialDistance && touches[0] && touches[1]) {\n const currentDistance = getDistance(touches[0], touches[1])\n const scale = currentDistance / state.initialDistance\n const scaleDiff = Math.abs(scale - (state.lastScale || 1))\n\n if (scaleDiff > mergedConfig.pinchThreshold) {\n const gestureType = scale > (state.lastScale || 1) ? 'pinch-out' : 'pinch-in'\n \n if (mergedConfig.enabledGestures.includes(gestureType)) {\n const centerPoint = {\n x: (touches[0].x + touches[1].x) / 2,\n y: (touches[0].y + touches[1].y) / 2,\n id: -1,\n timestamp: Date.now()\n }\n \n const startCenterPoint = {\n x: ((state.startTouches[0]?.x ?? 0) + (state.startTouches[1]?.x ?? 0)) / 2,\n y: ((state.startTouches[0]?.y ?? 0) + (state.startTouches[1]?.y ?? 0)) / 2,\n id: -1,\n timestamp: state.startTouches[0]?.timestamp ?? Date.now()\n }\n\n const gestureEvent = createGestureEvent(gestureType, startCenterPoint, centerPoint, {\n scale,\n distance: currentDistance\n })\n \n onGesture(gestureEvent)\n state.lastScale = scale\n }\n }\n }\n\n // Clear long press timer on move\n if (state.longPressTimer && touches.length === 1 && state.startTouches[0] && touches[0]) {\n const startTouch = state.startTouches[0]\n const currentTouch = touches[0]\n const distance = getDistance(startTouch, currentTouch)\n \n if (distance > mergedConfig.swipeThreshold) {\n clearTimeout(state.longPressTimer)\n state.longPressTimer = undefined\n }\n }\n }, [mergedConfig, onGesture])\n\n // Handle touch end\n const handleTouchEnd = React.useCallback((e: TouchEvent) => {\n const state = gestureState.current\n if (!state.isTracking) return\n\n const endTouches = Array.from(e.changedTouches).map(getTouchPoint)\n const currentTime = Date.now()\n\n // Clear long press timer\n if (state.longPressTimer) {\n clearTimeout(state.longPressTimer)\n state.longPressTimer = undefined\n }\n\n // Handle single touch gestures\n if (state.startTouches.length === 1 && endTouches.length === 1 && state.startTouches[0] && endTouches[0]) {\n const startTouch = state.startTouches[0]\n const endTouch = endTouches[0]\n const distance = getDistance(startTouch, endTouch)\n const duration = endTouch.timestamp - startTouch.timestamp\n\n // Check for swipe gestures\n if (distance > mergedConfig.swipeThreshold) {\n const velocity = getVelocity(startTouch, endTouch)\n const absVelX = Math.abs(velocity.x)\n const absVelY = Math.abs(velocity.y)\n\n if (absVelX > mergedConfig.swipeVelocityThreshold || absVelY > mergedConfig.swipeVelocityThreshold) {\n let gestureType: GestureType\n\n if (absVelX > absVelY) {\n gestureType = velocity.x > 0 ? 'swipe-right' : 'swipe-left'\n } else {\n gestureType = velocity.y > 0 ? 'swipe-down' : 'swipe-up'\n }\n\n if (mergedConfig.enabledGestures.includes(gestureType)) {\n const gestureEvent = createGestureEvent(gestureType, startTouch, endTouch, {\n velocity,\n distance\n })\n \n onGesture(gestureEvent)\n \n if (mergedConfig.enableHapticFeedback) {\n triggerHaptic('light')\n }\n }\n }\n }\n // Check for tap gestures\n else if (duration < mergedConfig.tapThreshold && distance < mergedConfig.swipeThreshold) {\n // Check for double tap\n if (state.lastTap && \n currentTime - state.lastTap.timestamp < mergedConfig.doubleTapThreshold &&\n getDistance({...state.lastTap.point, id: -1, timestamp: state.lastTap.timestamp}, endTouch) < mergedConfig.swipeThreshold) {\n \n if (mergedConfig.enabledGestures.includes('double-tap')) {\n const gestureEvent = createGestureEvent('double-tap', startTouch, endTouch)\n onGesture(gestureEvent)\n \n if (mergedConfig.enableHapticFeedback) {\n triggerHaptic('medium')\n }\n }\n \n state.lastTap = undefined\n } else {\n // Single tap\n if (mergedConfig.enabledGestures.includes('tap')) {\n const gestureEvent = createGestureEvent('tap', startTouch, endTouch)\n onGesture(gestureEvent)\n \n if (mergedConfig.enableHapticFeedback) {\n triggerHaptic('light')\n }\n }\n \n state.lastTap = {\n timestamp: currentTime,\n point: { x: endTouch.x, y: endTouch.y }\n }\n }\n }\n }\n\n // Reset gesture state\n if (e.touches.length === 0) {\n state.isTracking = false\n state.touches = []\n state.startTouches = []\n state.initialDistance = undefined\n state.initialScale = undefined\n state.lastScale = undefined\n }\n }, [mergedConfig, onGesture, triggerHaptic])\n\n // Attach event listeners\n React.useEffect(() => {\n const element = ref.current\n if (!element || !isTouchDevice) return\n\n element.addEventListener('touchstart', handleTouchStart, { passive: false })\n element.addEventListener('touchmove', handleTouchMove, { passive: false })\n element.addEventListener('touchend', handleTouchEnd, { passive: false })\n element.addEventListener('touchcancel', handleTouchEnd, { passive: false })\n\n return () => {\n element.removeEventListener('touchstart', handleTouchStart)\n element.removeEventListener('touchmove', handleTouchMove)\n element.removeEventListener('touchend', handleTouchEnd)\n element.removeEventListener('touchcancel', handleTouchEnd)\n }\n }, [handleTouchStart, handleTouchMove, handleTouchEnd, isTouchDevice])\n\n return {\n isGestureEnabled: isTouchDevice && mergedConfig.enabledGestures.length > 0\n }\n}\n\n// Media player specific gesture hook with predefined actions\nexport function useMediaGestures(\n ref: React.RefObject<HTMLElement>,\n actions: {\n onPlayPause?: () => void\n onSeek?: (direction: 'forward' | 'backward', amount: number) => void\n onVolumeChange?: (direction: 'up' | 'down', amount: number) => void\n onToggleFullscreen?: () => void\n onZoom?: (scale: number) => void\n }\n) {\n const handleGesture = React.useCallback((event: GestureEvent) => {\n const { type, velocity, distance, scale } = event\n\n switch (type) {\n case 'double-tap':\n // Double tap to play/pause\n actions.onPlayPause?.()\n break\n\n case 'swipe-left':\n // Swipe left to seek backward\n const backwardAmount = Math.min((distance || 0) / 10, 30) // Max 30 seconds\n actions.onSeek?.('backward', backwardAmount)\n break\n\n case 'swipe-right':\n // Swipe right to seek forward\n const forwardAmount = Math.min((distance || 0) / 10, 30) // Max 30 seconds\n actions.onSeek?.('forward', forwardAmount)\n break\n\n case 'swipe-up':\n // Swipe up on right side for volume up\n if (event.startPoint.x > (ref.current?.clientWidth || 0) / 2) {\n const volumeAmount = Math.min((distance || 0) / 100, 0.2) // Max 20%\n actions.onVolumeChange?.('up', volumeAmount)\n }\n break\n\n case 'swipe-down':\n // Swipe down on right side for volume down\n if (event.startPoint.x > (ref.current?.clientWidth || 0) / 2) {\n const volumeAmount = Math.min((distance || 0) / 100, 0.2) // Max 20%\n actions.onVolumeChange?.('down', volumeAmount)\n }\n break\n\n case 'pinch-out':\n // Pinch out to zoom in (for video zoom functionality)\n actions.onZoom?.(scale || 1)\n break\n\n case 'pinch-in':\n // Pinch in to zoom out\n actions.onZoom?.(scale || 1)\n break\n\n case 'long-press':\n // Long press for fullscreen toggle\n actions.onToggleFullscreen?.()\n break\n\n default:\n break\n }\n }, [actions, ref])\n\n const gestureConfig: GestureConfig = {\n enabledGestures: ['tap', 'double-tap', 'long-press', 'swipe-left', 'swipe-right', 'swipe-up', 'swipe-down', 'pinch-in', 'pinch-out'],\n enableHapticFeedback: true,\n swipeThreshold: 30,\n swipeVelocityThreshold: 0.3\n }\n\n return useTouchGestures(ref, handleGesture, gestureConfig)\n}","import { useState, useRef, useCallback, useEffect } from \"react\"\n\nexport interface BufferedRange {\n\tstart: number\n\tend: number\n\tpercentage: number\n}\n\nexport interface VideoState {\n\tisPlaying: boolean\n\tcurrentTime: number\n\tduration: number\n\tvolume: number\n\tisMuted: boolean\n\tisFullscreen: boolean\n\tisLoading: boolean\n\tisSeeking: boolean\n\tisBuffering: boolean\n\tbufferedRanges: BufferedRange[]\n}\n\nexport interface VideoControls {\n\ttogglePlay: () => void\n\tseekForward: (seconds?: number) => void\n\tseekBackward: (seconds?: number) => void\n\ttoggleMute: () => void\n\tsetVolume: (volume: number) => void\n\ttoggleFullscreen: () => void\n\tseekTo: (time: number) => void\n}\n\nexport function useVideoPlayer(containerRef: React.RefObject<HTMLDivElement | null>) {\n\tconst videoRef = useRef<HTMLVideoElement>(null)\n\tconst [state, setState] = useState<VideoState>({\n\t\tisPlaying: false,\n\t\tcurrentTime: 0,\n\t\tduration: 0,\n\t\tvolume: 1,\n\t\tisMuted: false,\n\t\tisFullscreen: false,\n\t\tisLoading: true,\n\t\tisSeeking: false,\n\t\tisBuffering: false,\n\t\tbufferedRanges: []\n\t})\n\n\tuseEffect(() => {\n\t\tconst video = videoRef.current\n\t\tif (!video) return\n\n\t\tconst handleTimeUpdate = () => {\n\t\t\tsetState(prev => ({ ...prev, currentTime: video.currentTime }))\n\t\t}\n\n\t\tconst handleLoadedMetadata = () => {\n\t\t\tsetState(prev => ({ ...prev, duration: video.duration }))\n\t\t}\n\n\t\tconst handlePlay = () => {\n\t\t\tsetState(prev => ({ ...prev, isPlaying: true, isBuffering: false }))\n\t\t}\n\n\t\tconst handlePause = () => {\n\t\t\tsetState(prev => ({ ...prev, isPlaying: false }))\n\t\t}\n\n\t\tconst handleVolumeChange = () => {\n\t\t\tsetState(prev => ({\n\t\t\t\t...prev,\n\t\t\t\tvolume: video.volume,\n\t\t\t\tisMuted: video.muted\n\t\t\t}))\n\t\t}\n\n\t\t// Loading state handlers\n\t\tconst handleLoadStart = () => {\n\t\t\tsetState(prev => ({ ...prev, isLoading: true }))\n\t\t}\n\n\t\tconst handleLoadedData = () => {\n\t\t\tsetState(prev => ({ ...prev, isLoading: false }))\n\t\t}\n\n\t\t// Seeking state handlers\n\t\tconst handleSeeking = () => {\n\t\t\tsetState(prev => ({ ...prev, isSeeking: true }))\n\t\t}\n\n\t\tconst handleSeeked = () => {\n\t\t\tsetState(prev => ({ ...prev, isSeeking: false }))\n\t\t}\n\n\t\t// Buffering state handlers\n\t\tconst handleWaiting = () => {\n\t\t\tsetState(prev => ({ ...prev, isBuffering: true }))\n\t\t}\n\n\t\tconst handlePlaying = () => {\n\t\t\tsetState(prev => ({ ...prev, isBuffering: false, isLoading: false }))\n\t\t}\n\n\t\tconst handleCanPlay = () => {\n\t\t\tsetState(prev => ({ ...prev, isLoading: false, isBuffering: false }))\n\t\t}\n\n\t\t// Progress handler for buffered ranges\n\t\tconst handleProgress = () => {\n\t\t\tif (!video.buffered || video.buffered.length === 0 || video.duration === 0) {\n\t\t\t\tsetState(prev => ({ ...prev, bufferedRanges: [] }))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst ranges: BufferedRange[] = []\n\t\t\tfor (let i = 0; i < video.buffered.length; i++) {\n\t\t\t\tconst start = video.buffered.start(i)\n\t\t\t\tconst end = video.buffered.end(i)\n\t\t\t\tranges.push({\n\t\t\t\t\tstart,\n\t\t\t\t\tend,\n\t\t\t\t\tpercentage: ((end - start) / video.duration) * 100\n\t\t\t\t})\n\t\t\t}\n\t\t\tsetState(prev => ({ ...prev, bufferedRanges: ranges }))\n\t\t}\n\n\t\tvideo.addEventListener(\"timeupdate\", handleTimeUpdate)\n\t\tvideo.addEventListener(\"loadedmetadata\", handleLoadedMetadata)\n\t\tvideo.addEventListener(\"play\", handlePlay)\n\t\tvideo.addEventListener(\"pause\", handlePause)\n\t\tvideo.addEventListener(\"volumechange\", handleVolumeChange)\n\t\tvideo.addEventListener(\"loadstart\", handleLoadStart)\n\t\tvideo.addEventListener(\"loadeddata\", handleLoadedData)\n\t\tvideo.addEventListener(\"seeking\", handleSeeking)\n\t\tvideo.addEventListener(\"seeked\", handleSeeked)\n\t\tvideo.addEventListener(\"waiting\", handleWaiting)\n\t\tvideo.addEventListener(\"playing\", handlePlaying)\n\t\tvideo.addEventListener(\"canplay\", handleCanPlay)\n\t\tvideo.addEventListener(\"progress\", handleProgress)\n\n\t\treturn () => {\n\t\t\tvideo.removeEventListener(\"timeupdate\", handleTimeUpdate)\n\t\t\tvideo.removeEventListener(\"loadedmetadata\", handleLoadedMetadata)\n\t\t\tvideo.removeEventListener(\"play\", handlePlay)\n\t\t\tvideo.removeEventListener(\"pause\", handlePause)\n\t\t\tvideo.removeEventListener(\"volumechange\", handleVolumeChange)\n\t\t\tvideo.removeEventListener(\"loadstart\", handleLoadStart)\n\t\t\tvideo.removeEventListener(\"loadeddata\", handleLoadedData)\n\t\t\tvideo.removeEventListener(\"seeking\", handleSeeking)\n\t\t\tvideo.removeEventListener(\"seeked\", handleSeeked)\n\t\t\tvideo.removeEventListener(\"waiting\", handleWaiting)\n\t\t\tvideo.removeEventListener(\"playing\", handlePlaying)\n\t\t\tvideo.removeEventListener(\"canplay\", handleCanPlay)\n\t\t\tvideo.removeEventListener(\"progress\", handleProgress)\n\t\t}\n\t}, [])\n\n\tconst togglePlay = () => {\n \t\tconst video = videoRef.current\n \t\tif (!video) return\n\n \t\tif (state.isPlaying) {\n \t\t\tvideo.pause()\n \t\t} else {\n \t\t\tvideo.play()\n \t\t}\n \t}\n\n\tconst seekForward = (seconds = 10) => {\n \t\tconst video = videoRef.current\n \t\tif (!video) return\n \t\tvideo.currentTime = Math.min(state.duration, video.currentTime + seconds)\n \t}\n\n\tconst seekBackward = (seconds = 10) => {\n \t\tconst video = videoRef.current\n \t\tif (!video) return\n \t\tvideo.currentTime = Math.max(0, video.currentTime - seconds)\n \t}\n\n\tconst toggleMute = () => {\n \t\tconst video = videoRef.current\n \t\tif (!video) return\n \t\tvideo.muted = !state.isMuted\n \t}\n\n\tconst setVolume = (volume: number) => {\n \t\tconst video = videoRef.current\n \t\tif (!video) return\n \t\tvideo.volume = volume\n \t\tif (volume > 0 && state.isMuted) {\n \t\t\tvideo.muted = false\n \t\t}\n \t}\n\n\tconst toggleFullscreen = () => {\n \t\tconst container = containerRef.current\n \t\tif (!container) return\n\n \t\tif (!state.isFullscreen) {\n \t\t\tif (container.requestFullscreen) {\n \t\t\t\tcontainer.requestFullscreen()\n \t\t\t}\n \t\t} else {\n \t\t\tif (document.exitFullscreen) {\n \t\t\t\tdocument.exitFullscreen()\n \t\t\t}\n \t\t}\n \t\tsetState(prev => ({ ...prev, isFullscreen: !prev.isFullscreen }))\n \t}\n\n\tconst seekTo = (time: number) => {\n \t\tconst video = videoRef.current\n \t\tif (!video || state.duration === 0) return\n \t\tvideo.currentTime = Math.max(0, Math.min(state.duration, time))\n \t}\n\n\tconst controls: VideoControls = {\n\t\ttogglePlay,\n\t\tseekForward,\n\t\tseekBackward,\n\t\ttoggleMute,\n\t\tsetVolume,\n\t\ttoggleFullscreen,\n\t\tseekTo\n\t}\n\n\treturn {\n\t\tvideoRef,\n\t\tstate,\n\t\tcontrols\n\t}\n}","import { useState, useCallback, useMemo, useEffect } from \"react\"\n\ninterface SubtitleCue {\n start: number\n end: number\n text: string\n}\n\nexport interface SubtitleTrack {\n id: string\n label: string\n language?: string\n src?: string\n}\n\nexport interface UseEnhancedSubtitlesOptions {\n subtitleSrc?: string\n subtitleTracks?: SubtitleTrack[]\n defaultFontSize?: \"small\" | \"medium\" | \"large\"\n onLoadError?: (error: Error) => void\n}\n\nexport function useEnhancedSubtitles({\n subtitleSrc,\n subtitleTracks = [],\n defaultFontSize = \"medium\",\n onLoadError\n}: UseEnhancedSubtitlesOptions = {}) {\n const [subtitlesEnabled, setSubtitlesEnabled] = useState(false)\n const [subtitleCues, setSubtitleCues] = useState<SubtitleCue[]>([])\n const [currentSubtitle, setCurrentSubtitle] = useState(\"\")\n const [currentTrackId, setCurrentTrackId] = useState<string | null>(null)\n const [fontSize, setFontSize] = useState<\"small\" | \"medium\" | \"large\">(defaultFontSize)\n const [loadError, setLoadError] = useState<Error | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n\n // Size mapping for subtitle font sizes\n const sizeMap = {\n small: \"text-sm\",\n medium: \"text-base\", \n large: \"text-lg\"\n }\n\n // Determine if subtitles are available\n const hasSubtitles = !!(subtitleSrc || (subtitleTracks && subtitleTracks.length > 0))\n\n // Parse VTT/WebVTT timestamp\n const parseVTTTime = (timeStr: string): number => {\n const parts = timeStr.split(\":\")\n const seconds = parts[2] ? parseFloat(parts[2]) : 0\n const minutes = parts[1] ? parseInt(parts[1], 10) * 60 : 0\n const hours = parts[0] ? parseInt(parts[0], 10) * 3600 : 0\n return hours + minutes + seconds\n }\n\n // Parse SRT timestamp\n const parseSRTTime = (timeStr: string): number => {\n // SRT format: 00:00:00,000 (hours:minutes:seconds,milliseconds)\n const [time, ms] = timeStr.split(\",\")\n const parts = (time || \"\").split(\":\")\n const milliseconds = ms ? parseInt(ms, 10) / 1000 : 0\n const seconds = parts[2] ? parseInt(parts[2], 10) : 0\n const minutes = parts[1] ? parseInt(parts[1], 10) * 60 : 0\n const hours = parts[0] ? parseInt(parts[0], 10) * 3600 : 0\n return hours + minutes + seconds + milliseconds\n }\n\n // Load and parse subtitle file\n const loadSubtitles = async (url: string) => {\n setIsLoading(true)\n setLoadError(null)\n \n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Failed to load subtitles: ${response.status} ${response.statusText}`)\n }\n \n const text = await response.text()\n const cues: SubtitleCue[] = []\n const lines = text.split(\"\\n\")\n let i = 0\n\n // Detect format (VTT or SRT)\n const isVTT = text.includes(\"WEBVTT\") || url.endsWith(\".vtt\")\n const isSRT = url.endsWith(\".srt\") || /^\\d+$/.test(lines[0]?.trim() || \"\")\n\n if (isVTT) {\n // Parse VTT format\n while (i < lines.length) {\n if (lines[i]?.includes(\"-->\")) {\n const [startStr, endStr] = (lines[i] || \"\").split(\"-->\").map((s) => s.trim())\n const start = parseVTTTime(startStr || \"\")\n const end = parseVTTTime(endStr || \"\")\n\n i++\n let subtitleText = \"\"\n while (i < lines.length && lines[i]?.trim() !== \"\") {\n subtitleText += (subtitleText ? \" \" : \"\") + lines[i]?.trim()\n i++\n }\n\n if (subtitleText) {\n cues.push({ start, end, text: subtitleText })\n }\n }\n i++\n }\n } else if (isSRT) {\n // Parse SRT format\n while (i < lines.length) {\n // Skip the sequence number\n if (/^\\d+$/.test(lines[i]?.trim() || \"\")) {\n i++\n // Parse timestamp line\n if (lines[i]?.includes(\"-->\")) {\n const [startStr, endStr] = (lines[i] || \"\").split(\"-->\").map((s) => s.trim())\n const start = parseSRTTime(startStr || \"\")\n const end = parseSRTTime(endStr || \"\")\n\n i++\n let subtitleText = \"\"\n while (i < lines.length && lines[i]?.trim() !== \"\") {\n subtitleText += (subtitleText ? \" \" : \"\") + lines[i]?.trim()\n i++\n }\n\n if (subtitleText) {\n cues.push({ start, end, text: subtitleText })\n }\n }\n }\n i++\n }\n } else {\n throw new Error(\"Unsupported subtitle format. Only VTT and SRT are supported.\")\n }\n\n if (cues.length === 0) {\n throw new Error(\"No subtitle cues found in file\")\n }\n\n setSubtitleCues(cues)\n setIsLoading(false)\n } catch (error) {\n const err = error instanceof Error ? error : new Error(\"Failed to load subtitles\")\n console.error(\"Failed to load subtitles:\", err)\n setLoadError(err)\n setIsLoading(false)\n setSubtitleCues([])\n onLoadError?.(err)\n }\n }\n\n // Get current subtitle text based on time\n const getCurrentSubtitle = (currentTime: number) => {\n if (!subtitlesEnabled || subtitleCues.length === 0) return \"\"\n \n const currentCue = subtitleCues.find(\n (cue) => currentTime >= cue.start && currentTime <= cue.end\n )\n return currentCue?.text || \"\"\n }\n\n // Toggle subtitles on/off\n const toggleSubtitles = () => {\n setSubtitlesEnabled(prev => {\n const newEnabled = !prev\n \n if (newEnabled && !loadError) {\n // Try to load subtitles if not already loaded\n if (subtitleCues.length === 0 && !isLoading) {\n // Load default subtitle source or first track\n const srcToLoad = subtitleSrc || subtitleTracks[0]?.src\n if (srcToLoad) {\n loadSubtitles(srcToLoad)\n if (subtitleTracks[0]) {\n setCurrentTrackId(subtitleTracks[0].id)\n }\n }\n }\n } else if (!newEnabled) {\n setCurrentSubtitle(\"\")\n }\n \n return newEnabled\n })\n }\n\n // Select a specific subtitle track\n const selectSubtitleTrack = (trackId: string | null) => {\n if (!trackId) {\n // Turn off subtitles\n setSubtitlesEnabled(false)\n setCurrentTrackId(null)\n setCurrentSubtitle(\"\")\n return\n }\n\n const track = subtitleTracks.find(t => t.id === trackId)\n if (track?.src) {\n setCurrentTrackId(trackId)\n loadSubtitles(track.src)\n setSubtitlesEnabled(true)\n }\n }\n\n // Change subtitle font size\n const changeSubtitleFontSize = (size: \"small\" | \"medium\" | \"large\") => {\n setFontSize(size)\n }\n\n // Get CSS classes for subtitle display\n const getSubtitleStyles = {\n fontSize: sizeMap[fontSize],\n className: `${sizeMap[fontSize]} font-medium`\n }\n\n // Clear subtitle on disable\n useEffect(() => {\n if (!subtitlesEnabled) {\n setCurrentSubtitle(\"\")\n }\n }, [subtitlesEnabled])\n\n // Auto-load default subtitles on mount if available\n useEffect(() => {\n if (subtitleSrc && !subtitleCues.length && !loadError && !isLoading) {\n // Don't auto-load, wait for user to enable\n // This prevents errors on initial load\n }\n }, [])\n\n return {\n // State\n subtitlesEnabled,\n currentSubtitle,\n subtitleCues,\n currentTrackId,\n fontSize,\n loadError,\n isLoading,\n hasSubtitles,\n \n // Actions\n toggleSubtitles,\n selectSubtitleTrack,\n changeSubtitleFontSize,\n setCurrentSubtitle,\n \n // Utilities\n getCurrentSubtitle,\n getSubtitleStyles,\n \n // Track info\n availableTracks: subtitleTracks\n }\n}\n","import { useState, useRef, useCallback, useEffect } from \"react\"\n\nexport function useMediaControls(isPlaying: boolean, showSettings: boolean) {\n\tconst [controlsVisible, setControlsVisible] = useState(true)\n\tconst [showVolumeSlider, setShowVolumeSlider] = useState(false)\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n\n\tconst showControls = () => {\n \t\tsetControlsVisible(true)\n \t\tif (hideTimeoutRef.current) {\n \t\t\tclearTimeout(hideTimeoutRef.current)\n \t\t}\n\n \t\tif (isPlaying && !showSettings) {\n \t\t\thideTimeoutRef.current = setTimeout(() => {\n \t\t\t\tsetControlsVisible(false)\n \t\t\t}, 3000)\n \t\t}\n \t}\n\n\tconst handleMouseMove = () => {\n \t\tshowControls()\n \t}\n\n\tconst handleMouseEnter = () => {\n \t\tsetControlsVisible(true)\n \t}\n\n\tconst handleMouseLeave = () => {\n \t\tif (isPlaying) {\n \t\t\tsetControlsVisible(false)\n \t\t}\n \t}\n\n\tuseEffect(() => {\n\t\tshowControls()\n\t\treturn () => {\n\t\t\tif (hideTimeoutRef.current) {\n\t\t\t\tclearTimeout(hideTimeoutRef.current)\n\t\t\t}\n\t\t}\n\t}, [showControls])\n\n\treturn {\n\t\tcontrolsVisible,\n\t\tshowVolumeSlider,\n\t\tsetShowVolumeSlider,\n\t\thandleMouseMove,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave\n\t}\n}","import { useEffect, useCallback } from \"react\"\nimport type { VideoControls } from \"./useVideoPlayer\"\n\ninterface UseKeyboardShortcutsProps {\n\tvideoControls: VideoControls\n\ttoggleSubtitles: () => void\n\ttakeScreenshot: (ctrlKey?: boolean) => void\n\tduration: number\n}\n\nexport function useKeyboardShortcuts({\n\tvideoControls,\n\ttoggleSubtitles,\n\ttakeScreenshot,\n\tduration\n}: UseKeyboardShortcutsProps) {\n\tconst handleKeyDown = (e: KeyboardEvent) => {\n \t\tconst video = document.querySelector('video')\n \t\tif (!video) return\n\n \t\tswitch (e.key.toLowerCase()) {\n \t\t\tcase \" \":\n \t\t\tcase \"k\":\n \t\t\t\te.preventDefault()\n \t\t\t\tvideoControls.togglePlay()\n \t\t\t\tbreak\n \t\t\tcase \"j\":\n \t\t\t\te.preventDefault()\n \t\t\t\tvideoControls.seekBackward()\n \t\t\t\tbreak\n \t\t\tcase \"l\":\n \t\t\t\te.preventDefault()\n \t\t\t\tvideoControls.seekForward()\n \t\t\t\tbreak\n \t\t\tcase \"arrowleft\":\n \t\t\t\te.preventDefault()\n \t\t\t\tvideo.currentTime = Math.max(0, video.currentTime - 5)\n \t\t\t\tbreak\n \t\t\tcase \"arrowright\":\n \t\t\t\te.preventDefault()\n \t\t\t\tvideo.currentTime = Math.min(duration, video.currentTime + 5)\n \t\t\t\tbreak\n \t\t\tcase \"arrowup\":\n \t\t\t\te.preventDefault()\n \t\t\t\tvideo.volume = Math.min(1, video.volume + 0.1)\n \t\t\t\tbreak\n \t\t\tcase \"arrowdown\":\n \t\t\t\te.preventDefault()\n \t\t\t\tvideo.volume = Math.max(0, video.volume - 0.1)\n \t\t\t\tbreak\n \t\t\tcase \"m\":\n \t\t\t\te.preventDefault()\n \t\t\t\tvideoControls.toggleMute()\n \t\t\t\tbreak\n \t\t\tcase \"f\":\n \t\t\t\te.preventDefault()\n \t\t\t\tvideoControls.toggleFullscreen()\n \t\t\t\tbreak\n \t\t\tcase \"c\":\n \t\t\t\te.preventDefault()\n \t\t\t\ttoggleSubtitles()\n \t\t\t\tbreak\n \t\t\tcase \"s\":\n \t\t\t\te.preventDefault()\n \t\t\t\ttakeScreenshot(e.ctrlKey || e.metaKey)\n \t\t\t\tbreak\n \t\t}\n \t}\n\n\tuseEffect(() => {\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown)\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown)\n\t}, [handleKeyDown])\n}","import { useCallback } from \"react\"\n\nexport function useScreenshot(videoRef: React.RefObject<HTMLVideoElement | null>) {\n\tconst takeScreenshot = (ctrlKey: boolean = false) => {\n \t\tif (!videoRef.current) return\n\n \t\tconst video = videoRef.current\n \t\tconst canvas = document.createElement(\"canvas\")\n \t\tcanvas.width = video.videoWidth\n \t\tcanvas.height = video.videoHeight\n \t\tconst ctx = canvas.getContext(\"2d\")\n \t\tif (!ctx) return\n\n \t\ttry {\n \t\t\t// Draw the video frame to canvas\n \t\t\tctx.drawImage(video, 0, 0)\n\n \t\t\t// Try to export the canvas\n \t\t\tcanvas.toBlob((blob) => {\n \t\t\t\tif (!blob) {\n \t\t\t\t\tconsole.error(\"Failed to create blob from canvas\")\n \t\t\t\t\treturn\n \t\t\t\t}\n\n \t\t\t\tif (ctrlKey) {\n \t\t\t\t\t// Copy to clipboard\n \t\t\t\t\tif (navigator.clipboard && window.ClipboardItem) {\n \t\t\t\t\t\tconst item = new ClipboardItem({ \"image/png\": blob })\n \t\t\t\t\t\tnavigator.clipboard.write([item]).catch(err => {\n \t\t\t\t\t\t\tconsole.error(\"Failed to copy to clipboard:\", err)\n \t\t\t\t\t\t})\n \t\t\t\t\t} else {\n \t\t\t\t\t\tconsole.warn(\"Clipboard API not supported\")\n \t\t\t\t\t}\n \t\t\t\t} else {\n \t\t\t\t\t// Download\n \t\t\t\t\tconst url = URL.createObjectURL(blob)\n \t\t\t\t\tconst a = document.createElement(\"a\")\n \t\t\t\t\ta.href = url\n \t\t\t\t\ta.download = `screenshot-${Date.now()}.png`\n \t\t\t\t\ta.click()\n \t\t\t\t\tURL.revokeObjectURL(url)\n \t\t\t\t}\n \t\t\t}, \"image/png\")\n \t\t} catch (error) {\n \t\t\tif (error instanceof Error && error.message.includes(\"tainted\")) {\n \t\t\t\tconsole.error(\"Canvas is tainted - video source may not have proper CORS headers. Try setting crossOrigin='anonymous' on the video element.\")\n \t\t\t\talert(\"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.\")\n \t\t\t} else {\n \t\t\t\tconsole.error(\"Screenshot failed:\", error)\n \t\t\t\talert(\"Screenshot failed: \" + (error instanceof Error ? error.message : \"Unknown error\"))\n \t\t\t}\n \t\t}\n \t}\n\n\treturn { takeScreenshot }\n}","/**\n * Intelligent Preloading Hook\n * Combines user behavior analysis with network conditions for optimal preloading\n */\n\nimport { useEffect, useRef, useCallback, useMemo } from 'react';\nimport { MediaSource } from '../types';\n\ninterface IntelligentPreloadingOptions {\n\t/** Enable user behavior tracking */\n\ttrackUserBehavior?: boolean;\n\t/** Adapt to network conditions */\n\tadaptToNetwork?: boolean;\n\t/** Preload strategy */\n\tstrategy?: 'conservative' | 'balanced' | 'aggressive';\n\t/** Maximum number of items to preload */\n\tmaxPreloadItems?: number;\n\t/** Preload radius for playlist items */\n\tpreloadRadius?: number;\n}\n\ninterface UserBehaviorData {\n\tmouseMovements: number;\n\tscrollEvents: number;\n\tkeyPresses: number;\n\tfocusEvents: number;\n\ttimeOnPage: number;\n\tengagementScore: number;\n\tlastInteraction: number;\n}\n\ninterface PreloadingDecision {\n\tshouldPreload: boolean;\n\tpriority: 'high' | 'medium' | 'low';\n\treason: string;\n}\n\nexport const useIntelligentPreloading = (\n\tsources: MediaSource[],\n\toptions: IntelligentPreloadingOptions = {}\n) => {\n\tconst {\n\t\ttrackUserBehavior = true,\n\t\tadaptToNetwork = true,\n\t\tstrategy = 'balanced',\n\t\tmaxPreloadItems = 3,\n\t\tpreloadRadius = 2,\n\t} = options;\n\n\tconst userBehaviorRef = useRef<UserBehaviorData>({\n\t\tmouseMovements: 0,\n\t\tscrollEvents: 0,\n\t\tkeyPresses: 0,\n\t\tfocusEvents: 0,\n\t\ttimeOnPage: 0,\n\t\tengagementScore: 0,\n\t\tlastInteraction: Date.now(),\n\t});\n\n\tconst networkInfoRef = useRef<NetworkInformation | null>(null);\n\tconst preloadedItemsRef = useRef<Set<string>>(new Set());\n\tconst preloadQueueRef = useRef<Array<{ source: MediaSource; priority: number }>>([]);\n\n\t// Calculate user engagement score\n\tconst calculateEngagementScore = useCallback((): number => {\n\t\tconst behavior = userBehaviorRef.current;\n\t\tconst timeFactor = Math.min(behavior.timeOnPage / 60000, 1); // Cap at 1 minute\n\t\tconst interactionFactor = Math.min(\n\t\t\t(behavior.mouseMovements + behavior.scrollEvents + behavior.keyPresses) / 100,\n\t\t\t1\n\t\t);\n\n\t\treturn (timeFactor * 0.4 + interactionFactor * 0.6) * 100;\n\t}, []);\n\n\t// Update user behavior tracking\n\tconst updateUserBehavior = useCallback((type: keyof UserBehaviorData, increment = 1) => {\n\t\tconst behavior = userBehaviorRef.current;\n\t\tbehavior[type] = typeof behavior[type] === 'number' ? behavior[type] + increment : Date.now();\n\t\tbehavior.engagementScore = calculateEngagementScore();\n\t\tbehavior.lastInteraction = Date.now();\n\t}, [calculateEngagementScore]);\n\n\t// Get current network conditions\n\tconst getNetworkConditions = useCallback(() => {\n\t\tif (!networkInfoRef.current || !adaptToNetwork) {\n\t\t\treturn { type: 'unknown', downlink: 10, effectiveType: '4g', saveData: false };\n\t\t}\n\n\t\tconst network = networkInfoRef.current;\n\t\treturn {\n\t\t\ttype: network.type,\n\t\t\tdownlink: network.downlink || 10,\n\t\t\teffectiveType: network.effectiveType || '4g',\n\t\t\tsaveData: network.saveData || false,\n\t\t\trtt: network.rtt || 100,\n\t\t};\n\t}, [adaptToNetwork]);\n\n\t// Determine if a source should be preloaded\n\tconst shouldPreloadSource = useCallback((\n\t\tsource: MediaSource,\n\t\tindex: number,\n\t\tcurrentIndex: number = 0\n\t): PreloadingDecision => {\n\t\t// Skip if already preloaded\n\t\tif (preloadedItemsRef.current.has(source.src)) {\n\t\t\treturn { shouldPreload: false, priority: 'low', reason: 'Already preloaded' };\n\t\t}\n\n\t\t// Check if within preload radius\n\t\tconst distance = Math.abs(index - currentIndex);\n\t\tif (distance > preloadRadius) {\n\t\t\treturn { shouldPreload: false, priority: 'low', reason: 'Outside preload radius' };\n\t\t}\n\n\t\tconst behavior = userBehaviorRef.current;\n\t\tconst network = getNetworkConditions();\n\t\tconst engagementScore = behavior.engagementScore;\n\t\tconst timeSinceInteraction = Date.now() - behavior.lastInteraction;\n\n\t\t// Network-based decisions\n\t\tif (network.saveData) {\n\t\t\treturn { shouldPreload: false, priority: 'low', reason: 'Data saver mode' };\n\t\t}\n\n\t\t// Strategy-based filtering\n\t\tlet shouldPreload = false;\n\t\tlet priority: 'high' | 'medium' | 'low' = 'medium';\n\t\tlet reason = '';\n\n\t\tswitch (strategy) {\n\t\t\tcase 'conservative':\n\t\t\t\tshouldPreload = engagementScore > 70 && network.effectiveType !== '2g' && distance === 1;\n\t\t\t\tpriority = shouldPreload ? 'medium' : 'low';\n\t\t\t\treason = shouldPreload ? 'High engagement and optimal network' : 'Conservative strategy';\n\t\t\t\tbreak;\n\n\t\t\tcase 'aggressive':\n\t\t\t\tshouldPreload = engagementScore > 30 && network.effectiveType !== 'slow-2g';\n\t\t\t\tpriority = engagementScore > 70 ? 'high' : engagementScore > 50 ? 'medium' : 'low';\n\t\t\t\treason = shouldPreload ? 'Aggressive preloading' : 'Low engagement';\n\t\t\t\tbreak;\n\n\t\t\tcase 'balanced':\n\t\t\tdefault:\n\t\t\t\tconst networkMultiplier = network.effectiveType === '4g' ? 1 :\n\t\t\t\t\t\t\t\t\t\tnetwork.effectiveType === '3g' ? 0.7 : 0.3;\n\t\t\t\tconst adjustedScore = engagementScore * networkMultiplier;\n\n\t\t\t\tshouldPreload = adjustedScore > 40 && distance <= 2;\n\t\t\t\tpriority = adjustedScore > 70 ? 'high' : adjustedScore > 55 ? 'medium' : 'low';\n\t\t\t\treason = shouldPreload ? `Balanced: score ${adjustedScore.toFixed(1)}` : 'Low adjusted score';\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Additional heuristics\n\t\tif (shouldPreload) {\n\t\t\t// Prioritize HLS and adaptive streaming\n\t\t\tif (source.type === 'hls' || source.type === 'm3u8') {\n\t\t\t\tpriority = priority === 'low' ? 'medium' : 'high';\n\t\t\t}\n\n\t\t\t// Boost priority for recent user interaction\n\t\t\tif (timeSinceInteraction < 5000) { // Within 5 seconds\n\t\t\t\tpriority = 'high';\n\t\t\t\treason += ' + Recent interaction';\n\t\t\t}\n\n\t\t\t// Consider content type (video gets higher priority than audio)\n\t\t\tif (source.type === 'mp4' || source.type === 'webm') {\n\t\t\t\tpriority = priority === 'low' ? 'medium' : priority;\n\t\t\t}\n\t\t}\n\n\t\treturn { shouldPreload, priority, reason };\n\t}, [strategy, preloadRadius, getNetworkConditions, calculateEngagementScore]);\n\n\t// Preload a specific source\n\tconst preloadSource = useCallback(async (source: MediaSource, priority: number) => {\n\t\ttry {\n\t\t\t// Create a preload link element\n\t\t\tconst link = document.createElement('link');\n\t\t\tlink.rel = 'preload';\n\t\t\tlink.href = source.src;\n\n\t\t\t// Determine the correct 'as' attribute\n\t\t\tswitch (source.type) {\n\t\t\t\tcase 'hls':\n\t\t\t\tcase 'm3u8':\n\t\t\t\t\tlink.as = 'fetch';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'mp4':\n\t\t\t\tcase 'webm':\n\t\t\t\t\tlink.as = 'video';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'mp3':\n\t\t\t\tcase 'wav':\n\t\t\t\tcase 'ogg':\n\t\t\t\t\tlink.as = 'audio';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlink.as = 'fetch';\n\t\t\t}\n\n\t\t\tlink.crossOrigin = 'anonymous';\n\n\t\t\t// Add to document head\n\t\t\tdocument.head.appendChild(link);\n\n\t\t\t// Mark as preloaded\n\t\t\tpreloadedItemsRef.current.add(source.src);\n\n\t\t\tconsole.debug(`Preloaded: ${source.src} (${priority})`);\n\n\t\t\t// Cleanup after 30 seconds to prevent memory issues\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (document.head.contains(link)) {\n\t\t\t\t\tdocument.head.removeChild(link);\n\t\t\t\t}\n\t\t\t}, 30000);\n\n\t\t} catch (error) {\n\t\t\tconsole.warn('Failed to preload source:', source.src, error);\n\t\t}\n\t}, []);\n\n\t// Process preload queue\n\tconst processPreloadQueue = useCallback(() => {\n\t\tif (preloadQueueRef.current.length === 0) return;\n\n\t\t// Sort by priority (higher number = higher priority)\n\t\tconst sortedQueue = [...preloadQueueRef.current].sort((a, b) => b.priority - a.priority);\n\n\t\t// Take top items based on maxPreloadItems\n\t\tconst itemsToPreload = sortedQueue.slice(0, maxPreloadItems);\n\n\t\t// Clear queue\n\t\tpreloadQueueRef.current = [];\n\n\t\t// Preload items\n\t\titemsToPreload.forEach(({ source, priority }) => {\n\t\t\tpreloadSource(source, priority);\n\t\t});\n\t}, [maxPreloadItems, preloadSource]);\n\n\t// Update preloading decisions\n\tconst updatePreloading = useCallback((currentIndex: number = 0) => {\n\t\tpreloadQueueRef.current = [];\n\n\t\tsources.forEach((source, index) => {\n\t\t\tconst decision = shouldPreloadSource(source, index, currentIndex);\n\n\t\t\tif (decision.shouldPreload) {\n\t\t\t\tconst priority = decision.priority === 'high' ? 3 :\n\t\t\t\t\t\t\t\tdecision.priority === 'medium' ? 2 : 1;\n\n\t\t\t\tpreloadQueueRef.current.push({ source, priority });\n\t\t\t}\n\t\t});\n\n\t\tprocessPreloadQueue();\n\t}, [sources, shouldPreloadSource, processPreloadQueue]);\n\n\t// Set up user behavior tracking\n\tuseEffect(() => {\n\t\tif (!trackUserBehavior) return;\n\n\t\tconst handleMouseMove = () => updateUserBehavior('mouseMovements');\n\t\tconst handleScroll = () => updateUserBehavior('scrollEvents');\n\t\tconst handleKeyPress = () => updateUserBehavior('keyPresses');\n\t\tconst handleFocus = () => updateUserBehavior('focusEvents');\n\n\t\t// Add event listeners\n\t\tdocument.addEventListener('mousemove', handleMouseMove, { passive: true });\n\t\tdocument.addEventListener('scroll', handleScroll, { passive: true });\n\t\tdocument.addEventListener('keydown', handleKeyPress, { passive: true });\n\t\tdocument.addEventListener('focusin', handleFocus, { passive: true });\n\n\t\t// Update time on page every second\n\t\tconst timeInterval = setInterval(() => {\n\t\t\tupdateUserBehavior('timeOnPage', 1);\n\t\t}, 1000);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousemove', handleMouseMove);\n\t\t\tdocument.removeEventListener('scroll', handleScroll);\n\t\t\tdocument.removeEventListener('keydown', handleKeyPress);\n\t\t\tdocument.removeEventListener('focusin', handleFocus);\n\t\t\tclearInterval(timeInterval);\n\t\t};\n\t}, [trackUserBehavior, updateUserBehavior]);\n\n\t// Set up network monitoring\n\tuseEffect(() => {\n\t\tif (!adaptToNetwork || !('connection' in navigator)) return;\n\n\t\tconst network = (navigator as any).connection;\n\t\tnetworkInfoRef.current = network;\n\n\t\tconst handleNetworkChange = () => {\n\t\t\t// Re-evaluate preloading when network conditions change\n\t\t\tupdatePreloading();\n\t\t};\n\n\t\tnetwork.addEventListener('change', handleNetworkChange);\n\n\t\treturn () => {\n\t\t\tnetwork.removeEventListener('change', handleNetworkChange);\n\t\t};\n\t}, [adaptToNetwork, updatePreloading]);\n\n\t// Initial preloading\n\tuseEffect(() => {\n\t\tupdatePreloading();\n\t}, [updatePreloading]);\n\n\t// Memoize return values\n\tconst controls = useMemo(() => ({\n\t\t/**\n\t\t * Manually trigger preloading for specific index\n\t\t */\n\t\tpreloadAtIndex: (index: number) => {\n\t\t\tupdatePreloading(index);\n\t\t},\n\n\t\t/**\n\t\t * Get current user behavior data\n\t\t */\n\t\tgetUserBehavior: () => ({ ...userBehaviorRef.current }),\n\n\t\t/**\n\t\t * Get current network conditions\n\t\t */\n\t\tgetNetworkConditions: getNetworkConditions,\n\n\t\t/**\n\t\t * Clear preloaded items cache\n\t\t */\n\t\tclearCache: () => {\n\t\t\tpreloadedItemsRef.current.clear();\n\t\t},\n\n\t\t/**\n\t\t * Get preloading statistics\n\t\t */\n\t\tgetStats: () => ({\n\t\t\tpreloadedItems: preloadedItemsRef.current.size,\n\t\t\tengagementScore: userBehaviorRef.current.engagementScore,\n\t\t\tqueueLength: preloadQueueRef.current.length,\n\t\t\tmaxPreloadItems,\n\t\t}),\n\t}), [updatePreloading, getNetworkConditions, maxPreloadItems]);\n\n\treturn controls;\n};\n\nexport default useIntelligentPreloading;","import { useState, useCallback, useMemo, useEffect } from \"react\"\n\ninterface SubtitleCue {\n\tstart: number\n\tend: number\n\ttext: string\n}\n\nexport function useSubtitles(subtitleSrc?: string) {\n\tconst [subtitlesEnabled, setSubtitlesEnabled] = useState(false)\n\tconst [subtitleCues, setSubtitleCues] = useState<SubtitleCue[]>([])\n\tconst [currentSubtitle, setCurrentSubtitle] = useState(\"\")\n\n\tconst parseVTTTime = (timeStr: string): number => {\n \t\tconst parts = timeStr.split(\":\")\n \t\tconst seconds = parts[2] ? parseFloat(parts[2]) : 0\n \t\tconst minutes = parts[1] ? parseInt(parts[1], 10) * 60 : 0\n \t\tconst hours = parts[0] ? parseInt(parts[0], 10) * 3600 : 0\n \t\treturn hours + minutes + seconds\n \t}\n\n\tconst loadSubtitles = async (url: string) => {\n \t\ttry {\n \t\t\tconst response = await fetch(url)\n \t\t\tconst text = await response.text()\n\n \t\t\tconst cues: SubtitleCue[] = []\n \t\t\tconst lines = text.split(\"\\n\")\n \t\t\tlet i = 0\n\n \t\t\twhile (i < lines.length) {\n \t\t\t\tif (lines[i]?.includes(\"-->\")) {\n \t\t\t\t\tconst [startStr, endStr] = (lines[i] || \"\").split(\"-->\").map((s) => s.trim())\n \t\t\t\t\tconst start = parseVTTTime(startStr || \"\")\n \t\t\t\t\tconst end = parseVTTTime(endStr || \"\")\n\n \t\t\t\t\ti++\n \t\t\t\t\tlet subtitleText = \"\"\n \t\t\t\t\twhile (i < lines.length && lines[i]?.trim() !== \"\") {\n \t\t\t\t\t\tsubtitleText += (subtitleText ? \" \" : \"\") + lines[i]?.trim()\n \t\t\t\t\t\ti++\n \t\t\t\t\t}\n\n \t\t\t\t\tif (subtitleText) {\n \t\t\t\t\t\tcues.push({ start, end, text: subtitleText })\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\ti++\n \t\t\t}\n\n \t\t\tsetSubtitleCues(cues)\n \t\t} catch (error) {\n \t\t\tconsole.error(\"Failed to load subtitles:\", error)\n \t\t}\n \t}\n\n\tconst getCurrentSubtitle = (currentTime: number) => {\n \t\t\tif (!subtitlesEnabled || subtitleCues.length === 0) return \"\"\n \t\t\t\n \t\t\tconst currentCue = subtitleCues.find(\n \t\t\t\t(cue) => currentTime >= cue.start && currentTime <= cue.end\n \t\t\t)\n \t\t\treturn currentCue?.text || \"\"\n \t\t}\n\n\tconst toggleSubtitles = () => {\n \t\tsetSubtitlesEnabled(prev => {\n \t\t\tconst newEnabled = !prev\n \t\t\tif (newEnabled && subtitleSrc && subtitleCues.length === 0) {\n \t\t\t\tloadSubtitles(subtitleSrc)\n \t\t\t} else if (!newEnabled) {\n \t\t\t\tsetCurrentSubtitle(\"\")\n \t\t\t}\n \t\t\treturn newEnabled\n \t\t})\n \t}\n\n\tuseEffect(() => {\n\t\tif (!subtitlesEnabled) {\n\t\t\tsetCurrentSubtitle(\"\")\n\t\t}\n\t}, [subtitlesEnabled])\n\n\treturn {\n\t\tsubtitlesEnabled,\n\t\tcurrentSubtitle,\n\t\ttoggleSubtitles,\n\t\tgetCurrentSubtitle,\n\t\tsetCurrentSubtitle\n\t}\n}","/**\n * Legacy Hooks (Deprecated)\n * These hooks are wrapped with deprecation warnings\n */\n\nimport { showDeprecationWarning } from \"../lib/deprecation\"\n\n// Import current hooks\nimport { useMediaPlayer } from \"./use-media-player\"\nimport { useSubtitles } from \"./useSubtitles\"\n\n// Legacy hook wrappers with deprecation warnings\nexport function useVideoPlayer(props: any) {\n\tshowDeprecationWarning(\n\t\t\"useVideoPlayer\",\n\t\t\"useMediaPlayer (the primary media player hook)\"\n\t)\n\treturn useMediaPlayer(props)\n}\n\nexport function useEnhancedSubtitles(props: any) {\n\tshowDeprecationWarning(\n\t\t\"useEnhancedSubtitles\",\n\t\t\"useSubtitles (the current subtitle hook)\"\n\t)\n\treturn useSubtitles(props)\n}"],"names":["useKeyboardControls","enabled","state","controls","seekStep","volumeStep","handleKeyDown","event","target","percentage","useEffect","optimisticMediaReducer","action","useMediaOptimistic","store","actualState","React","optimisticState","addOptimistic","useOptimistic","dispatchOptimistic","optimisticActions","volume","time","rate","selectors","formatTime","seconds","mins","secs","hours","createOptimisticAction","type","payload","optimistic","useMediaActionState","actionState","setActionState","newActionState","current","useMediaActions","actions","MediaActionTypes","isPlaying","delta","currentVolume","newVolume","isFullscreen","retryLastAction","lastAction","useEnhancedMediaPlayer","options","mediaRef","useRef","containerRef","isPending","startTransition","useTransition","isSeeking","startSeekTransition","frameCount","lastFrameTime","lastTimeUpdate","useMediaStore","isEnhanced","useMediaSelector","currentTime","duration","isMuted","isLoading","isBuffering","error","buffered","enhancedStore","performanceMetrics","setPerformanceMetrics","optimisticVolume","setOptimisticVolume","newTime","media","initProps","key","value","handleTimeUpdate","useCallback","now","handlePlay","handlePause","handleVolumeChange","handleSeeking","handleSeeked","handleProgress","measureRenderTime","fps","prev","eventListeners","handler","passive","rafId","performanceLoop","useMemo","play","pause","clampedTime","clampedVolume","container","computedState","useMemoryOptimization","maxMemoryUsage","cleanupInterval","enableGC","monitorMemory","observersRef","eventListenersRef","intervalRefs","animationFrameRefs","getMemoryUsage","memory","memoryStats","setMemoryStats","checkMemory","usage","isHighUsage","performCleanup","interval","setInterval","timeout","frameId","observer","listeners","element","addEventListener","index","l","callback","delay","timeoutId","setTimeout","requestAnimationFrame","addObserver","bytes","k","sizes","i","useMediaState","setState","useState","updateState","updates","useMediaPlayer","setPlaying","setCurrentTime","setDuration","setVolume","setMuted","setLoading","setFullscreen","setError","setBuffered","handleDurationChange","handleLoadStart","handleLoadedData","handleError","errorMessage","handleEnded","toggle","seek","setVolumeControl","mute","unmute","toggleMute","enterFullscreen","exitFullscreen","toggleFullscreen","handleFullscreenChange","BREAKPOINTS","detectPlatform","userAgent","isTouchDevice","supportsHaptics","useDeviceInfo","deviceInfo","setDeviceInfo","width","height","updateDeviceInfo","mobileQuery","tabletQuery","desktopQuery","useMobileOptimizations","platform","isMobile","preventZoom","e","useHapticFeedback","pattern","defaultConfig","useTouchGestures","ref","onGesture","config","mergedConfig","triggerHaptic","gestureState","getTouchPoint","touch","getDistance","p1","p2","getVelocity","start","end","timeDiff","createGestureEvent","startPoint","currentPoint","additionalData","handleTouchStart","touches","gestureEvent","handleTouchMove","currentDistance","scale","gestureType","centerPoint","startCenterPoint","startTouch","currentTouch","handleTouchEnd","endTouches","endTouch","distance","velocity","absVelX","absVelY","useMediaGestures","handleGesture","backwardAmount","forwardAmount","volumeAmount","useVideoPlayer","videoRef","video","handleLoadedMetadata","handleWaiting","handlePlaying","handleCanPlay","ranges","useEnhancedSubtitles","subtitleSrc","subtitleTracks","defaultFontSize","onLoadError","subtitlesEnabled","setSubtitlesEnabled","subtitleCues","setSubtitleCues","currentSubtitle","setCurrentSubtitle","currentTrackId","setCurrentTrackId","fontSize","setFontSize","loadError","setLoadError","setIsLoading","sizeMap","hasSubtitles","parseVTTTime","timeStr","parts","minutes","parseSRTTime","ms","milliseconds","loadSubtitles","url","response","text","cues","lines","isVTT","isSRT","startStr","endStr","s","subtitleText","err","getCurrentSubtitle","cue","toggleSubtitles","newEnabled","srcToLoad","selectSubtitleTrack","trackId","track","t","changeSubtitleFontSize","size","getSubtitleStyles","useMediaControls","showSettings","controlsVisible","setControlsVisible","showVolumeSlider","setShowVolumeSlider","hideTimeoutRef","showControls","handleMouseMove","handleMouseEnter","handleMouseLeave","useKeyboardShortcuts","videoControls","takeScreenshot","useScreenshot","ctrlKey","canvas","ctx","blob","item","a","useIntelligentPreloading","sources","trackUserBehavior","adaptToNetwork","strategy","maxPreloadItems","preloadRadius","userBehaviorRef","networkInfoRef","preloadedItemsRef","preloadQueueRef","calculateEngagementScore","behavior","timeFactor","interactionFactor","updateUserBehavior","increment","getNetworkConditions","network","shouldPreloadSource","source","currentIndex","engagementScore","timeSinceInteraction","shouldPreload","priority","reason","networkMultiplier","adjustedScore","preloadSource","link","processPreloadQueue","itemsToPreload","b","updatePreloading","decision","handleScroll","handleKeyPress","handleFocus","timeInterval","handleNetworkChange","useSubtitles","props","showDeprecationWarning"],"mappings":"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"}
|