@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-C_r8wexn.cjs","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","updatePreloading","decision","handleScroll","handleKeyPress","handleFocus","timeInterval","handleNetworkChange","useSubtitles","props","showDeprecationWarning"],"mappings":"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"}
|