@therealtinhtute/baroiplayer 1.2.1 → 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 +90 -71
- 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 +1 -41
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +750 -5640
- package/dist/index.mjs.map +1 -1
- package/dist/package.json +3 -0
- package/package.json +110 -114
- 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 -1
- package/dist/context/media.mjs +0 -3
- package/dist/context/store.js +0 -1
- package/dist/context/store.mjs +0 -3
- package/dist/context-Bzd5QCKM.cjs +0 -7
- package/dist/context-Bzd5QCKM.cjs.map +0 -1
- package/dist/context-DD_SH4tT.js +0 -1053
- package/dist/context-DD_SH4tT.js.map +0 -1
- package/dist/core-events-BRnLMB7s.cjs +0 -2
- package/dist/core-events-BRnLMB7s.cjs.map +0 -1
- package/dist/core-events-v_mKdj5p.js +0 -417
- package/dist/core-events-v_mKdj5p.js.map +0 -1
- package/dist/core-plugins-CMBv-yVh.cjs +0 -2
- package/dist/core-plugins-CMBv-yVh.cjs.map +0 -1
- package/dist/core-plugins-CqCxLkbd.js +0 -754
- package/dist/core-plugins-CqCxLkbd.js.map +0 -1
- package/dist/core.js +0 -15
- package/dist/core.js.map +0 -1
- package/dist/core.mjs +0 -960
- package/dist/core.mjs.map +0 -1
- package/dist/enhanced-components-BwjBqSA1.js +0 -2858
- package/dist/enhanced-components-BwjBqSA1.js.map +0 -1
- package/dist/enhanced-components-C-ka-XLp.cjs +0 -2
- package/dist/enhanced-components-C-ka-XLp.cjs.map +0 -1
- package/dist/hooks-B-IIWPJr.js +0 -1842
- package/dist/hooks-B-IIWPJr.js.map +0 -1
- package/dist/hooks-DcHzmBwA.cjs +0 -4
- package/dist/hooks-DcHzmBwA.cjs.map +0 -1
- package/dist/minimal-components-BYsMQde5.js +0 -1610
- package/dist/minimal-components-BYsMQde5.js.map +0 -1
- package/dist/minimal-components-CsxQbDp7.cjs +0 -2
- package/dist/minimal-components-CsxQbDp7.cjs.map +0 -1
- package/dist/minimal-components.css +0 -1
- package/dist/mona-loading.gif +0 -0
- package/dist/performance-monitor-DCSijLJg.js +0 -312
- package/dist/performance-monitor-DCSijLJg.js.map +0 -1
- package/dist/performance-monitor-wNFKmqMr.cjs +0 -2
- package/dist/performance-monitor-wNFKmqMr.cjs.map +0 -1
- package/dist/rolldown-runtime-BmowowmI.js +0 -14
- package/dist/rolldown-runtime-mLOUI7ql.cjs +0 -1
- package/dist/utils-D2gQ7c2R.js +0 -64
- package/dist/utils-D2gQ7c2R.js.map +0 -1
- package/dist/utils-DJaAwiZ9.cjs +0 -2
- package/dist/utils-DJaAwiZ9.cjs.map +0 -1
- package/dist/utils.js +0 -1
- package/dist/utils.mjs +0 -3
- package/src/adapters/videojs-adapter.tsx +0 -470
- package/src/assets/mona-loading.gif +0 -0
- package/src/components/AnimateLoading.tsx +0 -111
- 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 -141
- package/src/components/examples/react-19-demo.tsx +0 -349
- package/src/components/examples/volume-orientation-demo.tsx +0 -105
- 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 -96
- 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 -35
- 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 -545
- 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 -77
- 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/assets.d.ts +0 -29
- 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-BYsMQde5.js","names":[],"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// Import the GIF statically for bundling (Vite / webpack may yield string or { src })\nimport monaGifSrc from \"../assets/mona-loading.gif\"\n\nfunction resolveAssetUrl(src: unknown): string | undefined {\n\tif (typeof src === \"string\" && src.length > 0) return src\n\tif (\n\t\tsrc &&\n\t\ttypeof src === \"object\" &&\n\t\t\"src\" in src &&\n\t\ttypeof (src as { src: unknown }).src === \"string\"\n\t) {\n\t\treturn (src as { src: string }).src\n\t}\n\treturn undefined\n}\n\nconst monaLoadingGif = resolveAssetUrl(monaGifSrc)\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// crossOrigin must be applied before src so the media request is CORS-enabled\n\t\t// (required for canvas screenshot / frame capture).\n\t\t<video\n\t\t\tref={videoRef}\n\t\t\tcrossOrigin={crossOrigin}\n\t\t\tsrc={src}\n\t\t\tposter={poster}\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"],"mappings":"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"}
|