@therealtinhtute/baroiplayer 1.2.0 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/README.md +91 -73
  2. package/dist/components/icons/index.d.ts +36 -0
  3. package/dist/components/icons/index.d.ts.map +1 -0
  4. package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts +4 -0
  5. package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +1 -0
  6. package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts +5 -0
  7. package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts.map +1 -0
  8. package/dist/components/icons/svg-icons/AudioIcon.d.ts +5 -0
  9. package/dist/components/icons/svg-icons/AudioIcon.d.ts.map +1 -0
  10. package/dist/components/icons/svg-icons/BackwardIcon.d.ts +5 -0
  11. package/dist/components/icons/svg-icons/BackwardIcon.d.ts.map +1 -0
  12. package/dist/components/icons/svg-icons/CameraIcon.d.ts +5 -0
  13. package/dist/components/icons/svg-icons/CameraIcon.d.ts.map +1 -0
  14. package/dist/components/icons/svg-icons/CheckIcon.d.ts +5 -0
  15. package/dist/components/icons/svg-icons/CheckIcon.d.ts.map +1 -0
  16. package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts +4 -0
  17. package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts.map +1 -0
  18. package/dist/components/icons/svg-icons/ForwardIcon.d.ts +5 -0
  19. package/dist/components/icons/svg-icons/ForwardIcon.d.ts.map +1 -0
  20. package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts +5 -0
  21. package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +1 -0
  22. package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts +5 -0
  23. package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +1 -0
  24. package/dist/components/icons/svg-icons/LoadingIcon.d.ts +5 -0
  25. package/dist/components/icons/svg-icons/LoadingIcon.d.ts.map +1 -0
  26. package/dist/components/icons/svg-icons/PauseIcon.d.ts +5 -0
  27. package/dist/components/icons/svg-icons/PauseIcon.d.ts.map +1 -0
  28. package/dist/components/icons/svg-icons/PlayIcon.d.ts +5 -0
  29. package/dist/components/icons/svg-icons/PlayIcon.d.ts.map +1 -0
  30. package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +5 -0
  31. package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +1 -0
  32. package/dist/components/icons/svg-icons/QualityIcon.d.ts +5 -0
  33. package/dist/components/icons/svg-icons/QualityIcon.d.ts.map +1 -0
  34. package/dist/components/icons/svg-icons/SettingsIcon.d.ts +5 -0
  35. package/dist/components/icons/svg-icons/SettingsIcon.d.ts.map +1 -0
  36. package/dist/components/icons/svg-icons/SliderIcon.d.ts +5 -0
  37. package/dist/components/icons/svg-icons/SliderIcon.d.ts.map +1 -0
  38. package/dist/components/icons/svg-icons/SubtitleIcon.d.ts +5 -0
  39. package/dist/components/icons/svg-icons/SubtitleIcon.d.ts.map +1 -0
  40. package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts +5 -0
  41. package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +1 -0
  42. package/dist/components/icons/svg-icons/UnPiPIcon.d.ts +4 -0
  43. package/dist/components/icons/svg-icons/UnPiPIcon.d.ts.map +1 -0
  44. package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts +5 -0
  45. package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +1 -0
  46. package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts +5 -0
  47. package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts.map +1 -0
  48. package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts +5 -0
  49. package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +1 -0
  50. package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts +5 -0
  51. package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +1 -0
  52. package/dist/components/variants/gradient/gradient-audio.d.ts +13 -0
  53. package/dist/components/variants/gradient/gradient-audio.d.ts.map +1 -0
  54. package/dist/components/variants/gradient/gradient-controls.d.ts +4 -0
  55. package/dist/components/variants/gradient/gradient-controls.d.ts.map +1 -0
  56. package/dist/components/variants/gradient/gradient-glyphs.d.ts +30 -0
  57. package/dist/components/variants/gradient/gradient-glyphs.d.ts.map +1 -0
  58. package/dist/components/variants/gradient/gradient-video.d.ts +16 -0
  59. package/dist/components/variants/gradient/gradient-video.d.ts.map +1 -0
  60. package/dist/index.css +1 -1
  61. package/dist/index.d.ts +5 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +2 -112
  64. package/dist/index.js.map +1 -1
  65. package/dist/index.mjs +786 -6271
  66. package/dist/index.mjs.map +1 -1
  67. package/dist/package.json +3 -0
  68. package/package.json +110 -108
  69. package/src/components/variants/gradient/gradient-audio.tsx +47 -0
  70. package/src/components/variants/gradient/gradient-controls.tsx +254 -0
  71. package/src/components/variants/gradient/gradient-glyphs.test.tsx +69 -0
  72. package/src/components/variants/gradient/gradient-glyphs.tsx +129 -0
  73. package/src/components/variants/gradient/gradient-skin.css +211 -0
  74. package/src/components/variants/gradient/gradient-video.tsx +70 -0
  75. package/src/index.ts +5 -198
  76. package/src/test/accessibility-utils.ts +0 -59
  77. package/dist/context/media.js +0 -2
  78. package/dist/context/media.js.map +0 -1
  79. package/dist/context/media.mjs +0 -15
  80. package/dist/context/media.mjs.map +0 -1
  81. package/dist/context/store.js +0 -2
  82. package/dist/context/store.js.map +0 -1
  83. package/dist/context/store.mjs +0 -5
  84. package/dist/context/store.mjs.map +0 -1
  85. package/dist/context-BYwDoSRX.js +0 -1172
  86. package/dist/context-BYwDoSRX.js.map +0 -1
  87. package/dist/context-eNS62_ac.cjs +0 -23
  88. package/dist/context-eNS62_ac.cjs.map +0 -1
  89. package/dist/core-events-B1iM2F46.cjs +0 -2
  90. package/dist/core-events-B1iM2F46.cjs.map +0 -1
  91. package/dist/core-events-DunPHKRE.js +0 -484
  92. package/dist/core-events-DunPHKRE.js.map +0 -1
  93. package/dist/core-plugins-By-4-kGs.cjs +0 -2
  94. package/dist/core-plugins-By-4-kGs.cjs.map +0 -1
  95. package/dist/core-plugins-DSBWcTuX.js +0 -821
  96. package/dist/core-plugins-DSBWcTuX.js.map +0 -1
  97. package/dist/core.js +0 -37
  98. package/dist/core.js.map +0 -1
  99. package/dist/core.mjs +0 -1233
  100. package/dist/core.mjs.map +0 -1
  101. package/dist/enhanced-components-B_l3cist.js +0 -1142
  102. package/dist/enhanced-components-B_l3cist.js.map +0 -1
  103. package/dist/enhanced-components-BspFs9OO.cjs +0 -2
  104. package/dist/enhanced-components-BspFs9OO.cjs.map +0 -1
  105. package/dist/hooks-BXwI8QG6.cjs +0 -4
  106. package/dist/hooks-BXwI8QG6.cjs.map +0 -1
  107. package/dist/hooks-Bpi-jDiO.js +0 -1816
  108. package/dist/hooks-Bpi-jDiO.js.map +0 -1
  109. package/dist/minimal-components-C4z900Ro.js +0 -1926
  110. package/dist/minimal-components-C4z900Ro.js.map +0 -1
  111. package/dist/minimal-components-v4qBp6jv.cjs +0 -2
  112. package/dist/minimal-components-v4qBp6jv.cjs.map +0 -1
  113. package/dist/minimal-components.css +0 -1
  114. package/dist/mona-loading.gif +0 -0
  115. package/dist/performance-monitor-C5k6FDXw.js +0 -301
  116. package/dist/performance-monitor-C5k6FDXw.js.map +0 -1
  117. package/dist/performance-monitor-lJmuUjQQ.cjs +0 -2
  118. package/dist/performance-monitor-lJmuUjQQ.cjs.map +0 -1
  119. package/dist/utils-CFOue_9K.cjs +0 -9
  120. package/dist/utils-CFOue_9K.cjs.map +0 -1
  121. package/dist/utils-Dzpl2ArK.js +0 -2844
  122. package/dist/utils-Dzpl2ArK.js.map +0 -1
  123. package/dist/utils.js +0 -2
  124. package/dist/utils.js.map +0 -1
  125. package/dist/utils.mjs +0 -11
  126. package/dist/utils.mjs.map +0 -1
  127. package/src/adapters/videojs-adapter.tsx +0 -470
  128. package/src/assets/mona-loading.gif +0 -0
  129. package/src/components/AnimateLoading.tsx +0 -107
  130. package/src/components/LoadingState.tsx +0 -239
  131. package/src/components/__tests__/media-player-accessibility.test.tsx +0 -510
  132. package/src/components/__tests__/media-player-react19.test.tsx +0 -457
  133. package/src/components/accessibility/keyboard-help-overlay.tsx +0 -207
  134. package/src/components/audio-player.tsx +0 -85
  135. package/src/components/basic/index.ts +0 -37
  136. package/src/components/enhanced/advanced-features.tsx +0 -311
  137. package/src/components/enhanced/debug-panel.tsx +0 -448
  138. package/src/components/enhanced/enhanced-controls.tsx +0 -597
  139. package/src/components/enhanced/enhanced-media-player.tsx +0 -566
  140. package/src/components/enhanced/error-handling.tsx +0 -338
  141. package/src/components/enhanced/index.ts +0 -39
  142. package/src/components/enhanced/media-player-enhanced.tsx +0 -383
  143. package/src/components/examples/basic-video-player.tsx +0 -50
  144. package/src/components/examples/custom-controls-example.tsx +0 -63
  145. package/src/components/examples/enhanced-controls-example.tsx +0 -100
  146. package/src/components/examples/enhanced-media-player-example.tsx +0 -302
  147. package/src/components/examples/loading-states-demo.tsx +0 -142
  148. package/src/components/examples/react-19-demo.tsx +0 -353
  149. package/src/components/examples/volume-orientation-demo.tsx +0 -106
  150. package/src/components/icon-demo.tsx +0 -196
  151. package/src/components/legacy.tsx +0 -87
  152. package/src/components/media-metadata-display.tsx +0 -99
  153. package/src/components/media-player-audio.tsx +0 -39
  154. package/src/components/media-player-controls.tsx +0 -223
  155. package/src/components/media-player-error.tsx +0 -163
  156. package/src/components/media-player-fullscreen.tsx +0 -109
  157. package/src/components/media-player-hls.tsx +0 -111
  158. package/src/components/media-player-loading.tsx +0 -76
  159. package/src/components/media-player-play.tsx +0 -75
  160. package/src/components/media-player-root.tsx +0 -338
  161. package/src/components/media-player-seek.tsx +0 -168
  162. package/src/components/media-player-time.tsx +0 -99
  163. package/src/components/media-player-tooltip.tsx +0 -58
  164. package/src/components/media-player-video.tsx +0 -54
  165. package/src/components/media-player-volume.tsx +0 -155
  166. package/src/components/media-player.tsx +0 -292
  167. package/src/components/media-suspense.tsx +0 -344
  168. package/src/components/player-settings-form.tsx +0 -158
  169. package/src/components/react-player-wrapper.tsx +0 -651
  170. package/src/components/simple-video-player.tsx +0 -62
  171. package/src/components/ui/blur-poster.tsx +0 -93
  172. package/src/components/ui/empty-state.tsx +0 -91
  173. package/src/components/ui/enhanced-seek-bar.tsx +0 -254
  174. package/src/components/ui/error-state.tsx +0 -124
  175. package/src/components/ui/fullscreen-button.tsx +0 -81
  176. package/src/components/ui/loading-skeleton.tsx +0 -107
  177. package/src/components/ui/media-resource-preloader.tsx +0 -458
  178. package/src/components/ui/offline-message.tsx +0 -98
  179. package/src/components/ui/play-button.tsx +0 -99
  180. package/src/components/ui/seek-bar.tsx +0 -191
  181. package/src/components/ui/time-display.tsx +0 -61
  182. package/src/components/ui/volume-control.tsx +0 -190
  183. package/src/components/unified/base-media-player.tsx +0 -252
  184. package/src/components/unified/media-player.tsx +0 -75
  185. package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +0 -587
  186. package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +0 -573
  187. package/src/components/variants/minimal/MinimalControls.tsx +0 -124
  188. package/src/components/variants/minimal/MinimalLoading.tsx +0 -28
  189. package/src/components/variants/minimal/MinimalMediaPlayer.tsx +0 -318
  190. package/src/components/variants/minimal/MinimalOverlay.tsx +0 -58
  191. package/src/components/variants/minimal/MinimalPlayButton.tsx +0 -56
  192. package/src/components/variants/minimal/MinimalSeekBar.tsx +0 -140
  193. package/src/components/variants/minimal/MinimalVolumeControl.tsx +0 -75
  194. package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +0 -206
  195. package/src/components/variants/minimal/components/CenterPlayButton.tsx +0 -22
  196. package/src/components/variants/minimal/components/ControlBar.tsx +0 -142
  197. package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +0 -412
  198. package/src/components/variants/minimal/components/PlaybackControls.tsx +0 -46
  199. package/src/components/variants/minimal/components/RightControls.tsx +0 -164
  200. package/src/components/variants/minimal/components/SeekBar.tsx +0 -127
  201. package/src/components/variants/minimal/components/SettingsDropdown.tsx +0 -68
  202. package/src/components/variants/minimal/components/SubtitleDisplay.tsx +0 -21
  203. package/src/components/variants/minimal/components/TimeDisplay.tsx +0 -15
  204. package/src/components/variants/minimal/components/VideoElement.tsx +0 -33
  205. package/src/components/variants/minimal/components/VolumeControl.tsx +0 -220
  206. package/src/components/variants/minimal/index.ts +0 -23
  207. package/src/components/video-player.tsx +0 -100
  208. package/src/context/__tests__/media-store.test.ts +0 -509
  209. package/src/context/error-handling.ts +0 -398
  210. package/src/context/media-context.tsx +0 -254
  211. package/src/context/media-provider.tsx +0 -264
  212. package/src/context/media-store.ts +0 -387
  213. package/src/context/persistence.ts +0 -462
  214. package/src/core/events/event-system.ts +0 -448
  215. package/src/core/events/hooks.ts +0 -325
  216. package/src/core/events/index.ts +0 -22
  217. package/src/core/events/middleware.ts +0 -286
  218. package/src/core/index.ts +0 -22
  219. package/src/core/optimization/bundle-optimizer.tsx +0 -312
  220. package/src/core/performance/cicd.ts +0 -98
  221. package/src/core/performance/index.ts +0 -38
  222. package/src/core/performance/media-loading-optimizer.ts +0 -544
  223. package/src/core/performance/performance-budgets.ts +0 -437
  224. package/src/core/performance/performance-monitor.tsx +0 -488
  225. package/src/core/performance/performance-testing.ts +0 -461
  226. package/src/core/plugins/__tests__/registry.test.ts +0 -595
  227. package/src/core/plugins/base-plugin.ts +0 -225
  228. package/src/core/plugins/enhanced-plugin-system.ts +0 -435
  229. package/src/core/plugins/examples/analytics-plugin.ts +0 -241
  230. package/src/core/plugins/index.ts +0 -39
  231. package/src/core/plugins/registry.ts +0 -546
  232. package/src/core/plugins/types.ts +0 -169
  233. package/src/core/plugins/utils.ts +0 -317
  234. package/src/core/progressive-loading.tsx +0 -331
  235. package/src/core/providers/enhanced-hls-provider.ts +0 -307
  236. package/src/core/providers/lazy-provider.tsx +0 -14
  237. package/src/core/providers/service-provider.tsx +0 -164
  238. package/src/core/utils.tsx +0 -34
  239. package/src/features/media-session/media-session-manager.ts +0 -411
  240. package/src/features/picture-in-picture/pip-manager.ts +0 -428
  241. package/src/features/playlist/playlist-manager.ts +0 -626
  242. package/src/features/subtitles/subtitle-manager.ts +0 -435
  243. package/src/features/subtitles/subtitle-parser.ts +0 -284
  244. package/src/features/thumbnails/thumbnail-generator.ts +0 -528
  245. package/src/hooks/__tests__/currentTime-fix.test.ts +0 -149
  246. package/src/hooks/__tests__/use-media-player.test.ts +0 -712
  247. package/src/hooks/__tests__/use-media-state.test.tsx +0 -316
  248. package/src/hooks/accessibility/index.ts +0 -27
  249. package/src/hooks/accessibility/use-accessibility-preferences.ts +0 -190
  250. package/src/hooks/accessibility/use-focus-management.ts +0 -183
  251. package/src/hooks/accessibility/use-keyboard-shortcuts.ts +0 -152
  252. package/src/hooks/accessibility/use-screen-reader.ts +0 -212
  253. package/src/hooks/core/index.ts +0 -47
  254. package/src/hooks/legacy.ts +0 -21
  255. package/src/hooks/use-buffer-health.ts +0 -218
  256. package/src/hooks/use-enhanced-media-player.ts +0 -575
  257. package/src/hooks/use-focus-trap.tsx +0 -162
  258. package/src/hooks/use-intelligent-preloading.ts +0 -387
  259. package/src/hooks/use-keyboard-controls.ts +0 -115
  260. package/src/hooks/use-keyboard-shortcuts.ts +0 -255
  261. package/src/hooks/use-media-actions.ts +0 -184
  262. package/src/hooks/use-media-metadata.ts +0 -91
  263. package/src/hooks/use-media-optimistic.ts +0 -264
  264. package/src/hooks/use-media-player.ts +0 -343
  265. package/src/hooks/use-media-state.ts +0 -194
  266. package/src/hooks/use-memory-optimization.ts +0 -360
  267. package/src/hooks/use-network-status.ts +0 -124
  268. package/src/hooks/use-optimistic-controls.ts +0 -95
  269. package/src/hooks/use-optimized-media.ts +0 -283
  270. package/src/hooks/use-smart-preload.ts +0 -229
  271. package/src/hooks/use-touch-gestures.ts +0 -461
  272. package/src/hooks/useEnhancedSubtitles.ts +0 -258
  273. package/src/hooks/useKeyboardShortcuts.ts +0 -106
  274. package/src/hooks/useMediaControls.ts +0 -52
  275. package/src/hooks/useScreenshot.ts +0 -61
  276. package/src/hooks/useSubtitles.ts +0 -91
  277. package/src/hooks/useVideoPlayer.ts +0 -278
  278. package/src/icons/components/FullscreenIcon.tsx +0 -36
  279. package/src/icons/components/SettingsIcon.tsx +0 -37
  280. package/src/icons/components/animated/LoadingIcon.tsx +0 -27
  281. package/src/icons/components/animated/PlayPauseIcon.tsx +0 -42
  282. package/src/icons/components/media/PauseIcon.tsx +0 -38
  283. package/src/icons/components/media/PlayIcon.tsx +0 -37
  284. package/src/icons/components/volume/VolumeIcon.tsx +0 -38
  285. package/src/icons/components/volume/VolumeOffIcon.tsx +0 -38
  286. package/src/icons/index.ts +0 -56
  287. package/src/icons/provider.tsx +0 -58
  288. package/src/icons/types.ts +0 -60
  289. package/src/index-enhanced.ts +0 -35
  290. package/src/index-legacy.ts +0 -324
  291. package/src/index.css +0 -102
  292. package/src/lib/__tests__/async-utils.test.ts +0 -291
  293. package/src/lib/async-utils.ts +0 -194
  294. package/src/lib/deprecation.ts +0 -51
  295. package/src/lib/format-time.ts +0 -37
  296. package/src/lib/index.ts +0 -4
  297. package/src/lib/utils.ts +0 -6
  298. package/src/styles/globals.css +0 -462
  299. package/src/styles/minimal-player.css +0 -621
  300. package/src/styles/pixel-art.css +0 -41
  301. package/src/styles/videojs.css +0 -100
  302. package/src/types/events.ts +0 -47
  303. package/src/types/formats.ts +0 -79
  304. package/src/types/index.ts +0 -203
  305. package/src/types/videojs-plugins.d.ts +0 -14
@@ -1 +0,0 @@
1
- {"version":3,"file":"enhanced-components-B_l3cist.js","sources":["../src/components/enhanced/media-player-enhanced.tsx","../src/components/enhanced/advanced-features.tsx","../src/components/enhanced/enhanced-controls.tsx","../src/components/enhanced/debug-panel.tsx"],"sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport {\n\tMediaActionTypes,\n\tuseMediaContext,\n\tuseMediaDispatch,\n\tuseMediaSelector\n} from \"../../context/media-context\"\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) {\n\t\t\t\t;(ref as React.MutableRefObject<T>).current = node\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Enhanced media player with better performance and mobile support\nexport interface EnhancedMediaPlayerProps {\n\tchildren: React.ReactNode\n\tclassName?: string\n\tautoHide?: boolean\n\tautoHideDelay?: number\n\tshowControlsOnHover?: boolean\n\tshowControlsOnTouch?: boolean\n\tenableKeyboardControls?: boolean\n\tenableTouchGestures?: boolean\n\tonPlay?: () => void\n\tonPause?: () => void\n\tonTimeUpdate?: (time: number) => void\n\tonVolumeChange?: (volume: number) => void\n\tonFullscreenChange?: (isFullscreen: boolean) => void\n}\n\n// Custom hook for auto-hide controls\nfunction useAutoHideControls(\n\tautoHide: boolean,\n\tdelay: number,\n\tshowOnHover: boolean,\n\tshowOnTouch: boolean\n) {\n\tconst [showControls, setShowControls] = React.useState(true)\n\tconst [isHovering, setIsHovering] = React.useState(false)\n\tconst [isTouching, setIsTouching] = React.useState(false)\n\tconst timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n\n\tconst resetTimeout = React.useCallback(() => {\n\t\tif (timeoutRef.current) {\n\t\t\tclearTimeout(timeoutRef.current)\n\t\t}\n\t\tif (autoHide) {\n\t\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\t\tif (!isHovering && !isTouching) {\n\t\t\t\t\tsetShowControls(false)\n\t\t\t\t}\n\t\t\t}, delay)\n\t\t}\n\t}, [autoHide, delay, isHovering, isTouching])\n\n\tconst showControlsTemporarily = React.useCallback(() => {\n\t\tsetShowControls(true)\n\t\tresetTimeout()\n\t}, [resetTimeout])\n\n\tReact.useEffect(() => {\n\t\tif (autoHide) {\n\t\t\tresetTimeout()\n\t\t} else {\n\t\t\tsetShowControls(true)\n\t\t}\n\t\treturn () => {\n\t\t\tif (timeoutRef.current) {\n\t\t\t\tclearTimeout(timeoutRef.current)\n\t\t\t}\n\t\t}\n\t}, [autoHide, resetTimeout])\n\n\tconst handleMouseEnter = React.useCallback(() => {\n\t\tif (showOnHover) {\n\t\t\tsetIsHovering(true)\n\t\t\tsetShowControls(true)\n\t\t}\n\t}, [showOnHover])\n\n\tconst handleMouseLeave = React.useCallback(() => {\n\t\tif (showOnHover) {\n\t\t\tsetIsHovering(false)\n\t\t\tresetTimeout()\n\t\t}\n\t}, [showOnHover, resetTimeout])\n\n\tconst handleTouchStart = React.useCallback(() => {\n\t\tif (showOnTouch) {\n\t\t\tsetIsTouching(true)\n\t\t\tshowControlsTemporarily()\n\t\t}\n\t}, [showOnTouch, showControlsTemporarily])\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\tif (showOnTouch) {\n\t\t\tsetIsTouching(false)\n\t\t\tresetTimeout()\n\t\t}\n\t}, [showOnTouch, resetTimeout])\n\n\treturn {\n\t\tshowControls,\n\t\tshowControlsTemporarily,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave,\n\t\thandleTouchStart,\n\t\thandleTouchEnd\n\t}\n}\n\n// Custom hook for touch gestures\nfunction useTouchGestures(enabled: boolean) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPlaying = useMediaSelector((state) => state.isPlaying)\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\tconst volume = useMediaSelector((state) => state.volume)\n\n\tconst [touchStart, setTouchStart] = React.useState<{ x: number; y: number; time: number } | null>(\n\t\tnull\n\t)\n\tconst [isDoubleTap, setIsDoubleTap] = React.useState(false)\n\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!enabled) return\n\n\t\t\tconst touch = e.touches[0]\n\t\t\tif (!touch) return\n\n\t\t\tconst now = Date.now()\n\n\t\t\tif (touchStart && now - touchStart.time < 300) {\n\t\t\t\tsetIsDoubleTap(true)\n\t\t\t\t// Double tap to play/pause\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} else {\n\t\t\t\tsetTouchStart({\n\t\t\t\t\tx: touch.clientX,\n\t\t\t\t\ty: touch.clientY,\n\t\t\t\t\ttime: now\n\t\t\t\t})\n\t\t\t\tsetIsDoubleTap(false)\n\t\t\t}\n\t\t},\n\t\t[enabled, touchStart, isPlaying, dispatch]\n\t)\n\n\tconst handleTouchMove = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!enabled || !touchStart || isDoubleTap) return\n\n\t\t\tconst touch = e.touches[0]\n\t\t\tif (!touch) return\n\n\t\t\tconst deltaX = touch.clientX - touchStart.x\n\t\t\tconst deltaY = touch.clientY - touchStart.y\n\n\t\t\t// Horizontal swipe for seeking\n\t\t\tif (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 50) {\n\t\t\t\tconst seekAmount = (deltaX / window.innerWidth) * 30 // 30 seconds max\n\t\t\t\tconst newTime = Math.max(0, Math.min(duration, currentTime + seekAmount))\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\tdetail: newTime\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Vertical swipe for volume (right side of screen)\n\t\t\tif (\n\t\t\t\tMath.abs(deltaY) > Math.abs(deltaX) &&\n\t\t\t\tMath.abs(deltaY) > 50 &&\n\t\t\t\ttouchStart.x > window.innerWidth / 2\n\t\t\t) {\n\t\t\t\tconst volumeChange = -(deltaY / window.innerHeight) * 1 // Full range\n\t\t\t\tconst newVolume = Math.max(0, Math.min(1, volume + volumeChange))\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\tdetail: newVolume\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[enabled, touchStart, isDoubleTap, duration, currentTime, volume, dispatch]\n\t)\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\tif (!enabled) return\n\t\t// Reset touch state after a delay to allow for double tap detection\n\t\tsetTimeout(() => {\n\t\t\tsetTouchStart(null)\n\t\t\tsetIsDoubleTap(false)\n\t\t}, 300)\n\t}, [enabled])\n\n\treturn {\n\t\thandleTouchStart,\n\t\thandleTouchMove,\n\t\thandleTouchEnd\n\t}\n}\n\nexport const EnhancedMediaPlayer = function EnhancedMediaPlayer({\n\tchildren,\n\tclassName,\n\tautoHide = true,\n\tautoHideDelay = 3000,\n\tshowControlsOnHover = true,\n\tshowControlsOnTouch = true,\n\tenableKeyboardControls = true,\n\tenableTouchGestures = true,\n\tonPlay,\n\tonPause,\n\tonTimeUpdate,\n\tonVolumeChange,\n\tonFullscreenChange\n}: EnhancedMediaPlayerProps) {\n\tconst context = useMediaContext()\n\tconst dispatch = useMediaDispatch()\n\n\t// State selectors with memoization\n\tconst isPlaying = useMediaSelector(React.useCallback((state) => state.isPlaying, []))\n\tconst isFullscreen = useMediaSelector(React.useCallback((state) => state.isFullscreen, []))\n\tconst currentTime = useMediaSelector(React.useCallback((state) => state.currentTime, []))\n\tconst volume = useMediaSelector(React.useCallback((state) => state.volume, []))\n\tconst error = useMediaSelector(React.useCallback((state) => state.error, []))\n\n\t// Custom hooks\n\tconst {\n\t\tshowControls,\n\t\tshowControlsTemporarily,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave,\n\t\thandleTouchStart: handleControlsTouch,\n\t\thandleTouchEnd: handleControlsTouchEnd\n\t} = useAutoHideControls(autoHide, autoHideDelay, showControlsOnHover, showControlsOnTouch)\n\n\tconst {\n\t\thandleTouchStart: handleGestureStart,\n\t\thandleTouchMove: handleGestureMove,\n\t\thandleTouchEnd: handleGestureEnd\n\t} = useTouchGestures(enableTouchGestures)\n\n\t// Combine touch handlers\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\thandleControlsTouch()\n\t\t\thandleGestureStart(e)\n\t\t},\n\t\t[handleControlsTouch, handleGestureStart]\n\t)\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\thandleControlsTouchEnd()\n\t\thandleGestureEnd()\n\t}, [handleControlsTouchEnd, handleGestureEnd])\n\n\t// Event handlers with memoization\n\tconst handleClick = React.useCallback(() => {\n\t\tshowControlsTemporarily()\n\t}, [showControlsTemporarily])\n\n\t// Keyboard controls\n\tReact.useEffect(() => {\n\t\tif (!enableKeyboardControls) return\n\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Space\":\n\t\t\t\tcase \"KeyK\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"KeyF\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: isFullscreen\n\t\t\t\t\t\t\t? MediaActionTypes.EXIT_FULLSCREEN\n\t\t\t\t\t\t\t: MediaActionTypes.ENTER_FULLSCREEN\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"KeyM\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({ type: MediaActionTypes.TOGGLE_MUTE })\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: Math.max(0, currentTime - 10)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: currentTime + 10\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\t\tdetail: Math.min(1, volume + 0.1)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\t\tdetail: Math.max(0, volume - 0.1)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown)\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown)\n\t}, [enableKeyboardControls, dispatch, isPlaying, isFullscreen, currentTime, volume])\n\n\t// Event callbacks\n\tReact.useEffect(() => {\n\t\tif (isPlaying) onPlay?.()\n\t\telse onPause?.()\n\t}, [isPlaying, onPlay, onPause])\n\n\tReact.useEffect(() => {\n\t\tonTimeUpdate?.(currentTime)\n\t}, [currentTime, onTimeUpdate])\n\n\tReact.useEffect(() => {\n\t\tonVolumeChange?.(volume)\n\t}, [volume, onVolumeChange])\n\n\tReact.useEffect(() => {\n\t\tonFullscreenChange?.(isFullscreen)\n\t}, [isFullscreen, onFullscreenChange])\n\n\treturn (\n\t\t<div\n\t\t\tref={composeRefs(context.rootRef)}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative isolate flex flex-col overflow-hidden rounded-lg bg-black outline-none\",\n\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n\t\t\t\t\"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\t\t\t\tisFullscreen && \"fixed inset-0 z-50 rounded-none\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-state={isFullscreen ? \"fullscreen\" : \"inline\"}\n\t\t\tdata-disabled={error ? \"\" : undefined}\n\t\t\tdata-controls-visible={showControls ? \"\" : undefined}\n\t\t\ttabIndex={0}\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\tonTouchStart={handleTouchStart}\n\t\t\tonTouchMove={handleGestureMove}\n\t\t\tonTouchEnd={handleTouchEnd}\n\t\t\tonClick={handleClick}>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nEnhancedMediaPlayer.displayName = \"EnhancedMediaPlayer\"\n","\"use client\"\n\nimport React from \"react\"\nimport { MediaActionTypes, useMediaDispatch, useMediaSelector } from \"../../context/media-context\"\nimport { formatTime } from \"../../lib/format-time\"\nimport { cn } from \"../../lib/utils\"\n\n// Types for advanced features\nexport interface Chapter {\n\tid: string\n\ttitle: string\n\tstartTime: number\n\tendTime: number\n\tthumbnail?: string\n}\n\nexport interface QualityLevel {\n\tid: string\n\tlabel: string\n\twidth: number\n\theight: number\n\tbitrate?: number\n}\n\nexport interface Subtitle {\n\tid: string\n\tlabel: string\n\tlanguage: string\n\tsrc: string\n\tdefault?: boolean\n}\n\n// Quality selector component\nexport const QualitySelector = function QualitySelector({\n\tqualities,\n\tcurrentQuality,\n\tonQualityChange,\n\tclassName\n}: {\n\tqualities: QualityLevel[]\n\tcurrentQuality: string\n\tonQualityChange: (qualityId: string) => void\n\tclassName?: string\n}) {\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst currentQualityLabel = React.useMemo(() => {\n\t\treturn qualities.find((q) => q.id === currentQuality)?.label || \"Auto\"\n\t}, [qualities, currentQuality])\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select quality\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{currentQualityLabel}</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t{qualities.map((quality) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={quality.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonQualityChange(quality.id)\n\t\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tquality.id === currentQuality && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{quality.label}\n\t\t\t\t\t\t\t{quality.bitrate && (\n\t\t\t\t\t\t\t\t<span className=\"ml-2 text-white/60 text-xs\">\n\t\t\t\t\t\t\t\t\t({Math.round(quality.bitrate / 1000)}k)\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Subtitle selector component\nexport const SubtitleSelector = function SubtitleSelector({\n\tsubtitles,\n\tcurrentSubtitle,\n\tonSubtitleChange,\n\tclassName\n}: {\n\tsubtitles: Subtitle[]\n\tcurrentSubtitle: string | null\n\tonSubtitleChange: (subtitleId: string | null) => void\n\tclassName?: string\n}) {\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst currentSubtitleLabel = React.useMemo(() => {\n\t\tif (!currentSubtitle) return \"Off\"\n\t\treturn subtitles.find((s) => s.id === currentSubtitle)?.label || \"Off\"\n\t}, [subtitles, currentSubtitle])\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select subtitles\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{currentSubtitleLabel}</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tonSubtitleChange(null)\n\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t!currentSubtitle && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\tOff\n\t\t\t\t\t</button>\n\t\t\t\t\t{subtitles.map((subtitle) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={subtitle.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonSubtitleChange(subtitle.id)\n\t\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tsubtitle.id === currentSubtitle && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{subtitle.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Playback speed selector\nexport const PlaybackSpeedSelector = function PlaybackSpeedSelector({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst playbackRate = useMediaSelector((state) => state.playbackRate)\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst speeds = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n\n\tconst handleSpeedChange = React.useCallback(\n\t\t(speed: number) => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_PLAYBACK_RATE, detail: speed })\n\t\t\tsetIsOpen(false)\n\t\t},\n\t\t[dispatch]\n\t)\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select playback speed\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M13,8A4,4 0 0,0 9,12A4,4 0 0,0 13,16A4,4 0 0,0 17,12A4,4 0 0,0 13,8M13,14A2,2 0 0,1 11,12A2,2 0 0,1 13,10A2,2 0 0,1 15,12A2,2 0 0,1 13,14M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4Z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{playbackRate}x</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-20 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t{speeds.map((speed) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={speed}\n\t\t\t\t\t\t\tonClick={() => handleSpeedChange(speed)}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tspeed === playbackRate && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{speed}x\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Chapters component\nexport const ChaptersPanel = function ChaptersPanel({\n\tchapters,\n\tonChapterSelect,\n\tclassName\n}: {\n\tchapters: Chapter[]\n\tonChapterSelect: (chapter: Chapter) => void\n\tclassName?: string\n}) {\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\n\tconst currentChapter = React.useMemo(() => {\n\t\treturn chapters.find(\n\t\t\t(chapter) => currentTime >= chapter.startTime && currentTime < chapter.endTime\n\t\t)\n\t}, [chapters, currentTime])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-lg border border-white/20 bg-black/90 p-4 backdrop-blur-sm\",\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<h3 className=\"mb-3 font-semibold text-white\">Chapters</h3>\n\t\t\t<div className=\"max-h-64 space-y-2 overflow-y-auto\">\n\t\t\t\t{chapters.map((chapter) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={chapter.id}\n\t\t\t\t\t\tonClick={() => onChapterSelect(chapter)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-full items-center gap-3 rounded-lg p-3 text-left transition-colors\",\n\t\t\t\t\t\t\t\"hover:bg-white/10\",\n\t\t\t\t\t\t\tchapter.id === currentChapter?.id && \"border border-primary/30 bg-primary/20\"\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\t{chapter.thumbnail && (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={chapter.thumbnail}\n\t\t\t\t\t\t\t\talt={chapter.title}\n\t\t\t\t\t\t\t\tclassName=\"h-9 w-16 rounded object-cover\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<div className=\"truncate font-medium text-white\">{chapter.title}</div>\n\t\t\t\t\t\t\t<div className=\"text-sm text-white/60\">\n\t\t\t\t\t\t\t\t{formatTime(chapter.startTime)} - {formatTime(chapter.endTime)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Picture-in-Picture button\nexport const PictureInPictureButton = function PictureInPictureButton({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPictureInPicture = useMediaSelector((state) => state.isPictureInPicture)\n\n\tconst handleTogglePiP = React.useCallback(() => {\n\t\tdispatch({\n\t\t\ttype: isPictureInPicture ? MediaActionTypes.EXIT_PIP : MediaActionTypes.ENTER_PIP\n\t\t})\n\t}, [dispatch, isPictureInPicture])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleTogglePiP}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex h-10 w-10 items-center justify-center rounded-full text-white\",\n\t\t\t\t\"transition-colors hover:bg-white/10\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={isPictureInPicture ? \"Exit Picture-in-Picture\" : \"Enter Picture-in-Picture\"}>\n\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t<path d=\"M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14z\" />\n\t\t\t</svg>\n\t\t</button>\n\t)\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { MediaActionTypes, useMediaDispatch, useMediaSelector } from \"../../context/media-context\"\nimport { formatTime } from \"../../lib/format-time\"\nimport { cn } from \"../../lib/utils\"\n\n// Enhanced play button with better animations\nexport const EnhancedPlayButton = function EnhancedPlayButton({\n\tclassName,\n\tsize = \"md\"\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPlaying = useMediaSelector((state) => state.isPlaying)\n\tconst isLoading = useMediaSelector((state) => state.isLoading)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\",\n\t\txl: \"h-16 w-16\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\",\n\t\txl: \"h-8 w-8\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tdispatch({\n\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t})\n\t}, [dispatch, isPlaying])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tdisabled={isLoading}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={isPlaying ? \"Pause\" : \"Play\"}>\n\t\t\t{isLoading ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"animate-spin rounded-full border-2 border-white/30 border-t-white\",\n\t\t\t\t\t\ticonSizes[size]\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className={cn(\"transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t\t{isPlaying ? (\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t\t\t<path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"ml-0.5 h-full w-full\">\n\t\t\t\t\t\t\t<path d=\"M8 5v14l11-7z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</button>\n\t)\n}\n\n// Enhanced seek bar with preview and better touch support\nexport const EnhancedSeekBar = function EnhancedSeekBar({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\tconst buffered = useMediaSelector((state) => state.buffered)\n\tconst previewTime = useMediaSelector((state) => state.previewTime)\n\n\tconst [isDragging, setIsDragging] = React.useState(false)\n\tconst [hoverTime, setHoverTime] = React.useState<number | null>(null)\n\tconst progressRef = React.useRef<HTMLDivElement>(null)\n\n\tconst progress = duration > 0 ? (currentTime / duration) * 100 : 0\n\tconst previewProgress =\n\t\tduration > 0 && previewTime !== null ? (previewTime / duration) * 100 : null\n\n\t// Calculate buffered ranges\n\tconst bufferedRanges = React.useMemo(() => {\n\t\tif (!buffered || duration === 0) return []\n\t\tconst ranges = []\n\t\tfor (let i = 0; i < buffered.length; i++) {\n\t\t\tranges.push({\n\t\t\t\tstart: (buffered.start(i) / duration) * 100,\n\t\t\t\tend: (buffered.end(i) / duration) * 100\n\t\t\t})\n\t\t}\n\t\treturn ranges\n\t}, [buffered, duration])\n\n\tconst getTimeFromPosition = React.useCallback(\n\t\t(clientX: number) => {\n\t\t\tif (!progressRef.current) return 0\n\t\t\tconst rect = progressRef.current.getBoundingClientRect()\n\t\t\tconst position = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n\t\t\treturn position * duration\n\t\t},\n\t\t[duration]\n\t)\n\n\tconst handleMouseMove = React.useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\t\tsetHoverTime(time)\n\t\t\t\tdispatch({ type: MediaActionTypes.PREVIEW_TIME, detail: time })\n\t\t\t}\n\t\t},\n\t\t[isDragging, getTimeFromPosition, dispatch]\n\t)\n\n\tconst handleMouseLeave = React.useCallback(() => {\n\t\tif (!isDragging) {\n\t\t\tsetHoverTime(null)\n\t\t\tdispatch({ type: MediaActionTypes.CLEAR_PREVIEW })\n\t\t}\n\t}, [isDragging, dispatch])\n\n\tconst handleMouseDown = React.useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tsetIsDragging(true)\n\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t},\n\t\t[getTimeFromPosition, dispatch]\n\t)\n\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tsetIsDragging(true)\n\t\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t},\n\t\t[getTimeFromPosition, dispatch]\n\t)\n\n\tReact.useEffect(() => {\n\t\tconst handleMouseMove = (e: MouseEvent) => {\n\t\t\tif (isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t\t}\n\t\t}\n\n\t\tconst handleMouseUp = () => {\n\t\t\tsetIsDragging(false)\n\t\t\tsetHoverTime(null)\n\t\t\tdispatch({ type: MediaActionTypes.CLEAR_PREVIEW })\n\t\t}\n\n\t\tconst handleTouchMove = (e: TouchEvent) => {\n\t\t\tif (isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t\t}\n\t\t}\n\n\t\tif (isDragging) {\n\t\t\tdocument.addEventListener(\"mousemove\", handleMouseMove)\n\t\t\tdocument.addEventListener(\"mouseup\", handleMouseUp)\n\t\t\tdocument.addEventListener(\"touchmove\", handleTouchMove)\n\t\t\tdocument.addEventListener(\"touchend\", handleMouseUp)\n\t\t}\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousemove\", handleMouseMove)\n\t\t\tdocument.removeEventListener(\"mouseup\", handleMouseUp)\n\t\t\tdocument.removeEventListener(\"touchmove\", handleTouchMove)\n\t\t\tdocument.removeEventListener(\"touchend\", handleMouseUp)\n\t\t}\n\t}, [isDragging, getTimeFromPosition, dispatch])\n\n\treturn (\n\t\t<div className={cn(\"group relative flex items-center\", className)}>\n\t\t\t{/* Time preview tooltip */}\n\t\t\t{(hoverTime !== null || previewTime !== null) && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"pointer-events-none absolute bottom-full mb-2 rounded bg-black/80 px-2 py-1 text-white text-xs\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tleft: `${previewProgress || ((hoverTime || 0) / duration) * 100}%`,\n\t\t\t\t\t\ttransform: \"translateX(-50%)\"\n\t\t\t\t\t}}>\n\t\t\t\t\t{formatTime(hoverTime || previewTime || 0)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tref={progressRef}\n\t\t\t\tclassName=\"relative h-2 w-full cursor-pointer rounded-full bg-white/20 transition-all duration-200 group-hover:h-3\"\n\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\tonTouchStart={handleTouchStart}>\n\t\t\t\t{/* Buffered ranges */}\n\t\t\t\t{bufferedRanges.map((range, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName=\"absolute top-0 h-full rounded-full bg-white/30\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tleft: `${range.start}%`,\n\t\t\t\t\t\t\twidth: `${range.end - range.start}%`\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\n\t\t\t\t{/* Progress bar */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute top-0 h-full rounded-full bg-primary transition-all duration-100\"\n\t\t\t\t\tstyle={{ width: `${progress}%` }}\n\t\t\t\t/>\n\n\t\t\t\t{/* Preview indicator */}\n\t\t\t\t{previewProgress !== null && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute top-0 h-full w-1 rounded-full bg-white/80\"\n\t\t\t\t\t\tstyle={{ left: `${previewProgress}%` }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* Thumb */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 h-4 w-4 rounded-full border-2 border-white bg-primary opacity-0 shadow-lg transition-all duration-200 group-hover:opacity-100\"\n\t\t\t\t\tstyle={{ left: `${progress}%`, transform: \"translateX(-50%) translateY(-50%)\" }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Enhanced volume control with better UX\nexport const EnhancedVolumeControl = function EnhancedVolumeControl({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst volume = useMediaSelector((state) => state.volume)\n\tconst isMuted = useMediaSelector((state) => state.isMuted)\n\n\tconst [showSlider, setShowSlider] = React.useState(false)\n\n\tconst handleToggleMute = React.useCallback(() => {\n\t\tdispatch({ type: MediaActionTypes.TOGGLE_MUTE })\n\t}, [dispatch])\n\n\tconst handleVolumeChange = React.useCallback(\n\t\t(newVolume: number) => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_VOLUME, detail: newVolume })\n\t\t},\n\t\t[dispatch]\n\t)\n\n\tconst VolumeIcon = React.useMemo(() => {\n\t\tif (isMuted || volume === 0) {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<path d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t} else if (volume < 0.5) {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<path d=\"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t} else {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t}\n\t}, [isMuted, volume])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"relative flex items-center\", className)}\n\t\t\tonMouseEnter={() => setShowSlider(true)}\n\t\t\tonMouseLeave={() => setShowSlider(false)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={handleToggleMute}\n\t\t\t\tclassName=\"flex h-10 w-10 items-center justify-center rounded-full text-white transition-colors hover:bg-white/10\"\n\t\t\t\taria-label={isMuted ? \"Unmute\" : \"Mute\"}>\n\t\t\t\t{VolumeIcon}\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\"absolute left-full ml-2 flex items-center transition-all duration-200\",\n\t\t\t\t\tshowSlider ? \"translate-x-0 opacity-100\" : \"-translate-x-2 pointer-events-none 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={(e) => handleVolumeChange(parseFloat(e.target.value))}\n\t\t\t\t\tclassName=\"slider h-1 w-20 cursor-pointer appearance-none rounded-lg bg-white/20\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Enhanced backward skip button\nexport const EnhancedBackwardButton = function EnhancedBackwardButton({\n\tclassName,\n\tsize = \"md\",\n\tskipTime = 10\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tconst newTime = Math.max(0, currentTime - skipTime)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: newTime })\n\t}, [dispatch, currentTime, skipTime])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={`Backward ${skipTime} seconds`}\n\t\t\ttitle={`Backward ${skipTime}s`}>\n\t\t\t<div className={cn(\"flex items-center transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t<path d=\"M7 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM15.5 7.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v9c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-9z\" />\n\t\t\t\t\t<path d=\"M5.5 12l7-4.5v9l-7-4.5z\" opacity=\"0.8\" />\n\t\t\t\t</svg>\n\t\t\t\t{skipTime && <span className=\"-bottom-1 absolute font-bold text-[10px]\">{skipTime}</span>}\n\t\t\t</div>\n\t\t</button>\n\t)\n}\n\n// Enhanced forward skip button\nexport const EnhancedForwardButton = function EnhancedForwardButton({\n\tclassName,\n\tsize = \"md\",\n\tskipTime = 10\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tconst newTime = Math.min(duration, currentTime + skipTime)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: newTime })\n\t}, [dispatch, currentTime, duration, skipTime])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={`Forward ${skipTime} seconds`}\n\t\t\ttitle={`Forward ${skipTime}s`}>\n\t\t\t<div className={cn(\"flex items-center transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t<path d=\"M17 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM8.5 7.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v9c0 .83-.67 1.5-1.5 1.5s-1.5-.67-1.5-1.5v-9z\" />\n\t\t\t\t\t<path d=\"M18.5 12l-7-4.5v9l7-4.5z\" opacity=\"0.8\" />\n\t\t\t\t</svg>\n\t\t\t\t{skipTime && <span className=\"-bottom-1 absolute font-bold text-[10px]\">{skipTime}</span>}\n\t\t\t</div>\n\t\t</button>\n\t)\n}\n\n// Enhanced time display\nexport const EnhancedTimeDisplay = function EnhancedTimeDisplay({\n\tvariant = \"current\",\n\tclassName\n}: {\n\tvariant?: \"current\" | \"duration\" | \"remaining\"\n\tclassName?: string\n}) {\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\n\tconst displayTime = React.useMemo(() => {\n\t\tswitch (variant) {\n\t\t\tcase \"current\":\n\t\t\t\treturn formatTime(currentTime)\n\t\t\tcase \"duration\":\n\t\t\t\treturn formatTime(duration)\n\t\t\tcase \"remaining\":\n\t\t\t\treturn `-${formatTime(duration - currentTime)}`\n\t\t\tdefault:\n\t\t\t\treturn formatTime(currentTime)\n\t\t}\n\t}, [variant, currentTime, duration])\n\n\treturn (\n\t\t<div className={cn(\"font-mono text-sm text-white tabular-nums\", className)}>{displayTime}</div>\n\t)\n}\n\n// Performance indicator component\nexport const PerformanceIndicator = function PerformanceIndicator({\n\tmetrics,\n\tclassName\n}: {\n\tmetrics?: {\n\t\tfps?: number\n\t\tbufferHealth?: number\n\t\tquality?: number\n\t\tbandwidth?: number\n\t}\n\tclassName?: string\n}) {\n\tif (!metrics || process.env.NODE_ENV !== \"development\") {\n\t\treturn null\n\t}\n\n\tconst getPerformanceColor = (fps: number) => {\n\t\tif (fps >= 50) return \"text-green-400\"\n\t\tif (fps >= 30) return \"text-yellow-400\"\n\t\treturn \"text-red-400\"\n\t}\n\n\tconst getBufferColor = (health: number) => {\n\t\tif (health >= 5) return \"text-green-400\"\n\t\tif (health >= 2) return \"text-yellow-400\"\n\t\treturn \"text-red-400\"\n\t}\n\n\treturn (\n\t\t<div className={cn(\"flex items-center gap-3 font-mono text-xs\", className)}>\n\t\t\t{metrics.fps !== undefined && (\n\t\t\t\t<div className={cn(\"flex items-center gap-1\", getPerformanceColor(metrics.fps))}>\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.fps} FPS</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{metrics.bufferHealth !== undefined && (\n\t\t\t\t<div className={cn(\"flex items-center gap-1\", getBufferColor(metrics.bufferHealth))}>\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.bufferHealth.toFixed(1)}s</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{metrics.quality !== undefined && (\n\t\t\t\t<div className=\"flex items-center gap-1 text-blue-400\">\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.quality}p</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Enhanced control bar that combines all controls\nexport const EnhancedControlBar = function EnhancedControlBar({\n\tclassName,\n\tshowSkipButtons = true,\n\tshowVolumeControl = true,\n\tshowTimeDisplay = true,\n\tplayButtonSize = \"xl\",\n\tskipButtonSize = \"md\",\n\tskipTime = 10,\n\tshowPerformanceIndicators = process.env.NODE_ENV === \"development\",\n\tperformanceMetrics\n}: {\n\tclassName?: string\n\tshowSkipButtons?: boolean\n\tshowVolumeControl?: boolean\n\tshowTimeDisplay?: boolean\n\tplayButtonSize?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n\tskipButtonSize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n\tshowPerformanceIndicators?: boolean\n\tperformanceMetrics?: {\n\t\tfps?: number\n\t\tbufferHealth?: number\n\t\tquality?: number\n\t\tbandwidth?: number\n\t}\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-4 bg-gradient-to-t from-black/80 to-transparent p-4\",\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t{/* Seek Bar */}\n\t\t\t<EnhancedSeekBar className=\"w-full\" />\n\n\t\t\t{/* Control Buttons */}\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t{/* Left side - Media controls */}\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedBackwardButton\n\t\t\t\t\t\t\tsize={skipButtonSize}\n\t\t\t\t\t\t\tskipTime={skipTime}\n\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<EnhancedPlayButton size={playButtonSize} className=\"shrink-0\" />\n\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedForwardButton size={skipButtonSize} skipTime={skipTime} className=\"shrink-0\" />\n\t\t\t\t\t)}\n\n\t\t\t\t\t{showVolumeControl && <EnhancedVolumeControl className=\"shrink-0\" />}\n\n\t\t\t\t\t{showTimeDisplay && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1 font-mono text-sm\">\n\t\t\t\t\t\t\t<EnhancedTimeDisplay variant=\"current\" />\n\t\t\t\t\t\t\t<span className=\"text-white/60\">/</span>\n\t\t\t\t\t\t\t<EnhancedTimeDisplay variant=\"duration\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Right side - Performance indicators and additional controls */}\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{showPerformanceIndicators && (\n\t\t\t\t\t\t<PerformanceIndicator metrics={performanceMetrics} className=\"text-white/80\" />\n\t\t\t\t\t)}\n\t\t\t\t\t{/* Future: Settings, Fullscreen, etc. */}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","/**\n * Debug Panel Component for Performance Monitoring\n * Development-only component for displaying performance metrics\n */\n\nimport React, { useMemo } from \"react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface PerformanceMetrics {\n\tfps: number\n\tmemoryUsage: number\n\tbufferHealth: number\n\tnetworkBandwidth: number\n\tdroppedFrames: number\n\tdecodedFrames: number\n\tpresentationTime: number\n}\n\ninterface PreloadingStats {\n\tpreloadedItems: number\n\tengagementScore: number\n\tqueueLength: number\n\thitRate: number\n\ttotalSaved: number\n}\n\ninterface DebugPanelProps {\n\t/** Performance metrics to display */\n\tperformanceMetrics?: Partial<PerformanceMetrics>\n\t/** Preloading statistics */\n\tpreloadingStats?: PreloadingStats\n\t/** Current playback state */\n\tplaybackState?: {\n\t\tcurrentTime: number\n\t\tduration: number\n\t\tvolume: number\n\t\tisPlaying: boolean\n\t\tquality: number\n\t\tisBuffering: boolean\n\t\terror?: string\n\t}\n\t/** HLS-specific metrics */\n\thlsMetrics?: {\n\t\tcurrentLevel: number\n\t\tavailableLevels: number\n\t\tbandwidthEstimate: number\n\t\tdroppedFrames: number\n\t}\n\t/** Plugin information */\n\tpluginInfo?: {\n\t\tloadedPlugins: string[]\n\t\tactivePlugins: string[]\n\t\tpluginCount: number\n\t}\n\t/** Additional debug information */\n\tdebugInfo?: Record<string, any>\n\t/** Custom className */\n\tclassName?: string\n\t/** Panel position */\n\tposition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\"\n\t/** Whether the panel is collapsed by default */\n\tdefaultCollapsed?: boolean\n\t/** Custom title */\n\ttitle?: string\n}\n\n/**\n * Debug Panel Component\n */\nexport const DebugPanel: React.FC<DebugPanelProps> = ({\n\tperformanceMetrics = {},\n\tpreloadingStats = {} as PreloadingStats,\n\tplaybackState = {} as any,\n\thlsMetrics = {},\n\tpluginInfo = {},\n\tdebugInfo = {},\n\tclassName,\n\tposition = \"top-right\",\n\tdefaultCollapsed = false,\n\ttitle = \"BaroiPlayer Debug Panel\"\n}) => {\n\tconst [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed)\n\tconst [activeTab, setActiveTab] = React.useState<\"performance\" | \"hls\" | \"plugins\" | \"debug\">(\n\t\t\"performance\"\n\t)\n\n\t// Position classes\n\tconst positionClasses = useMemo(() => {\n\t\tswitch (position) {\n\t\t\tcase \"top-left\":\n\t\t\t\treturn \"top-4 left-4\"\n\t\t\tcase \"top-right\":\n\t\t\t\treturn \"top-4 right-4\"\n\t\t\tcase \"bottom-left\":\n\t\t\t\treturn \"bottom-4 left-4\"\n\t\t\tcase \"bottom-right\":\n\t\t\t\treturn \"bottom-4 right-4\"\n\t\t\tdefault:\n\t\t\t\treturn \"top-4 right-4\"\n\t\t}\n\t}, [position])\n\n\t// Format bytes\n\tconst formatBytes = (bytes: number): string => {\n\t\tif (bytes === 0) return \"0 B\"\n\t\tconst k = 1024\n\t\tconst sizes = [\"B\", \"KB\", \"MB\", \"GB\"]\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\n\t\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i]\n\t}\n\n\t// Format time\n\tconst formatTime = (seconds: number): string => {\n\t\tconst mins = Math.floor(seconds / 60)\n\t\tconst secs = Math.floor(seconds % 60)\n\t\treturn `${mins}:${secs.toString().padStart(2, \"0\")}`\n\t}\n\n\t// Render performance metrics\n\tconst renderPerformanceMetrics = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">FPS:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.fps || 0}</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Memory:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)} MB\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Buffer:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{(performanceMetrics.bufferHealth || 0).toFixed(2)}s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Bandwidth:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{formatBytes(performanceMetrics.networkBandwidth || 0)}/s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Dropped:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.droppedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-cyan-400\">Decoded:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.decodedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render playback state\n\tconst renderPlaybackState = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Status:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{playbackState.isPlaying ? (\n\t\t\t\t\t\t\t<span className=\"text-green-300\">Playing</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"text-red-300\">Paused</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Time:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{formatTime(playbackState.currentTime || 0)} / {formatTime(playbackState.duration || 0)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Volume:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{Math.round((playbackState.volume || 0) * 100)}%</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Quality:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{playbackState.quality || 0}p</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Buffering:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{playbackState.isBuffering ? (\n\t\t\t\t\t\t\t<span className=\"text-yellow-300\">Yes</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"text-green-300\">No</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t{playbackState.error && (\n\t\t\t\t\t<div className=\"col-span-2\">\n\t\t\t\t\t\t<span className=\"text-red-400\">Error:</span>\n\t\t\t\t\t\t<span className=\"ml-2 break-all font-mono text-red-300 text-xs\">\n\t\t\t\t\t\t\t{playbackState.error}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render preloading stats\n\tconst renderPreloadingStats = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Preloaded:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{preloadingStats.preloadedItems || 0} items</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Engagement:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{(preloadingStats.engagementScore || 0).toFixed(1)}%\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Queue:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{preloadingStats.queueLength || 0} items</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Hit Rate:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{(preloadingStats.hitRate || 0).toFixed(1)}%</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"col-span-2\">\n\t\t\t\t\t<span className=\"text-cyan-400\">Saved:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{formatBytes(preloadingStats.totalSaved || 0)}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render HLS metrics\n\tconst renderHLSMetrics = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Level:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{hlsMetrics.currentLevel || 0} / {hlsMetrics.availableLevels || 0}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Bandwidth:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{formatBytes(hlsMetrics.bandwidthEstimate || 0)}/s</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Dropped:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{hlsMetrics.droppedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render plugin info\n\tconst renderPluginInfo = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Total:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{pluginInfo.pluginCount || 0} plugins</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t<span className=\"text-blue-400\">Active:</span>\n\t\t\t\t\t<div className=\"ml-2 space-y-1 font-mono text-xs\">\n\t\t\t\t\t\t{pluginInfo.activePlugins?.map((plugin, index) => (\n\t\t\t\t\t\t\t<div key={index} className=\"text-green-300\">\n\t\t\t\t\t\t\t\t• {plugin}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)) || <div className=\"text-gray-400\">None</div>}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{pluginInfo.loadedPlugins &&\n\t\t\t\t\tpluginInfo.loadedPlugins.length > (pluginInfo.activePlugins?.length || 0) && (\n\t\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t\t<span className=\"text-yellow-400\">Loaded (inactive):</span>\n\t\t\t\t\t\t\t<div className=\"ml-2 space-y-1 font-mono text-xs\">\n\t\t\t\t\t\t\t\t{pluginInfo.loadedPlugins\n\t\t\t\t\t\t\t\t\t.filter((plugin) => !pluginInfo.activePlugins?.includes(plugin))\n\t\t\t\t\t\t\t\t\t.map((plugin, index) => (\n\t\t\t\t\t\t\t\t\t\t<div key={index} className=\"text-yellow-300\">\n\t\t\t\t\t\t\t\t\t\t\t• {plugin}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render debug info\n\tconst renderDebugInfo = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"space-y-1 font-mono text-xs\">\n\t\t\t\t{Object.entries(debugInfo).map(([key, value]) => (\n\t\t\t\t\t<div key={key}>\n\t\t\t\t\t\t<span className=\"text-yellow-400\">{key}:</span>\n\t\t\t\t\t\t<span className=\"ml-2 text-gray-300\">\n\t\t\t\t\t\t\t{typeof value === \"object\" ? JSON.stringify(value, null, 2) : String(value)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render tabs\n\tconst renderTabs = () => (\n\t\t<div className=\"flex space-x-1 border-gray-600 border-b\">\n\t\t\t{[\n\t\t\t\t{ id: \"performance\", label: \"Performance\" },\n\t\t\t\t{ id: \"hls\", label: \"HLS\" },\n\t\t\t\t{ id: \"plugins\", label: \"Plugins\" },\n\t\t\t\t{ id: \"debug\", label: \"Debug\" }\n\t\t\t].map((tab) => (\n\t\t\t\t<button\n\t\t\t\t\tkey={tab.id}\n\t\t\t\t\tonClick={() => setActiveTab(tab.id as any)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"px-2 py-1 font-medium text-xs transition-colors\",\n\t\t\t\t\t\tactiveTab === tab.id\n\t\t\t\t\t\t\t? \"border-blue-400 border-b text-blue-400\"\n\t\t\t\t\t\t\t: \"text-gray-400 hover:text-white\"\n\t\t\t\t\t)}>\n\t\t\t\t\t{tab.label}\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</div>\n\t)\n\n\t// Render active tab content\n\tconst renderTabContent = () => {\n\t\tswitch (activeTab) {\n\t\t\tcase \"performance\":\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t{renderPerformanceMetrics()}\n\t\t\t\t\t\t<hr className=\"border-gray-600\" />\n\t\t\t\t\t\t{renderPlaybackState()}\n\t\t\t\t\t\t<hr className=\"border-gray-600\" />\n\t\t\t\t\t\t{renderPreloadingStats()}\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\tcase \"hls\":\n\t\t\t\treturn renderHLSMetrics()\n\t\t\tcase \"plugins\":\n\t\t\t\treturn renderPluginInfo()\n\t\t\tcase \"debug\":\n\t\t\t\treturn renderDebugInfo()\n\t\t\tdefault:\n\t\t\t\treturn renderPerformanceMetrics()\n\t\t}\n\t}\n\n\t// Only render in development\n\tif (process.env.NODE_ENV !== \"development\") {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed z-50 min-w-80 max-w-96 rounded-lg border border-gray-700 bg-black/90 p-3 font-mono text-white text-xs backdrop-blur-sm\",\n\t\t\t\tpositionClasses,\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t{/* Header */}\n\t\t\t<div className=\"mb-3 flex items-center justify-between\">\n\t\t\t\t<h3 className=\"font-bold text-blue-400 text-sm\">{title}</h3>\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => setIsCollapsed(!isCollapsed)}\n\t\t\t\t\t\tclassName=\"text-gray-400 transition-colors hover:text-white\"\n\t\t\t\t\t\taria-label={isCollapsed ? \"Expand\" : \"Collapse\"}>\n\t\t\t\t\t\t{isCollapsed ? (\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M3 4.5L6 7.5L9 4.5\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M3 7.5L6 4.5L9 7.5\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Collapsed content */}\n\t\t\t{isCollapsed ? (\n\t\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span className=\"text-green-400\">FPS:</span>\n\t\t\t\t\t\t<span className=\"ml-1 font-mono\">{performanceMetrics.fps || 0}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span className=\"text-blue-400\">Memory:</span>\n\t\t\t\t\t\t<span className=\"ml-1 font-mono\">\n\t\t\t\t\t\t\t{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)}MB\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{/* Tabs */}\n\t\t\t\t\t{renderTabs()}\n\n\t\t\t\t\t{/* Tab Content */}\n\t\t\t\t\t<div className=\"mt-3 max-h-64 overflow-y-auto\">{renderTabContent()}</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n/**\n * Performance Debug Panel - simplified version focused on performance metrics\n */\nexport const PerformanceDebugPanel: React.FC<\n\tOmit<DebugPanelProps, \"position\" | \"defaultCollapsed\" | \"title\">\n> = (props) => {\n\treturn (\n\t\t<DebugPanel\n\t\t\t{...props}\n\t\t\tposition=\"top-right\"\n\t\t\tdefaultCollapsed={false}\n\t\t\ttitle=\"Performance Monitor\"\n\t\t/>\n\t)\n}\n\nexport default DebugPanel\n"],"names":["composeRefs","refs","node","ref","useAutoHideControls","autoHide","delay","showOnHover","showOnTouch","showControls","setShowControls","React","isHovering","setIsHovering","isTouching","setIsTouching","timeoutRef","resetTimeout","showControlsTemporarily","handleMouseEnter","handleMouseLeave","handleTouchStart","handleTouchEnd","useTouchGestures","enabled","dispatch","useMediaDispatch","isPlaying","useMediaSelector","state","currentTime","duration","volume","touchStart","setTouchStart","isDoubleTap","setIsDoubleTap","e","touch","now","MediaActionTypes","handleTouchMove","deltaX","deltaY","seekAmount","newTime","volumeChange","newVolume","EnhancedMediaPlayer","children","className","autoHideDelay","showControlsOnHover","showControlsOnTouch","enableKeyboardControls","enableTouchGestures","onPlay","onPause","onTimeUpdate","onVolumeChange","onFullscreenChange","context","useMediaContext","isFullscreen","error","handleControlsTouch","handleControlsTouchEnd","handleGestureStart","handleGestureMove","handleGestureEnd","handleClick","handleKeyDown","jsx","cn","QualitySelector","qualities","currentQuality","onQualityChange","isOpen","setIsOpen","currentQualityLabel","q","jsxs","quality","SubtitleSelector","subtitles","currentSubtitle","onSubtitleChange","currentSubtitleLabel","s","subtitle","PlaybackSpeedSelector","playbackRate","speeds","handleSpeedChange","speed","ChaptersPanel","chapters","onChapterSelect","currentChapter","chapter","formatTime","PictureInPictureButton","isPictureInPicture","handleTogglePiP","EnhancedPlayButton","size","isLoading","sizeClasses","iconSizes","EnhancedSeekBar","buffered","previewTime","isDragging","setIsDragging","hoverTime","setHoverTime","progressRef","progress","previewProgress","bufferedRanges","ranges","i","getTimeFromPosition","clientX","rect","handleMouseMove","time","handleMouseDown","handleMouseUp","range","index","EnhancedVolumeControl","isMuted","showSlider","setShowSlider","handleToggleMute","handleVolumeChange","VolumeIcon","EnhancedBackwardButton","skipTime","EnhancedForwardButton","EnhancedTimeDisplay","variant","displayTime","PerformanceIndicator","metrics","getPerformanceColor","fps","getBufferColor","health","EnhancedControlBar","showSkipButtons","showVolumeControl","showTimeDisplay","playButtonSize","skipButtonSize","showPerformanceIndicators","performanceMetrics","DebugPanel","preloadingStats","playbackState","hlsMetrics","pluginInfo","debugInfo","position","defaultCollapsed","title","isCollapsed","setIsCollapsed","activeTab","setActiveTab","positionClasses","useMemo","formatBytes","bytes","k","sizes","seconds","mins","secs","renderPerformanceMetrics","renderPlaybackState","renderPreloadingStats","renderHLSMetrics","renderPluginInfo","plugin","renderDebugInfo","key","value","renderTabs","tab","renderTabContent","Fragment"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const e=require("./context-eNS62_ac.cjs"),o=require("react"),x=require("./utils-CFOue_9K.cjs");function Y(...u){return i=>{u.forEach(s=>{typeof s=="function"?s(i):s&&(s.current=i)})}}function W(u,i,s,n){const[t,a]=o.useState(!0),[r,c]=o.useState(!1),[l,p]=o.useState(!1),d=o.useRef(null),v=o.useCallback(()=>{d.current&&clearTimeout(d.current),u&&(d.current=setTimeout(()=>{!r&&!l&&a(!1)},i))},[u,i,r,l]),N=o.useCallback(()=>{a(!0),v()},[v]);o.useEffect(()=>(u?v():a(!0),()=>{d.current&&clearTimeout(d.current)}),[u,v]);const f=o.useCallback(()=>{s&&(c(!0),a(!0))},[s]),R=o.useCallback(()=>{s&&(c(!1),v())},[s,v]),m=o.useCallback(()=>{n&&(p(!0),N())},[n,N]),b=o.useCallback(()=>{n&&(p(!1),v())},[n,v]);return{showControls:t,showControlsTemporarily:N,handleMouseEnter:f,handleMouseLeave:R,handleTouchStart:m,handleTouchEnd:b}}function Q(u){const i=e.useMediaDispatch(),s=e.useMediaSelector(f=>f.isPlaying),n=e.useMediaSelector(f=>f.currentTime),t=e.useMediaSelector(f=>f.duration),a=e.useMediaSelector(f=>f.volume),[r,c]=o.useState(null),[l,p]=o.useState(!1),d=o.useCallback(f=>{if(!u)return;const R=f.touches[0];if(!R)return;const m=Date.now();r&&m-r.time<300?(p(!0),i({type:s?e.MediaActionTypes.PAUSE:e.MediaActionTypes.PLAY})):(c({x:R.clientX,y:R.clientY,time:m}),p(!1))},[u,r,s,i]),v=o.useCallback(f=>{if(!u||!r||l)return;const R=f.touches[0];if(!R)return;const m=R.clientX-r.x,b=R.clientY-r.y;if(Math.abs(m)>Math.abs(b)&&Math.abs(m)>50){const g=m/window.innerWidth*30,M=Math.max(0,Math.min(t,n+g));i({type:e.MediaActionTypes.SEEK,detail:M})}if(Math.abs(b)>Math.abs(m)&&Math.abs(b)>50&&r.x>window.innerWidth/2){const g=-(b/window.innerHeight)*1,M=Math.max(0,Math.min(1,a+g));i({type:e.MediaActionTypes.SET_VOLUME,detail:M})}},[u,r,l,t,n,a,i]),N=o.useCallback(()=>{u&&setTimeout(()=>{c(null),p(!1)},300)},[u]);return{handleTouchStart:d,handleTouchMove:v,handleTouchEnd:N}}const D=function({children:i,className:s,autoHide:n=!0,autoHideDelay:t=3e3,showControlsOnHover:a=!0,showControlsOnTouch:r=!0,enableKeyboardControls:c=!0,enableTouchGestures:l=!0,onPlay:p,onPause:d,onTimeUpdate:v,onVolumeChange:N,onFullscreenChange:f}){const R=e.useMediaContext(),m=e.useMediaDispatch(),b=e.useMediaSelector(o.useCallback(y=>y.isPlaying,[])),g=e.useMediaSelector(o.useCallback(y=>y.isFullscreen,[])),M=e.useMediaSelector(o.useCallback(y=>y.currentTime,[])),C=e.useMediaSelector(o.useCallback(y=>y.volume,[])),h=e.useMediaSelector(o.useCallback(y=>y.error,[])),{showControls:j,showControlsTemporarily:S,handleMouseEnter:k,handleMouseLeave:P,handleTouchStart:E,handleTouchEnd:w}=W(n,t,a,r),{handleTouchStart:A,handleTouchMove:L,handleTouchEnd:z}=Q(l),$=o.useCallback(y=>{E(),A(y)},[E,A]),X=o.useCallback(()=>{w(),z()},[w,z]),G=o.useCallback(()=>{S()},[S]);return o.useEffect(()=>{if(!c)return;const y=T=>{if(!(T.target instanceof HTMLInputElement||T.target instanceof HTMLTextAreaElement))switch(T.code){case"Space":case"KeyK":T.preventDefault(),m({type:b?e.MediaActionTypes.PAUSE:e.MediaActionTypes.PLAY});break;case"KeyF":T.preventDefault(),m({type:g?e.MediaActionTypes.EXIT_FULLSCREEN:e.MediaActionTypes.ENTER_FULLSCREEN});break;case"KeyM":T.preventDefault(),m({type:e.MediaActionTypes.TOGGLE_MUTE});break;case"ArrowLeft":T.preventDefault(),m({type:e.MediaActionTypes.SEEK,detail:Math.max(0,M-10)});break;case"ArrowRight":T.preventDefault(),m({type:e.MediaActionTypes.SEEK,detail:M+10});break;case"ArrowUp":T.preventDefault(),m({type:e.MediaActionTypes.SET_VOLUME,detail:Math.min(1,C+.1)});break;case"ArrowDown":T.preventDefault(),m({type:e.MediaActionTypes.SET_VOLUME,detail:Math.max(0,C-.1)});break}};return document.addEventListener("keydown",y),()=>document.removeEventListener("keydown",y)},[c,m,b,g,M,C]),o.useEffect(()=>{b?p?.():d?.()},[b,p,d]),o.useEffect(()=>{v?.(M)},[M,v]),o.useEffect(()=>{N?.(C)},[C,N]),o.useEffect(()=>{f?.(g)},[g,f]),e.jsxRuntimeExports.jsx("div",{ref:Y(R.rootRef),className:x.cn("relative isolate flex flex-col overflow-hidden rounded-lg bg-black outline-none","focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","data-[disabled]:pointer-events-none data-[disabled]:opacity-50",g&&"fixed inset-0 z-50 rounded-none",s),"data-state":g?"fullscreen":"inline","data-disabled":h?"":void 0,"data-controls-visible":j?"":void 0,tabIndex:0,onMouseEnter:k,onMouseLeave:P,onTouchStart:$,onTouchMove:L,onTouchEnd:X,onClick:G,children:i})};D.displayName="EnhancedMediaPlayer";const F=function({qualities:i,currentQuality:s,onQualityChange:n,className:t}){const[a,r]=o.useState(!1),c=o.useMemo(()=>i.find(l=>l.id===s)?.label||"Auto",[i,s]);return e.jsxRuntimeExports.jsxs("div",{className:x.cn("relative",t),children:[e.jsxRuntimeExports.jsxs("button",{type:"button",onClick:()=>r(!a),className:"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70","aria-label":"Select quality",children:[e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-4 w-4",children:e.jsxRuntimeExports.jsx("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})}),e.jsxRuntimeExports.jsx("span",{className:"text-sm",children:c}),e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:x.cn("h-4 w-4 transition-transform",a&&"rotate-180"),children:e.jsxRuntimeExports.jsx("path",{d:"M7 10l5 5 5-5z"})})]}),a&&e.jsxRuntimeExports.jsx("div",{className:"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm",children:i.map(l=>e.jsxRuntimeExports.jsxs("button",{onClick:()=>{n(l.id),r(!1)},className:x.cn("w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10",l.id===s&&"bg-primary/20 text-primary"),children:[l.label,l.bitrate&&e.jsxRuntimeExports.jsxs("span",{className:"ml-2 text-white/60 text-xs",children:["(",Math.round(l.bitrate/1e3),"k)"]})]},l.id))})]})},V=function({subtitles:i,currentSubtitle:s,onSubtitleChange:n,className:t}){const[a,r]=o.useState(!1),c=o.useMemo(()=>s&&i.find(l=>l.id===s)?.label||"Off",[i,s]);return e.jsxRuntimeExports.jsxs("div",{className:x.cn("relative",t),children:[e.jsxRuntimeExports.jsxs("button",{type:"button",onClick:()=>r(!a),className:"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70","aria-label":"Select subtitles",children:[e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-4 w-4",children:e.jsxRuntimeExports.jsx("path",{d:"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z"})}),e.jsxRuntimeExports.jsx("span",{className:"text-sm",children:c}),e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:x.cn("h-4 w-4 transition-transform",a&&"rotate-180"),children:e.jsxRuntimeExports.jsx("path",{d:"M7 10l5 5 5-5z"})})]}),a&&e.jsxRuntimeExports.jsxs("div",{className:"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm",children:[e.jsxRuntimeExports.jsx("button",{onClick:()=>{n(null),r(!1)},className:x.cn("w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10",!s&&"bg-primary/20 text-primary"),children:"Off"}),i.map(l=>e.jsxRuntimeExports.jsx("button",{onClick:()=>{n(l.id),r(!1)},className:x.cn("w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10",l.id===s&&"bg-primary/20 text-primary"),children:l.label},l.id))]})]})},I=function({className:i}){const s=e.useMediaDispatch(),n=e.useMediaSelector(l=>l.playbackRate),[t,a]=o.useState(!1),r=[.25,.5,.75,1,1.25,1.5,1.75,2],c=o.useCallback(l=>{s({type:e.MediaActionTypes.SET_PLAYBACK_RATE,detail:l}),a(!1)},[s]);return e.jsxRuntimeExports.jsxs("div",{className:x.cn("relative",i),children:[e.jsxRuntimeExports.jsxs("button",{type:"button",onClick:()=>a(!t),className:"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70","aria-label":"Select playback speed",children:[e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-4 w-4",children:e.jsxRuntimeExports.jsx("path",{d:"M13,8A4,4 0 0,0 9,12A4,4 0 0,0 13,16A4,4 0 0,0 17,12A4,4 0 0,0 13,8M13,14A2,2 0 0,1 11,12A2,2 0 0,1 13,10A2,2 0 0,1 15,12A2,2 0 0,1 13,14M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4Z"})}),e.jsxRuntimeExports.jsxs("span",{className:"text-sm",children:[n,"x"]}),e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:x.cn("h-4 w-4 transition-transform",t&&"rotate-180"),children:e.jsxRuntimeExports.jsx("path",{d:"M7 10l5 5 5-5z"})})]}),t&&e.jsxRuntimeExports.jsx("div",{className:"absolute right-0 bottom-full mb-2 min-w-20 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm",children:r.map(l=>e.jsxRuntimeExports.jsxs("button",{onClick:()=>c(l),className:x.cn("w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10",l===n&&"bg-primary/20 text-primary"),children:[l,"x"]},l))})]})},_=function({chapters:i,onChapterSelect:s,className:n}){const t=e.useMediaSelector(r=>r.currentTime),a=o.useMemo(()=>i.find(r=>t>=r.startTime&&t<r.endTime),[i,t]);return e.jsxRuntimeExports.jsxs("div",{className:x.cn("rounded-lg border border-white/20 bg-black/90 p-4 backdrop-blur-sm",n),children:[e.jsxRuntimeExports.jsx("h3",{className:"mb-3 font-semibold text-white",children:"Chapters"}),e.jsxRuntimeExports.jsx("div",{className:"max-h-64 space-y-2 overflow-y-auto",children:i.map(r=>e.jsxRuntimeExports.jsxs("button",{onClick:()=>s(r),className:x.cn("flex w-full items-center gap-3 rounded-lg p-3 text-left transition-colors","hover:bg-white/10",r.id===a?.id&&"border border-primary/30 bg-primary/20"),children:[r.thumbnail&&e.jsxRuntimeExports.jsx("img",{src:r.thumbnail,alt:r.title,className:"h-9 w-16 rounded object-cover"}),e.jsxRuntimeExports.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxRuntimeExports.jsx("div",{className:"truncate font-medium text-white",children:r.title}),e.jsxRuntimeExports.jsxs("div",{className:"text-sm text-white/60",children:[x.formatTime(r.startTime)," - ",x.formatTime(r.endTime)]})]})]},r.id))})]})},H=function({className:i}){const s=e.useMediaDispatch(),n=e.useMediaSelector(a=>a.isPictureInPicture),t=o.useCallback(()=>{s({type:n?e.MediaActionTypes.EXIT_PIP:e.MediaActionTypes.ENTER_PIP})},[s,n]);return e.jsxRuntimeExports.jsx("button",{type:"button",onClick:t,className:x.cn("flex h-10 w-10 items-center justify-center rounded-full text-white","transition-colors hover:bg-white/10",i),"aria-label":n?"Exit Picture-in-Picture":"Enter Picture-in-Picture",children:e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5",children:e.jsxRuntimeExports.jsx("path",{d:"M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14z"})})})},q=Object.freeze(Object.defineProperty({__proto__:null,ChaptersPanel:_,PictureInPictureButton:H,PlaybackSpeedSelector:I,QualitySelector:F,SubtitleSelector:V},Symbol.toStringTag,{value:"Module"})),O=function({className:i,size:s="md"}){const n=e.useMediaDispatch(),t=e.useMediaSelector(p=>p.isPlaying),a=e.useMediaSelector(p=>p.isLoading),r={sm:"h-8 w-8",md:"h-10 w-10",lg:"h-12 w-12",xl:"h-16 w-16"},c={sm:"h-4 w-4",md:"h-5 w-5",lg:"h-6 w-6",xl:"h-8 w-8"},l=o.useCallback(()=>{n({type:t?e.MediaActionTypes.PAUSE:e.MediaActionTypes.PLAY})},[n,t]);return e.jsxRuntimeExports.jsx("button",{type:"button",onClick:l,disabled:a,className:x.cn("group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm","border border-white/20 text-white transition-all duration-200","hover:scale-105 hover:bg-white/20 active:scale-95","focus:outline-none focus:ring-2 focus:ring-white/50","disabled:cursor-not-allowed disabled:opacity-50",r[s],i),"aria-label":t?"Pause":"Play",children:a?e.jsxRuntimeExports.jsx("div",{className:x.cn("animate-spin rounded-full border-2 border-white/30 border-t-white",c[s])}):e.jsxRuntimeExports.jsx("div",{className:x.cn("transition-transform duration-200",c[s]),children:t?e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-full w-full",children:e.jsxRuntimeExports.jsx("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"})}):e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"ml-0.5 h-full w-full",children:e.jsxRuntimeExports.jsx("path",{d:"M8 5v14l11-7z"})})})})},K=function({className:i}){const s=e.useMediaDispatch(),n=e.useMediaSelector(h=>h.currentTime),t=e.useMediaSelector(h=>h.duration),a=e.useMediaSelector(h=>h.buffered),r=e.useMediaSelector(h=>h.previewTime),[c,l]=o.useState(!1),[p,d]=o.useState(null),v=o.useRef(null),N=t>0?n/t*100:0,f=t>0&&r!==null?r/t*100:null,R=o.useMemo(()=>{if(!a||t===0)return[];const h=[];for(let j=0;j<a.length;j++)h.push({start:a.start(j)/t*100,end:a.end(j)/t*100});return h},[a,t]),m=o.useCallback(h=>{if(!v.current)return 0;const j=v.current.getBoundingClientRect();return Math.max(0,Math.min(1,(h-j.left)/j.width))*t},[t]),b=o.useCallback(h=>{if(!c){const j=m(h.clientX);d(j),s({type:e.MediaActionTypes.PREVIEW_TIME,detail:j})}},[c,m,s]),g=o.useCallback(()=>{c||(d(null),s({type:e.MediaActionTypes.CLEAR_PREVIEW}))},[c,s]),M=o.useCallback(h=>{l(!0);const j=m(h.clientX);s({type:e.MediaActionTypes.SEEK,detail:j})},[m,s]),C=o.useCallback(h=>{l(!0);const j=m(h.touches[0]?.clientX||0);s({type:e.MediaActionTypes.SEEK,detail:j})},[m,s]);return o.useEffect(()=>{const h=k=>{if(c){const P=m(k.clientX);s({type:e.MediaActionTypes.SEEK,detail:P})}},j=()=>{l(!1),d(null),s({type:e.MediaActionTypes.CLEAR_PREVIEW})},S=k=>{if(c){const P=m(k.touches[0]?.clientX||0);s({type:e.MediaActionTypes.SEEK,detail:P})}};return c&&(document.addEventListener("mousemove",h),document.addEventListener("mouseup",j),document.addEventListener("touchmove",S),document.addEventListener("touchend",j)),()=>{document.removeEventListener("mousemove",h),document.removeEventListener("mouseup",j),document.removeEventListener("touchmove",S),document.removeEventListener("touchend",j)}},[c,m,s]),e.jsxRuntimeExports.jsxs("div",{className:x.cn("group relative flex items-center",i),children:[(p!==null||r!==null)&&e.jsxRuntimeExports.jsx("div",{className:"pointer-events-none absolute bottom-full mb-2 rounded bg-black/80 px-2 py-1 text-white text-xs",style:{left:`${f||(p||0)/t*100}%`,transform:"translateX(-50%)"},children:x.formatTime(p||r||0)}),e.jsxRuntimeExports.jsxs("div",{ref:v,className:"relative h-2 w-full cursor-pointer rounded-full bg-white/20 transition-all duration-200 group-hover:h-3",onMouseMove:b,onMouseLeave:g,onMouseDown:M,onTouchStart:C,children:[R.map((h,j)=>e.jsxRuntimeExports.jsx("div",{className:"absolute top-0 h-full rounded-full bg-white/30",style:{left:`${h.start}%`,width:`${h.end-h.start}%`}},j)),e.jsxRuntimeExports.jsx("div",{className:"absolute top-0 h-full rounded-full bg-primary transition-all duration-100",style:{width:`${N}%`}}),f!==null&&e.jsxRuntimeExports.jsx("div",{className:"absolute top-0 h-full w-1 rounded-full bg-white/80",style:{left:`${f}%`}}),e.jsxRuntimeExports.jsx("div",{className:"-translate-y-1/2 absolute top-1/2 h-4 w-4 rounded-full border-2 border-white bg-primary opacity-0 shadow-lg transition-all duration-200 group-hover:opacity-100",style:{left:`${N}%`,transform:"translateX(-50%) translateY(-50%)"}})]})]})},U=function({className:i}){const s=e.useMediaDispatch(),n=e.useMediaSelector(d=>d.volume),t=e.useMediaSelector(d=>d.isMuted),[a,r]=o.useState(!1),c=o.useCallback(()=>{s({type:e.MediaActionTypes.TOGGLE_MUTE})},[s]),l=o.useCallback(d=>{s({type:e.MediaActionTypes.SET_VOLUME,detail:d})},[s]),p=o.useMemo(()=>t||n===0?e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5",children:e.jsxRuntimeExports.jsx("path",{d:"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"})}):n<.5?e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5",children:e.jsxRuntimeExports.jsx("path",{d:"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z"})}):e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-5 w-5",children:e.jsxRuntimeExports.jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"})}),[t,n]);return e.jsxRuntimeExports.jsxs("div",{className:x.cn("relative flex items-center",i),onMouseEnter:()=>r(!0),onMouseLeave:()=>r(!1),children:[e.jsxRuntimeExports.jsx("button",{type:"button",onClick:c,className:"flex h-10 w-10 items-center justify-center rounded-full text-white transition-colors hover:bg-white/10","aria-label":t?"Unmute":"Mute",children:p}),e.jsxRuntimeExports.jsx("div",{className:x.cn("absolute left-full ml-2 flex items-center transition-all duration-200",a?"translate-x-0 opacity-100":"-translate-x-2 pointer-events-none opacity-0"),children:e.jsxRuntimeExports.jsx("input",{type:"range",min:"0",max:"1",step:"0.01",value:t?0:n,onChange:d=>l(parseFloat(d.target.value)),className:"slider h-1 w-20 cursor-pointer appearance-none rounded-lg bg-white/20"})})]})},J=function({className:i,size:s="md",skipTime:n=10}){const t=e.useMediaDispatch(),a=e.useMediaSelector(p=>p.currentTime),r={sm:"h-8 w-8",md:"h-10 w-10",lg:"h-12 w-12"},c={sm:"h-4 w-4",md:"h-5 w-5",lg:"h-6 w-6"},l=o.useCallback(()=>{const p=Math.max(0,a-n);t({type:e.MediaActionTypes.SEEK,detail:p})},[t,a,n]);return e.jsxRuntimeExports.jsx("button",{type:"button",onClick:l,className:x.cn("group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm","border border-white/20 text-white transition-all duration-200","hover:scale-105 hover:bg-white/20 active:scale-95","focus:outline-none focus:ring-2 focus:ring-white/50",r[s],i),"aria-label":`Backward ${n} seconds`,title:`Backward ${n}s`,children:e.jsxRuntimeExports.jsxs("div",{className:x.cn("flex items-center transition-transform duration-200",c[s]),children:[e.jsxRuntimeExports.jsxs("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-full w-full",children:[e.jsxRuntimeExports.jsx("path",{d:"M7 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM15.5 7.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v9c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-9z"}),e.jsxRuntimeExports.jsx("path",{d:"M5.5 12l7-4.5v9l-7-4.5z",opacity:"0.8"})]}),n&&e.jsxRuntimeExports.jsx("span",{className:"-bottom-1 absolute font-bold text-[10px]",children:n})]})})},Z=function({className:i,size:s="md",skipTime:n=10}){const t=e.useMediaDispatch(),a=e.useMediaSelector(d=>d.currentTime),r=e.useMediaSelector(d=>d.duration),c={sm:"h-8 w-8",md:"h-10 w-10",lg:"h-12 w-12"},l={sm:"h-4 w-4",md:"h-5 w-5",lg:"h-6 w-6"},p=o.useCallback(()=>{const d=Math.min(r,a+n);t({type:e.MediaActionTypes.SEEK,detail:d})},[t,a,r,n]);return e.jsxRuntimeExports.jsx("button",{type:"button",onClick:p,className:x.cn("group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm","border border-white/20 text-white transition-all duration-200","hover:scale-105 hover:bg-white/20 active:scale-95","focus:outline-none focus:ring-2 focus:ring-white/50",c[s],i),"aria-label":`Forward ${n} seconds`,title:`Forward ${n}s`,children:e.jsxRuntimeExports.jsxs("div",{className:x.cn("flex items-center transition-transform duration-200",l[s]),children:[e.jsxRuntimeExports.jsxs("svg",{viewBox:"0 0 24 24",fill:"currentColor",className:"h-full w-full",children:[e.jsxRuntimeExports.jsx("path",{d:"M17 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM8.5 7.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v9c0 .83-.67 1.5-1.5 1.5s-1.5-.67-1.5-1.5v-9z"}),e.jsxRuntimeExports.jsx("path",{d:"M18.5 12l-7-4.5v9l7-4.5z",opacity:"0.8"})]}),n&&e.jsxRuntimeExports.jsx("span",{className:"-bottom-1 absolute font-bold text-[10px]",children:n})]})})},B=function({variant:i="current",className:s}){const n=e.useMediaSelector(r=>r.currentTime),t=e.useMediaSelector(r=>r.duration),a=o.useMemo(()=>{switch(i){case"current":return x.formatTime(n);case"duration":return x.formatTime(t);case"remaining":return`-${x.formatTime(t-n)}`;default:return x.formatTime(n)}},[i,n,t]);return e.jsxRuntimeExports.jsx("div",{className:x.cn("font-mono text-sm text-white tabular-nums",s),children:a})},ee=function({metrics:i,className:s}){if(!i||process.env.NODE_ENV!=="development")return null;const n=a=>a>=50?"text-green-400":a>=30?"text-yellow-400":"text-red-400",t=a=>a>=5?"text-green-400":a>=2?"text-yellow-400":"text-red-400";return e.jsxRuntimeExports.jsxs("div",{className:x.cn("flex items-center gap-3 font-mono text-xs",s),children:[i.fps!==void 0&&e.jsxRuntimeExports.jsxs("div",{className:x.cn("flex items-center gap-1",n(i.fps)),children:[e.jsxRuntimeExports.jsx("div",{className:"h-2 w-2 rounded-full bg-current"}),e.jsxRuntimeExports.jsxs("span",{children:[i.fps," FPS"]})]}),i.bufferHealth!==void 0&&e.jsxRuntimeExports.jsxs("div",{className:x.cn("flex items-center gap-1",t(i.bufferHealth)),children:[e.jsxRuntimeExports.jsx("div",{className:"h-2 w-2 rounded-full bg-current"}),e.jsxRuntimeExports.jsxs("span",{children:[i.bufferHealth.toFixed(1),"s"]})]}),i.quality!==void 0&&e.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-1 text-blue-400",children:[e.jsxRuntimeExports.jsx("div",{className:"h-2 w-2 rounded-full bg-current"}),e.jsxRuntimeExports.jsxs("span",{children:[i.quality,"p"]})]})]})},se=function({className:i,showSkipButtons:s=!0,showVolumeControl:n=!0,showTimeDisplay:t=!0,playButtonSize:a="xl",skipButtonSize:r="md",skipTime:c=10,showPerformanceIndicators:l=process.env.NODE_ENV==="development",performanceMetrics:p}){return e.jsxRuntimeExports.jsxs("div",{className:x.cn("flex flex-col gap-4 bg-gradient-to-t from-black/80 to-transparent p-4",i),children:[e.jsxRuntimeExports.jsx(K,{className:"w-full"}),e.jsxRuntimeExports.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-3",children:[s&&e.jsxRuntimeExports.jsx(J,{size:r,skipTime:c,className:"shrink-0"}),e.jsxRuntimeExports.jsx(O,{size:a,className:"shrink-0"}),s&&e.jsxRuntimeExports.jsx(Z,{size:r,skipTime:c,className:"shrink-0"}),n&&e.jsxRuntimeExports.jsx(U,{className:"shrink-0"}),t&&e.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-1 font-mono text-sm",children:[e.jsxRuntimeExports.jsx(B,{variant:"current"}),e.jsxRuntimeExports.jsx("span",{className:"text-white/60",children:"/"}),e.jsxRuntimeExports.jsx(B,{variant:"duration"})]})]}),e.jsxRuntimeExports.jsx("div",{className:"flex items-center gap-2",children:l&&e.jsxRuntimeExports.jsx(ee,{metrics:p,className:"text-white/80"})})]})]})},te=({performanceMetrics:u={},preloadingStats:i={},playbackState:s={},hlsMetrics:n={},pluginInfo:t={},debugInfo:a={},className:r,position:c="top-right",defaultCollapsed:l=!1,title:p="BaroiPlayer Debug Panel"})=>{const[d,v]=o.useState(l),[N,f]=o.useState("performance"),R=o.useMemo(()=>{switch(c){case"top-left":return"top-4 left-4";case"top-right":return"top-4 right-4";case"bottom-left":return"bottom-4 left-4";case"bottom-right":return"bottom-4 right-4";default:return"top-4 right-4"}},[c]),m=E=>{if(E===0)return"0 B";const w=1024,A=["B","KB","MB","GB"],L=Math.floor(Math.log(E)/Math.log(w));return parseFloat((E/Math.pow(w,L)).toFixed(2))+" "+A[L]},b=E=>{const w=Math.floor(E/60),A=Math.floor(E%60);return`${w}:${A.toString().padStart(2,"0")}`},g=()=>e.jsxRuntimeExports.jsx("div",{className:"space-y-2",children:e.jsxRuntimeExports.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-green-400",children:"FPS:"}),e.jsxRuntimeExports.jsx("span",{className:"ml-2 font-mono",children:u.fps||0})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-blue-400",children:"Memory:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[((u.memoryUsage||0)/1024/1024).toFixed(1)," MB"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-yellow-400",children:"Buffer:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[(u.bufferHealth||0).toFixed(2),"s"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-purple-400",children:"Bandwidth:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[m(u.networkBandwidth||0),"/s"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-red-400",children:"Dropped:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[u.droppedFrames||0," frames"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-cyan-400",children:"Decoded:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[u.decodedFrames||0," frames"]})]})]})}),M=()=>e.jsxRuntimeExports.jsx("div",{className:"space-y-2",children:e.jsxRuntimeExports.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-green-400",children:"Status:"}),e.jsxRuntimeExports.jsx("span",{className:"ml-2 font-mono",children:s.isPlaying?e.jsxRuntimeExports.jsx("span",{className:"text-green-300",children:"Playing"}):e.jsxRuntimeExports.jsx("span",{className:"text-red-300",children:"Paused"})})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-blue-400",children:"Time:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[b(s.currentTime||0)," / ",b(s.duration||0)]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-yellow-400",children:"Volume:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[Math.round((s.volume||0)*100),"%"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-purple-400",children:"Quality:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[s.quality||0,"p"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-red-400",children:"Buffering:"}),e.jsxRuntimeExports.jsx("span",{className:"ml-2 font-mono",children:s.isBuffering?e.jsxRuntimeExports.jsx("span",{className:"text-yellow-300",children:"Yes"}):e.jsxRuntimeExports.jsx("span",{className:"text-green-300",children:"No"})})]}),s.error&&e.jsxRuntimeExports.jsxs("div",{className:"col-span-2",children:[e.jsxRuntimeExports.jsx("span",{className:"text-red-400",children:"Error:"}),e.jsxRuntimeExports.jsx("span",{className:"ml-2 break-all font-mono text-red-300 text-xs",children:s.error})]})]})}),C=()=>e.jsxRuntimeExports.jsx("div",{className:"space-y-2",children:e.jsxRuntimeExports.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-green-400",children:"Preloaded:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[i.preloadedItems||0," items"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-blue-400",children:"Engagement:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[(i.engagementScore||0).toFixed(1),"%"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-yellow-400",children:"Queue:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[i.queueLength||0," items"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-purple-400",children:"Hit Rate:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[(i.hitRate||0).toFixed(1),"%"]})]}),e.jsxRuntimeExports.jsxs("div",{className:"col-span-2",children:[e.jsxRuntimeExports.jsx("span",{className:"text-cyan-400",children:"Saved:"}),e.jsxRuntimeExports.jsx("span",{className:"ml-2 font-mono",children:m(i.totalSaved||0)})]})]})}),h=()=>e.jsxRuntimeExports.jsx("div",{className:"space-y-2",children:e.jsxRuntimeExports.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-green-400",children:"Level:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[n.currentLevel||0," / ",n.availableLevels||0]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-blue-400",children:"Bandwidth:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[m(n.bandwidthEstimate||0),"/s"]})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-red-400",children:"Dropped:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[n.droppedFrames||0," frames"]})]})]})}),j=()=>e.jsxRuntimeExports.jsx("div",{className:"space-y-2",children:e.jsxRuntimeExports.jsxs("div",{className:"text-xs",children:[e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-green-400",children:"Total:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-2 font-mono",children:[t.pluginCount||0," plugins"]})]}),e.jsxRuntimeExports.jsxs("div",{className:"mt-2",children:[e.jsxRuntimeExports.jsx("span",{className:"text-blue-400",children:"Active:"}),e.jsxRuntimeExports.jsx("div",{className:"ml-2 space-y-1 font-mono text-xs",children:t.activePlugins?.map((E,w)=>e.jsxRuntimeExports.jsxs("div",{className:"text-green-300",children:["• ",E]},w))||e.jsxRuntimeExports.jsx("div",{className:"text-gray-400",children:"None"})})]}),t.loadedPlugins&&t.loadedPlugins.length>(t.activePlugins?.length||0)&&e.jsxRuntimeExports.jsxs("div",{className:"mt-2",children:[e.jsxRuntimeExports.jsx("span",{className:"text-yellow-400",children:"Loaded (inactive):"}),e.jsxRuntimeExports.jsx("div",{className:"ml-2 space-y-1 font-mono text-xs",children:t.loadedPlugins.filter(E=>!t.activePlugins?.includes(E)).map((E,w)=>e.jsxRuntimeExports.jsxs("div",{className:"text-yellow-300",children:["• ",E]},w))})]})]})}),S=()=>e.jsxRuntimeExports.jsx("div",{className:"space-y-2",children:e.jsxRuntimeExports.jsx("div",{className:"space-y-1 font-mono text-xs",children:Object.entries(a).map(([E,w])=>e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsxs("span",{className:"text-yellow-400",children:[E,":"]}),e.jsxRuntimeExports.jsx("span",{className:"ml-2 text-gray-300",children:typeof w=="object"?JSON.stringify(w,null,2):String(w)})]},E))})}),k=()=>e.jsxRuntimeExports.jsx("div",{className:"flex space-x-1 border-gray-600 border-b",children:[{id:"performance",label:"Performance"},{id:"hls",label:"HLS"},{id:"plugins",label:"Plugins"},{id:"debug",label:"Debug"}].map(E=>e.jsxRuntimeExports.jsx("button",{onClick:()=>f(E.id),className:x.cn("px-2 py-1 font-medium text-xs transition-colors",N===E.id?"border-blue-400 border-b text-blue-400":"text-gray-400 hover:text-white"),children:E.label},E.id))}),P=()=>{switch(N){case"performance":return e.jsxRuntimeExports.jsxs("div",{className:"space-y-3",children:[g(),e.jsxRuntimeExports.jsx("hr",{className:"border-gray-600"}),M(),e.jsxRuntimeExports.jsx("hr",{className:"border-gray-600"}),C()]});case"hls":return h();case"plugins":return j();case"debug":return S();default:return g()}};return process.env.NODE_ENV!=="development"?null:e.jsxRuntimeExports.jsxs("div",{className:x.cn("fixed z-50 min-w-80 max-w-96 rounded-lg border border-gray-700 bg-black/90 p-3 font-mono text-white text-xs backdrop-blur-sm",R,r),children:[e.jsxRuntimeExports.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[e.jsxRuntimeExports.jsx("h3",{className:"font-bold text-blue-400 text-sm",children:p}),e.jsxRuntimeExports.jsx("div",{className:"flex items-center space-x-2",children:e.jsxRuntimeExports.jsx("button",{onClick:()=>v(!d),className:"text-gray-400 transition-colors hover:text-white","aria-label":d?"Expand":"Collapse",children:d?e.jsxRuntimeExports.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:e.jsxRuntimeExports.jsx("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}):e.jsxRuntimeExports.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:e.jsxRuntimeExports.jsx("path",{d:"M3 7.5L6 4.5L9 7.5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})})})]}),d?e.jsxRuntimeExports.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-green-400",children:"FPS:"}),e.jsxRuntimeExports.jsx("span",{className:"ml-1 font-mono",children:u.fps||0})]}),e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("span",{className:"text-blue-400",children:"Memory:"}),e.jsxRuntimeExports.jsxs("span",{className:"ml-1 font-mono",children:[((u.memoryUsage||0)/1024/1024).toFixed(1),"MB"]})]})]}):e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[k(),e.jsxRuntimeExports.jsx("div",{className:"mt-3 max-h-64 overflow-y-auto",children:P()})]})]})};exports.ChaptersPanel=_;exports.DebugPanel=te;exports.EnhancedControlBar=se;exports.EnhancedMediaPlayer=D;exports.EnhancedPlayButton=O;exports.EnhancedSeekBar=K;exports.EnhancedTimeDisplay=B;exports.EnhancedVolumeControl=U;exports.PictureInPictureButton=H;exports.PlaybackSpeedSelector=I;exports.QualitySelector=F;exports.SubtitleSelector=V;exports.advancedFeatures=q;
2
- //# sourceMappingURL=enhanced-components-BspFs9OO.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enhanced-components-BspFs9OO.cjs","sources":["../src/components/enhanced/media-player-enhanced.tsx","../src/components/enhanced/advanced-features.tsx","../src/components/enhanced/enhanced-controls.tsx","../src/components/enhanced/debug-panel.tsx"],"sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport {\n\tMediaActionTypes,\n\tuseMediaContext,\n\tuseMediaDispatch,\n\tuseMediaSelector\n} from \"../../context/media-context\"\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) {\n\t\t\t\t;(ref as React.MutableRefObject<T>).current = node\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Enhanced media player with better performance and mobile support\nexport interface EnhancedMediaPlayerProps {\n\tchildren: React.ReactNode\n\tclassName?: string\n\tautoHide?: boolean\n\tautoHideDelay?: number\n\tshowControlsOnHover?: boolean\n\tshowControlsOnTouch?: boolean\n\tenableKeyboardControls?: boolean\n\tenableTouchGestures?: boolean\n\tonPlay?: () => void\n\tonPause?: () => void\n\tonTimeUpdate?: (time: number) => void\n\tonVolumeChange?: (volume: number) => void\n\tonFullscreenChange?: (isFullscreen: boolean) => void\n}\n\n// Custom hook for auto-hide controls\nfunction useAutoHideControls(\n\tautoHide: boolean,\n\tdelay: number,\n\tshowOnHover: boolean,\n\tshowOnTouch: boolean\n) {\n\tconst [showControls, setShowControls] = React.useState(true)\n\tconst [isHovering, setIsHovering] = React.useState(false)\n\tconst [isTouching, setIsTouching] = React.useState(false)\n\tconst timeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n\n\tconst resetTimeout = React.useCallback(() => {\n\t\tif (timeoutRef.current) {\n\t\t\tclearTimeout(timeoutRef.current)\n\t\t}\n\t\tif (autoHide) {\n\t\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\t\tif (!isHovering && !isTouching) {\n\t\t\t\t\tsetShowControls(false)\n\t\t\t\t}\n\t\t\t}, delay)\n\t\t}\n\t}, [autoHide, delay, isHovering, isTouching])\n\n\tconst showControlsTemporarily = React.useCallback(() => {\n\t\tsetShowControls(true)\n\t\tresetTimeout()\n\t}, [resetTimeout])\n\n\tReact.useEffect(() => {\n\t\tif (autoHide) {\n\t\t\tresetTimeout()\n\t\t} else {\n\t\t\tsetShowControls(true)\n\t\t}\n\t\treturn () => {\n\t\t\tif (timeoutRef.current) {\n\t\t\t\tclearTimeout(timeoutRef.current)\n\t\t\t}\n\t\t}\n\t}, [autoHide, resetTimeout])\n\n\tconst handleMouseEnter = React.useCallback(() => {\n\t\tif (showOnHover) {\n\t\t\tsetIsHovering(true)\n\t\t\tsetShowControls(true)\n\t\t}\n\t}, [showOnHover])\n\n\tconst handleMouseLeave = React.useCallback(() => {\n\t\tif (showOnHover) {\n\t\t\tsetIsHovering(false)\n\t\t\tresetTimeout()\n\t\t}\n\t}, [showOnHover, resetTimeout])\n\n\tconst handleTouchStart = React.useCallback(() => {\n\t\tif (showOnTouch) {\n\t\t\tsetIsTouching(true)\n\t\t\tshowControlsTemporarily()\n\t\t}\n\t}, [showOnTouch, showControlsTemporarily])\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\tif (showOnTouch) {\n\t\t\tsetIsTouching(false)\n\t\t\tresetTimeout()\n\t\t}\n\t}, [showOnTouch, resetTimeout])\n\n\treturn {\n\t\tshowControls,\n\t\tshowControlsTemporarily,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave,\n\t\thandleTouchStart,\n\t\thandleTouchEnd\n\t}\n}\n\n// Custom hook for touch gestures\nfunction useTouchGestures(enabled: boolean) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPlaying = useMediaSelector((state) => state.isPlaying)\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\tconst volume = useMediaSelector((state) => state.volume)\n\n\tconst [touchStart, setTouchStart] = React.useState<{ x: number; y: number; time: number } | null>(\n\t\tnull\n\t)\n\tconst [isDoubleTap, setIsDoubleTap] = React.useState(false)\n\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!enabled) return\n\n\t\t\tconst touch = e.touches[0]\n\t\t\tif (!touch) return\n\n\t\t\tconst now = Date.now()\n\n\t\t\tif (touchStart && now - touchStart.time < 300) {\n\t\t\t\tsetIsDoubleTap(true)\n\t\t\t\t// Double tap to play/pause\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} else {\n\t\t\t\tsetTouchStart({\n\t\t\t\t\tx: touch.clientX,\n\t\t\t\t\ty: touch.clientY,\n\t\t\t\t\ttime: now\n\t\t\t\t})\n\t\t\t\tsetIsDoubleTap(false)\n\t\t\t}\n\t\t},\n\t\t[enabled, touchStart, isPlaying, dispatch]\n\t)\n\n\tconst handleTouchMove = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tif (!enabled || !touchStart || isDoubleTap) return\n\n\t\t\tconst touch = e.touches[0]\n\t\t\tif (!touch) return\n\n\t\t\tconst deltaX = touch.clientX - touchStart.x\n\t\t\tconst deltaY = touch.clientY - touchStart.y\n\n\t\t\t// Horizontal swipe for seeking\n\t\t\tif (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 50) {\n\t\t\t\tconst seekAmount = (deltaX / window.innerWidth) * 30 // 30 seconds max\n\t\t\t\tconst newTime = Math.max(0, Math.min(duration, currentTime + seekAmount))\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\tdetail: newTime\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Vertical swipe for volume (right side of screen)\n\t\t\tif (\n\t\t\t\tMath.abs(deltaY) > Math.abs(deltaX) &&\n\t\t\t\tMath.abs(deltaY) > 50 &&\n\t\t\t\ttouchStart.x > window.innerWidth / 2\n\t\t\t) {\n\t\t\t\tconst volumeChange = -(deltaY / window.innerHeight) * 1 // Full range\n\t\t\t\tconst newVolume = Math.max(0, Math.min(1, volume + volumeChange))\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\tdetail: newVolume\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[enabled, touchStart, isDoubleTap, duration, currentTime, volume, dispatch]\n\t)\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\tif (!enabled) return\n\t\t// Reset touch state after a delay to allow for double tap detection\n\t\tsetTimeout(() => {\n\t\t\tsetTouchStart(null)\n\t\t\tsetIsDoubleTap(false)\n\t\t}, 300)\n\t}, [enabled])\n\n\treturn {\n\t\thandleTouchStart,\n\t\thandleTouchMove,\n\t\thandleTouchEnd\n\t}\n}\n\nexport const EnhancedMediaPlayer = function EnhancedMediaPlayer({\n\tchildren,\n\tclassName,\n\tautoHide = true,\n\tautoHideDelay = 3000,\n\tshowControlsOnHover = true,\n\tshowControlsOnTouch = true,\n\tenableKeyboardControls = true,\n\tenableTouchGestures = true,\n\tonPlay,\n\tonPause,\n\tonTimeUpdate,\n\tonVolumeChange,\n\tonFullscreenChange\n}: EnhancedMediaPlayerProps) {\n\tconst context = useMediaContext()\n\tconst dispatch = useMediaDispatch()\n\n\t// State selectors with memoization\n\tconst isPlaying = useMediaSelector(React.useCallback((state) => state.isPlaying, []))\n\tconst isFullscreen = useMediaSelector(React.useCallback((state) => state.isFullscreen, []))\n\tconst currentTime = useMediaSelector(React.useCallback((state) => state.currentTime, []))\n\tconst volume = useMediaSelector(React.useCallback((state) => state.volume, []))\n\tconst error = useMediaSelector(React.useCallback((state) => state.error, []))\n\n\t// Custom hooks\n\tconst {\n\t\tshowControls,\n\t\tshowControlsTemporarily,\n\t\thandleMouseEnter,\n\t\thandleMouseLeave,\n\t\thandleTouchStart: handleControlsTouch,\n\t\thandleTouchEnd: handleControlsTouchEnd\n\t} = useAutoHideControls(autoHide, autoHideDelay, showControlsOnHover, showControlsOnTouch)\n\n\tconst {\n\t\thandleTouchStart: handleGestureStart,\n\t\thandleTouchMove: handleGestureMove,\n\t\thandleTouchEnd: handleGestureEnd\n\t} = useTouchGestures(enableTouchGestures)\n\n\t// Combine touch handlers\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\thandleControlsTouch()\n\t\t\thandleGestureStart(e)\n\t\t},\n\t\t[handleControlsTouch, handleGestureStart]\n\t)\n\n\tconst handleTouchEnd = React.useCallback(() => {\n\t\thandleControlsTouchEnd()\n\t\thandleGestureEnd()\n\t}, [handleControlsTouchEnd, handleGestureEnd])\n\n\t// Event handlers with memoization\n\tconst handleClick = React.useCallback(() => {\n\t\tshowControlsTemporarily()\n\t}, [showControlsTemporarily])\n\n\t// Keyboard controls\n\tReact.useEffect(() => {\n\t\tif (!enableKeyboardControls) return\n\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Space\":\n\t\t\t\tcase \"KeyK\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"KeyF\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: isFullscreen\n\t\t\t\t\t\t\t? MediaActionTypes.EXIT_FULLSCREEN\n\t\t\t\t\t\t\t: MediaActionTypes.ENTER_FULLSCREEN\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"KeyM\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({ type: MediaActionTypes.TOGGLE_MUTE })\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: Math.max(0, currentTime - 10)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\t\t\tdetail: currentTime + 10\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\t\tdetail: Math.min(1, volume + 0.1)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\t\t\tdetail: Math.max(0, volume - 0.1)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown)\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown)\n\t}, [enableKeyboardControls, dispatch, isPlaying, isFullscreen, currentTime, volume])\n\n\t// Event callbacks\n\tReact.useEffect(() => {\n\t\tif (isPlaying) onPlay?.()\n\t\telse onPause?.()\n\t}, [isPlaying, onPlay, onPause])\n\n\tReact.useEffect(() => {\n\t\tonTimeUpdate?.(currentTime)\n\t}, [currentTime, onTimeUpdate])\n\n\tReact.useEffect(() => {\n\t\tonVolumeChange?.(volume)\n\t}, [volume, onVolumeChange])\n\n\tReact.useEffect(() => {\n\t\tonFullscreenChange?.(isFullscreen)\n\t}, [isFullscreen, onFullscreenChange])\n\n\treturn (\n\t\t<div\n\t\t\tref={composeRefs(context.rootRef)}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative isolate flex flex-col overflow-hidden rounded-lg bg-black outline-none\",\n\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n\t\t\t\t\"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\t\t\t\tisFullscreen && \"fixed inset-0 z-50 rounded-none\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-state={isFullscreen ? \"fullscreen\" : \"inline\"}\n\t\t\tdata-disabled={error ? \"\" : undefined}\n\t\t\tdata-controls-visible={showControls ? \"\" : undefined}\n\t\t\ttabIndex={0}\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\tonTouchStart={handleTouchStart}\n\t\t\tonTouchMove={handleGestureMove}\n\t\t\tonTouchEnd={handleTouchEnd}\n\t\t\tonClick={handleClick}>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nEnhancedMediaPlayer.displayName = \"EnhancedMediaPlayer\"\n","\"use client\"\n\nimport React from \"react\"\nimport { MediaActionTypes, useMediaDispatch, useMediaSelector } from \"../../context/media-context\"\nimport { formatTime } from \"../../lib/format-time\"\nimport { cn } from \"../../lib/utils\"\n\n// Types for advanced features\nexport interface Chapter {\n\tid: string\n\ttitle: string\n\tstartTime: number\n\tendTime: number\n\tthumbnail?: string\n}\n\nexport interface QualityLevel {\n\tid: string\n\tlabel: string\n\twidth: number\n\theight: number\n\tbitrate?: number\n}\n\nexport interface Subtitle {\n\tid: string\n\tlabel: string\n\tlanguage: string\n\tsrc: string\n\tdefault?: boolean\n}\n\n// Quality selector component\nexport const QualitySelector = function QualitySelector({\n\tqualities,\n\tcurrentQuality,\n\tonQualityChange,\n\tclassName\n}: {\n\tqualities: QualityLevel[]\n\tcurrentQuality: string\n\tonQualityChange: (qualityId: string) => void\n\tclassName?: string\n}) {\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst currentQualityLabel = React.useMemo(() => {\n\t\treturn qualities.find((q) => q.id === currentQuality)?.label || \"Auto\"\n\t}, [qualities, currentQuality])\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select quality\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{currentQualityLabel}</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t{qualities.map((quality) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={quality.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonQualityChange(quality.id)\n\t\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tquality.id === currentQuality && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{quality.label}\n\t\t\t\t\t\t\t{quality.bitrate && (\n\t\t\t\t\t\t\t\t<span className=\"ml-2 text-white/60 text-xs\">\n\t\t\t\t\t\t\t\t\t({Math.round(quality.bitrate / 1000)}k)\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Subtitle selector component\nexport const SubtitleSelector = function SubtitleSelector({\n\tsubtitles,\n\tcurrentSubtitle,\n\tonSubtitleChange,\n\tclassName\n}: {\n\tsubtitles: Subtitle[]\n\tcurrentSubtitle: string | null\n\tonSubtitleChange: (subtitleId: string | null) => void\n\tclassName?: string\n}) {\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst currentSubtitleLabel = React.useMemo(() => {\n\t\tif (!currentSubtitle) return \"Off\"\n\t\treturn subtitles.find((s) => s.id === currentSubtitle)?.label || \"Off\"\n\t}, [subtitles, currentSubtitle])\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select subtitles\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{currentSubtitleLabel}</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-32 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tonSubtitleChange(null)\n\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t!currentSubtitle && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\tOff\n\t\t\t\t\t</button>\n\t\t\t\t\t{subtitles.map((subtitle) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={subtitle.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonSubtitleChange(subtitle.id)\n\t\t\t\t\t\t\t\tsetIsOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tsubtitle.id === currentSubtitle && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{subtitle.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Playback speed selector\nexport const PlaybackSpeedSelector = function PlaybackSpeedSelector({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst playbackRate = useMediaSelector((state) => state.playbackRate)\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\n\tconst speeds = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n\n\tconst handleSpeedChange = React.useCallback(\n\t\t(speed: number) => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_PLAYBACK_RATE, detail: speed })\n\t\t\tsetIsOpen(false)\n\t\t},\n\t\t[dispatch]\n\t)\n\n\treturn (\n\t\t<div className={cn(\"relative\", className)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t\tclassName=\"flex items-center gap-2 rounded-lg bg-black/50 px-3 py-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\taria-label=\"Select playback speed\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-4 w-4\">\n\t\t\t\t\t<path d=\"M13,8A4,4 0 0,0 9,12A4,4 0 0,0 13,16A4,4 0 0,0 17,12A4,4 0 0,0 13,8M13,14A2,2 0 0,1 11,12A2,2 0 0,1 13,10A2,2 0 0,1 15,12A2,2 0 0,1 13,14M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4Z\" />\n\t\t\t\t</svg>\n\t\t\t\t<span className=\"text-sm\">{playbackRate}x</span>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclassName={cn(\"h-4 w-4 transition-transform\", isOpen && \"rotate-180\")}>\n\t\t\t\t\t<path d=\"M7 10l5 5 5-5z\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute right-0 bottom-full mb-2 min-w-20 rounded-lg border border-white/20 bg-black/90 py-2 backdrop-blur-sm\">\n\t\t\t\t\t{speeds.map((speed) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={speed}\n\t\t\t\t\t\t\tonClick={() => handleSpeedChange(speed)}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-full px-4 py-2 text-left text-sm text-white transition-colors hover:bg-white/10\",\n\t\t\t\t\t\t\t\tspeed === playbackRate && \"bg-primary/20 text-primary\"\n\t\t\t\t\t\t\t)}>\n\t\t\t\t\t\t\t{speed}x\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Chapters component\nexport const ChaptersPanel = function ChaptersPanel({\n\tchapters,\n\tonChapterSelect,\n\tclassName\n}: {\n\tchapters: Chapter[]\n\tonChapterSelect: (chapter: Chapter) => void\n\tclassName?: string\n}) {\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\n\tconst currentChapter = React.useMemo(() => {\n\t\treturn chapters.find(\n\t\t\t(chapter) => currentTime >= chapter.startTime && currentTime < chapter.endTime\n\t\t)\n\t}, [chapters, currentTime])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-lg border border-white/20 bg-black/90 p-4 backdrop-blur-sm\",\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<h3 className=\"mb-3 font-semibold text-white\">Chapters</h3>\n\t\t\t<div className=\"max-h-64 space-y-2 overflow-y-auto\">\n\t\t\t\t{chapters.map((chapter) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={chapter.id}\n\t\t\t\t\t\tonClick={() => onChapterSelect(chapter)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-full items-center gap-3 rounded-lg p-3 text-left transition-colors\",\n\t\t\t\t\t\t\t\"hover:bg-white/10\",\n\t\t\t\t\t\t\tchapter.id === currentChapter?.id && \"border border-primary/30 bg-primary/20\"\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\t{chapter.thumbnail && (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={chapter.thumbnail}\n\t\t\t\t\t\t\t\talt={chapter.title}\n\t\t\t\t\t\t\t\tclassName=\"h-9 w-16 rounded object-cover\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t<div className=\"truncate font-medium text-white\">{chapter.title}</div>\n\t\t\t\t\t\t\t<div className=\"text-sm text-white/60\">\n\t\t\t\t\t\t\t\t{formatTime(chapter.startTime)} - {formatTime(chapter.endTime)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Picture-in-Picture button\nexport const PictureInPictureButton = function PictureInPictureButton({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPictureInPicture = useMediaSelector((state) => state.isPictureInPicture)\n\n\tconst handleTogglePiP = React.useCallback(() => {\n\t\tdispatch({\n\t\t\ttype: isPictureInPicture ? MediaActionTypes.EXIT_PIP : MediaActionTypes.ENTER_PIP\n\t\t})\n\t}, [dispatch, isPictureInPicture])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleTogglePiP}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex h-10 w-10 items-center justify-center rounded-full text-white\",\n\t\t\t\t\"transition-colors hover:bg-white/10\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={isPictureInPicture ? \"Exit Picture-in-Picture\" : \"Enter Picture-in-Picture\"}>\n\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t<path d=\"M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14z\" />\n\t\t\t</svg>\n\t\t</button>\n\t)\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { MediaActionTypes, useMediaDispatch, useMediaSelector } from \"../../context/media-context\"\nimport { formatTime } from \"../../lib/format-time\"\nimport { cn } from \"../../lib/utils\"\n\n// Enhanced play button with better animations\nexport const EnhancedPlayButton = function EnhancedPlayButton({\n\tclassName,\n\tsize = \"md\"\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst isPlaying = useMediaSelector((state) => state.isPlaying)\n\tconst isLoading = useMediaSelector((state) => state.isLoading)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\",\n\t\txl: \"h-16 w-16\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\",\n\t\txl: \"h-8 w-8\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tdispatch({\n\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t})\n\t}, [dispatch, isPlaying])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tdisabled={isLoading}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={isPlaying ? \"Pause\" : \"Play\"}>\n\t\t\t{isLoading ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"animate-spin rounded-full border-2 border-white/30 border-t-white\",\n\t\t\t\t\t\ticonSizes[size]\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className={cn(\"transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t\t{isPlaying ? (\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t\t\t<path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"ml-0.5 h-full w-full\">\n\t\t\t\t\t\t\t<path d=\"M8 5v14l11-7z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</button>\n\t)\n}\n\n// Enhanced seek bar with preview and better touch support\nexport const EnhancedSeekBar = function EnhancedSeekBar({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\tconst buffered = useMediaSelector((state) => state.buffered)\n\tconst previewTime = useMediaSelector((state) => state.previewTime)\n\n\tconst [isDragging, setIsDragging] = React.useState(false)\n\tconst [hoverTime, setHoverTime] = React.useState<number | null>(null)\n\tconst progressRef = React.useRef<HTMLDivElement>(null)\n\n\tconst progress = duration > 0 ? (currentTime / duration) * 100 : 0\n\tconst previewProgress =\n\t\tduration > 0 && previewTime !== null ? (previewTime / duration) * 100 : null\n\n\t// Calculate buffered ranges\n\tconst bufferedRanges = React.useMemo(() => {\n\t\tif (!buffered || duration === 0) return []\n\t\tconst ranges = []\n\t\tfor (let i = 0; i < buffered.length; i++) {\n\t\t\tranges.push({\n\t\t\t\tstart: (buffered.start(i) / duration) * 100,\n\t\t\t\tend: (buffered.end(i) / duration) * 100\n\t\t\t})\n\t\t}\n\t\treturn ranges\n\t}, [buffered, duration])\n\n\tconst getTimeFromPosition = React.useCallback(\n\t\t(clientX: number) => {\n\t\t\tif (!progressRef.current) return 0\n\t\t\tconst rect = progressRef.current.getBoundingClientRect()\n\t\t\tconst position = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n\t\t\treturn position * duration\n\t\t},\n\t\t[duration]\n\t)\n\n\tconst handleMouseMove = React.useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\t\tsetHoverTime(time)\n\t\t\t\tdispatch({ type: MediaActionTypes.PREVIEW_TIME, detail: time })\n\t\t\t}\n\t\t},\n\t\t[isDragging, getTimeFromPosition, dispatch]\n\t)\n\n\tconst handleMouseLeave = React.useCallback(() => {\n\t\tif (!isDragging) {\n\t\t\tsetHoverTime(null)\n\t\t\tdispatch({ type: MediaActionTypes.CLEAR_PREVIEW })\n\t\t}\n\t}, [isDragging, dispatch])\n\n\tconst handleMouseDown = React.useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tsetIsDragging(true)\n\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t},\n\t\t[getTimeFromPosition, dispatch]\n\t)\n\n\tconst handleTouchStart = React.useCallback(\n\t\t(e: React.TouchEvent) => {\n\t\t\tsetIsDragging(true)\n\t\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t},\n\t\t[getTimeFromPosition, dispatch]\n\t)\n\n\tReact.useEffect(() => {\n\t\tconst handleMouseMove = (e: MouseEvent) => {\n\t\t\tif (isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t\t}\n\t\t}\n\n\t\tconst handleMouseUp = () => {\n\t\t\tsetIsDragging(false)\n\t\t\tsetHoverTime(null)\n\t\t\tdispatch({ type: MediaActionTypes.CLEAR_PREVIEW })\n\t\t}\n\n\t\tconst handleTouchMove = (e: TouchEvent) => {\n\t\t\tif (isDragging) {\n\t\t\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\t\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t\t\t}\n\t\t}\n\n\t\tif (isDragging) {\n\t\t\tdocument.addEventListener(\"mousemove\", handleMouseMove)\n\t\t\tdocument.addEventListener(\"mouseup\", handleMouseUp)\n\t\t\tdocument.addEventListener(\"touchmove\", handleTouchMove)\n\t\t\tdocument.addEventListener(\"touchend\", handleMouseUp)\n\t\t}\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousemove\", handleMouseMove)\n\t\t\tdocument.removeEventListener(\"mouseup\", handleMouseUp)\n\t\t\tdocument.removeEventListener(\"touchmove\", handleTouchMove)\n\t\t\tdocument.removeEventListener(\"touchend\", handleMouseUp)\n\t\t}\n\t}, [isDragging, getTimeFromPosition, dispatch])\n\n\treturn (\n\t\t<div className={cn(\"group relative flex items-center\", className)}>\n\t\t\t{/* Time preview tooltip */}\n\t\t\t{(hoverTime !== null || previewTime !== null) && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"pointer-events-none absolute bottom-full mb-2 rounded bg-black/80 px-2 py-1 text-white text-xs\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tleft: `${previewProgress || ((hoverTime || 0) / duration) * 100}%`,\n\t\t\t\t\t\ttransform: \"translateX(-50%)\"\n\t\t\t\t\t}}>\n\t\t\t\t\t{formatTime(hoverTime || previewTime || 0)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tref={progressRef}\n\t\t\t\tclassName=\"relative h-2 w-full cursor-pointer rounded-full bg-white/20 transition-all duration-200 group-hover:h-3\"\n\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\tonTouchStart={handleTouchStart}>\n\t\t\t\t{/* Buffered ranges */}\n\t\t\t\t{bufferedRanges.map((range, index) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName=\"absolute top-0 h-full rounded-full bg-white/30\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tleft: `${range.start}%`,\n\t\t\t\t\t\t\twidth: `${range.end - range.start}%`\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\n\t\t\t\t{/* Progress bar */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute top-0 h-full rounded-full bg-primary transition-all duration-100\"\n\t\t\t\t\tstyle={{ width: `${progress}%` }}\n\t\t\t\t/>\n\n\t\t\t\t{/* Preview indicator */}\n\t\t\t\t{previewProgress !== null && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute top-0 h-full w-1 rounded-full bg-white/80\"\n\t\t\t\t\t\tstyle={{ left: `${previewProgress}%` }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* Thumb */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 h-4 w-4 rounded-full border-2 border-white bg-primary opacity-0 shadow-lg transition-all duration-200 group-hover:opacity-100\"\n\t\t\t\t\tstyle={{ left: `${progress}%`, transform: \"translateX(-50%) translateY(-50%)\" }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Enhanced volume control with better UX\nexport const EnhancedVolumeControl = function EnhancedVolumeControl({\n\tclassName\n}: {\n\tclassName?: string\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst volume = useMediaSelector((state) => state.volume)\n\tconst isMuted = useMediaSelector((state) => state.isMuted)\n\n\tconst [showSlider, setShowSlider] = React.useState(false)\n\n\tconst handleToggleMute = React.useCallback(() => {\n\t\tdispatch({ type: MediaActionTypes.TOGGLE_MUTE })\n\t}, [dispatch])\n\n\tconst handleVolumeChange = React.useCallback(\n\t\t(newVolume: number) => {\n\t\t\tdispatch({ type: MediaActionTypes.SET_VOLUME, detail: newVolume })\n\t\t},\n\t\t[dispatch]\n\t)\n\n\tconst VolumeIcon = React.useMemo(() => {\n\t\tif (isMuted || volume === 0) {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<path d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t} else if (volume < 0.5) {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<path d=\"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t} else {\n\t\t\treturn (\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-5 w-5\">\n\t\t\t\t\t<path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\" />\n\t\t\t\t</svg>\n\t\t\t)\n\t\t}\n\t}, [isMuted, volume])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"relative flex items-center\", className)}\n\t\t\tonMouseEnter={() => setShowSlider(true)}\n\t\t\tonMouseLeave={() => setShowSlider(false)}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={handleToggleMute}\n\t\t\t\tclassName=\"flex h-10 w-10 items-center justify-center rounded-full text-white transition-colors hover:bg-white/10\"\n\t\t\t\taria-label={isMuted ? \"Unmute\" : \"Mute\"}>\n\t\t\t\t{VolumeIcon}\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\"absolute left-full ml-2 flex items-center transition-all duration-200\",\n\t\t\t\t\tshowSlider ? \"translate-x-0 opacity-100\" : \"-translate-x-2 pointer-events-none 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={(e) => handleVolumeChange(parseFloat(e.target.value))}\n\t\t\t\t\tclassName=\"slider h-1 w-20 cursor-pointer appearance-none rounded-lg bg-white/20\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// Enhanced backward skip button\nexport const EnhancedBackwardButton = function EnhancedBackwardButton({\n\tclassName,\n\tsize = \"md\",\n\tskipTime = 10\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tconst newTime = Math.max(0, currentTime - skipTime)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: newTime })\n\t}, [dispatch, currentTime, skipTime])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={`Backward ${skipTime} seconds`}\n\t\t\ttitle={`Backward ${skipTime}s`}>\n\t\t\t<div className={cn(\"flex items-center transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t<path d=\"M7 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM15.5 7.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v9c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-9z\" />\n\t\t\t\t\t<path d=\"M5.5 12l7-4.5v9l-7-4.5z\" opacity=\"0.8\" />\n\t\t\t\t</svg>\n\t\t\t\t{skipTime && <span className=\"-bottom-1 absolute font-bold text-[10px]\">{skipTime}</span>}\n\t\t\t</div>\n\t\t</button>\n\t)\n}\n\n// Enhanced forward skip button\nexport const EnhancedForwardButton = function EnhancedForwardButton({\n\tclassName,\n\tsize = \"md\",\n\tskipTime = 10\n}: {\n\tclassName?: string\n\tsize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n}) {\n\tconst dispatch = useMediaDispatch()\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\n\tconst sizeClasses = {\n\t\tsm: \"h-8 w-8\",\n\t\tmd: \"h-10 w-10\",\n\t\tlg: \"h-12 w-12\"\n\t}\n\n\tconst iconSizes = {\n\t\tsm: \"h-4 w-4\",\n\t\tmd: \"h-5 w-5\",\n\t\tlg: \"h-6 w-6\"\n\t}\n\n\tconst handleClick = React.useCallback(() => {\n\t\tconst newTime = Math.min(duration, currentTime + skipTime)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: newTime })\n\t}, [dispatch, currentTime, duration, skipTime])\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center justify-center rounded-full bg-white/10 backdrop-blur-sm\",\n\t\t\t\t\"border border-white/20 text-white transition-all duration-200\",\n\t\t\t\t\"hover:scale-105 hover:bg-white/20 active:scale-95\",\n\t\t\t\t\"focus:outline-none focus:ring-2 focus:ring-white/50\",\n\t\t\t\tsizeClasses[size],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\taria-label={`Forward ${skipTime} seconds`}\n\t\t\ttitle={`Forward ${skipTime}s`}>\n\t\t\t<div className={cn(\"flex items-center transition-transform duration-200\", iconSizes[size])}>\n\t\t\t\t<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"h-full w-full\">\n\t\t\t\t\t<path d=\"M17 6c.55 0 1 .45 1 1v10c0 .55-.45 1-1 1s-1-.45-1-1V7c0-.55.45-1 1-1zM8.5 7.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v9c0 .83-.67 1.5-1.5 1.5s-1.5-.67-1.5-1.5v-9z\" />\n\t\t\t\t\t<path d=\"M18.5 12l-7-4.5v9l7-4.5z\" opacity=\"0.8\" />\n\t\t\t\t</svg>\n\t\t\t\t{skipTime && <span className=\"-bottom-1 absolute font-bold text-[10px]\">{skipTime}</span>}\n\t\t\t</div>\n\t\t</button>\n\t)\n}\n\n// Enhanced time display\nexport const EnhancedTimeDisplay = function EnhancedTimeDisplay({\n\tvariant = \"current\",\n\tclassName\n}: {\n\tvariant?: \"current\" | \"duration\" | \"remaining\"\n\tclassName?: string\n}) {\n\tconst currentTime = useMediaSelector((state) => state.currentTime)\n\tconst duration = useMediaSelector((state) => state.duration)\n\n\tconst displayTime = React.useMemo(() => {\n\t\tswitch (variant) {\n\t\t\tcase \"current\":\n\t\t\t\treturn formatTime(currentTime)\n\t\t\tcase \"duration\":\n\t\t\t\treturn formatTime(duration)\n\t\t\tcase \"remaining\":\n\t\t\t\treturn `-${formatTime(duration - currentTime)}`\n\t\t\tdefault:\n\t\t\t\treturn formatTime(currentTime)\n\t\t}\n\t}, [variant, currentTime, duration])\n\n\treturn (\n\t\t<div className={cn(\"font-mono text-sm text-white tabular-nums\", className)}>{displayTime}</div>\n\t)\n}\n\n// Performance indicator component\nexport const PerformanceIndicator = function PerformanceIndicator({\n\tmetrics,\n\tclassName\n}: {\n\tmetrics?: {\n\t\tfps?: number\n\t\tbufferHealth?: number\n\t\tquality?: number\n\t\tbandwidth?: number\n\t}\n\tclassName?: string\n}) {\n\tif (!metrics || process.env.NODE_ENV !== \"development\") {\n\t\treturn null\n\t}\n\n\tconst getPerformanceColor = (fps: number) => {\n\t\tif (fps >= 50) return \"text-green-400\"\n\t\tif (fps >= 30) return \"text-yellow-400\"\n\t\treturn \"text-red-400\"\n\t}\n\n\tconst getBufferColor = (health: number) => {\n\t\tif (health >= 5) return \"text-green-400\"\n\t\tif (health >= 2) return \"text-yellow-400\"\n\t\treturn \"text-red-400\"\n\t}\n\n\treturn (\n\t\t<div className={cn(\"flex items-center gap-3 font-mono text-xs\", className)}>\n\t\t\t{metrics.fps !== undefined && (\n\t\t\t\t<div className={cn(\"flex items-center gap-1\", getPerformanceColor(metrics.fps))}>\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.fps} FPS</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{metrics.bufferHealth !== undefined && (\n\t\t\t\t<div className={cn(\"flex items-center gap-1\", getBufferColor(metrics.bufferHealth))}>\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.bufferHealth.toFixed(1)}s</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{metrics.quality !== undefined && (\n\t\t\t\t<div className=\"flex items-center gap-1 text-blue-400\">\n\t\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-current\" />\n\t\t\t\t\t<span>{metrics.quality}p</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// Enhanced control bar that combines all controls\nexport const EnhancedControlBar = function EnhancedControlBar({\n\tclassName,\n\tshowSkipButtons = true,\n\tshowVolumeControl = true,\n\tshowTimeDisplay = true,\n\tplayButtonSize = \"xl\",\n\tskipButtonSize = \"md\",\n\tskipTime = 10,\n\tshowPerformanceIndicators = process.env.NODE_ENV === \"development\",\n\tperformanceMetrics\n}: {\n\tclassName?: string\n\tshowSkipButtons?: boolean\n\tshowVolumeControl?: boolean\n\tshowTimeDisplay?: boolean\n\tplayButtonSize?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n\tskipButtonSize?: \"sm\" | \"md\" | \"lg\"\n\tskipTime?: number\n\tshowPerformanceIndicators?: boolean\n\tperformanceMetrics?: {\n\t\tfps?: number\n\t\tbufferHealth?: number\n\t\tquality?: number\n\t\tbandwidth?: number\n\t}\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-4 bg-gradient-to-t from-black/80 to-transparent p-4\",\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t{/* Seek Bar */}\n\t\t\t<EnhancedSeekBar className=\"w-full\" />\n\n\t\t\t{/* Control Buttons */}\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t{/* Left side - Media controls */}\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedBackwardButton\n\t\t\t\t\t\t\tsize={skipButtonSize}\n\t\t\t\t\t\t\tskipTime={skipTime}\n\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<EnhancedPlayButton size={playButtonSize} className=\"shrink-0\" />\n\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedForwardButton size={skipButtonSize} skipTime={skipTime} className=\"shrink-0\" />\n\t\t\t\t\t)}\n\n\t\t\t\t\t{showVolumeControl && <EnhancedVolumeControl className=\"shrink-0\" />}\n\n\t\t\t\t\t{showTimeDisplay && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1 font-mono text-sm\">\n\t\t\t\t\t\t\t<EnhancedTimeDisplay variant=\"current\" />\n\t\t\t\t\t\t\t<span className=\"text-white/60\">/</span>\n\t\t\t\t\t\t\t<EnhancedTimeDisplay variant=\"duration\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Right side - Performance indicators and additional controls */}\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{showPerformanceIndicators && (\n\t\t\t\t\t\t<PerformanceIndicator metrics={performanceMetrics} className=\"text-white/80\" />\n\t\t\t\t\t)}\n\t\t\t\t\t{/* Future: Settings, Fullscreen, etc. */}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","/**\n * Debug Panel Component for Performance Monitoring\n * Development-only component for displaying performance metrics\n */\n\nimport React, { useMemo } from \"react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface PerformanceMetrics {\n\tfps: number\n\tmemoryUsage: number\n\tbufferHealth: number\n\tnetworkBandwidth: number\n\tdroppedFrames: number\n\tdecodedFrames: number\n\tpresentationTime: number\n}\n\ninterface PreloadingStats {\n\tpreloadedItems: number\n\tengagementScore: number\n\tqueueLength: number\n\thitRate: number\n\ttotalSaved: number\n}\n\ninterface DebugPanelProps {\n\t/** Performance metrics to display */\n\tperformanceMetrics?: Partial<PerformanceMetrics>\n\t/** Preloading statistics */\n\tpreloadingStats?: PreloadingStats\n\t/** Current playback state */\n\tplaybackState?: {\n\t\tcurrentTime: number\n\t\tduration: number\n\t\tvolume: number\n\t\tisPlaying: boolean\n\t\tquality: number\n\t\tisBuffering: boolean\n\t\terror?: string\n\t}\n\t/** HLS-specific metrics */\n\thlsMetrics?: {\n\t\tcurrentLevel: number\n\t\tavailableLevels: number\n\t\tbandwidthEstimate: number\n\t\tdroppedFrames: number\n\t}\n\t/** Plugin information */\n\tpluginInfo?: {\n\t\tloadedPlugins: string[]\n\t\tactivePlugins: string[]\n\t\tpluginCount: number\n\t}\n\t/** Additional debug information */\n\tdebugInfo?: Record<string, any>\n\t/** Custom className */\n\tclassName?: string\n\t/** Panel position */\n\tposition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\"\n\t/** Whether the panel is collapsed by default */\n\tdefaultCollapsed?: boolean\n\t/** Custom title */\n\ttitle?: string\n}\n\n/**\n * Debug Panel Component\n */\nexport const DebugPanel: React.FC<DebugPanelProps> = ({\n\tperformanceMetrics = {},\n\tpreloadingStats = {} as PreloadingStats,\n\tplaybackState = {} as any,\n\thlsMetrics = {},\n\tpluginInfo = {},\n\tdebugInfo = {},\n\tclassName,\n\tposition = \"top-right\",\n\tdefaultCollapsed = false,\n\ttitle = \"BaroiPlayer Debug Panel\"\n}) => {\n\tconst [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed)\n\tconst [activeTab, setActiveTab] = React.useState<\"performance\" | \"hls\" | \"plugins\" | \"debug\">(\n\t\t\"performance\"\n\t)\n\n\t// Position classes\n\tconst positionClasses = useMemo(() => {\n\t\tswitch (position) {\n\t\t\tcase \"top-left\":\n\t\t\t\treturn \"top-4 left-4\"\n\t\t\tcase \"top-right\":\n\t\t\t\treturn \"top-4 right-4\"\n\t\t\tcase \"bottom-left\":\n\t\t\t\treturn \"bottom-4 left-4\"\n\t\t\tcase \"bottom-right\":\n\t\t\t\treturn \"bottom-4 right-4\"\n\t\t\tdefault:\n\t\t\t\treturn \"top-4 right-4\"\n\t\t}\n\t}, [position])\n\n\t// Format bytes\n\tconst formatBytes = (bytes: number): string => {\n\t\tif (bytes === 0) return \"0 B\"\n\t\tconst k = 1024\n\t\tconst sizes = [\"B\", \"KB\", \"MB\", \"GB\"]\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\n\t\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i]\n\t}\n\n\t// Format time\n\tconst formatTime = (seconds: number): string => {\n\t\tconst mins = Math.floor(seconds / 60)\n\t\tconst secs = Math.floor(seconds % 60)\n\t\treturn `${mins}:${secs.toString().padStart(2, \"0\")}`\n\t}\n\n\t// Render performance metrics\n\tconst renderPerformanceMetrics = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">FPS:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.fps || 0}</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Memory:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)} MB\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Buffer:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{(performanceMetrics.bufferHealth || 0).toFixed(2)}s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Bandwidth:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{formatBytes(performanceMetrics.networkBandwidth || 0)}/s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Dropped:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.droppedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-cyan-400\">Decoded:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{performanceMetrics.decodedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render playback state\n\tconst renderPlaybackState = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Status:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{playbackState.isPlaying ? (\n\t\t\t\t\t\t\t<span className=\"text-green-300\">Playing</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"text-red-300\">Paused</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Time:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{formatTime(playbackState.currentTime || 0)} / {formatTime(playbackState.duration || 0)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Volume:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{Math.round((playbackState.volume || 0) * 100)}%</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Quality:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{playbackState.quality || 0}p</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Buffering:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{playbackState.isBuffering ? (\n\t\t\t\t\t\t\t<span className=\"text-yellow-300\">Yes</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"text-green-300\">No</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t{playbackState.error && (\n\t\t\t\t\t<div className=\"col-span-2\">\n\t\t\t\t\t\t<span className=\"text-red-400\">Error:</span>\n\t\t\t\t\t\t<span className=\"ml-2 break-all font-mono text-red-300 text-xs\">\n\t\t\t\t\t\t\t{playbackState.error}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render preloading stats\n\tconst renderPreloadingStats = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Preloaded:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{preloadingStats.preloadedItems || 0} items</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Engagement:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{(preloadingStats.engagementScore || 0).toFixed(1)}%\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-yellow-400\">Queue:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{preloadingStats.queueLength || 0} items</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-purple-400\">Hit Rate:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{(preloadingStats.hitRate || 0).toFixed(1)}%</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"col-span-2\">\n\t\t\t\t\t<span className=\"text-cyan-400\">Saved:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{formatBytes(preloadingStats.totalSaved || 0)}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render HLS metrics\n\tconst renderHLSMetrics = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Level:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">\n\t\t\t\t\t\t{hlsMetrics.currentLevel || 0} / {hlsMetrics.availableLevels || 0}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-blue-400\">Bandwidth:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{formatBytes(hlsMetrics.bandwidthEstimate || 0)}/s</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-red-400\">Dropped:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{hlsMetrics.droppedFrames || 0} frames</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render plugin info\n\tconst renderPluginInfo = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"text-xs\">\n\t\t\t\t<div>\n\t\t\t\t\t<span className=\"text-green-400\">Total:</span>\n\t\t\t\t\t<span className=\"ml-2 font-mono\">{pluginInfo.pluginCount || 0} plugins</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t<span className=\"text-blue-400\">Active:</span>\n\t\t\t\t\t<div className=\"ml-2 space-y-1 font-mono text-xs\">\n\t\t\t\t\t\t{pluginInfo.activePlugins?.map((plugin, index) => (\n\t\t\t\t\t\t\t<div key={index} className=\"text-green-300\">\n\t\t\t\t\t\t\t\t• {plugin}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)) || <div className=\"text-gray-400\">None</div>}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{pluginInfo.loadedPlugins &&\n\t\t\t\t\tpluginInfo.loadedPlugins.length > (pluginInfo.activePlugins?.length || 0) && (\n\t\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t\t<span className=\"text-yellow-400\">Loaded (inactive):</span>\n\t\t\t\t\t\t\t<div className=\"ml-2 space-y-1 font-mono text-xs\">\n\t\t\t\t\t\t\t\t{pluginInfo.loadedPlugins\n\t\t\t\t\t\t\t\t\t.filter((plugin) => !pluginInfo.activePlugins?.includes(plugin))\n\t\t\t\t\t\t\t\t\t.map((plugin, index) => (\n\t\t\t\t\t\t\t\t\t\t<div key={index} className=\"text-yellow-300\">\n\t\t\t\t\t\t\t\t\t\t\t• {plugin}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render debug info\n\tconst renderDebugInfo = () => (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"space-y-1 font-mono text-xs\">\n\t\t\t\t{Object.entries(debugInfo).map(([key, value]) => (\n\t\t\t\t\t<div key={key}>\n\t\t\t\t\t\t<span className=\"text-yellow-400\">{key}:</span>\n\t\t\t\t\t\t<span className=\"ml-2 text-gray-300\">\n\t\t\t\t\t\t\t{typeof value === \"object\" ? JSON.stringify(value, null, 2) : String(value)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t)\n\n\t// Render tabs\n\tconst renderTabs = () => (\n\t\t<div className=\"flex space-x-1 border-gray-600 border-b\">\n\t\t\t{[\n\t\t\t\t{ id: \"performance\", label: \"Performance\" },\n\t\t\t\t{ id: \"hls\", label: \"HLS\" },\n\t\t\t\t{ id: \"plugins\", label: \"Plugins\" },\n\t\t\t\t{ id: \"debug\", label: \"Debug\" }\n\t\t\t].map((tab) => (\n\t\t\t\t<button\n\t\t\t\t\tkey={tab.id}\n\t\t\t\t\tonClick={() => setActiveTab(tab.id as any)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"px-2 py-1 font-medium text-xs transition-colors\",\n\t\t\t\t\t\tactiveTab === tab.id\n\t\t\t\t\t\t\t? \"border-blue-400 border-b text-blue-400\"\n\t\t\t\t\t\t\t: \"text-gray-400 hover:text-white\"\n\t\t\t\t\t)}>\n\t\t\t\t\t{tab.label}\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</div>\n\t)\n\n\t// Render active tab content\n\tconst renderTabContent = () => {\n\t\tswitch (activeTab) {\n\t\t\tcase \"performance\":\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t{renderPerformanceMetrics()}\n\t\t\t\t\t\t<hr className=\"border-gray-600\" />\n\t\t\t\t\t\t{renderPlaybackState()}\n\t\t\t\t\t\t<hr className=\"border-gray-600\" />\n\t\t\t\t\t\t{renderPreloadingStats()}\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\tcase \"hls\":\n\t\t\t\treturn renderHLSMetrics()\n\t\t\tcase \"plugins\":\n\t\t\t\treturn renderPluginInfo()\n\t\t\tcase \"debug\":\n\t\t\t\treturn renderDebugInfo()\n\t\t\tdefault:\n\t\t\t\treturn renderPerformanceMetrics()\n\t\t}\n\t}\n\n\t// Only render in development\n\tif (process.env.NODE_ENV !== \"development\") {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed z-50 min-w-80 max-w-96 rounded-lg border border-gray-700 bg-black/90 p-3 font-mono text-white text-xs backdrop-blur-sm\",\n\t\t\t\tpositionClasses,\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t{/* Header */}\n\t\t\t<div className=\"mb-3 flex items-center justify-between\">\n\t\t\t\t<h3 className=\"font-bold text-blue-400 text-sm\">{title}</h3>\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => setIsCollapsed(!isCollapsed)}\n\t\t\t\t\t\tclassName=\"text-gray-400 transition-colors hover:text-white\"\n\t\t\t\t\t\taria-label={isCollapsed ? \"Expand\" : \"Collapse\"}>\n\t\t\t\t\t\t{isCollapsed ? (\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M3 4.5L6 7.5L9 4.5\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td=\"M3 7.5L6 4.5L9 7.5\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Collapsed content */}\n\t\t\t{isCollapsed ? (\n\t\t\t\t<div className=\"grid grid-cols-2 gap-2 text-xs\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span className=\"text-green-400\">FPS:</span>\n\t\t\t\t\t\t<span className=\"ml-1 font-mono\">{performanceMetrics.fps || 0}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span className=\"text-blue-400\">Memory:</span>\n\t\t\t\t\t\t<span className=\"ml-1 font-mono\">\n\t\t\t\t\t\t\t{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)}MB\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{/* Tabs */}\n\t\t\t\t\t{renderTabs()}\n\n\t\t\t\t\t{/* Tab Content */}\n\t\t\t\t\t<div className=\"mt-3 max-h-64 overflow-y-auto\">{renderTabContent()}</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n/**\n * Performance Debug Panel - simplified version focused on performance metrics\n */\nexport const PerformanceDebugPanel: React.FC<\n\tOmit<DebugPanelProps, \"position\" | \"defaultCollapsed\" | \"title\">\n> = (props) => {\n\treturn (\n\t\t<DebugPanel\n\t\t\t{...props}\n\t\t\tposition=\"top-right\"\n\t\t\tdefaultCollapsed={false}\n\t\t\ttitle=\"Performance Monitor\"\n\t\t/>\n\t)\n}\n\nexport default DebugPanel\n"],"names":["composeRefs","refs","node","ref","useAutoHideControls","autoHide","delay","showOnHover","showOnTouch","showControls","setShowControls","React","isHovering","setIsHovering","isTouching","setIsTouching","timeoutRef","resetTimeout","showControlsTemporarily","handleMouseEnter","handleMouseLeave","handleTouchStart","handleTouchEnd","useTouchGestures","enabled","dispatch","useMediaDispatch","isPlaying","useMediaSelector","state","currentTime","duration","volume","touchStart","setTouchStart","isDoubleTap","setIsDoubleTap","e","touch","now","MediaActionTypes","handleTouchMove","deltaX","deltaY","seekAmount","newTime","volumeChange","newVolume","EnhancedMediaPlayer","children","className","autoHideDelay","showControlsOnHover","showControlsOnTouch","enableKeyboardControls","enableTouchGestures","onPlay","onPause","onTimeUpdate","onVolumeChange","onFullscreenChange","context","useMediaContext","isFullscreen","error","handleControlsTouch","handleControlsTouchEnd","handleGestureStart","handleGestureMove","handleGestureEnd","handleClick","handleKeyDown","jsx","cn","QualitySelector","qualities","currentQuality","onQualityChange","isOpen","setIsOpen","currentQualityLabel","q","jsxs","quality","SubtitleSelector","subtitles","currentSubtitle","onSubtitleChange","currentSubtitleLabel","s","subtitle","PlaybackSpeedSelector","playbackRate","speeds","handleSpeedChange","speed","ChaptersPanel","chapters","onChapterSelect","currentChapter","chapter","formatTime","PictureInPictureButton","isPictureInPicture","handleTogglePiP","EnhancedPlayButton","size","isLoading","sizeClasses","iconSizes","EnhancedSeekBar","buffered","previewTime","isDragging","setIsDragging","hoverTime","setHoverTime","progressRef","progress","previewProgress","bufferedRanges","ranges","i","getTimeFromPosition","clientX","rect","handleMouseMove","time","handleMouseDown","handleMouseUp","range","index","EnhancedVolumeControl","isMuted","showSlider","setShowSlider","handleToggleMute","handleVolumeChange","VolumeIcon","EnhancedBackwardButton","skipTime","EnhancedForwardButton","EnhancedTimeDisplay","variant","displayTime","PerformanceIndicator","metrics","getPerformanceColor","fps","getBufferColor","health","EnhancedControlBar","showSkipButtons","showVolumeControl","showTimeDisplay","playButtonSize","skipButtonSize","showPerformanceIndicators","performanceMetrics","DebugPanel","preloadingStats","playbackState","hlsMetrics","pluginInfo","debugInfo","position","defaultCollapsed","title","isCollapsed","setIsCollapsed","activeTab","setActiveTab","positionClasses","useMemo","formatBytes","bytes","k","sizes","seconds","mins","secs","renderPerformanceMetrics","renderPlaybackState","renderPreloadingStats","renderHLSMetrics","renderPluginInfo","plugin","renderDebugInfo","key","value","renderTabs","tab","renderTabContent","Fragment"],"mappings":"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"}