@therealtinhtute/baroiplayer 1.2.0 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -73
- package/dist/components/icons/index.d.ts +36 -0
- package/dist/components/icons/index.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts +4 -0
- package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/AudioIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/AudioIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/BackwardIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/BackwardIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/CameraIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/CameraIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/CheckIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/CheckIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts +4 -0
- package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/ForwardIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/ForwardIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/LoadingIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/LoadingIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/PauseIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/PauseIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/PlayIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/PlayIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/QualityIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/QualityIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SettingsIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SettingsIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SliderIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SliderIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SubtitleIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SubtitleIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/UnPiPIcon.d.ts +4 -0
- package/dist/components/icons/svg-icons/UnPiPIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-audio.d.ts +13 -0
- package/dist/components/variants/gradient/gradient-audio.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-controls.d.ts +4 -0
- package/dist/components/variants/gradient/gradient-controls.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-glyphs.d.ts +30 -0
- package/dist/components/variants/gradient/gradient-glyphs.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-video.d.ts +16 -0
- package/dist/components/variants/gradient/gradient-video.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -112
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +786 -6271
- package/dist/index.mjs.map +1 -1
- package/dist/package.json +3 -0
- package/package.json +110 -108
- package/src/components/variants/gradient/gradient-audio.tsx +47 -0
- package/src/components/variants/gradient/gradient-controls.tsx +254 -0
- package/src/components/variants/gradient/gradient-glyphs.test.tsx +69 -0
- package/src/components/variants/gradient/gradient-glyphs.tsx +129 -0
- package/src/components/variants/gradient/gradient-skin.css +211 -0
- package/src/components/variants/gradient/gradient-video.tsx +70 -0
- package/src/index.ts +5 -198
- package/src/test/accessibility-utils.ts +0 -59
- package/dist/context/media.js +0 -2
- package/dist/context/media.js.map +0 -1
- package/dist/context/media.mjs +0 -15
- package/dist/context/media.mjs.map +0 -1
- package/dist/context/store.js +0 -2
- package/dist/context/store.js.map +0 -1
- package/dist/context/store.mjs +0 -5
- package/dist/context/store.mjs.map +0 -1
- package/dist/context-BYwDoSRX.js +0 -1172
- package/dist/context-BYwDoSRX.js.map +0 -1
- package/dist/context-eNS62_ac.cjs +0 -23
- package/dist/context-eNS62_ac.cjs.map +0 -1
- package/dist/core-events-B1iM2F46.cjs +0 -2
- package/dist/core-events-B1iM2F46.cjs.map +0 -1
- package/dist/core-events-DunPHKRE.js +0 -484
- package/dist/core-events-DunPHKRE.js.map +0 -1
- package/dist/core-plugins-By-4-kGs.cjs +0 -2
- package/dist/core-plugins-By-4-kGs.cjs.map +0 -1
- package/dist/core-plugins-DSBWcTuX.js +0 -821
- package/dist/core-plugins-DSBWcTuX.js.map +0 -1
- package/dist/core.js +0 -37
- package/dist/core.js.map +0 -1
- package/dist/core.mjs +0 -1233
- package/dist/core.mjs.map +0 -1
- package/dist/enhanced-components-B_l3cist.js +0 -1142
- package/dist/enhanced-components-B_l3cist.js.map +0 -1
- package/dist/enhanced-components-BspFs9OO.cjs +0 -2
- package/dist/enhanced-components-BspFs9OO.cjs.map +0 -1
- package/dist/hooks-BXwI8QG6.cjs +0 -4
- package/dist/hooks-BXwI8QG6.cjs.map +0 -1
- package/dist/hooks-Bpi-jDiO.js +0 -1816
- package/dist/hooks-Bpi-jDiO.js.map +0 -1
- package/dist/minimal-components-C4z900Ro.js +0 -1926
- package/dist/minimal-components-C4z900Ro.js.map +0 -1
- package/dist/minimal-components-v4qBp6jv.cjs +0 -2
- package/dist/minimal-components-v4qBp6jv.cjs.map +0 -1
- package/dist/minimal-components.css +0 -1
- package/dist/mona-loading.gif +0 -0
- package/dist/performance-monitor-C5k6FDXw.js +0 -301
- package/dist/performance-monitor-C5k6FDXw.js.map +0 -1
- package/dist/performance-monitor-lJmuUjQQ.cjs +0 -2
- package/dist/performance-monitor-lJmuUjQQ.cjs.map +0 -1
- package/dist/utils-CFOue_9K.cjs +0 -9
- package/dist/utils-CFOue_9K.cjs.map +0 -1
- package/dist/utils-Dzpl2ArK.js +0 -2844
- package/dist/utils-Dzpl2ArK.js.map +0 -1
- package/dist/utils.js +0 -2
- package/dist/utils.js.map +0 -1
- package/dist/utils.mjs +0 -11
- package/dist/utils.mjs.map +0 -1
- package/src/adapters/videojs-adapter.tsx +0 -470
- package/src/assets/mona-loading.gif +0 -0
- package/src/components/AnimateLoading.tsx +0 -107
- package/src/components/LoadingState.tsx +0 -239
- package/src/components/__tests__/media-player-accessibility.test.tsx +0 -510
- package/src/components/__tests__/media-player-react19.test.tsx +0 -457
- package/src/components/accessibility/keyboard-help-overlay.tsx +0 -207
- package/src/components/audio-player.tsx +0 -85
- package/src/components/basic/index.ts +0 -37
- package/src/components/enhanced/advanced-features.tsx +0 -311
- package/src/components/enhanced/debug-panel.tsx +0 -448
- package/src/components/enhanced/enhanced-controls.tsx +0 -597
- package/src/components/enhanced/enhanced-media-player.tsx +0 -566
- package/src/components/enhanced/error-handling.tsx +0 -338
- package/src/components/enhanced/index.ts +0 -39
- package/src/components/enhanced/media-player-enhanced.tsx +0 -383
- package/src/components/examples/basic-video-player.tsx +0 -50
- package/src/components/examples/custom-controls-example.tsx +0 -63
- package/src/components/examples/enhanced-controls-example.tsx +0 -100
- package/src/components/examples/enhanced-media-player-example.tsx +0 -302
- package/src/components/examples/loading-states-demo.tsx +0 -142
- package/src/components/examples/react-19-demo.tsx +0 -353
- package/src/components/examples/volume-orientation-demo.tsx +0 -106
- package/src/components/icon-demo.tsx +0 -196
- package/src/components/legacy.tsx +0 -87
- package/src/components/media-metadata-display.tsx +0 -99
- package/src/components/media-player-audio.tsx +0 -39
- package/src/components/media-player-controls.tsx +0 -223
- package/src/components/media-player-error.tsx +0 -163
- package/src/components/media-player-fullscreen.tsx +0 -109
- package/src/components/media-player-hls.tsx +0 -111
- package/src/components/media-player-loading.tsx +0 -76
- package/src/components/media-player-play.tsx +0 -75
- package/src/components/media-player-root.tsx +0 -338
- package/src/components/media-player-seek.tsx +0 -168
- package/src/components/media-player-time.tsx +0 -99
- package/src/components/media-player-tooltip.tsx +0 -58
- package/src/components/media-player-video.tsx +0 -54
- package/src/components/media-player-volume.tsx +0 -155
- package/src/components/media-player.tsx +0 -292
- package/src/components/media-suspense.tsx +0 -344
- package/src/components/player-settings-form.tsx +0 -158
- package/src/components/react-player-wrapper.tsx +0 -651
- package/src/components/simple-video-player.tsx +0 -62
- package/src/components/ui/blur-poster.tsx +0 -93
- package/src/components/ui/empty-state.tsx +0 -91
- package/src/components/ui/enhanced-seek-bar.tsx +0 -254
- package/src/components/ui/error-state.tsx +0 -124
- package/src/components/ui/fullscreen-button.tsx +0 -81
- package/src/components/ui/loading-skeleton.tsx +0 -107
- package/src/components/ui/media-resource-preloader.tsx +0 -458
- package/src/components/ui/offline-message.tsx +0 -98
- package/src/components/ui/play-button.tsx +0 -99
- package/src/components/ui/seek-bar.tsx +0 -191
- package/src/components/ui/time-display.tsx +0 -61
- package/src/components/ui/volume-control.tsx +0 -190
- package/src/components/unified/base-media-player.tsx +0 -252
- package/src/components/unified/media-player.tsx +0 -75
- package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +0 -587
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +0 -573
- package/src/components/variants/minimal/MinimalControls.tsx +0 -124
- package/src/components/variants/minimal/MinimalLoading.tsx +0 -28
- package/src/components/variants/minimal/MinimalMediaPlayer.tsx +0 -318
- package/src/components/variants/minimal/MinimalOverlay.tsx +0 -58
- package/src/components/variants/minimal/MinimalPlayButton.tsx +0 -56
- package/src/components/variants/minimal/MinimalSeekBar.tsx +0 -140
- package/src/components/variants/minimal/MinimalVolumeControl.tsx +0 -75
- package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +0 -206
- package/src/components/variants/minimal/components/CenterPlayButton.tsx +0 -22
- package/src/components/variants/minimal/components/ControlBar.tsx +0 -142
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +0 -412
- package/src/components/variants/minimal/components/PlaybackControls.tsx +0 -46
- package/src/components/variants/minimal/components/RightControls.tsx +0 -164
- package/src/components/variants/minimal/components/SeekBar.tsx +0 -127
- package/src/components/variants/minimal/components/SettingsDropdown.tsx +0 -68
- package/src/components/variants/minimal/components/SubtitleDisplay.tsx +0 -21
- package/src/components/variants/minimal/components/TimeDisplay.tsx +0 -15
- package/src/components/variants/minimal/components/VideoElement.tsx +0 -33
- package/src/components/variants/minimal/components/VolumeControl.tsx +0 -220
- package/src/components/variants/minimal/index.ts +0 -23
- package/src/components/video-player.tsx +0 -100
- package/src/context/__tests__/media-store.test.ts +0 -509
- package/src/context/error-handling.ts +0 -398
- package/src/context/media-context.tsx +0 -254
- package/src/context/media-provider.tsx +0 -264
- package/src/context/media-store.ts +0 -387
- package/src/context/persistence.ts +0 -462
- package/src/core/events/event-system.ts +0 -448
- package/src/core/events/hooks.ts +0 -325
- package/src/core/events/index.ts +0 -22
- package/src/core/events/middleware.ts +0 -286
- package/src/core/index.ts +0 -22
- package/src/core/optimization/bundle-optimizer.tsx +0 -312
- package/src/core/performance/cicd.ts +0 -98
- package/src/core/performance/index.ts +0 -38
- package/src/core/performance/media-loading-optimizer.ts +0 -544
- package/src/core/performance/performance-budgets.ts +0 -437
- package/src/core/performance/performance-monitor.tsx +0 -488
- package/src/core/performance/performance-testing.ts +0 -461
- package/src/core/plugins/__tests__/registry.test.ts +0 -595
- package/src/core/plugins/base-plugin.ts +0 -225
- package/src/core/plugins/enhanced-plugin-system.ts +0 -435
- package/src/core/plugins/examples/analytics-plugin.ts +0 -241
- package/src/core/plugins/index.ts +0 -39
- package/src/core/plugins/registry.ts +0 -546
- package/src/core/plugins/types.ts +0 -169
- package/src/core/plugins/utils.ts +0 -317
- package/src/core/progressive-loading.tsx +0 -331
- package/src/core/providers/enhanced-hls-provider.ts +0 -307
- package/src/core/providers/lazy-provider.tsx +0 -14
- package/src/core/providers/service-provider.tsx +0 -164
- package/src/core/utils.tsx +0 -34
- package/src/features/media-session/media-session-manager.ts +0 -411
- package/src/features/picture-in-picture/pip-manager.ts +0 -428
- package/src/features/playlist/playlist-manager.ts +0 -626
- package/src/features/subtitles/subtitle-manager.ts +0 -435
- package/src/features/subtitles/subtitle-parser.ts +0 -284
- package/src/features/thumbnails/thumbnail-generator.ts +0 -528
- package/src/hooks/__tests__/currentTime-fix.test.ts +0 -149
- package/src/hooks/__tests__/use-media-player.test.ts +0 -712
- package/src/hooks/__tests__/use-media-state.test.tsx +0 -316
- package/src/hooks/accessibility/index.ts +0 -27
- package/src/hooks/accessibility/use-accessibility-preferences.ts +0 -190
- package/src/hooks/accessibility/use-focus-management.ts +0 -183
- package/src/hooks/accessibility/use-keyboard-shortcuts.ts +0 -152
- package/src/hooks/accessibility/use-screen-reader.ts +0 -212
- package/src/hooks/core/index.ts +0 -47
- package/src/hooks/legacy.ts +0 -21
- package/src/hooks/use-buffer-health.ts +0 -218
- package/src/hooks/use-enhanced-media-player.ts +0 -575
- package/src/hooks/use-focus-trap.tsx +0 -162
- package/src/hooks/use-intelligent-preloading.ts +0 -387
- package/src/hooks/use-keyboard-controls.ts +0 -115
- package/src/hooks/use-keyboard-shortcuts.ts +0 -255
- package/src/hooks/use-media-actions.ts +0 -184
- package/src/hooks/use-media-metadata.ts +0 -91
- package/src/hooks/use-media-optimistic.ts +0 -264
- package/src/hooks/use-media-player.ts +0 -343
- package/src/hooks/use-media-state.ts +0 -194
- package/src/hooks/use-memory-optimization.ts +0 -360
- package/src/hooks/use-network-status.ts +0 -124
- package/src/hooks/use-optimistic-controls.ts +0 -95
- package/src/hooks/use-optimized-media.ts +0 -283
- package/src/hooks/use-smart-preload.ts +0 -229
- package/src/hooks/use-touch-gestures.ts +0 -461
- package/src/hooks/useEnhancedSubtitles.ts +0 -258
- package/src/hooks/useKeyboardShortcuts.ts +0 -106
- package/src/hooks/useMediaControls.ts +0 -52
- package/src/hooks/useScreenshot.ts +0 -61
- package/src/hooks/useSubtitles.ts +0 -91
- package/src/hooks/useVideoPlayer.ts +0 -278
- package/src/icons/components/FullscreenIcon.tsx +0 -36
- package/src/icons/components/SettingsIcon.tsx +0 -37
- package/src/icons/components/animated/LoadingIcon.tsx +0 -27
- package/src/icons/components/animated/PlayPauseIcon.tsx +0 -42
- package/src/icons/components/media/PauseIcon.tsx +0 -38
- package/src/icons/components/media/PlayIcon.tsx +0 -37
- package/src/icons/components/volume/VolumeIcon.tsx +0 -38
- package/src/icons/components/volume/VolumeOffIcon.tsx +0 -38
- package/src/icons/index.ts +0 -56
- package/src/icons/provider.tsx +0 -58
- package/src/icons/types.ts +0 -60
- package/src/index-enhanced.ts +0 -35
- package/src/index-legacy.ts +0 -324
- package/src/index.css +0 -102
- package/src/lib/__tests__/async-utils.test.ts +0 -291
- package/src/lib/async-utils.ts +0 -194
- package/src/lib/deprecation.ts +0 -51
- package/src/lib/format-time.ts +0 -37
- package/src/lib/index.ts +0 -4
- package/src/lib/utils.ts +0 -6
- package/src/styles/globals.css +0 -462
- package/src/styles/minimal-player.css +0 -621
- package/src/styles/pixel-art.css +0 -41
- package/src/styles/videojs.css +0 -100
- package/src/types/events.ts +0 -47
- package/src/types/formats.ts +0 -79
- package/src/types/index.ts +0 -203
- package/src/types/videojs-plugins.d.ts +0 -14
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"minimal-components-C4z900Ro.js","sources":["../src/components/media-player-root.tsx","../src/components/icons/svg-icons/BackwardIcon.tsx","../src/components/icons/svg-icons/CameraIcon.tsx","../src/components/icons/svg-icons/ForwardIcon.tsx","../src/components/icons/svg-icons/FullscreenEnterIcon.tsx","../src/components/icons/svg-icons/FullscreenExitIcon.tsx","../src/components/icons/svg-icons/LoadingIcon.tsx","../src/components/icons/svg-icons/PauseIcon.tsx","../src/components/icons/svg-icons/PlayIcon.tsx","../src/components/icons/svg-icons/SettingsIcon.tsx","../src/components/icons/svg-icons/SubtitleIcon.tsx","../src/components/icons/svg-icons/VolumeMutedIcon.tsx","../src/components/icons/svg-icons/VolumeTwoIcon.tsx","../src/components/icons/index.tsx","../src/components/media-player-video.tsx","../src/components/media-player-time.tsx","../src/components/variants/minimal/MinimalPlayButton.tsx","../src/components/variants/minimal/MinimalSeekBar.tsx","../src/components/variants/minimal/MinimalVolumeControl.tsx","../src/components/variants/minimal/MinimalControls.tsx","../src/components/variants/minimal/MinimalLoading.tsx","../src/components/variants/minimal/MinimalOverlay.tsx","../src/components/variants/minimal/MinimalMediaPlayer.tsx","../src/assets/mona-loading.gif","../src/components/AnimateLoading.tsx","../src/components/LoadingState.tsx","../src/components/variants/minimal/components/CenterPlayButton.tsx","../src/components/variants/minimal/components/PlaybackControls.tsx","../src/components/variants/minimal/components/SettingsDropdown.tsx","../src/components/variants/minimal/components/RightControls.tsx","../src/components/variants/minimal/components/SeekBar.tsx","../src/components/variants/minimal/components/TimeDisplay.tsx","../src/components/variants/minimal/components/VolumeControl.tsx","../src/components/variants/minimal/components/ControlBar.tsx","../src/components/variants/minimal/components/SubtitleDisplay.tsx","../src/components/variants/minimal/components/VideoElement.tsx","../src/components/variants/minimal/SimpleMinimalPlayer.tsx"],"sourcesContent":["\"use client\"\n\nimport { useDeviceInfo, useMobileOptimizations } from \"@rp/ui/hooks/use-mobile\"\nimport React from \"react\"\nimport {\n\tMediaActionTypes,\n\tuseMediaContext,\n\tuseMediaDispatch,\n\tuseMediaSelector\n} from \"../context/media-context\"\nimport { MediaProvider } from \"../context/media-provider\"\nimport { useMediaGestures } from \"../hooks/use-touch-gestures\"\nimport { cn } from \"../lib/utils\"\n\n// Utility function to compose refs\nfunction composeRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n\treturn (node: T) => {\n\t\trefs.forEach((ref) => {\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(node)\n\t\t\t} else if (ref && typeof ref === \"object\") {\n\t\t\t\t;(ref as React.MutableRefObject<T>).current = node\n\t\t\t}\n\t\t})\n\t}\n}\n\n// MediaPlayer root component props\nexport interface MediaPlayerRootProps {\n\tchildren: React.ReactNode\n\tclassName?: string\n\tdir?: \"ltr\" | \"rtl\"\n\tdisabled?: boolean\n\tasChild?: boolean\n\tautoHide?: boolean\n\ttooltipDelayDuration?: number\n\ttooltipSideOffset?: number\n\twithoutTooltip?: boolean\n\n\t// Mobile-first options\n\tenableGestures?: boolean\n\tenableMobileOptimizations?: boolean\n\n\t// Media event handlers\n\tonPlay?: () => void\n\tonPause?: () => void\n\tonEnded?: () => void\n\tonTimeUpdate?: (currentTime: number) => void\n\tonVolumeChange?: (volume: number) => void\n\tonMuted?: (muted: boolean) => void\n\tonMediaError?: (error: string) => void\n\tonPipError?: (error: Error) => void\n\tonFullscreenChange?: (isFullscreen: boolean) => void\n}\n\n// Internal MediaPlayer implementation\nfunction MediaPlayerImpl({\n\tchildren,\n\tclassName,\n\tdir = \"ltr\",\n\tdisabled = false,\n\tasChild = false,\n\tautoHide = true,\n\tenableGestures = true,\n\tenableMobileOptimizations = true,\n\tonPlay,\n\tonPause,\n\tonEnded,\n\tonTimeUpdate,\n\tonVolumeChange,\n\tonMuted,\n\tonMediaError,\n\tonPipError,\n\tonFullscreenChange,\n\t...props\n}: MediaPlayerRootProps) {\n\tconst context = useMediaContext()\n\tconst dispatch = useMediaDispatch()\n\tconst { isTouchDevice } = useDeviceInfo()\n\n\t// Get state values\n\tconst isPlaying = useMediaSelector((state) => state.isPlaying)\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst volume = useMediaSelector((state) => state.volume)\n\tconst isMuted = useMediaSelector((state) => state.isMuted)\n\tconst error = useMediaSelector((state) => state.error)\n\tconst isFullscreen = useMediaSelector((state) => state.isFullscreen)\n\tconst isPictureInPicture = useMediaSelector((state) => state.isPictureInPicture)\n\n\t// Enable mobile optimizations\n\tuseMobileOptimizations()\n\n\t// Gesture handling actions - React 19 compiler will optimize this\n\tconst gestureActions = {\n\t\tonPlayPause: () => {\n\t\t\tif (disabled) return\n\t\t\tdispatch({\n\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t})\n\t\t},\n\t\tonSeek: (direction: \"forward\" | \"backward\", amount: number) => {\n\t\t\tif (disabled || !context.isVideo) return\n\t\t\tconst mediaElement = context.mediaRef.current\n\t\t\tif (!mediaElement) return\n\n\t\t\tconst newTime =\n\t\t\t\tdirection === \"forward\"\n\t\t\t\t\t? Math.min(mediaElement.duration || 0, currentTime + amount)\n\t\t\t\t\t: Math.max(0, currentTime - amount)\n\n\t\t\tdispatch({\n\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\tdetail: newTime\n\t\t\t})\n\t\t},\n\t\tonVolumeChange: (direction: \"up\" | \"down\", amount: number) => {\n\t\t\tif (disabled) return\n\t\t\tconst newVolume =\n\t\t\t\tdirection === \"up\" ? Math.min(1, volume + amount) : Math.max(0, volume - amount)\n\n\t\t\tdispatch({\n\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\tdetail: newVolume\n\t\t\t})\n\t\t},\n\t\tonToggleFullscreen: () => {\n\t\t\tif (disabled || !context.isVideo) return\n\t\t\tdispatch({\n\t\t\t\ttype: isFullscreen ? MediaActionTypes.EXIT_FULLSCREEN : MediaActionTypes.ENTER_FULLSCREEN\n\t\t\t})\n\t\t},\n\t\tonZoom: (scale: number) => {\n\t\t\t// Handle video zoom - this could be implemented with CSS transforms\n\t\t\t// For now, we'll just log it as a placeholder\n\t\t\tconsole.log(\"Zoom gesture detected:\", scale)\n\t\t}\n\t}\n\n\t// Set up touch gestures for mobile devices\n\tconst { isGestureEnabled } = useMediaGestures(\n\t\tcontext.rootRef as React.RefObject<HTMLElement>,\n\t\tenableGestures ? gestureActions : {}\n\t)\n\n\t// Keyboard event handler - React 19 compiler will optimize this\n\tconst handleKeyDown = (event: React.KeyboardEvent) => {\n\t\tif (disabled) return\n\n\t\tconst target = event.target as HTMLElement\n\t\tconst isInputElement =\n\t\t\ttarget.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\" || target.isContentEditable\n\n\t\tif (isInputElement) return\n\n\t\tconst mediaElement = context.mediaRef.current\n\t\tif (!mediaElement) return\n\n\t\tswitch (event.code) {\n\t\t\tcase \"Space\":\n\t\t\tcase \"KeyK\":\n\t\t\t\tevent.preventDefault()\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t\t})\n\t\t\t\tbreak\n\n\t\t\tcase \"KeyF\":\n\t\t\t\tevent.preventDefault()\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: isFullscreen ? MediaActionTypes.EXIT_FULLSCREEN : MediaActionTypes.ENTER_FULLSCREEN\n\t\t\t\t})\n\t\t\t\tbreak\n\n\t\t\tcase \"KeyM\":\n\t\t\t\tevent.preventDefault()\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.TOGGLE_MUTE\n\t\t\t\t})\n\t\t\t\tbreak\n\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tevent.preventDefault()\n\t\t\t\tif (context.isVideo && mediaElement instanceof HTMLVideoElement) {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: Math.max(0, currentTime - 10)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tevent.preventDefault()\n\t\t\t\tif (context.isVideo && mediaElement instanceof HTMLVideoElement) {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: Math.min(mediaElement.duration || 0, currentTime + 10)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tevent.preventDefault()\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\tdetail: Math.min(1, volume + 0.1)\n\t\t\t\t})\n\t\t\t\tbreak\n\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tevent.preventDefault()\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\tdetail: Math.max(0, volume - 0.1)\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t// Set up media element event listeners\n\tReact.useEffect(() => {\n\t\tconst mediaElement = context.mediaRef.current\n\t\tif (!mediaElement) return\n\n\t\tconst handlePlay = () => {\n\t\t\tdispatch({ type: MediaActionTypes.PLAY })\n\t\t\tonPlay?.()\n\t\t}\n\n\t\tconst handlePause = () => {\n\t\t\tdispatch({ type: MediaActionTypes.PAUSE })\n\t\t\tonPause?.()\n\t\t}\n\n\t\tconst handleEnded = () => {\n\t\t\tdispatch({ type: MediaActionTypes.PAUSE })\n\t\t\tonEnded?.()\n\t\t}\n\n\t\tconst handleTimeUpdate = () => {\n\t\t\tconst time = mediaElement.currentTime\n\t\t\tdispatch({ type: MediaActionTypes.SET_CURRENT_TIME, detail: time })\n\t\t\tonTimeUpdate?.(time)\n\t\t}\n\n\t\tconst handleVolumeChange = () => {\n\t\t\tconst vol = mediaElement.volume\n\t\t\tconst muted = mediaElement.muted\n\t\t\tdispatch({ type: MediaActionTypes.SET_VOLUME, detail: vol })\n\t\t\tdispatch({ type: muted ? MediaActionTypes.MUTE : MediaActionTypes.UNMUTE })\n\t\t\tonVolumeChange?.(vol)\n\t\t\tonMuted?.(muted)\n\t\t}\n\n\t\tconst handleLoadedMetadata = () => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_DURATION, detail: mediaElement.duration })\n\t\t\tdispatch({ type: MediaActionTypes.SET_LOADING, detail: false })\n\t\t}\n\n\t\tconst handleError = () => {\n\t\t\tconst errorMessage = \"An error occurred while loading the media\"\n\t\t\tdispatch({ type: MediaActionTypes.SET_ERROR, detail: errorMessage })\n\t\t\tonMediaError?.(errorMessage)\n\t\t}\n\n\t\tconst handleLoadStart = () => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_LOADING, detail: true })\n\t\t}\n\n\t\t// Add event listeners\n\t\tmediaElement.addEventListener(\"play\", handlePlay)\n\t\tmediaElement.addEventListener(\"pause\", handlePause)\n\t\tmediaElement.addEventListener(\"ended\", handleEnded)\n\t\tmediaElement.addEventListener(\"timeupdate\", handleTimeUpdate)\n\t\tmediaElement.addEventListener(\"volumechange\", handleVolumeChange)\n\t\tmediaElement.addEventListener(\"loadedmetadata\", handleLoadedMetadata)\n\t\tmediaElement.addEventListener(\"error\", handleError)\n\t\tmediaElement.addEventListener(\"loadstart\", handleLoadStart)\n\n\t\treturn () => {\n\t\t\tmediaElement.removeEventListener(\"play\", handlePlay)\n\t\t\tmediaElement.removeEventListener(\"pause\", handlePause)\n\t\t\tmediaElement.removeEventListener(\"ended\", handleEnded)\n\t\t\tmediaElement.removeEventListener(\"timeupdate\", handleTimeUpdate)\n\t\t\tmediaElement.removeEventListener(\"volumechange\", handleVolumeChange)\n\t\t\tmediaElement.removeEventListener(\"loadedmetadata\", handleLoadedMetadata)\n\t\t\tmediaElement.removeEventListener(\"error\", handleError)\n\t\t\tmediaElement.removeEventListener(\"loadstart\", handleLoadStart)\n\t\t}\n\t}, [dispatch, onPlay, onPause, onEnded, onTimeUpdate, onVolumeChange, onMuted, onMediaError])\n\n\tconst rootProps = {\n\t\t\"aria-labelledby\": context.labelId,\n\t\t\"aria-describedby\": context.descriptionId,\n\t\t\"aria-disabled\": disabled,\n\t\t\"data-disabled\": disabled ? \"\" : undefined,\n\t\t\"data-slot\": \"media-player\",\n\t\t\"data-state\": isFullscreen ? \"fullscreen\" : \"inline\",\n\t\tdir,\n\t\ttabIndex: disabled ? -1 : 0,\n\t\tclassName: cn(\n\t\t\t\"dark relative isolate flex flex-col overflow-hidden rounded-lg bg-background outline-none\",\n\t\t\t\"focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50\",\n\t\t\t\"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\t\t\t\"[&_video]:relative [&_video]:object-contain\",\n\t\t\t\"data-[state=fullscreen]:[&_video]:size-full\",\n\t\t\t\"[:fullscreen_&]:flex [:fullscreen_&]:h-full [:fullscreen_&]:max-h-screen [:fullscreen_&]:flex-col [:fullscreen_&]:justify-between\",\n\t\t\t// Mobile-first optimizations\n\t\t\tisTouchDevice && [\n\t\t\t\t\"touch-manipulation\", // Improves touch responsiveness\n\t\t\t\t\"select-none\", // Prevents text selection during gestures\n\t\t\t\t\"overscroll-contain\" // Prevents scroll chaining\n\t\t\t],\n\t\t\t// Enable hardware acceleration for smooth animations\n\t\t\t\"will-change-transform\",\n\t\t\t\"transform-gpu\",\n\t\t\tclassName\n\t\t),\n\t\tonKeyDown: handleKeyDown,\n\t\t...props\n\t}\n\n\treturn (\n\t\t<div ref={composeRefs(context.rootRef)} {...rootProps}>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\n// Main MediaPlayer component with provider\nexport function MediaPlayerRoot(props: MediaPlayerRootProps) {\n\treturn (\n\t\t<MediaProvider>\n\t\t\t<MediaPlayerImpl {...props} />\n\t\t</MediaProvider>\n\t)\n}\n\nMediaPlayerRoot.displayName = \"MediaPlayerRoot\"\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst BackwardIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M3 2.25a1 1 0 0 0-1 1V9a1 1 0 0 0 1 1h5.25a1 1 0 0 0 0-2H4.863c.985-1.179 2.208-2.113 3.682-2.57a9.435 9.435 0 0 1 6.106.16c1.981.738 3.81 2.232 4.722 3.894a1 1 0 1 0 1.754-.961c-1.175-2.143-3.415-3.927-5.778-4.807a11.435 11.435 0 0 0-7.395-.196C6.378 4.008 5.068 4.9 4 5.979V3.25a1 1 0 0 0-1-1ZM9.75 12a1 1 0 0 0-1.762-.647l-.222.265c-.515.623-1.078 1.303-2.28 2.024a1 1 0 1 0 1.029 1.716c.483-.29.889-.582 1.235-.865V20a1 1 0 0 0 2 0v-8Zm6.5-1c-1.386 0-2.4.635-3.008 1.661c-.564.95-.742 2.161-.742 3.339s.178 2.39.742 3.339C13.85 20.365 14.864 21 16.25 21s2.4-.635 3.008-1.661c.564-.95.742-2.161.742-3.339s-.178-2.39-.742-3.339C18.65 11.635 17.636 11 16.25 11Zm-1.75 5c0-1.031.166-1.82.461-2.318c.251-.422.613-.682 1.289-.682c.676 0 1.038.26 1.288.682c.296.498.462 1.287.462 2.318c0 1.031-.166 1.82-.462 2.318c-.25.422-.612.682-1.288.682s-1.038-.26-1.289-.682c-.295-.498-.461-1.287-.461-2.318Z\"></path>\n\t</svg>\n)\n\nexport default BackwardIcon\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst CameraIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg\n\t\twidth={32}\n\t\theight={32}\n\t\tviewBox=\"0 0 24 24\"\n\t\tstyle={{ width: \"100%\", height: \"100%\" }}\n\t\t{...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M12 18q2.075 0 3.538-1.462Q17 15.075 17 13q0-2.075-1.462-3.538Q14.075 8 12 8 9.925 8 8.463 9.462 7 10.925 7 13q0 2.075 1.463 3.538Q9.925 18 12 18Zm0-2q-1.25 0-2.125-.875T9 13q0-1.25.875-2.125T12 10q1.25 0 2.125.875T15 13q0 1.25-.875 2.125T12 16Zm6-6q.425 0 .712-.288Q19 9.425 19 9t-.288-.713Q18.425 8 18 8t-.712.287Q17 8.575 17 9t.288.712Q17.575 10 18 10ZM4 21q-.825 0-1.412-.587Q2 19.825 2 19V7q0-.825.588-1.412Q3.175 5 4 5h3.15L8.7 3.325q.15-.15.337-.238Q9.225 3 9.425 3h5.15q.2 0 .388.087.187.088.337.238L16.85 5H20q.825 0 1.413.588Q22 6.175 22 7v12q0 .825-.587 1.413Q20.825 21 20 21Zm16-2V7h-4.05l-1.825-2h-4.25L8.05 7H4v12Zm-8-6Z\"\n\t\t/>\n\t</svg>\n)\n\nconst Memo = CameraIcon\nexport default Memo\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst ForwardIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M21 2.25a1 1 0 0 1 1 1V9a1 1 0 0 1-1 1h-5.25a1 1 0 0 1 0-2h3.387c-.985-1.179-2.208-2.113-3.682-2.57a9.435 9.435 0 0 0-6.106.16c-1.981.738-3.81 2.232-4.722 3.894a1 1 0 0 1-1.754-.961C4.048 6.38 6.288 4.596 8.652 3.716a11.435 11.435 0 0 1 7.394-.196c1.576.488 2.886 1.38 3.954 2.459V3.25a1 1 0 0 1 1-1ZM9.095 11.061A1 1 0 0 1 9.75 12v8a1 1 0 0 1-2 0v-5.507c-.346.283-.752.575-1.235.864a1 1 0 1 1-1.03-1.715c1.203-.721 1.766-1.4 2.281-2.024c.074-.09.148-.178.222-.265a1 1 0 0 1 1.107-.292Zm4.147 1.6C13.85 11.635 14.864 11 16.25 11s2.4.635 3.008 1.661c.564.95.742 2.161.742 3.339s-.178 2.39-.742 3.339C18.65 20.365 17.636 21 16.25 21s-2.4-.636-3.008-1.661c-.564-.95-.742-2.161-.742-3.339s.178-2.39.742-3.339Zm1.72 1.021c-.296.498-.462 1.287-.462 2.318c0 1.031.166 1.82.461 2.318c.251.422.613.682 1.289.682c.676 0 1.038-.26 1.288-.682c.296-.498.462-1.287.462-2.318c0-1.031-.166-1.82-.462-2.318c-.25-.422-.612-.682-1.288-.682s-1.038.26-1.289.682Z\"></path>\n\t</svg>\n)\n\nexport default ForwardIcon\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst FullscreenEnterIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg\n\t\twidth=\"24\"\n\t\theight=\"24\"\n\t\tviewBox=\"0 0 24 24\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tdata-uia=\"control-fullscreen-enter\"\n\t\tstyle={{ width: \"100%\", height: \"100%\" }}\n\t\t{...props}>\n\t\t<path\n\t\t\tfillRule=\"evenodd\"\n\t\t\tclipRule=\"evenodd\"\n\t\t\td=\"M0 5a2 2 0 0 1 2-2h7v2H2v4H0V5Zm22 0h-7V3h7a2 2 0 0 1 2 2v4h-2V5ZM2 15v4h7v2H2a2 2 0 0 1-2-2v-4h2Zm20 4v-4h2v4a2 2 0 0 1-2 2h-7v-2h7Z\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t</svg>\n)\n\nexport default FullscreenEnterIcon\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst FullscreenExitIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg\n\t\twidth=\"24\"\n\t\theight=\"24\"\n\t\tviewBox=\"0 0 24 24\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tdata-uia=\"control-fullscreen-exit\"\n\t\tstyle={{ width: \"100%\", height: \"100%\" }}\n\t\t{...props}>\n\t\t<path\n\t\t\tfillRule=\"evenodd\"\n\t\t\tclipRule=\"evenodd\"\n\t\t\td=\"M24 8h-5V3h-2v7h7V8ZM0 16h5v5h2v-7H0v2Zm7-6H0V8h5V3h2v7Zm12 11v-5h5v-2h-7v7h2Z\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t</svg>\n)\n\nexport default FullscreenExitIcon\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst LoadingIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg\n\t\twidth=\"24\"\n\t\theight=\"24\"\n\t\tviewBox=\"0 0 24 24\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tclassName=\"svg-icon-nfplayerPlay\"\n\t\tstyle={{ width: \"100%\", height: \"100%\" }}\n\t\t{...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M12 2A10 10 0 1 0 22 12A10 10 0 0 0 12 2Zm0 18a8 8 0 1 1 8-8A8 8 0 0 1 12 20Z\"\n\t\t\topacity=\".5\"\n\t\t/>\n\t\t<path fill=\"currentColor\" d=\"M20 12h2A10 10 0 0 0 12 2V4A8 8 0 0 1 20 12Z\">\n\t\t\t<animateTransform\n\t\t\t\tattributeName=\"transform\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\tfrom=\"0 12 12\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tto=\"360 12 12\"\n\t\t\t\ttype=\"rotate\"\n\t\t\t/>\n\t\t</path>\n\t</svg>\n)\n\nexport default LoadingIcon\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst PauseIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg\n\t\twidth=\"24\"\n\t\theight=\"24\"\n\t\tviewBox=\"0 0 24 24\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tclassName=\"svg-icon-nfplayerPause\"\n\t\tstyle={{ width: \"100%\", height: \"100%\" }}\n\t\t{...props}>\n\t\t<path\n\t\t\tfillRule=\"evenodd\"\n\t\t\tclipRule=\"evenodd\"\n\t\t\td=\"M4.5 3a.5.5 0 0 0-.5.5v17a.5.5 0 0 0 .5.5h5a.5.5 0 0 0 .5-.5v-17a.5.5 0 0 0-.5-.5h-5Zm10 0a.5.5 0 0 0-.5.5v17a.5.5 0 0 0 .5.5h5a.5.5 0 0 0 .5-.5v-17a.5.5 0 0 0-.5-.5h-5Z\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t</svg>\n)\n\nexport default PauseIcon\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst PlayIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg\n\t\twidth=\"24\"\n\t\theight=\"24\"\n\t\tviewBox=\"0 0 24 24\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tclassName=\"svg-icon-nfplayerPlay\"\n\t\tstyle={{ width: \"100%\", height: \"100%\" }}\n\t\t{...props}>\n\t\t<path\n\t\t\td=\"M4 2.691a1 1 0 0 1 1.482-.876l16.925 9.309a1 1 0 0 1 0 1.752L5.482 22.185A1 1 0 0 1 4 21.309V2.69Z\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t</svg>\n)\n\nexport default PlayIcon\n","import * as React from \"react\"\nimport { SVGProps } from \"react\"\n\nconst SettingsIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M2 12c0-.865.11-1.703.316-2.504A3 3 0 0 0 4.99 4.867a9.99 9.99 0 0 1 4.335-2.505a3 3 0 0 0 5.348 0a9.99 9.99 0 0 1 4.335 2.505a3 3 0 0 0 2.675 4.63a10.036 10.036 0 0 1 0 5.007a3 3 0 0 0-2.675 4.629a9.99 9.99 0 0 1-4.335 2.505a3 3 0 0 0-5.348 0a9.99 9.99 0 0 1-4.335-2.505a3 3 0 0 0-2.675-4.63A10.056 10.056 0 0 1 2 12zm4.804 3c.63 1.091.81 2.346.564 3.524c.408.29.842.541 1.297.75A4.993 4.993 0 0 1 12 18c1.26 0 2.438.471 3.335 1.274c.455-.209.889-.46 1.297-.75A4.993 4.993 0 0 1 17.196 15a4.993 4.993 0 0 1 2.77-2.25a8.126 8.126 0 0 0 0-1.5A4.993 4.993 0 0 1 17.195 9a4.993 4.993 0 0 1-.564-3.524a7.989 7.989 0 0 0-1.297-.75A4.993 4.993 0 0 1 12 6a4.993 4.993 0 0 1-3.335-1.274a7.99 7.99 0 0 0-1.297.75A4.993 4.993 0 0 1 6.804 9a4.993 4.993 0 0 1-2.77 2.25a8.126 8.126 0 0 0 0 1.5A4.993 4.993 0 0 1 6.805 15zM12 15a3 3 0 1 1 0-6a3 3 0 0 1 0 6zm0-2a1 1 0 1 0 0-2a1 1 0 0 0 0 2z\"></path>\n\t</svg>\n)\n\nexport default SettingsIcon\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst SubtitleIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg\n\t\twidth=\"24\"\n\t\theight=\"24\"\n\t\tviewBox=\"0 0 24 24\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tclassName=\"Hawkins-Icon Hawkins-Icon-Standard\"\n\t\tstyle={{ width: \"100%\", height: \"100%\" }}\n\t\t{...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V6h16v12zM6 10h2v2H6zm0 4h8v2H6zm10 0h2v2h-2zm-6-4h8v2h-8z\"\n\t\t/>\n\t</svg>\n)\n\nexport default SubtitleIcon\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst VolumeMutedIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<g fill=\"currentColor\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M20.515 6.316a.75.75 0 0 1 .991.376c.468 1.035.994 2.768.994 5.308c0 2.192-.392 3.783-.8 4.844a7.72 7.72 0 0 1-.572 1.195a4.73 4.73 0 0 1-.289.425l-.007.01l-.003.003l-.002.002L20.25 18l.576.48a.75.75 0 0 1-1.156-.956l.003-.004l.031-.041a3.27 3.27 0 0 0 .137-.212c.12-.199.288-.516.459-.961c.342-.889.7-2.298.7-4.306c0-2.326-.48-3.849-.86-4.692a.75.75 0 0 1 .375-.992Zm-2.101 2.95a.75.75 0 0 1 .887.582c.11.53.199 1.24.199 2.152c0 1.11-.132 1.923-.273 2.474a5.172 5.172 0 0 1-.203.631a2.977 2.977 0 0 1-.102.228l-.01.018l-.003.007l-.002.003v.002s-.001.001-.657-.363l.656.364a.75.75 0 0 1-1.317-.719l.005-.01a1.85 1.85 0 0 0 .038-.087a3.66 3.66 0 0 0 .141-.447c.11-.424.227-1.111.227-2.101a9.17 9.17 0 0 0-.168-1.848a.75.75 0 0 1 .582-.886Z\"\n\t\t\t\tclipRule=\"evenodd\"></path>\n\t\t\t<path d=\"M21.78 3.53a.75.75 0 0 0-1.06-1.06l-4.45 4.449a11.265 11.265 0 0 0-.193-1.39c-.172-.788-.477-1.473-1.116-1.923a3.066 3.066 0 0 0-.769-.39c-.818-.28-1.631-.057-2.457.345c-.814.395-1.8 1.046-3.032 1.857l-.267.176c-.447.295-.602.394-.76.464a2.17 2.17 0 0 1-.535.16c-.171.03-.354.032-.89.032h-.162c-1.217 0-2.062-.001-2.814.347A3.962 3.962 0 0 0 1.548 8.22c-.392.729-.438 1.491-.504 2.575l-.008.13C1.014 11.294 1 11.658 1 12c0 .342.014.706.036 1.074l.008.13c.066 1.084.112 1.846.504 2.575a3.962 3.962 0 0 0 1.727 1.624c.61.283 1.283.336 2.166.345L2.72 20.47a.75.75 0 1 0 1.06 1.06l18-18ZM16.5 12a.75.75 0 0 0-1.255-.554l-.071.074l-6 6.274A.778.778 0 0 0 9.34 19c1.039.68 1.899 1.225 2.631 1.549c.743.328 1.48.489 2.222.236a3.08 3.08 0 0 0 .769-.391c.706-.497 1.005-1.28 1.167-2.18c.159-.884.213-2.056.281-3.516l.003-.058a68.23 68.23 0 0 0 .088-2.64Z\"></path>\n\t\t</g>\n\t</svg>\n)\n\nexport default VolumeMutedIcon\n","import * as React from \"react\"\nimport { SVGProps, memo } from \"react\"\n\nconst VolumeTwoIcon = (props: SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<g fill=\"currentColor\">\n\t\t\t<path d=\"M2.003 11.716c.037-1.843.056-2.764.668-3.552a3.18 3.18 0 0 1 .413-.431c.752-.636 1.746-.636 3.733-.636c.71 0 1.065 0 1.403-.092c.07-.02.14-.042.209-.067c.33-.121.627-.33 1.22-.746c2.338-1.645 3.508-2.467 4.489-2.11c.188.069.37.168.533.29c.848.635.913 2.115 1.042 5.073a70.58 70.58 0 0 1 .08 2.555c0 .521-.032 1.46-.08 2.555c-.13 2.958-.194 4.438-1.042 5.073a2.109 2.109 0 0 1-.533.29c-.982.357-2.15-.465-4.49-2.11c-.592-.416-.889-.625-1.22-.746a2.61 2.61 0 0 0-.208-.067c-.338-.092-.693-.092-1.403-.092c-1.987 0-2.98 0-3.733-.636a3.145 3.145 0 0 1-.413-.43c-.612-.79-.63-1.71-.668-3.553a14.06 14.06 0 0 1 0-.569Z\"></path>\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M19.49 5.552a.66.66 0 0 1 .97.094l-.529.471l.53-.47l.002.002l.003.004l.007.009a2.572 2.572 0 0 1 .079.112c.047.071.111.173.186.305c.149.264.339.652.526 1.171C21.64 8.291 22 9.851 22 12c0 2.15-.36 3.71-.736 4.75c-.187.52-.377.907-.526 1.172a4.655 4.655 0 0 1-.265.417l-.007.009l-.003.003l-.001.002s-.001.001-.531-.47l.53.471a.66.66 0 0 1-.971.094a.77.77 0 0 1-.09-1.035l.03-.041c.026-.04.07-.11.125-.207a6.28 6.28 0 0 0 .422-.943c.314-.871.644-2.253.644-4.222c0-1.97-.33-3.35-.644-4.222a6.28 6.28 0 0 0-.422-.942a3.152 3.152 0 0 0-.157-.253m-1.641 1.833c.333-.197.753-.07.938.286l-.603.357l.603-.357l.001.002l.002.003l.003.007l.01.018l.024.053c.018.042.042.099.07.17c.053.145.12.35.185.62c.13.54.252 1.337.252 2.425c0 1.089-.122 1.886-.252 2.426c-.065.27-.132.475-.186.619a3.04 3.04 0 0 1-.094.223l-.009.018l-.003.007l-.002.003v.002s-.001.001-.604-.356l.603.357c-.185.355-.605.483-.938.286c-.33-.196-.45-.638-.272-.991l.004-.01l.035-.085c.032-.086.08-.23.13-.438c.1-.416.208-1.09.208-2.06c0-.971-.108-1.645-.208-2.06a3.757 3.757 0 0 0-.165-.524l-.004-.01a.76.76 0 0 1 .272-.991Z\"\n\t\t\t\tclipRule=\"evenodd\"></path>\n\t\t</g>\n\t</svg>\n)\n\nexport default VolumeTwoIcon\n","\"use client\"\n\nimport React from \"react\"\nimport BackwardIcon from \"./svg-icons/BackwardIcon\"\nimport CameraIcon from \"./svg-icons/CameraIcon\"\nimport ForwardIcon from \"./svg-icons/ForwardIcon\"\nimport FullscreenEnterIcon from \"./svg-icons/FullscreenEnterIcon\"\nimport FullscreenExitIcon from \"./svg-icons/FullscreenExitIcon\"\nimport LoadingIcon from \"./svg-icons/LoadingIcon\"\nimport PauseIcon from \"./svg-icons/PauseIcon\"\nimport PlayIcon from \"./svg-icons/PlayIcon\"\nimport PlaybackSpeedIcon from \"./svg-icons/PlaybackSpeedIcon\"\nimport SettingsIcon from \"./svg-icons/SettingsIcon\"\nimport SubtitleIconSVG from \"./svg-icons/SubtitleIcon\"\nimport VolumeMutedIcon from \"./svg-icons/VolumeMutedIcon\"\nimport VolumeOneIcon from \"./svg-icons/VolumeOneIcon\"\nimport VolumeThreeIcon from \"./svg-icons/VolumeThreeIcon\"\nimport VolumeTwoIcon from \"./svg-icons/VolumeTwoIcon\"\n\nexport interface IconProps {\n\tsize?: number\n\tclassName?: string\n\tcolor?: string\n}\n\n// Minimal Play Icon\nexport const MinimalPlayIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <PlayIcon width={size} height={size} className={className} style={{ color }} />\n\n// Minimal Pause Icon\nexport const MinimalPauseIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <PauseIcon width={size} height={size} className={className} style={{ color }} />\n\n// Minimal Volume Icon\nexport const MinimalVolumeIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <VolumeTwoIcon width={size} height={size} className={className} style={{ color }} />\n\n// Minimal Volume Muted Icon\nexport const MinimalVolumeMutedIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <VolumeMutedIcon width={size} height={size} className={className} style={{ color }} />\n\n// Minimal Fullscreen Icon\nexport const MinimalFullscreenIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <FullscreenEnterIcon width={size} height={size} className={className} style={{ color }} />\n\n// Minimal Exit Fullscreen Icon\nexport const MinimalExitFullscreenIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <FullscreenExitIcon width={size} height={size} className={className} style={{ color }} />\n\n// Minimal Settings Icon\nexport const MinimalSettingsIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <SettingsIcon width={size} height={size} className={className} style={{ color }} />\n\n// Minimal Loading Spinner\nexport const MinimalSpinner: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => (\n\t<LoadingIcon\n\t\twidth={size}\n\t\theight={size}\n\t\tclassName={`animate-spin ${className}`}\n\t\tstyle={{ color }}\n\t/>\n)\n\n// Minimal Forward Icon (using backward design)\nexport const MinimalForwardIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <BackwardIcon width={size} height={size} className={className} style={{ color }} />\n\n// Minimal Backward Icon\nexport const MinimalBackwardIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <ForwardIcon width={size} height={size} className={className} style={{ color }} />\n\n// Forward 10 seconds icon\nexport const MinimalForward10Icon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <ForwardIcon width={size} height={size} className={className} style={{ color }} />\n\n// Backward 10 seconds icon\nexport const MinimalBackward10Icon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <BackwardIcon width={size} height={size} className={className} style={{ color }} />\n\n// Subtitle/Caption icon\nexport const MinimalSubtitleIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <SubtitleIconSVG width={size} height={size} className={className} style={{ color }} />\n\n// Screenshot/Camera icon\nexport const MinimalScreenshotIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <CameraIcon width={size} height={size} className={className} style={{ color }} />\n\n// Speed icon\nexport const MinimalSpeedIcon: React.FC<IconProps> = ({\n\tsize = 24,\n\tclassName = \"\",\n\tcolor = \"currentColor\"\n}) => <PlaybackSpeedIcon width={size} height={size} className={className} style={{ color }} />\n\n// Icon Set Type\nexport interface IconSet {\n\tplay?: React.FC<IconProps>\n\tpause?: React.FC<IconProps>\n\tvolume?: React.FC<IconProps>\n\tvolumeMuted?: React.FC<IconProps>\n\tfullscreen?: React.FC<IconProps>\n\texitFullscreen?: React.FC<IconProps>\n\tsettings?: React.FC<IconProps>\n\tforward?: React.FC<IconProps>\n\tbackward?: React.FC<IconProps>\n\tspinner?: React.FC<IconProps>\n\tsubtitle?: React.FC<IconProps>\n}\n\n// Default Icon Set\nexport const defaultMinimalIcons: IconSet = {\n\tplay: MinimalPlayIcon,\n\tpause: MinimalPauseIcon,\n\tvolume: MinimalVolumeIcon,\n\tvolumeMuted: MinimalVolumeMutedIcon,\n\tfullscreen: MinimalFullscreenIcon,\n\texitFullscreen: MinimalExitFullscreenIcon,\n\tsettings: MinimalSettingsIcon,\n\tforward: MinimalForwardIcon,\n\tbackward: MinimalBackwardIcon,\n\tspinner: MinimalSpinner,\n\tsubtitle: MinimalSubtitleIcon\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { useMediaContext } from \"../context/media-context\"\n\n// Utility function to compose refs\nfunction composeRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n\treturn (node: T | null) => {\n\t\trefs.forEach((ref) => {\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(node)\n\t\t\t} else if (ref) {\n\t\t\t\t;(ref as React.MutableRefObject<T | null>).current = node\n\t\t\t}\n\t\t})\n\t}\n}\n\nexport interface MediaPlayerVideoProps extends React.VideoHTMLAttributes<HTMLVideoElement> {\n\tasChild?: boolean\n}\n\nexport function MediaPlayerVideo({\n\tasChild = false,\n\tclassName,\n\tchildren,\n\t...props\n}: MediaPlayerVideoProps) {\n\tconst context = useMediaContext()\n\n\t// Create a ref that will be composed with the context mediaRef when mounted\n\tconst combinedRef = React.useMemo(\n\t\t() => composeRefs(context.mediaRef),\n\t\t[context.mediaRef]\n\t)\n\n\tif (asChild) {\n\t\t// When asChild is true, clone the child element and add our props\n\t\tconst child = React.Children.only(children) as React.ReactElement\n\t\treturn React.cloneElement(child, {\n\t\t\t...props,\n\t\t\tref: combinedRef,\n\t\t\t\"data-slot\": \"media-player-video\"\n\t\t} as any)\n\t}\n\n\treturn (\n\t\t<video ref={combinedRef} data-slot=\"media-player-video\" className={className} {...props}>\n\t\t\t{children}\n\t\t</video>\n\t)\n}\n\nMediaPlayerVideo.displayName = \"MediaPlayerVideo\"\n","\"use client\"\n\nimport React from \"react\"\nimport { useMediaContext, useMediaSelector } from \"../context/media-context\"\nimport { formatTime } from \"../lib/format-time\"\nimport { cn } from \"../lib/utils\"\n\nexport interface MediaPlayerTimeProps {\n\tvariant?: \"current\" | \"duration\" | \"remaining\" | \"current-duration\"\n\tclassName?: string\n\tasChild?: boolean\n\tchildren?: React.ReactNode\n}\n\nexport function MediaPlayerTime({\n\tvariant = \"current-duration\",\n\tclassName,\n\tasChild = false,\n\tchildren,\n\t...props\n}: MediaPlayerTimeProps) {\n\tconst context = useMediaContext()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\n\tconst times = React.useMemo(() => {\n\t\tif (variant === \"remaining\") {\n\t\t\treturn {\n\t\t\t\tremaining: formatTime(Math.max(0, duration - currentTime))\n\t\t\t}\n\t\t}\n\n\t\tif (variant === \"duration\") {\n\t\t\treturn {\n\t\t\t\tduration: formatTime(duration)\n\t\t\t}\n\t\t}\n\n\t\tif (variant === \"current\") {\n\t\t\treturn {\n\t\t\t\tcurrent: formatTime(currentTime)\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tcurrent: formatTime(currentTime),\n\t\t\tduration: formatTime(duration)\n\t\t}\n\t}, [variant, currentTime, duration])\n\n\tconst timeProps = {\n\t\t\"data-slot\": \"media-player-time\",\n\t\t\"data-variant\": variant,\n\t\tdir: context.dir,\n\t\tclassName: cn(\"text-sm text-foreground/80 tabular-nums\", className),\n\t\t...props\n\t}\n\n\tif (variant !== \"current-duration\") {\n\t\tconst content = times[variant as keyof typeof times]\n\n\t\tif (asChild) {\n\t\t\tconst child = React.Children.only(children) as React.ReactElement\n\t\t\treturn React.cloneElement(child, timeProps as any, content)\n\t\t}\n\n\t\treturn <time {...timeProps}>{content}</time>\n\t}\n\n\tconst content = (\n\t\t<>\n\t\t\t<time>{times.current}</time>\n\t\t\t<span className=\"text-foreground/60\">/</span>\n\t\t\t<time>{times.duration}</time>\n\t\t</>\n\t)\n\n\tif (asChild) {\n\t\tconst child = React.Children.only(children) as React.ReactElement\n\t\treturn React.cloneElement(\n\t\t\tchild,\n\t\t\t{\n\t\t\t\t...timeProps,\n\t\t\t\tclassName: cn(\"flex items-center gap-1 text-foreground/80 text-sm\", className)\n\t\t\t} as any,\n\t\t\tcontent\n\t\t)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\t{...timeProps}\n\t\t\tclassName={cn(\"flex items-center gap-1 text-foreground/80 text-sm\", className)}>\n\t\t\t{content}\n\t\t</div>\n\t)\n}\n\nMediaPlayerTime.displayName = \"MediaPlayerTime\"\n","\"use client\"\n\nimport React from \"react\"\nimport { MediaActionTypes, useMediaContext, useMediaDispatch } from \"../../../context/media-context\"\nimport { cn } from \"../../../lib/utils\"\nimport type { IconSet } from \"../../icons\"\n\nexport interface MinimalPlayButtonProps {\n\tisPlaying: boolean\n\ticons: IconSet\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n\tclassName?: string\n}\n\nexport function MinimalPlayButton({\n\tisPlaying,\n\ticons,\n\tsize = \"md\",\n\tclassName\n}: MinimalPlayButtonProps) {\n\tconst dispatch = useMediaDispatch()\n\n\tconst handleClick = () => {\n\t\tdispatch({\n\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t})\n\t}\n\n\tconst sizeClasses = {\n\t\tsm: \"h-10 w-10\",\n\t\tmd: \"h-12 w-12 minimal-btn\",\n\t\tlg: \"h-16 w-16 minimal-btn-lg\",\n\t\txl: \"h-20 w-20 minimal-btn-lg\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: 27,\n\t\tmd: 30,\n\t\tlg: 36,\n\t\txl: 42\n\t}\n\n\tconst PlayIcon = icons.play\n\tconst PauseIcon = icons.pause\n\n\tif (!PlayIcon || !PauseIcon) return null\n\n\treturn (\n\t\t<button\n\t\t\tclassName={cn(\"minimal-btn\", sizeClasses[size], className)}\n\t\t\tonClick={handleClick}\n\t\t\taria-label={isPlaying ? \"Pause\" : \"Play\"}>\n\t\t\t{isPlaying ? <PauseIcon size={iconSizes[size]} /> : <PlayIcon size={iconSizes[size]} />}\n\t\t</button>\n\t)\n}\n","\"use client\"\n\nimport React, { useRef, useState } from \"react\"\nimport {\n\tMediaActionTypes,\n\tuseMediaDispatch,\n\tuseMediaSelector\n} from \"../../../context/media-context\"\nimport { formatTime } from \"../../../lib/format-time\"\nimport { cn } from \"../../../lib/utils\"\n\nexport interface MinimalSeekBarProps {\n\tthumbnails?: string\n\tonSeek?: (time: number) => void\n\tclassName?: string\n}\n\nexport function MinimalSeekBar({ thumbnails, onSeek, className }: MinimalSeekBarProps) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\tconst buffered = useMediaSelector((state) => state.buffered)\n\n\tconst [isDragging, setIsDragging] = useState(false)\n\tconst [hoverTime, setHoverTime] = useState(0)\n\tconst [hoverPosition, setHoverPosition] = useState(0)\n\tconst seekBarRef = useRef<HTMLDivElement>(null)\n\n\tconst progress = duration > 0 ? (currentTime / duration) * 100 : 0\n\tconst bufferedProgress =\n\t\tbuffered && buffered.length > 0 && duration > 0\n\t\t\t? (buffered.end(buffered.length - 1) / duration) * 100\n\t\t\t: 0\n\n\tconst handleSeek = (clientX: number) => {\n\t\tif (!seekBarRef.current || duration === 0) return\n\n\t\tconst rect = seekBarRef.current.getBoundingClientRect()\n\t\tconst position = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n\t\tconst newTime = position * duration\n\n\t\tdispatch({\n\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\tdetail: newTime\n\t\t})\n\n\t\tonSeek?.(newTime)\n\t}\n\n\tconst handleMouseDown = (e: React.MouseEvent) => {\n\t\te.preventDefault()\n\t\tsetIsDragging(true)\n\t\thandleSeek(e.clientX)\n\t}\n\n\tconst handleMouseMove = (e: React.MouseEvent) => {\n\t\tif (!seekBarRef.current || duration === 0) return\n\n\t\tconst rect = seekBarRef.current.getBoundingClientRect()\n\t\tconst position = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n\t\tconst time = position * duration\n\n\t\tsetHoverTime(time)\n\t\tsetHoverPosition(e.clientX - rect.left)\n\n\t\tif (isDragging) {\n\t\t\thandleSeek(e.clientX)\n\t\t}\n\t}\n\n\tconst handleMouseUp = () => {\n\t\tsetIsDragging(false)\n\t}\n\n\tconst handleMouseLeave = () => {\n\t\tsetIsDragging(false)\n\t\tsetHoverTime(0)\n\t}\n\n\tReact.useEffect(() => {\n\t\tif (isDragging) {\n\t\t\tconst handleGlobalMouseMove = (e: MouseEvent) => {\n\t\t\t\thandleSeek(e.clientX)\n\t\t\t}\n\n\t\t\tconst handleGlobalMouseUp = () => {\n\t\t\t\tsetIsDragging(false)\n\t\t\t}\n\n\t\t\tdocument.addEventListener(\"mousemove\", handleGlobalMouseMove)\n\t\t\tdocument.addEventListener(\"mouseup\", handleGlobalMouseUp)\n\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener(\"mousemove\", handleGlobalMouseMove)\n\t\t\t\tdocument.removeEventListener(\"mouseup\", handleGlobalMouseUp)\n\t\t\t}\n\t\t}\n\t}, [isDragging])\n\n\treturn (\n\t\t<div className={cn(\"group relative\", className)}>\n\t\t\t{/* Preview Tooltip */}\n\t\t\t{hoverTime > 0 && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"pointer-events-none absolute bottom-full z-50 mb-2\"\n\t\t\t\t\tstyle={{ left: `${hoverPosition}px`, transform: \"translateX(-50%)\" }}>\n\t\t\t\t\t{thumbnails && (\n\t\t\t\t\t\t<div className=\"mb-1 rounded bg-black/90 p-1\">\n\t\t\t\t\t\t\t<div className=\"h-18 w-32 rounded bg-gray-800\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"whitespace-nowrap rounded bg-black/90 px-2 py-1 text-white text-xs\">\n\t\t\t\t\t\t{formatTime(hoverTime)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Seek Bar */}\n\t\t\t<div\n\t\t\t\tref={seekBarRef}\n\t\t\t\tclassName=\"minimal-seekbar\"\n\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\tonMouseUp={handleMouseUp}\n\t\t\t\tonMouseLeave={handleMouseLeave}>\n\t\t\t\t{/* Buffered Progress */}\n\t\t\t\t<div className=\"minimal-seekbar-buffered\" style={{ width: `${bufferedProgress}%` }} />\n\n\t\t\t\t{/* Progress */}\n\t\t\t\t<div className=\"minimal-seekbar-progress\" style={{ width: `${progress}%` }} />\n\n\t\t\t\t{/* Thumb */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\"minimal-seekbar-thumb\", isDragging && \"active\")}\n\t\t\t\t\tstyle={{ left: `${progress}%` }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","\"use client\"\n\nimport React, { useState } from \"react\"\nimport {\n\tMediaActionTypes,\n\tuseMediaDispatch,\n\tuseMediaSelector\n} from \"../../../context/media-context\"\nimport { cn } from \"../../../lib/utils\"\nimport type { IconSet } from \"../../icons\"\n\nexport interface MinimalVolumeControlProps {\n\ticons: IconSet\n\tclassName?: string\n}\n\nexport function MinimalVolumeControl({ icons, className }: MinimalVolumeControlProps) {\n\tconst dispatch = useMediaDispatch()\n\tconst volume = useMediaSelector((state) => state.volume)\n\tconst isMuted = useMediaSelector((state) => state.isMuted)\n\tconst [isExpanded, setIsExpanded] = useState(false)\n\n\tconst handleVolumeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst newVolume = parseFloat(e.target.value)\n\t\tdispatch({\n\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\tdetail: newVolume\n\t\t})\n\t}\n\n\tconst handleMuteToggle = () => {\n\t\tdispatch({\n\t\t\ttype: MediaActionTypes.TOGGLE_MUTE\n\t\t})\n\t}\n\n\tconst VolumeIcon = isMuted || volume === 0 ? icons.volumeMuted : icons.volume\n\n\tif (!VolumeIcon) return null\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"minimal-volume-group flex items-center gap-2\", className)}\n\t\t\tonMouseEnter={() => setIsExpanded(true)}\n\t\t\tonMouseLeave={() => setIsExpanded(false)}>\n\t\t\t{/* Volume Button */}\n\t\t\t<button\n\t\t\t\tclassName=\"minimal-btn inline-flex h-8 w-8 items-center justify-center rounded-full border border-white/20 bg-white/10 text-white transition-all duration-150 hover:border-white/30 hover:bg-white/20\"\n\t\t\t\tonClick={handleMuteToggle}\n\t\t\t\taria-label={isMuted ? \"Unmute\" : \"Mute\"}>\n\t\t\t\t<VolumeIcon size={18} />\n\t\t\t</button>\n\n\t\t\t{/* Volume Slider */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"overflow-hidden transition-all duration-250\",\n\t\t\t\t\tisExpanded ? \"w-20 opacity-100\" : \"w-0 opacity-0\"\n\t\t\t\t)}>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"range\"\n\t\t\t\t\tmin=\"0\"\n\t\t\t\t\tmax=\"1\"\n\t\t\t\t\tstep=\"0.01\"\n\t\t\t\t\tvalue={isMuted ? 0 : volume}\n\t\t\t\t\tonChange={handleVolumeChange}\n\t\t\t\t\tclassName=\"minimal-volume-slider h-1 w-full cursor-pointer appearance-none rounded-full bg-white/20\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: `linear-gradient(to right, rgb(59 130 246) 0%, rgb(59 130 246) ${(isMuted ? 0 : volume) * 100}%, rgba(255,255,255,0.2) ${(isMuted ? 0 : volume) * 100}%, rgba(255,255,255,0.2) 100%)`\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { cn } from \"../../../lib/utils\"\nimport type { IconSet } from \"../../icons\"\nimport { MediaPlayerFullscreen } from \"../../media-player-fullscreen\"\nimport { MediaPlayerPlay } from \"../../media-player-play\"\nimport { MediaPlayerSeek } from \"../../media-player-seek\"\nimport { MediaPlayerTime } from \"../../media-player-time\"\nimport { MediaPlayerVolume } from \"../../media-player-volume\"\nimport { MinimalPlayButton } from \"./MinimalPlayButton\"\nimport { MinimalSeekBar } from \"./MinimalSeekBar\"\nimport { MinimalVolumeControl } from \"./MinimalVolumeControl\"\n\nexport interface MinimalControlsProps {\n\tvisible: boolean\n\ticons: IconSet\n\tisPlaying: boolean\n\tshowQualitySelector?: boolean\n\tshowSpeedControl?: boolean\n\tqualities?: Array<{\n\t\tsrc: string\n\t\tquality: string\n\t\tdefault?: boolean\n\t}>\n\tthumbnails?: string\n\tonUserInteractionStart?: () => void\n\tonUserInteractionEnd?: () => void\n\tonSeek?: (time: number) => void\n}\n\nexport function MinimalControls({\n\tvisible,\n\ticons,\n\tisPlaying,\n\tshowQualitySelector,\n\tshowSpeedControl,\n\tqualities,\n\tthumbnails,\n\tonUserInteractionStart,\n\tonUserInteractionEnd,\n\tonSeek\n}: MinimalControlsProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"minimal-control-bar\",\n\t\t\t\t\"absolute right-0 bottom-0 left-0 z-40\",\n\t\t\t\t\"px-6 py-3 transition-all duration-200\",\n\t\t\t\tvisible ? \"minimal-controls-visible\" : \"minimal-controls-hidden\"\n\t\t\t)}\n\t\t\tdata-hidden={!visible}\n\t\t\tonMouseDown={onUserInteractionStart}\n\t\t\tonMouseUp={onUserInteractionEnd}\n\t\t\tonTouchStart={onUserInteractionStart}\n\t\t\tonTouchEnd={onUserInteractionEnd}>\n\t\t\t{/* Seek Bar - Top of controls */}\n\t\t\t<div className=\"mb-2\">\n\t\t\t\t<MinimalSeekBar thumbnails={thumbnails} onSeek={onSeek} />\n\t\t\t</div>\n\n\t\t\t{/* Main Controls Row */}\n\t\t\t<div className=\"flex items-center justify-between gap-3\">\n\t\t\t\t{/* Left Side Controls */}\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t{/* Play/Pause Button */}\n\t\t\t\t\t<MinimalPlayButton isPlaying={isPlaying} icons={icons} />\n\n\t\t\t\t\t{/* Volume Control */}\n\t\t\t\t\t<MinimalVolumeControl icons={icons} />\n\n\t\t\t\t\t{/* Time Display */}\n\t\t\t\t\t<div className=\"minimal-time select-none font-mono text-sm text-white/90\">\n\t\t\t\t\t\t<MediaPlayerTime variant=\"current\" />\n\t\t\t\t\t\t<span className=\"mx-1 text-white/60\">/</span>\n\t\t\t\t\t\t<MediaPlayerTime variant=\"duration\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Right Side Controls */}\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{/* Quality Selector */}\n\t\t\t\t\t{showQualitySelector && qualities && qualities.length > 1 && (\n\t\t\t\t\t\t<button className=\"minimal-btn w-auto px-3 font-medium text-xs\" title=\"Quality\">\n\t\t\t\t\t\t\t{qualities.find((q) => q.default)?.quality || qualities[0]?.quality || \"Auto\"}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Speed Control */}\n\t\t\t\t\t{showSpeedControl && (\n\t\t\t\t\t\t<button className=\"minimal-btn w-auto px-3 font-medium text-xs\" title=\"Playback Speed\">\n\t\t\t\t\t\t\t1x\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Settings */}\n\t\t\t\t\t{icons.settings && (showQualitySelector || showSpeedControl) && (\n\t\t\t\t\t\t<button className=\"minimal-btn\" title=\"Settings\">\n\t\t\t\t\t\t\t<icons.settings size={18} />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Fullscreen Button */}\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName=\"minimal-btn\"\n\t\t\t\t\t\ttitle=\"Toggle Fullscreen\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t// This would need to be connected to fullscreen logic\n\t\t\t\t\t\t\tconst elem = document.documentElement\n\t\t\t\t\t\t\tif (!document.fullscreenElement) {\n\t\t\t\t\t\t\t\telem.requestFullscreen?.()\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdocument.exitFullscreen?.()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\t{document.fullscreenElement\n\t\t\t\t\t\t\t? icons.exitFullscreen && <icons.exitFullscreen size={18} />\n\t\t\t\t\t\t\t: icons.fullscreen && <icons.fullscreen size={18} />}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { cn } from \"../../../lib/utils\"\n\nexport interface MinimalLoadingProps {\n\ticon?: React.FC<{ size?: number; className?: string }>\n\tclassName?: string\n}\n\nexport function MinimalLoading({ icon: LoadingIcon, className }: MinimalLoadingProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute inset-0 z-40 flex items-center justify-center\",\n\t\t\t\t\"bg-black/60 backdrop-blur-sm\",\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<div className=\"text-white\">\n\t\t\t\t{LoadingIcon ? (\n\t\t\t\t\t<LoadingIcon size={48} className=\"animate-spin\" />\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"minimal-spinner h-12 w-12 animate-spin rounded-full border-3 border-white/20 border-t-white\" />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { cn } from \"../../../lib/utils\"\nimport type { IconSet } from \"../../icons\"\n\nexport interface MinimalOverlayProps {\n\tvisible: boolean\n\tshowCenterButton?: boolean\n\tisPlaying?: boolean\n\ticons: IconSet\n\tonPlayPause?: () => void\n\tclassName?: string\n}\n\nexport function MinimalOverlay({\n\tvisible,\n\tshowCenterButton = false,\n\tisPlaying = false,\n\ticons,\n\tonPlayPause,\n\tclassName\n}: MinimalOverlayProps) {\n\tif (!visible || !showCenterButton) return null\n\n\tconst PlayIcon = icons.play\n\tconst PauseIcon = icons.pause\n\n\tif (!PlayIcon || !PauseIcon) return null\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute inset-0 z-30 flex items-center justify-center\",\n\t\t\t\t\"bg-black/20 transition-opacity duration-200\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tonClick={onPlayPause}>\n\t\t\t<button\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"minimal-center-play\",\n\t\t\t\t\t\"h-20 w-20 rounded-full\",\n\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\"text-white\",\n\t\t\t\t\t\"transition-all duration-200\",\n\t\t\t\t\t\"hover:scale-110\",\n\t\t\t\t\t\"active:scale-95\"\n\t\t\t\t)}\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t\tonPlayPause?.()\n\t\t\t\t}}\n\t\t\t\taria-label={isPlaying ? \"Pause\" : \"Play\"}>\n\t\t\t\t{isPlaying ? <PauseIcon size={48} /> : <PlayIcon size={48} className=\"ml-1\" />}\n\t\t\t</button>\n\t\t</div>\n\t)\n}\n","\"use client\"\n\nimport React, { useCallback, useEffect, useRef, useState } from \"react\"\nimport { cn } from \"../../../lib/utils\"\nimport type { IconSet } from \"../../icons\"\nimport { defaultMinimalIcons } from \"../../icons\"\nimport { MediaPlayerRoot } from \"../../media-player-root\"\nimport { MediaPlayerVideo } from \"../../media-player-video\"\nimport { MinimalControls } from \"./MinimalControls\"\nimport { MinimalLoading } from \"./MinimalLoading\"\nimport { MinimalOverlay } from \"./MinimalOverlay\"\n\nexport interface MinimalMediaPlayerProps {\n\tsrc: string | string[]\n\tposter?: string\n\tautoPlay?: boolean\n\tmuted?: boolean\n\tloop?: boolean\n\tautoHideControls?: boolean\n\thideDelay?: number\n\ttheme?: \"dark\" | \"light\" | \"transparent\"\n\tcustomIcons?: IconSet\n\tshowCenterPlayButton?: boolean\n\tshowLoadingSpinner?: boolean\n\tclassName?: string\n\tonPlay?: () => void\n\tonPause?: () => void\n\tonEnded?: () => void\n\tonTimeUpdate?: (currentTime: number) => void\n\tonVolumeChange?: (volume: number) => void\n\tonSeek?: (time: number) => void\n\tonError?: (error: Error) => void\n\twatermark?: {\n\t\tsrc: string\n\t\tposition?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\"\n\t\topacity?: number\n\t\tsize?: \"small\" | \"medium\" | \"large\"\n\t}\n\tqualities?: Array<{\n\t\tsrc: string\n\t\tquality: string\n\t\tdefault?: boolean\n\t}>\n\tshowQualitySelector?: boolean\n\tshowSpeedControl?: boolean\n\tthumbnails?: string\n}\n\nexport function MinimalMediaPlayer({\n\tsrc,\n\tposter,\n\tautoPlay = false,\n\tmuted = false,\n\tloop = false,\n\tautoHideControls = true,\n\thideDelay = 2500,\n\ttheme = \"dark\",\n\tcustomIcons,\n\tshowCenterPlayButton = true,\n\tshowLoadingSpinner = true,\n\tclassName,\n\tonPlay,\n\tonPause,\n\tonEnded,\n\tonTimeUpdate,\n\tonVolumeChange,\n\tonSeek,\n\tonError,\n\twatermark,\n\tqualities,\n\tshowQualitySelector = false,\n\tshowSpeedControl = false,\n\tthumbnails\n}: MinimalMediaPlayerProps) {\n\tconst [controlsVisible, setControlsVisible] = useState(true)\n\tconst [isPlaying, setIsPlaying] = useState(false)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [error, setError] = useState<string | null>(null)\n\tconst hideTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n\tconst containerRef = useRef<HTMLDivElement | null>(null)\n\tconst [isHovered, setIsHovered] = useState(false)\n\tconst [userInteracting, setUserInteracting] = useState(false)\n\n\t// Merge default icons with custom icons\n\tconst icons = { ...defaultMinimalIcons, ...customIcons }\n\n\t// Auto-hide controls logic\n\tconst resetHideTimer = () => {\n\t\tif (!autoHideControls) return\n\n\t\tif (hideTimeoutRef.current) {\n\t\t\tclearTimeout(hideTimeoutRef.current)\n\t\t}\n\t\tsetControlsVisible(true)\n\n\t\tif (!userInteracting && isPlaying) {\n\t\t\thideTimeoutRef.current = setTimeout(() => {\n\t\t\t\tsetControlsVisible(false)\n\t\t\t}, hideDelay)\n\t\t}\n\t}\n\n\t// Handle mouse movement\n\tconst handleMouseMove = () => {\n\t\tresetHideTimer()\n\t}\n\n\t// Handle mouse enter/leave\n\tconst handleMouseEnter = () => {\n\t\tsetIsHovered(true)\n\t\tsetControlsVisible(true)\n\t\tif (hideTimeoutRef.current) {\n\t\t\tclearTimeout(hideTimeoutRef.current)\n\t\t}\n\t}\n\n\tconst handleMouseLeave = () => {\n\t\tsetIsHovered(false)\n\t\tif (isPlaying && autoHideControls && !userInteracting) {\n\t\t\thideTimeoutRef.current = setTimeout(() => {\n\t\t\t\tsetControlsVisible(false)\n\t\t\t}, 500)\n\t\t}\n\t}\n\n\t// Handle user interaction\n\tconst handleUserInteractionStart = () => {\n\t\tsetUserInteracting(true)\n\t\tsetControlsVisible(true)\n\t\tif (hideTimeoutRef.current) {\n\t\t\tclearTimeout(hideTimeoutRef.current)\n\t\t}\n\t}\n\n\tconst handleUserInteractionEnd = () => {\n\t\tsetUserInteracting(false)\n\t\tresetHideTimer()\n\t}\n\n\t// Handle play state changes\n\tconst handlePlayStateChange = (playing: boolean) => {\n\t\tsetIsPlaying(playing)\n\t\tif (playing) {\n\t\t\tonPlay?.()\n\t\t\tresetHideTimer()\n\t\t} else {\n\t\t\tonPause?.()\n\t\t\tsetControlsVisible(true)\n\t\t\tif (hideTimeoutRef.current) {\n\t\t\t\tclearTimeout(hideTimeoutRef.current)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Handle loading state\n\tconst handleLoadStart = () => {\n\t\tsetIsLoading(true)\n\t\tsetError(null)\n\t}\n\n\tconst handleLoadedData = () => {\n\t\tsetIsLoading(false)\n\t}\n\n\t// Handle errors\n\tconst handleError = (e: Error) => {\n\t\tsetIsLoading(false)\n\t\tsetError(e.message || \"An error occurred\")\n\t\tonError?.(e)\n\t}\n\n\t// Cleanup on unmount\n\tuseEffect(() => {\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}, [])\n\n\t// Determine video source\n\tconst videoSrc =\n\t\tqualities && qualities.length > 0\n\t\t\t? qualities.find((q) => q.default)?.src ||\n\t\t\t\tqualities[0]?.src ||\n\t\t\t\t(typeof src === \"string\" ? src : src[0])\n\t\t\t: typeof src === \"string\"\n\t\t\t\t? src\n\t\t\t\t: src[0]\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"minimal-player theme-minimal relative overflow-hidden rounded-lg bg-black\",\n\t\t\t\t`theme-minimal-${theme}`,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-theme={theme}\n\t\t\tonMouseMove={handleMouseMove}\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\tonMouseLeave={handleMouseLeave}>\n\t\t\t<MediaPlayerRoot\n\t\t\t\tclassName=\"relative h-full w-full\"\n\t\t\t\tautoHide={false}\n\t\t\t\tenableGestures={true}\n\t\t\t\tenableMobileOptimizations={true}>\n\t\t\t\t{/* Video Element */}\n\t\t\t\t<MediaPlayerVideo\n\t\t\t\t\tsrc={videoSrc}\n\t\t\t\t\tposter={poster}\n\t\t\t\t\tautoPlay={autoPlay}\n\t\t\t\t\tmuted={muted}\n\t\t\t\t\tloop={loop}\n\t\t\t\t\tplaysInline\n\t\t\t\t\tcrossOrigin=\"anonymous\"\n\t\t\t\t\tonPlay={() => handlePlayStateChange(true)}\n\t\t\t\t\tonPause={() => handlePlayStateChange(false)}\n\t\t\t\t\tonEnded={onEnded}\n\t\t\t\t\tonTimeUpdate={(e) => {\n\t\t\t\t\t\tconst video = e.currentTarget as HTMLVideoElement\n\t\t\t\t\t\tonTimeUpdate?.(video.currentTime)\n\t\t\t\t\t}}\n\t\t\t\t\tonVolumeChange={(e) => {\n\t\t\t\t\t\tconst video = e.currentTarget as HTMLVideoElement\n\t\t\t\t\t\tonVolumeChange?.(video.volume)\n\t\t\t\t\t}}\n\t\t\t\t\tonLoadStart={handleLoadStart}\n\t\t\t\t\tonLoadedData={handleLoadedData}\n\t\t\t\t\tonError={(e) => handleError(new Error(\"Failed to load video\"))}\n\t\t\t\t/>\n\n\t\t\t\t{/* Loading State */}\n\t\t\t\t{showLoadingSpinner && isLoading && <MinimalLoading icon={icons.spinner} />}\n\n\t\t\t\t{/* Error State */}\n\t\t\t\t{error && (\n\t\t\t\t\t<div className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/80\">\n\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t<div className=\"mb-4 text-red-500\">\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\tclassName=\"mx-auto h-12 w-12\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\">\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\td=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"mb-2 text-lg text-white\">Playback Error</p>\n\t\t\t\t\t\t\t<p className=\"text-gray-400 text-sm\">{error}</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Watermark */}\n\t\t\t\t{watermark && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\"pointer-events-none absolute z-20\", {\n\t\t\t\t\t\t\t\"top-4 left-4\": watermark.position === \"top-left\",\n\t\t\t\t\t\t\t\"top-4 right-4\": watermark.position === \"top-right\",\n\t\t\t\t\t\t\t\"bottom-16 left-4\": watermark.position === \"bottom-left\",\n\t\t\t\t\t\t\t\"right-4 bottom-16\": watermark.position === \"bottom-right\"\n\t\t\t\t\t\t})}\n\t\t\t\t\t\tstyle={{ opacity: watermark.opacity || 0.7 }}>\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={watermark.src}\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\tclassName={cn(\"object-contain\", {\n\t\t\t\t\t\t\t\t\"h-8\": watermark.size === \"small\",\n\t\t\t\t\t\t\t\t\"h-12\": watermark.size === \"medium\" || !watermark.size,\n\t\t\t\t\t\t\t\t\"h-16\": watermark.size === \"large\"\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Center Play Button */}\n\t\t\t\t{showCenterPlayButton && !isPlaying && !isLoading && (\n\t\t\t\t\t<MinimalOverlay\n\t\t\t\t\t\tvisible={true}\n\t\t\t\t\t\tshowCenterButton={true}\n\t\t\t\t\t\tisPlaying={isPlaying}\n\t\t\t\t\t\ticons={icons}\n\t\t\t\t\t\tonPlayPause={() => {\n\t\t\t\t\t\t\tconst video = containerRef.current?.querySelector(\"video\")\n\t\t\t\t\t\t\tif (video) {\n\t\t\t\t\t\t\t\tif (isPlaying) {\n\t\t\t\t\t\t\t\t\tvideo.pause()\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tvideo.play()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* Controls */}\n\t\t\t\t<MinimalControls\n\t\t\t\t\tvisible={controlsVisible || !isPlaying || isHovered}\n\t\t\t\t\ticons={icons}\n\t\t\t\t\tisPlaying={isPlaying}\n\t\t\t\t\tshowQualitySelector={showQualitySelector}\n\t\t\t\t\tshowSpeedControl={showSpeedControl}\n\t\t\t\t\tqualities={qualities}\n\t\t\t\t\tthumbnails={thumbnails}\n\t\t\t\t\tonUserInteractionStart={handleUserInteractionStart}\n\t\t\t\t\tonUserInteractionEnd={handleUserInteractionEnd}\n\t\t\t\t\tonSeek={onSeek}\n\t\t\t\t/>\n\t\t\t</MediaPlayerRoot>\n\t\t</div>\n\t)\n}\n","export default \"data:image/gif;base64,R0lGODlhgAGAAZECAPr7/ERNVv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5OTk5ODkxZS0wMWE2LTRlMTItYWM1Mi00YTIzMzI1MTViYjQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkU2QTk5NkYxM0UzMTFFQzg5RkRCRTMwRTcyQUZCRjIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkU2QTk5NkUxM0UzMTFFQzg5RkRCRTMwRTcyQUZCRjIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTQyMDFlMi00OGRjLTQ3OTgtOTFlNi05ZjkyNzhjNTJlZTUiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDplMjk3YTUwZC00MTM4LWVmNDYtYTY3Ni1kZTkzNDU1ZjNmOTkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRm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\"","\"use client\"\n\nimport React, { useState, useEffect } from \"react\"\nimport { cn } from \"../lib/utils\"\n\n// Try to import the GIF using direct import for better compatibility\nlet monaLoadingGif: string | undefined\n\n// Import the GIF statically for bundling - this will be handled by Vite\n// @ts-ignore - Vite handles this import\nimport monaGifSrc from \"../assets/mona-loading.gif\"\n\ntry {\n\tmonaLoadingGif = monaGifSrc\n} catch {\n\t// GIF import failed, will use fallback\n\tmonaLoadingGif = undefined\n}\n\ninterface AnimateLoadingProps extends React.HTMLAttributes<HTMLDivElement> {\n\tloadingText?: string\n\tgifSrc?: string\n\tshowFallback?: boolean\n}\n\nexport function AnimateLoading({\n\tloadingText = \"Loading...\",\n\tgifSrc,\n\tshowFallback = true,\n\tclassName,\n\t...props\n}: AnimateLoadingProps) {\n\tconst [imageError, setImageError] = useState(false)\n\tconst [imageLoaded, setImageLoaded] = useState(false)\n\n\t// Try multiple paths for the GIF\n\tconst gifPaths = [\n\t\tgifSrc,\n\t\tmonaLoadingGif,\n\t\t\"/mona-loading.gif\",\n\t\t\"./mona-loading.gif\",\n\t\t\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" // 1x1 transparent gif as last resort\n\t].filter(Boolean) as string[]\n\n\tconst [currentGifIndex, setCurrentGifIndex] = useState(0)\n\tconst currentGif = gifPaths[currentGifIndex]\n\n\tconst handleImageError = () => {\n\t\tif (currentGifIndex < gifPaths.length - 1) {\n\t\t\tsetCurrentGifIndex(currentGifIndex + 1)\n\t\t} else {\n\t\t\tsetImageError(true)\n\t\t}\n\t}\n\n\t// Enhanced fallback CSS animation\n\tconst FallbackAnimation = () => (\n\t\t<div className=\"relative h-12 w-12\">\n\t\t\t{/* Outer spinning gradient ring */}\n\t\t\t<div className=\"absolute inset-0 animate-spin rounded-full bg-gradient-to-r from-cyan-400 via-blue-500 to-cyan-400 opacity-75\" />\n\n\t\t\t{/* Inner background */}\n\t\t\t<div className=\"absolute inset-1 rounded-full bg-black/90\" />\n\n\t\t\t{/* Center spinning element */}\n\t\t\t<div className=\"absolute inset-0 flex items-center justify-center\">\n\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t<div className=\"h-8 w-8 rounded-full border-2 border-white/20\" />\n\t\t\t\t\t<div className=\"absolute inset-0 h-8 w-8 animate-spin rounded-full border-2 border-transparent border-t-cyan-400\" />\n\n\t\t\t\t\t{/* Pulsing dot in center */}\n\t\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center\">\n\t\t\t\t\t\t<div className=\"h-2 w-2 animate-pulse rounded-full bg-cyan-400\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col items-center justify-center space-y-2 rounded py-2 text-white\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}>\n\t\t\t{/* Show fallback while image is loading or if error */}\n\t\t\t{(!imageLoaded || imageError) && showFallback && <FallbackAnimation />}\n\n\t\t\t{/* Try to load the actual GIF (hidden if not loaded) */}\n\t\t\t{!imageError && currentGif && (\n\t\t\t\t<img\n\t\t\t\t\talt=\"loading\"\n\t\t\t\t\theight={50}\n\t\t\t\t\twidth={50}\n\t\t\t\t\tsrc={currentGif}\n\t\t\t\t\tonError={handleImageError}\n\t\t\t\t\tonLoad={() => setImageLoaded(true)}\n\t\t\t\t\tclassName={cn(\"object-contain\", !imageLoaded && \"hidden\")}\n\t\t\t\t\tstyle={{ display: imageLoaded ? \"block\" : \"none\" }}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<span className=\"mt-2 text-sm tracking-wider\">{loadingText}</span>\n\t\t</div>\n\t)\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport { AnimateLoading } from \"./AnimateLoading\"\n\nexport type LoadingVariant = \"animate\" | \"spinner\" | \"skeleton\" | \"dots\"\nexport type LoadingContext = \"initial\" | \"seeking\" | \"buffering\"\nexport type LoadingSize = \"sm\" | \"md\" | \"lg\" | \"xl\"\n\nexport interface LoadingStateProps {\n\tvariant?: LoadingVariant\n\tcontext?: LoadingContext\n\tsize?: LoadingSize\n\tcolor?: string\n\tmessage?: string\n\tshowMessage?: boolean\n\tclassName?: string\n\tstyle?: React.CSSProperties\n}\n\nconst sizeMap: Record<LoadingSize, { container: string; spinner: string; dots: string }> = {\n\tsm: {\n\t\tcontainer: \"h-8 w-8\",\n\t\tspinner: \"h-6 w-6 border-2\",\n\t\tdots: \"h-1.5 w-1.5\"\n\t},\n\tmd: {\n\t\tcontainer: \"h-12 w-12\",\n\t\tspinner: \"h-10 w-10 border-3\",\n\t\tdots: \"h-2 w-2\"\n\t},\n\tlg: {\n\t\tcontainer: \"h-16 w-16\",\n\t\tspinner: \"h-14 w-14 border-4\",\n\t\tdots: \"h-2.5 w-2.5\"\n\t},\n\txl: {\n\t\tcontainer: \"h-20 w-20\",\n\t\tspinner: \"h-18 w-18 border-4\",\n\t\tdots: \"h-3 w-3\"\n\t}\n}\n\nconst contextStyles: Record<LoadingContext, { wrapper: string; background: string }> = {\n\tinitial: {\n\t\twrapper: \"absolute inset-0 z-50 flex items-center justify-center\",\n\t\tbackground: \"bg-black/80\"\n\t},\n\tseeking: {\n\t\twrapper: \"absolute inset-0 z-40 flex items-center justify-center\",\n\t\tbackground: \"bg-black/40\"\n\t},\n\tbuffering: {\n\t\twrapper: \"absolute inset-0 z-45 flex items-center justify-center\",\n\t\tbackground: \"bg-black/60\"\n\t}\n}\n\n// Default AnimateLoading wrapper component\nexport const AnimateLoadingWrapper = function AnimateLoadingWrapper({\n\tcontext = \"initial\",\n\tmessage,\n\tclassName,\n\ttextSize = \"text-sm\"\n}: {\n\tcontext?: LoadingContext\n\tmessage?: string\n\tclassName?: string\n\ttextSize?: string\n}) {\n\tconst contextStyle = contextStyles[context]\n\n\tconst getLoadingText = () => {\n\t\tif (message) return message\n\n\t\tswitch (context) {\n\t\t\tcase \"initial\":\n\t\t\t\treturn \"Loading video...\"\n\t\t\tcase \"seeking\":\n\t\t\t\treturn \"Seeking...\"\n\t\t\tcase \"buffering\":\n\t\t\t\treturn \"Buffering...\"\n\t\t\tdefault:\n\t\t\t\treturn \"Loading...\"\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className={cn(contextStyle.wrapper, contextStyle.background, className)}>\n\t\t\t<AnimateLoading loadingText={getLoadingText()} className={cn(\"text-white\", textSize)} />\n\t\t</div>\n\t)\n}\n\nexport const LoadingState = function LoadingState({\n\tvariant = \"animate\",\n\tcontext = \"initial\",\n\tsize = \"md\",\n\tcolor,\n\tmessage,\n\tshowMessage = true,\n\tclassName,\n\tstyle\n}: LoadingStateProps) {\n\tconst sizes = sizeMap[size]\n\tconst contextStyle = contextStyles[context]\n\n\t// Use AnimateLoading as default\n\tif (variant === \"animate\") {\n\t\treturn (\n\t\t\t<AnimateLoadingWrapper\n\t\t\t\tcontext={context}\n\t\t\t\tmessage={message}\n\t\t\t\tclassName={className}\n\t\t\t\ttextSize={size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\"}\n\t\t\t/>\n\t\t)\n\t}\n\n\tconst renderLoadingIndicator = () => {\n\t\tswitch (variant) {\n\t\t\tcase \"spinner\":\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"minimal-loading-spinner animate-spin rounded-full\",\n\t\t\t\t\t\t\t\"border-white/20 border-t-cyan-500\",\n\t\t\t\t\t\t\tsizes.spinner,\n\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tborderTopColor: color || undefined,\n\t\t\t\t\t\t\t...style\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)\n\n\t\t\tcase \"dots\":\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t{[0, 1, 2].map((i) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"minimal-loading-dot rounded-full bg-cyan-500\",\n\t\t\t\t\t\t\t\t\tsizes.dots,\n\t\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackgroundColor: color || undefined,\n\t\t\t\t\t\t\t\t\tanimationDelay: `${i * 150}ms`,\n\t\t\t\t\t\t\t\t\t...style\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)\n\n\t\t\tcase \"skeleton\":\n\t\t\t\treturn (\n\t\t\t\t\t<div className={cn(\"space-y-3\", className)}>\n\t\t\t\t\t\t<div className=\"minimal-loading-skeleton h-4 w-32 rounded bg-white/10\" />\n\t\t\t\t\t\t<div className=\"minimal-loading-skeleton h-3 w-24 rounded bg-white/10\" />\n\t\t\t\t\t\t<div className=\"minimal-loading-skeleton h-3 w-28 rounded bg-white/10\" />\n\t\t\t\t\t</div>\n\t\t\t\t)\n\n\t\t\tdefault:\n\t\t\t\treturn null\n\t\t}\n\t}\n\n\tconst getMessage = () => {\n\t\tif (message) return message\n\n\t\tswitch (context) {\n\t\t\tcase \"initial\":\n\t\t\t\treturn \"Loading video...\"\n\t\t\tcase \"seeking\":\n\t\t\t\treturn \"Seeking...\"\n\t\t\tcase \"buffering\":\n\t\t\t\treturn \"Buffering...\"\n\t\t\tdefault:\n\t\t\t\treturn \"Loading...\"\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className={cn(contextStyle.wrapper, contextStyle.background)}>\n\t\t\t<div className=\"flex flex-col items-center gap-4\">\n\t\t\t\t<div className={cn(sizes.container, \"flex items-center justify-center\")}>\n\t\t\t\t\t{renderLoadingIndicator()}\n\t\t\t\t</div>\n\n\t\t\t\t{showMessage && (\n\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t<p className=\"font-medium text-sm text-white/90\">{getMessage()}</p>\n\t\t\t\t\t\t{context === \"buffering\" && (\n\t\t\t\t\t\t\t<p className=\"mt-1 text-white/60 text-xs\">Please wait...</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Custom loading component wrapper\nexport interface CustomLoadingProps {\n\tchildren: React.ReactNode\n\tcontext?: LoadingContext\n\tclassName?: string\n}\n\nexport const CustomLoading = function CustomLoading({\n\tchildren,\n\tcontext = \"initial\",\n\tclassName\n}: CustomLoadingProps) {\n\tconst contextStyle = contextStyles[context]\n\n\treturn (\n\t\t<div className={cn(contextStyle.wrapper, contextStyle.background, className)}>{children}</div>\n\t)\n}\n\n// Export default presets\nexport const LoadingPresets = {\n\tInitial: (props: Partial<LoadingStateProps>) => (\n\t\t<LoadingState variant=\"animate\" context=\"initial\" size=\"md\" {...props} />\n\t),\n\tSeeking: (props: Partial<LoadingStateProps>) => (\n\t\t<LoadingState variant=\"animate\" context=\"seeking\" size=\"sm\" {...props} />\n\t),\n\tBuffering: (props: Partial<LoadingStateProps>) => (\n\t\t<LoadingState variant=\"animate\" context=\"buffering\" size=\"sm\" {...props} />\n\t)\n}\n","import React, { memo } from \"react\"\nimport { defaultMinimalIcons } from \"../../../icons\"\n\ninterface CenterPlayButtonProps {\n\tisPlaying: boolean\n\tonTogglePlay: () => void\n}\n\nexport const CenterPlayButton = function CenterPlayButton({\n\tisPlaying,\n\tonTogglePlay\n}: CenterPlayButtonProps) {\n\tif (isPlaying) return null\n\n\tconst PlayIcon = defaultMinimalIcons.play\n\n\treturn (\n\t\t<div className=\"minimal-center-play cursor-pointer\" onClick={onTogglePlay}>\n\t\t\t{PlayIcon && <PlayIcon size={60} />}\n\t\t</div>\n\t)\n}\n","import React, { memo } from \"react\"\nimport { MinimalBackward10Icon, MinimalForward10Icon, defaultMinimalIcons } from \"../../../icons\"\n\ninterface PlaybackControlsProps {\n\tisPlaying: boolean\n\tonTogglePlay: () => void\n\tonSeekBackward: () => void\n\tonSeekForward: () => void\n}\n\nexport const PlaybackControls = function PlaybackControls({\n\tisPlaying,\n\tonTogglePlay,\n\tonSeekBackward,\n\tonSeekForward\n}: PlaybackControlsProps) {\n\tconst PlayIcon = defaultMinimalIcons.play\n\tconst PauseIcon = defaultMinimalIcons.pause\n\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<button\n\t\t\t\tclassName=\"minimal-btn size-15\"\n\t\t\t\tonClick={onTogglePlay}\n\t\t\t\taria-label={isPlaying ? \"Pause\" : \"Play\"}>\n\t\t\t\t{isPlaying ? PauseIcon && <PauseIcon size={32} /> : PlayIcon && <PlayIcon size={32} />}\n\t\t\t</button>\n\n\t\t\t<button\n\t\t\t\tclassName=\"minimal-btn h-9 w-9\"\n\t\t\t\tonClick={onSeekBackward}\n\t\t\t\taria-label=\"Backward 10 seconds\"\n\t\t\t\ttitle=\"Backward 10s (J)\">\n\t\t\t\t<MinimalBackward10Icon size={18} />\n\t\t\t</button>\n\n\t\t\t<button\n\t\t\t\tclassName=\"minimal-btn h-9 w-9\"\n\t\t\t\tonClick={onSeekForward}\n\t\t\t\taria-label=\"Forward 10 seconds\"\n\t\t\t\ttitle=\"Forward 10s (L)\">\n\t\t\t\t<MinimalForward10Icon size={18} />\n\t\t\t</button>\n\t\t</div>\n\t)\n}\n","import React, { memo, useCallback } from \"react\"\nimport { cn } from \"../../../../lib/utils\"\nimport { defaultMinimalIcons } from \"../../../icons\"\n\ninterface SettingsDropdownProps {\n\tshowSettings: boolean\n\tplaybackRate: number\n\tonToggleSettings: () => void\n\tonChangePlaybackRate: (rate: number) => void\n}\n\nexport const SettingsDropdown = function SettingsDropdown({\n\tshowSettings,\n\tplaybackRate,\n\tonToggleSettings,\n\tonChangePlaybackRate\n}: SettingsDropdownProps) {\n\tconst playbackRates = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n\n\tconst handleSettingsClick = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\te.stopPropagation()\n\t\t\tonToggleSettings()\n\t\t},\n\t\t[onToggleSettings]\n\t)\n\n\tconst handleDropdownClick = useCallback((e: React.MouseEvent) => {\n\t\te.stopPropagation()\n\t}, [])\n\n\treturn (\n\t\t<div className=\"relative\" style={{ zIndex: showSettings ? 60 : \"auto\" }}>\n\t\t\t<button\n\t\t\t\tclassName={cn(\"minimal-btn h-9 w-9\", showSettings && \"text-cyan-500\")}\n\t\t\t\tonClick={handleSettingsClick}\n\t\t\t\taria-label=\"Settings\">\n\t\t\t\t{defaultMinimalIcons.settings && <defaultMinimalIcons.settings size={18} />}\n\t\t\t</button>\n\n\t\t\t{showSettings && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute right-0 mb-2 min-w-[200px] rounded-lg border border-gray-700 bg-gray-900 py-2 shadow-xl\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbottom: \"100%\",\n\t\t\t\t\t\tzIndex: 1000\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={handleDropdownClick}>\n\t\t\t\t\t<div className=\"px-3 py-1 text-gray-400 text-xs uppercase tracking-wider\">Speed</div>\n\t\t\t\t\t<div className=\"px-1\">\n\t\t\t\t\t\t{playbackRates.map((rate) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={rate}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"w-full rounded px-3 py-1.5 text-left text-sm transition-colors hover:bg-gray-800\",\n\t\t\t\t\t\t\t\t\t\"text-white\",\n\t\t\t\t\t\t\t\t\tplaybackRate === rate && \"bg-cyan-700/20 text-cyan-400\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tonClick={() => onChangePlaybackRate(rate)}>\n\t\t\t\t\t\t\t\t{rate === 1 ? \"Normal\" : `${rate}x`}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import React, { memo, useState, useRef, useEffect } from \"react\"\nimport { cn } from \"../../../../lib/utils\"\nimport { MinimalScreenshotIcon, MinimalSubtitleIcon, defaultMinimalIcons } from \"../../../icons\"\nimport { SettingsDropdown } from \"./SettingsDropdown\"\n\ninterface RightControlsProps {\n\tsubtitleSrc?: string\n\tsubtitlesEnabled: boolean\n\tsubtitleTracks?: Array<{\n\t\tid: string\n\t\tlabel: string\n\t\tlanguage?: string\n\t\tsrc?: string\n\t}>\n\tcurrentTrackId?: string | null\n\thasSubtitles?: boolean\n\tsubtitleLoadError?: Error | null\n\tisFullscreen: boolean\n\tshowSettings: boolean\n\tplaybackRate: number\n\tonToggleSubtitles: () => void\n\tonSelectSubtitleTrack?: (trackId: string | null) => void\n\tonTakeScreenshot: (ctrlKey: boolean) => void\n\tonToggleFullscreen: () => void\n\tonToggleSettings: () => void\n\tonChangePlaybackRate: (rate: number) => void\n}\n\nexport const RightControls = function RightControls({\n\tsubtitleSrc,\n\tsubtitlesEnabled,\n\tsubtitleTracks,\n\tcurrentTrackId,\n\thasSubtitles,\n\tsubtitleLoadError,\n\tisFullscreen,\n\tshowSettings,\n\tplaybackRate,\n\tonToggleSubtitles,\n\tonSelectSubtitleTrack,\n\tonTakeScreenshot,\n\tonToggleFullscreen,\n\tonToggleSettings,\n\tonChangePlaybackRate\n}: RightControlsProps) {\n\tconst [showSubtitleMenu, setShowSubtitleMenu] = useState(false)\n\tconst subtitleMenuRef = useRef<HTMLDivElement>(null)\n\tconst FullscreenIcon = defaultMinimalIcons.fullscreen\n\tconst ExitFullscreenIcon = defaultMinimalIcons.exitFullscreen\n\n\t// Close subtitle menu when clicking outside\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tif (subtitleMenuRef.current && !subtitleMenuRef.current.contains(event.target as Node)) {\n\t\t\t\tsetShowSubtitleMenu(false)\n\t\t\t}\n\t\t}\n\n\t\tif (showSubtitleMenu) {\n\t\t\tdocument.addEventListener(\"mousedown\", handleClickOutside)\n\t\t\treturn () => document.removeEventListener(\"mousedown\", handleClickOutside)\n\t\t}\n\t}, [showSubtitleMenu])\n\n\tconst handleSubtitleClick = () => {\n\t\tif (subtitleTracks && subtitleTracks.length > 0) {\n\t\t\tsetShowSubtitleMenu(!showSubtitleMenu)\n\t\t} else {\n\t\t\tonToggleSubtitles()\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t{/* Subtitle Button with Dropdown */}\n\t\t\t{hasSubtitles && (\n\t\t\t\t<div className=\"relative\" ref={subtitleMenuRef}>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"minimal-btn h-9 w-9\",\n\t\t\t\t\t\t\tsubtitlesEnabled && \"text-cyan-500\",\n\t\t\t\t\t\t\tsubtitleLoadError && \"text-red-500\"\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tonClick={handleSubtitleClick}\n\t\t\t\t\t\taria-label=\"Subtitles\"\n\t\t\t\t\t\ttitle={subtitleLoadError ? \"Subtitle Error\" : \"Subtitles (C)\"}>\n\t\t\t\t\t\t<MinimalSubtitleIcon size={18} />\n\t\t\t\t\t</button>\n\n\t\t\t\t\t{/* Subtitle Track Selection Menu */}\n\t\t\t\t\t{showSubtitleMenu && subtitleTracks && subtitleTracks.length > 0 && (\n\t\t\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 w-48 rounded-md bg-gray-900/95 py-2 shadow-lg backdrop-blur-sm\">\n\t\t\t\t\t\t\t<div className=\"px-3 py-1 font-semibold text-gray-400 text-xs\">Subtitles</div>\n\n\t\t\t\t\t\t\t{/* Off Option */}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex w-full items-center px-3 py-1.5 text-gray-300 text-sm hover:bg-gray-800\",\n\t\t\t\t\t\t\t\t\t!subtitlesEnabled && \"bg-gray-800 text-cyan-500\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tonSelectSubtitleTrack?.(null)\n\t\t\t\t\t\t\t\t\tsetShowSubtitleMenu(false)\n\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\tOff\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t{/* Track Options */}\n\t\t\t\t\t\t\t{subtitleTracks.map((track) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={track.id}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex w-full items-center px-3 py-1.5 text-gray-300 text-sm hover:bg-gray-800\",\n\t\t\t\t\t\t\t\t\t\tcurrentTrackId === track.id && \"bg-gray-800 text-cyan-500\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tonSelectSubtitleTrack?.(track.id)\n\t\t\t\t\t\t\t\t\t\tsetShowSubtitleMenu(false)\n\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t<span>{track.label}</span>\n\t\t\t\t\t\t\t\t\t{track.language && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"ml-2 text-gray-500 text-xs\">({track.language})</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t\t{/* Error Message */}\n\t\t\t\t\t\t\t{subtitleLoadError && (\n\t\t\t\t\t\t\t\t<div className=\"mt-2 border-gray-800 border-t px-3 py-2\">\n\t\t\t\t\t\t\t\t\t<p className=\"text-red-400 text-xs\">Failed to load subtitles</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<button\n\t\t\t\tclassName=\"minimal-btn h-9 w-9\"\n\t\t\t\tonClick={(e) => onTakeScreenshot(e.ctrlKey || e.metaKey)}\n\t\t\t\taria-label=\"Take Screenshot\"\n\t\t\t\ttitle=\"Screenshot (S) - Ctrl+Click to copy\">\n\t\t\t\t<MinimalScreenshotIcon size={18} />\n\t\t\t</button>\n\n\t\t\t<SettingsDropdown\n\t\t\t\tshowSettings={showSettings}\n\t\t\t\tplaybackRate={playbackRate}\n\t\t\t\tonToggleSettings={onToggleSettings}\n\t\t\t\tonChangePlaybackRate={onChangePlaybackRate}\n\t\t\t/>\n\n\t\t\t<button\n\t\t\t\tclassName=\"minimal-btn h-9 w-9\"\n\t\t\t\tonClick={onToggleFullscreen}\n\t\t\t\taria-label={isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\"}\n\t\t\t\ttitle=\"Fullscreen (F)\">\n\t\t\t\t{isFullscreen\n\t\t\t\t\t? ExitFullscreenIcon && <ExitFullscreenIcon size={18} />\n\t\t\t\t\t: FullscreenIcon && <FullscreenIcon size={18} />}\n\t\t\t</button>\n\t\t</div>\n\t)\n}\n","import React, { memo, useState, useRef } from \"react\"\nimport type { BufferedRange } from \"../../../../hooks/useVideoPlayer\"\nimport { cn } from \"../../../../lib/utils\"\n\ninterface SeekBarProps {\n\tcurrentTime: number\n\tduration: number\n\tbufferedRanges?: BufferedRange[]\n\tisSeeking?: boolean\n\tonSeek: (time: number) => void\n}\n\nexport const SeekBar = function SeekBar({\n\tcurrentTime,\n\tduration,\n\tbufferedRanges = [],\n\tisSeeking = false,\n\tonSeek\n}: SeekBarProps) {\n\tconst [isHovering, setIsHovering] = useState(false)\n\tconst [hoverPosition, setHoverPosition] = useState(0)\n\tconst [showRipple, setShowRipple] = useState(false)\n\tconst [ripplePosition, setRipplePosition] = useState({ x: 0, y: 0 })\n\tconst seekBarRef = useRef<HTMLDivElement>(null)\n\n\tconst progress = duration > 0 ? (currentTime / duration) * 100 : 0\n\n\tconst handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\tif (duration === 0) return\n\n\t\tconst rect = e.currentTarget.getBoundingClientRect()\n\t\tconst position = (e.clientX - rect.left) / rect.width\n\t\tconst newTime = Math.max(0, Math.min(duration, position * duration))\n\n\t\t// Add ripple effect\n\t\tsetRipplePosition({ x: e.clientX - rect.left, y: e.clientY - rect.top })\n\t\tsetShowRipple(true)\n\t\tsetTimeout(() => setShowRipple(false), 600)\n\n\t\tonSeek(newTime)\n\t}\n\n\tconst handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\tif (!seekBarRef.current) return\n\t\tconst rect = seekBarRef.current.getBoundingClientRect()\n\t\tconst position = ((e.clientX - rect.left) / rect.width) * 100\n\t\tsetHoverPosition(Math.max(0, Math.min(100, position)))\n\t}\n\n\tconst handleMouseEnter = () => setIsHovering(true)\n\tconst handleMouseLeave = () => setIsHovering(false)\n\n\treturn (\n\t\t<div className=\"relative mb-3\">\n\t\t\t<div\n\t\t\t\tref={seekBarRef}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"minimal-seekbar group relative cursor-pointer\",\n\t\t\t\t\tisSeeking && \"minimal-seekbar-seeking\"\n\t\t\t\t)}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\t\tonMouseLeave={handleMouseLeave}>\n\t\t\t\t{/* Buffered ranges */}\n\t\t\t\t{bufferedRanges.map((range, index) => {\n\t\t\t\t\tconst startPercent = duration > 0 ? (range.start / duration) * 100 : 0\n\t\t\t\t\tconst widthPercent = duration > 0 ? ((range.end - range.start) / duration) * 100 : 0\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tclassName=\"minimal-seekbar-buffered\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tleft: `${startPercent}%`,\n\t\t\t\t\t\t\t\twidth: `${widthPercent}%`\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\n\t\t\t\t{/* Progress bar */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"minimal-seekbar-progress\",\n\t\t\t\t\t\tisSeeking && \"minimal-seekbar-progress-seeking\"\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ width: `${progress}%` }}\n\t\t\t\t/>\n\n\t\t\t\t{/* Hover indicator */}\n\t\t\t\t{isHovering && !isSeeking && (\n\t\t\t\t\t<div className=\"minimal-seekbar-hover-indicator\" style={{ left: `${hoverPosition}%` }} />\n\t\t\t\t)}\n\n\t\t\t\t{/* Thumb */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"minimal-seekbar-thumb\",\n\t\t\t\t\t\t(isHovering || isSeeking) && \"opacity-100\",\n\t\t\t\t\t\tisSeeking && \"minimal-seekbar-thumb-seeking\"\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ left: `${progress}%` }}\n\t\t\t\t/>\n\n\t\t\t\t{/* Ripple effect */}\n\t\t\t\t{showRipple && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"minimal-seekbar-ripple\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tleft: ripplePosition.x,\n\t\t\t\t\t\t\ttop: ripplePosition.y\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Seeking indicator */}\n\t\t\t{isSeeking && (\n\t\t\t\t<div className=\"-top-6 -translate-x-1/2 absolute left-1/2 transform\">\n\t\t\t\t\t<div className=\"rounded bg-black/80 px-2 py-1 text-white text-xs backdrop-blur-sm\">\n\t\t\t\t\t\tSeeking...\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import React, { memo } from \"react\"\nimport { formatTime } from \"../../../../lib/format-time\"\n\ninterface TimeDisplayProps {\n\tcurrentTime: number\n\tduration: number\n}\n\nexport const TimeDisplay = function TimeDisplay({ currentTime, duration }: TimeDisplayProps) {\n\treturn (\n\t\t<div className=\"font-mono text-sm text-white\">\n\t\t\t{formatTime(currentTime)} / {formatTime(duration)}\n\t\t</div>\n\t)\n}\n","import React, { memo, useCallback, useRef, useEffect } from \"react\"\nimport { cn } from \"../../../../lib/utils\"\nimport { defaultMinimalIcons } from \"../../../icons\"\n\ninterface VolumeControlProps {\n\tvolume: number\n\tisMuted: boolean\n\tshowVolumeSlider: boolean\n\tonToggleMute: () => void\n\tonVolumeChange: (volume: number) => void\n\tonShowVolumeSlider: (show: boolean) => void\n\torientation?: \"horizontal\" | \"vertical\"\n\tclassName?: string\n}\n\nexport const VolumeControl = function VolumeControl({\n\tvolume,\n\tisMuted,\n\tshowVolumeSlider,\n\tonToggleMute,\n\tonVolumeChange,\n\tonShowVolumeSlider,\n\torientation = \"horizontal\",\n\tclassName\n}: VolumeControlProps) {\n\tconst VolumeIcon = defaultMinimalIcons.volume\n\tconst VolumeMutedIcon = defaultMinimalIcons.volumeMuted\n\tconst sliderRefHorizontal = useRef<HTMLDivElement>(null)\n\tconst sliderRefVertical = useRef<HTMLDivElement>(null)\n\tconst isDragging = useRef(false)\n\tconst [isDraggingState, setIsDraggingState] = React.useState(false)\n\tconst [isHovering, setIsHovering] = React.useState(false)\n\tconst hideTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n\n\tconst handleVolumeChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst newVolume = parseFloat(e.target.value)\n\t\t\tonVolumeChange(newVolume)\n\t\t},\n\t\t[onVolumeChange]\n\t)\n\n\tconst handleSliderClick = useCallback(\n\t\t(e: React.MouseEvent<HTMLDivElement>, isVertical: boolean) => {\n\t\t\tconst sliderRef = isVertical ? sliderRefVertical : sliderRefHorizontal\n\t\t\tif (!sliderRef.current) return\n\t\t\tconst rect = sliderRef.current.getBoundingClientRect()\n\n\t\t\tlet percentage: number\n\t\t\tif (!isVertical) {\n\t\t\t\tpercentage = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n\t\t\t} else {\n\t\t\t\tpercentage = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height))\n\t\t\t}\n\n\t\t\tonVolumeChange(percentage)\n\t\t},\n\t\t[onVolumeChange]\n\t)\n\n\tconst handleMouseDown = useCallback(\n\t\t(e: React.MouseEvent<HTMLDivElement>, isVertical: boolean) => {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tisDragging.current = true\n\t\t\tsetIsDraggingState(true)\n\t\t\thandleSliderClick(e, isVertical)\n\t\t},\n\t\t[handleSliderClick]\n\t)\n\n\tuseEffect(() => {\n\t\tconst handleMouseMove = (e: MouseEvent) => {\n\t\t\tif (!isDragging.current) return\n\n\t\t\tconst sliderRef = orientation === \"vertical\" ? sliderRefVertical : sliderRefHorizontal\n\t\t\tif (!sliderRef.current) return\n\n\t\t\tconst rect = sliderRef.current.getBoundingClientRect()\n\t\t\tlet percentage: number\n\n\t\t\tif (orientation === \"horizontal\") {\n\t\t\t\tpercentage = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n\t\t\t} else {\n\t\t\t\tpercentage = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height))\n\t\t\t}\n\n\t\t\tonVolumeChange(percentage)\n\t\t}\n\n\t\tconst handleMouseUp = () => {\n\t\t\tisDragging.current = false\n\t\t\tsetIsDraggingState(false)\n\t\t}\n\n\t\tif (isDraggingState) {\n\t\t\tdocument.addEventListener(\"mousemove\", handleMouseMove)\n\t\t\tdocument.addEventListener(\"mouseup\", handleMouseUp)\n\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener(\"mousemove\", handleMouseMove)\n\t\t\t\tdocument.removeEventListener(\"mouseup\", handleMouseUp)\n\t\t\t}\n\t\t}\n\t}, [isDraggingState, orientation, onVolumeChange])\n\n\tconst handleMouseEnter = useCallback(() => {\n\t\tif (hideTimeoutRef.current) {\n\t\t\tclearTimeout(hideTimeoutRef.current)\n\t\t}\n\t\tsetIsHovering(true)\n\t\tonShowVolumeSlider(true)\n\t}, [onShowVolumeSlider])\n\n\tconst handleMouseLeave = useCallback(() => {\n\t\t// Add a small delay before hiding to prevent flickering\n\t\thideTimeoutRef.current = setTimeout(() => {\n\t\t\tif (!isDragging.current) {\n\t\t\t\tsetIsHovering(false)\n\t\t\t\tonShowVolumeSlider(false)\n\t\t\t}\n\t\t}, 200)\n\t}, [onShowVolumeSlider])\n\n\t// Clean up timeout on unmount\n\tuseEffect(() => {\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}, [])\n\n\tconst volumePercentage = (isMuted ? 0 : volume) * 100\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"volume-control-wrapper\",\n\t\t\t\torientation === \"vertical\" ? \"relative\" : \"flex items-center gap-2\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\tonMouseLeave={handleMouseLeave}>\n\t\t\t{/* Volume slider for vertical orientation (appears above) */}\n\t\t\t{orientation === \"vertical\" && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"volume-slider-vertical\",\n\t\t\t\t\t\t\"-translate-x-1/2 absolute bottom-full left-1/2 mb-2\",\n\t\t\t\t\t\t\"transition-all duration-300 ease-out\",\n\t\t\t\t\t\tshowVolumeSlider || isHovering || isDraggingState\n\t\t\t\t\t\t\t? \"pointer-events-auto translate-y-0 opacity-100\"\n\t\t\t\t\t\t\t: \"pointer-events-none translate-y-2 opacity-0\"\n\t\t\t\t\t)}>\n\t\t\t\t\t<div className=\"rounded-lg bg-black/80 p-3 backdrop-blur-sm\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={sliderRefVertical}\n\t\t\t\t\t\t\tclassName=\"volume-slider-track-vertical group\"\n\t\t\t\t\t\t\tonMouseDown={(e) => handleMouseDown(e, true)}\n\t\t\t\t\t\t\tonClick={(e) => handleSliderClick(e, true)}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"volume-slider-fill-vertical pointer-events-none\"\n\t\t\t\t\t\t\t\tstyle={{ height: `${volumePercentage}%` }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"volume-slider-thumb-vertical pointer-events-none\",\n\t\t\t\t\t\t\t\t\tisDraggingState && \"active\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{ bottom: `${volumePercentage}%` }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"mt-2 text-center text-white/70 text-xs\">\n\t\t\t\t\t\t\t{Math.round(volumePercentage)}%\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Volume button */}\n\t\t\t<button\n\t\t\t\tclassName=\"minimal-btn h-10 w-10\"\n\t\t\t\tonClick={onToggleMute}\n\t\t\t\taria-label={isMuted ? \"Unmute\" : \"Mute\"}>\n\t\t\t\t{isMuted || volume === 0\n\t\t\t\t\t? VolumeMutedIcon && <VolumeMutedIcon size={20} />\n\t\t\t\t\t: VolumeIcon && <VolumeIcon size={20} />}\n\t\t\t</button>\n\n\t\t\t{/* Volume slider for horizontal orientation (appears beside) */}\n\t\t\t{orientation === \"horizontal\" && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"volume-slider-horizontal-wrapper\",\n\t\t\t\t\t\t\"overflow-hidden transition-all duration-300 ease-out\",\n\t\t\t\t\t\tshowVolumeSlider || isHovering || isDraggingState ? \"w-24 opacity-100\" : \"w-0 opacity-0\"\n\t\t\t\t\t)}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={sliderRefHorizontal}\n\t\t\t\t\t\tclassName=\"volume-slider-track-horizontal group\"\n\t\t\t\t\t\tonMouseDown={(e) => handleMouseDown(e, false)}\n\t\t\t\t\t\tonClick={(e) => handleSliderClick(e, false)}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"volume-slider-fill-horizontal pointer-events-none\"\n\t\t\t\t\t\t\tstyle={{ width: `${volumePercentage}%` }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"volume-slider-thumb-horizontal pointer-events-none\",\n\t\t\t\t\t\t\t\tisDraggingState && \"active\"\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{ left: `${volumePercentage}%` }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import React, { memo } from \"react\"\nimport type { BufferedRange } from \"../../../../hooks/useVideoPlayer\"\nimport { cn } from \"../../../../lib/utils\"\nimport { PlaybackControls } from \"./PlaybackControls\"\nimport { RightControls } from \"./RightControls\"\nimport { SeekBar } from \"./SeekBar\"\nimport { TimeDisplay } from \"./TimeDisplay\"\nimport { VolumeControl } from \"./VolumeControl\"\n\ninterface ControlBarProps {\n\tcontrolsVisible: boolean\n\tcurrentTime: number\n\tduration: number\n\tisPlaying: boolean\n\tvolume: number\n\tisMuted: boolean\n\tshowVolumeSlider: boolean\n\tisFullscreen: boolean\n\tshowSettings: boolean\n\tplaybackRate: number\n\tsubtitleSrc?: string\n\tsubtitlesEnabled: boolean\n\tsubtitleTracks?: Array<{\n\t\tid: string\n\t\tlabel: string\n\t\tlanguage?: string\n\t\tsrc?: string\n\t}>\n\tcurrentTrackId?: string | null\n\thasSubtitles?: boolean\n\tsubtitleLoadError?: Error | null\n\tvolumeOrientation?: \"horizontal\" | \"vertical\"\n\tbufferedRanges?: BufferedRange[]\n\tisSeeking?: boolean\n\tonSeek: (time: number) => void\n\tonTogglePlay: () => void\n\tonSeekBackward: () => void\n\tonSeekForward: () => void\n\tonToggleMute: () => void\n\tonVolumeChange: (volume: number) => void\n\tonShowVolumeSlider: (show: boolean) => void\n\tonToggleSubtitles: () => void\n\tonSelectSubtitleTrack?: (trackId: string | null) => void\n\tonTakeScreenshot: (ctrlKey: boolean) => void\n\tonToggleFullscreen: () => void\n\tonToggleSettings: () => void\n\tonChangePlaybackRate: (rate: number) => void\n}\n\nexport const ControlBar = function ControlBar({\n\tcontrolsVisible,\n\tcurrentTime,\n\tduration,\n\tisPlaying,\n\tvolume,\n\tisMuted,\n\tshowVolumeSlider,\n\tisFullscreen,\n\tshowSettings,\n\tplaybackRate,\n\tsubtitleSrc,\n\tsubtitlesEnabled,\n\tsubtitleTracks,\n\tcurrentTrackId,\n\thasSubtitles,\n\tsubtitleLoadError,\n\tvolumeOrientation = \"horizontal\",\n\tbufferedRanges,\n\tisSeeking,\n\tonSeek,\n\tonTogglePlay,\n\tonSeekBackward,\n\tonSeekForward,\n\tonToggleMute,\n\tonVolumeChange,\n\tonShowVolumeSlider,\n\tonToggleSubtitles,\n\tonSelectSubtitleTrack,\n\tonTakeScreenshot,\n\tonToggleFullscreen,\n\tonToggleSettings,\n\tonChangePlaybackRate\n}: ControlBarProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"minimal-control-bar\",\n\t\t\t\t\"absolute right-0 bottom-0 left-0 z-40\",\n\t\t\t\t\"px-6 py-3 transition-all duration-200\",\n\t\t\t\tcontrolsVisible ? \"minimal-controls-visible\" : \"minimal-controls-hidden\"\n\t\t\t)}>\n\t\t\t<SeekBar\n\t\t\t\tcurrentTime={currentTime}\n\t\t\t\tduration={duration}\n\t\t\t\tbufferedRanges={bufferedRanges}\n\t\t\t\tisSeeking={isSeeking}\n\t\t\t\tonSeek={onSeek}\n\t\t\t/>\n\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<PlaybackControls\n\t\t\t\t\t\tisPlaying={isPlaying}\n\t\t\t\t\t\tonTogglePlay={onTogglePlay}\n\t\t\t\t\t\tonSeekBackward={onSeekBackward}\n\t\t\t\t\t\tonSeekForward={onSeekForward}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<VolumeControl\n\t\t\t\t\t\tvolume={volume}\n\t\t\t\t\t\tisMuted={isMuted}\n\t\t\t\t\t\tshowVolumeSlider={showVolumeSlider}\n\t\t\t\t\t\tonToggleMute={onToggleMute}\n\t\t\t\t\t\tonVolumeChange={onVolumeChange}\n\t\t\t\t\t\tonShowVolumeSlider={onShowVolumeSlider}\n\t\t\t\t\t\torientation={volumeOrientation}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<TimeDisplay currentTime={currentTime} duration={duration} />\n\t\t\t\t</div>\n\n\t\t\t\t<RightControls\n\t\t\t\t\tsubtitleSrc={subtitleSrc}\n\t\t\t\t\tsubtitlesEnabled={subtitlesEnabled}\n\t\t\t\t\tsubtitleTracks={subtitleTracks}\n\t\t\t\t\tcurrentTrackId={currentTrackId}\n\t\t\t\t\thasSubtitles={hasSubtitles}\n\t\t\t\t\tsubtitleLoadError={subtitleLoadError}\n\t\t\t\t\tisFullscreen={isFullscreen}\n\t\t\t\t\tshowSettings={showSettings}\n\t\t\t\t\tplaybackRate={playbackRate}\n\t\t\t\t\tonToggleSubtitles={onToggleSubtitles}\n\t\t\t\t\tonSelectSubtitleTrack={onSelectSubtitleTrack}\n\t\t\t\t\tonTakeScreenshot={onTakeScreenshot}\n\t\t\t\t\tonToggleFullscreen={onToggleFullscreen}\n\t\t\t\t\tonToggleSettings={onToggleSettings}\n\t\t\t\t\tonChangePlaybackRate={onChangePlaybackRate}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import React, { memo } from \"react\"\n\ninterface SubtitleDisplayProps {\n\tsubtitlesEnabled: boolean\n\tsubtitleText: string\n}\n\nexport const SubtitleDisplay = function SubtitleDisplay({\n\tsubtitlesEnabled,\n\tsubtitleText\n}: SubtitleDisplayProps) {\n\tif (!subtitlesEnabled || !subtitleText) return null\n\n\treturn (\n\t\t<div className=\"pointer-events-none absolute right-0 bottom-20 left-0 px-4 text-center\">\n\t\t\t<div className=\"inline-block rounded bg-black/75 px-4 py-2 font-medium text-lg text-white\">\n\t\t\t\t{subtitleText}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import React, { memo } from \"react\"\n\ninterface VideoElementProps {\n\tvideoRef: React.RefObject<HTMLVideoElement | null>\n\tsrc: string\n\tposter?: string\n\tsubtitleSrc?: string\n\tsubtitlesEnabled: boolean\n\tcrossOrigin?: \"anonymous\" | \"use-credentials\"\n\tonTogglePlay: () => void\n}\n\nexport const VideoElement = function VideoElement({\n\tvideoRef,\n\tsrc,\n\tposter,\n\tsubtitleSrc,\n\tsubtitlesEnabled,\n\tcrossOrigin,\n\tonTogglePlay\n}: VideoElementProps) {\n\treturn (\n\t\t<video\n\t\t\tref={videoRef}\n\t\t\tsrc={src}\n\t\t\tposter={poster}\n\t\t\tcrossOrigin={crossOrigin}\n\t\t\tclassName=\"h-full w-full object-contain\"\n\t\t\tonClick={onTogglePlay}>\n\t\t\t{subtitleSrc && <track kind=\"subtitles\" src={subtitleSrc} default={subtitlesEnabled} />}\n\t\t</video>\n\t)\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport \"../../../styles/minimal-player.css\"\nimport { useEnhancedSubtitles } from \"../../../hooks/useEnhancedSubtitles\"\nimport { useKeyboardShortcuts } from \"../../../hooks/useKeyboardShortcuts\"\nimport { useMediaControls } from \"../../../hooks/useMediaControls\"\nimport { useScreenshot } from \"../../../hooks/useScreenshot\"\nimport { useVideoPlayer } from \"../../../hooks/useVideoPlayer\"\nimport { cn } from \"../../../lib/utils\"\nimport { CustomLoading, LoadingPresets, LoadingState } from \"../../LoadingState\"\nimport type { LoadingStateProps } from \"../../LoadingState\"\nimport { CenterPlayButton } from \"./components/CenterPlayButton\"\nimport { ControlBar } from \"./components/ControlBar\"\nimport { SubtitleDisplay } from \"./components/SubtitleDisplay\"\nimport { VideoElement } from \"./components/VideoElement\"\n\nexport interface SimpleMinimalPlayerProps {\n\tsrc: string\n\tposter?: string\n\tclassName?: string\n\tsubtitleSrc?: string\n\tsubtitleTracks?: Array<{\n\t\tid: string\n\t\tlabel: string\n\t\tlanguage?: string\n\t\tsrc?: string\n\t}>\n\tcrossOrigin?: \"anonymous\" | \"use-credentials\"\n\tvolumeOrientation?: \"horizontal\" | \"vertical\"\n\tloadingComponent?: React.ComponentType<{ context: \"initial\" | \"seeking\" | \"buffering\" }>\n\tshowLoadingState?: boolean\n\tloadingProps?: Partial<LoadingStateProps>\n}\n\nexport function SimpleMinimalPlayer(props: SimpleMinimalPlayerProps) {\n\tconst {\n\t\tsrc,\n\t\tposter,\n\t\tclassName,\n\t\tsubtitleSrc,\n\t\tsubtitleTracks,\n\t\tcrossOrigin,\n\t\tvolumeOrientation = \"horizontal\",\n\t\tloadingComponent: LoadingComponent = undefined,\n\t\tshowLoadingState = true,\n\t\tloadingProps = {}\n\t} = props\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\tconst [showSettings, setShowSettings] = useState(false)\n\tconst [playbackRate, setPlaybackRate] = useState(1)\n\n\tconst { videoRef, state: videoState, controls: videoControls } = useVideoPlayer(containerRef)\n\tconst {\n\t\tsubtitlesEnabled,\n\t\tcurrentSubtitle,\n\t\ttoggleSubtitles,\n\t\tgetCurrentSubtitle,\n\t\tsetCurrentSubtitle,\n\t\tselectSubtitleTrack,\n\t\tavailableTracks,\n\t\tcurrentTrackId,\n\t\tloadError,\n\t\thasSubtitles\n\t} = useEnhancedSubtitles({\n\t\tsubtitleSrc,\n\t\tsubtitleTracks,\n\t\tonLoadError: (error) => console.error(\"Subtitle load error:\", error)\n\t})\n\tconst { takeScreenshot } = useScreenshot(videoRef)\n\tconst {\n\t\tcontrolsVisible,\n\t\tshowVolumeSlider,\n\t\tsetShowVolumeSlider,\n\t\thandleMouseMove,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave\n\t} = useMediaControls(videoState.isPlaying, showSettings)\n\n\t// Update subtitle display based on current time\n\tuseEffect(() => {\n\t\tif (subtitlesEnabled) {\n\t\t\tconst subtitle = getCurrentSubtitle(videoState.currentTime)\n\t\t\tsetCurrentSubtitle(subtitle)\n\t\t}\n\t}, [videoState.currentTime, subtitlesEnabled, getCurrentSubtitle, setCurrentSubtitle])\n\n\t// Change playback rate\n\tconst changePlaybackRate = (rate: number) => {\n\t\tif (!videoRef.current) return\n\t\tvideoRef.current.playbackRate = rate\n\t\tsetPlaybackRate(rate)\n\t\tsetShowSettings(false)\n\t}\n\n\t// Keyboard shortcuts\n\tuseKeyboardShortcuts({\n\t\tvideoControls,\n\t\ttoggleSubtitles,\n\t\ttakeScreenshot,\n\t\tduration: videoState.duration\n\t})\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\"minimal-player relative rounded-lg bg-black\", className)}\n\t\t\tstyle={{ overflow: \"hidden\" }}\n\t\t\tonMouseMove={handleMouseMove}\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\tonMouseLeave={handleMouseLeave}>\n\t\t\t<VideoElement\n\t\t\t\tvideoRef={videoRef}\n\t\t\t\tsrc={src}\n\t\t\t\tposter={poster}\n\t\t\t\tsubtitleSrc={subtitleSrc}\n\t\t\t\tsubtitlesEnabled={subtitlesEnabled}\n\t\t\t\tcrossOrigin={crossOrigin}\n\t\t\t\tonTogglePlay={videoControls.togglePlay}\n\t\t\t/>\n\n\t\t\t<SubtitleDisplay subtitlesEnabled={subtitlesEnabled} subtitleText={currentSubtitle} />\n\n\t\t\t{/* Show center play button only when not loading */}\n\t\t\t{!videoState.isLoading && (\n\t\t\t\t<CenterPlayButton\n\t\t\t\t\tisPlaying={videoState.isPlaying}\n\t\t\t\t\tonTogglePlay={videoControls.togglePlay}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<ControlBar\n\t\t\t\tcontrolsVisible={controlsVisible}\n\t\t\t\tcurrentTime={videoState.currentTime}\n\t\t\t\tduration={videoState.duration}\n\t\t\t\tisPlaying={videoState.isPlaying}\n\t\t\t\tvolume={videoState.volume}\n\t\t\t\tisMuted={videoState.isMuted}\n\t\t\t\tshowVolumeSlider={showVolumeSlider}\n\t\t\t\tisFullscreen={videoState.isFullscreen}\n\t\t\t\tshowSettings={showSettings}\n\t\t\t\tplaybackRate={playbackRate}\n\t\t\t\tsubtitleSrc={subtitleSrc}\n\t\t\t\tsubtitlesEnabled={subtitlesEnabled}\n\t\t\t\tsubtitleTracks={availableTracks}\n\t\t\t\tcurrentTrackId={currentTrackId}\n\t\t\t\thasSubtitles={hasSubtitles}\n\t\t\t\tsubtitleLoadError={loadError}\n\t\t\t\tvolumeOrientation={volumeOrientation}\n\t\t\t\tbufferedRanges={videoState.bufferedRanges}\n\t\t\t\tisSeeking={videoState.isSeeking}\n\t\t\t\tonSeek={videoControls.seekTo}\n\t\t\t\tonTogglePlay={videoControls.togglePlay}\n\t\t\t\tonSeekBackward={videoControls.seekBackward}\n\t\t\t\tonSeekForward={videoControls.seekForward}\n\t\t\t\tonToggleMute={videoControls.toggleMute}\n\t\t\t\tonVolumeChange={videoControls.setVolume}\n\t\t\t\tonShowVolumeSlider={setShowVolumeSlider}\n\t\t\t\tonToggleSubtitles={toggleSubtitles}\n\t\t\t\tonSelectSubtitleTrack={selectSubtitleTrack}\n\t\t\t\tonTakeScreenshot={takeScreenshot}\n\t\t\t\tonToggleFullscreen={videoControls.toggleFullscreen}\n\t\t\t\tonToggleSettings={() => setShowSettings(!showSettings)}\n\t\t\t\tonChangePlaybackRate={changePlaybackRate}\n\t\t\t/>\n\n\t\t\t{/* Loading states */}\n\t\t\t{showLoadingState && (\n\t\t\t\t<>\n\t\t\t\t\t{/* Initial loading */}\n\t\t\t\t\t{videoState.isLoading &&\n\t\t\t\t\t\t!videoState.isSeeking &&\n\t\t\t\t\t\t!videoState.isBuffering &&\n\t\t\t\t\t\t(LoadingComponent ? (\n\t\t\t\t\t\t\t<CustomLoading context=\"initial\">\n\t\t\t\t\t\t\t\t<LoadingComponent context=\"initial\" />\n\t\t\t\t\t\t\t</CustomLoading>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<LoadingPresets.Initial {...loadingProps} />\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t{/* Seeking */}\n\t\t\t\t\t{videoState.isSeeking &&\n\t\t\t\t\t\t(LoadingComponent ? (\n\t\t\t\t\t\t\t<CustomLoading context=\"seeking\">\n\t\t\t\t\t\t\t\t<LoadingComponent context=\"seeking\" />\n\t\t\t\t\t\t\t</CustomLoading>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<LoadingPresets.Seeking {...loadingProps} />\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t{/* Buffering */}\n\t\t\t\t\t{videoState.isBuffering &&\n\t\t\t\t\t\t!videoState.isSeeking &&\n\t\t\t\t\t\t(LoadingComponent ? (\n\t\t\t\t\t\t\t<CustomLoading context=\"buffering\">\n\t\t\t\t\t\t\t\t<LoadingComponent context=\"buffering\" />\n\t\t\t\t\t\t\t</CustomLoading>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<LoadingPresets.Buffering {...loadingProps} />\n\t\t\t\t\t\t))}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n"],"names":["composeRefs","refs","node","ref","MediaPlayerImpl","children","className","dir","disabled","asChild","autoHide","enableGestures","enableMobileOptimizations","onPlay","onPause","onEnded","onTimeUpdate","onVolumeChange","onMuted","onMediaError","onPipError","onFullscreenChange","props","context","useMediaContext","dispatch","useMediaDispatch","isTouchDevice","useDeviceInfo","isPlaying","useMediaSelector","state","currentTime","volume","isFullscreen","useMobileOptimizations","gestureActions","MediaActionTypes","direction","amount","mediaElement","newTime","newVolume","scale","useMediaGestures","handleKeyDown","event","target","React","handlePlay","handlePause","handleEnded","handleTimeUpdate","time","handleVolumeChange","vol","muted","handleLoadedMetadata","handleError","errorMessage","handleLoadStart","rootProps","cn","jsx","MediaPlayerRoot","MediaProvider","BackwardIcon","CameraIcon","Memo","ForwardIcon","FullscreenEnterIcon","FullscreenExitIcon","LoadingIcon","jsxs","PauseIcon","PlayIcon","SettingsIcon","SubtitleIcon","VolumeMutedIcon","VolumeTwoIcon","MinimalPlayIcon","size","color","MinimalPauseIcon","MinimalVolumeIcon","MinimalVolumeMutedIcon","MinimalFullscreenIcon","MinimalExitFullscreenIcon","MinimalSettingsIcon","MinimalSpinner","MinimalForwardIcon","MinimalBackwardIcon","MinimalForward10Icon","MinimalBackward10Icon","MinimalSubtitleIcon","SubtitleIconSVG","MinimalScreenshotIcon","defaultMinimalIcons","MediaPlayerVideo","combinedRef","child","MediaPlayerTime","variant","duration","times","formatTime","timeProps","content","Fragment","MinimalPlayButton","icons","handleClick","sizeClasses","iconSizes","MinimalSeekBar","thumbnails","onSeek","buffered","isDragging","setIsDragging","useState","hoverTime","setHoverTime","hoverPosition","setHoverPosition","seekBarRef","useRef","progress","bufferedProgress","handleSeek","clientX","rect","handleMouseDown","e","handleMouseMove","handleMouseUp","handleMouseLeave","handleGlobalMouseMove","handleGlobalMouseUp","MinimalVolumeControl","isMuted","isExpanded","setIsExpanded","handleMuteToggle","VolumeIcon","MinimalControls","visible","showQualitySelector","showSpeedControl","qualities","onUserInteractionStart","onUserInteractionEnd","q","elem","MinimalLoading","MinimalOverlay","showCenterButton","onPlayPause","MinimalMediaPlayer","src","poster","autoPlay","loop","autoHideControls","hideDelay","theme","customIcons","showCenterPlayButton","showLoadingSpinner","onError","watermark","controlsVisible","setControlsVisible","setIsPlaying","isLoading","setIsLoading","error","setError","hideTimeoutRef","containerRef","isHovered","setIsHovered","userInteracting","setUserInteracting","resetHideTimer","handleMouseEnter","handleUserInteractionStart","handleUserInteractionEnd","handlePlayStateChange","playing","handleLoadedData","useEffect","videoSrc","video","monaGifSrc","monaLoadingGif","AnimateLoading","loadingText","gifSrc","showFallback","imageError","setImageError","imageLoaded","setImageLoaded","gifPaths","currentGifIndex","setCurrentGifIndex","currentGif","handleImageError","FallbackAnimation","sizeMap","contextStyles","AnimateLoadingWrapper","message","textSize","contextStyle","getLoadingText","LoadingState","showMessage","style","sizes","renderLoadingIndicator","i","getMessage","CustomLoading","LoadingPresets","CenterPlayButton","onTogglePlay","PlaybackControls","onSeekBackward","onSeekForward","SettingsDropdown","showSettings","playbackRate","onToggleSettings","onChangePlaybackRate","playbackRates","handleSettingsClick","useCallback","handleDropdownClick","rate","RightControls","subtitleSrc","subtitlesEnabled","subtitleTracks","currentTrackId","hasSubtitles","subtitleLoadError","onToggleSubtitles","onSelectSubtitleTrack","onTakeScreenshot","onToggleFullscreen","showSubtitleMenu","setShowSubtitleMenu","subtitleMenuRef","FullscreenIcon","ExitFullscreenIcon","handleClickOutside","handleSubtitleClick","track","SeekBar","bufferedRanges","isSeeking","isHovering","setIsHovering","showRipple","setShowRipple","ripplePosition","setRipplePosition","position","range","index","startPercent","widthPercent","TimeDisplay","VolumeControl","showVolumeSlider","onToggleMute","onShowVolumeSlider","orientation","sliderRefHorizontal","sliderRefVertical","isDraggingState","setIsDraggingState","handleSliderClick","isVertical","sliderRef","percentage","volumePercentage","ControlBar","volumeOrientation","SubtitleDisplay","subtitleText","VideoElement","videoRef","crossOrigin","SimpleMinimalPlayer","LoadingComponent","showLoadingState","loadingProps","setShowSettings","setPlaybackRate","videoState","videoControls","useVideoPlayer","currentSubtitle","toggleSubtitles","getCurrentSubtitle","setCurrentSubtitle","selectSubtitleTrack","availableTracks","loadError","useEnhancedSubtitles","takeScreenshot","useScreenshot","setShowVolumeSlider","useMediaControls","subtitle","changePlaybackRate","useKeyboardShortcuts"],"mappings":"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"}
|