@therealtinhtute/baroiplayer 1.0.5 → 1.0.7

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 (611) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/package.json +1 -1
  3. package/dist/src/components/media-player-error.tsx +2 -2
  4. package/dist/src/components/media-player-fullscreen.tsx +2 -2
  5. package/dist/src/components/media-player-play.tsx +2 -2
  6. package/dist/src/components/media-player-seek.tsx +1 -1
  7. package/dist/src/components/media-player-tooltip.tsx +1 -1
  8. package/dist/src/components/media-player-volume.tsx +3 -3
  9. package/dist/src/components/react-player-wrapper.tsx +5 -5
  10. package/dist/src/hooks/use-touch-gestures.ts +1 -1
  11. package/package.json +1 -1
  12. package/src/components/media-player-error.tsx +2 -2
  13. package/src/components/media-player-fullscreen.tsx +2 -2
  14. package/src/components/media-player-play.tsx +2 -2
  15. package/src/components/media-player-seek.tsx +1 -1
  16. package/src/components/media-player-tooltip.tsx +1 -1
  17. package/src/components/media-player-volume.tsx +3 -3
  18. package/src/components/react-player-wrapper.tsx +5 -5
  19. package/src/hooks/use-touch-gestures.ts +1 -1
  20. package/dist/context/media.js +0 -2
  21. package/dist/context/media.js.map +0 -1
  22. package/dist/context/media.mjs +0 -15
  23. package/dist/context/media.mjs.map +0 -1
  24. package/dist/context/store.js +0 -2
  25. package/dist/context/store.js.map +0 -1
  26. package/dist/context/store.mjs +0 -5
  27. package/dist/context/store.mjs.map +0 -1
  28. package/dist/context-Af84FynT.js +0 -1179
  29. package/dist/context-Af84FynT.js.map +0 -1
  30. package/dist/context-CwZnPdz0.cjs +0 -23
  31. package/dist/context-CwZnPdz0.cjs.map +0 -1
  32. package/dist/core-events-B5W_j8yU.js +0 -480
  33. package/dist/core-events-B5W_j8yU.js.map +0 -1
  34. package/dist/core-events-CN0-Vhhq.cjs +0 -2
  35. package/dist/core-events-CN0-Vhhq.cjs.map +0 -1
  36. package/dist/core-plugins-Bq9KLany.js +0 -696
  37. package/dist/core-plugins-Bq9KLany.js.map +0 -1
  38. package/dist/core-plugins-CPDSHMiQ.cjs +0 -2
  39. package/dist/core-plugins-CPDSHMiQ.cjs.map +0 -1
  40. package/dist/core.js +0 -37
  41. package/dist/core.js.map +0 -1
  42. package/dist/core.mjs +0 -1217
  43. package/dist/core.mjs.map +0 -1
  44. package/dist/enhanced-components-CXnYiOt6.cjs +0 -2
  45. package/dist/enhanced-components-CXnYiOt6.cjs.map +0 -1
  46. package/dist/enhanced-components-Da0TSvKe.js +0 -1073
  47. package/dist/enhanced-components-Da0TSvKe.js.map +0 -1
  48. package/dist/hooks-BCMilGRf.cjs +0 -4
  49. package/dist/hooks-BCMilGRf.cjs.map +0 -1
  50. package/dist/hooks-BPtHV1ZT.js +0 -2042
  51. package/dist/hooks-BPtHV1ZT.js.map +0 -1
  52. package/dist/index.js.map +0 -1
  53. package/dist/index.mjs.map +0 -1
  54. package/dist/minimal-components-BHJMuaL7.cjs +0 -2
  55. package/dist/minimal-components-BHJMuaL7.cjs.map +0 -1
  56. package/dist/minimal-components-BmqRefl1.js +0 -2002
  57. package/dist/minimal-components-BmqRefl1.js.map +0 -1
  58. package/dist/mona-loading.gif +0 -0
  59. package/dist/performance-monitor--rzKTlbj.js +0 -302
  60. package/dist/performance-monitor--rzKTlbj.js.map +0 -1
  61. package/dist/performance-monitor-cjIvZE2D.cjs +0 -2
  62. package/dist/performance-monitor-cjIvZE2D.cjs.map +0 -1
  63. package/dist/src/adapters/videojs-adapter.d.ts.map +0 -1
  64. package/dist/src/adapters/videojs-adapter.js +0 -350
  65. package/dist/src/assets/mona-loading.gif +0 -0
  66. package/dist/src/components/AnimateLoading.d.ts.map +0 -1
  67. package/dist/src/components/AnimateLoading.js +0 -41
  68. package/dist/src/components/LoadingState.d.ts.map +0 -1
  69. package/dist/src/components/LoadingState.js +0 -111
  70. package/dist/src/components/accessibility/keyboard-help-overlay.d.ts.map +0 -1
  71. package/dist/src/components/accessibility/keyboard-help-overlay.js +0 -90
  72. package/dist/src/components/audio-player.d.ts.map +0 -1
  73. package/dist/src/components/audio-player.js +0 -31
  74. package/dist/src/components/basic/index.d.ts.map +0 -1
  75. package/dist/src/components/basic/index.js +0 -29
  76. package/dist/src/components/enhanced/advanced-features.d.ts.map +0 -1
  77. package/dist/src/components/enhanced/advanced-features.js +0 -64
  78. package/dist/src/components/enhanced/debug-panel.d.ts.map +0 -1
  79. package/dist/src/components/enhanced/debug-panel.js +0 -94
  80. package/dist/src/components/enhanced/enhanced-controls.d.ts.map +0 -1
  81. package/dist/src/components/enhanced/enhanced-controls.js +0 -233
  82. package/dist/src/components/enhanced/enhanced-media-player.d.ts.map +0 -1
  83. package/dist/src/components/enhanced/enhanced-media-player.js +0 -316
  84. package/dist/src/components/enhanced/error-handling.d.ts.map +0 -1
  85. package/dist/src/components/enhanced/error-handling.js +0 -153
  86. package/dist/src/components/enhanced/index.d.ts.map +0 -1
  87. package/dist/src/components/enhanced/index.js +0 -10
  88. package/dist/src/components/enhanced/media-player-enhanced.d.ts.map +0 -1
  89. package/dist/src/components/enhanced/media-player-enhanced.js +0 -250
  90. package/dist/src/components/examples/basic-video-player.d.ts.map +0 -1
  91. package/dist/src/components/examples/basic-video-player.js +0 -16
  92. package/dist/src/components/examples/custom-controls-example.d.ts.map +0 -1
  93. package/dist/src/components/examples/custom-controls-example.js +0 -12
  94. package/dist/src/components/examples/enhanced-controls-example.d.ts.map +0 -1
  95. package/dist/src/components/examples/enhanced-controls-example.js +0 -18
  96. package/dist/src/components/examples/enhanced-media-player-example.d.ts.map +0 -1
  97. package/dist/src/components/examples/enhanced-media-player-example.js +0 -13
  98. package/dist/src/components/examples/loading-states-demo.d.ts.map +0 -1
  99. package/dist/src/components/examples/loading-states-demo.js +0 -41
  100. package/dist/src/components/examples/react-19-demo.d.ts.map +0 -1
  101. package/dist/src/components/examples/react-19-demo.js +0 -104
  102. package/dist/src/components/examples/volume-orientation-demo.d.ts.map +0 -1
  103. package/dist/src/components/examples/volume-orientation-demo.js +0 -31
  104. package/dist/src/components/icon-demo.d.ts.map +0 -1
  105. package/dist/src/components/icon-demo.js +0 -16
  106. package/dist/src/components/icons/index.d.ts.map +0 -1
  107. package/dist/src/components/icons/index.js +0 -59
  108. package/dist/src/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +0 -1
  109. package/dist/src/components/icons/svg-icons/ArrowLeftIcon.js +0 -3
  110. package/dist/src/components/icons/svg-icons/ArrowRightIcon.d.ts.map +0 -1
  111. package/dist/src/components/icons/svg-icons/ArrowRightIcon.js +0 -3
  112. package/dist/src/components/icons/svg-icons/AudioIcon.d.ts.map +0 -1
  113. package/dist/src/components/icons/svg-icons/AudioIcon.js +0 -4
  114. package/dist/src/components/icons/svg-icons/BackwardIcon.d.ts.map +0 -1
  115. package/dist/src/components/icons/svg-icons/BackwardIcon.js +0 -3
  116. package/dist/src/components/icons/svg-icons/CameraIcon.d.ts.map +0 -1
  117. package/dist/src/components/icons/svg-icons/CameraIcon.js +0 -4
  118. package/dist/src/components/icons/svg-icons/CheckIcon.d.ts.map +0 -1
  119. package/dist/src/components/icons/svg-icons/CheckIcon.js +0 -4
  120. package/dist/src/components/icons/svg-icons/EnablePiPIcon.d.ts.map +0 -1
  121. package/dist/src/components/icons/svg-icons/EnablePiPIcon.js +0 -5
  122. package/dist/src/components/icons/svg-icons/ForwardIcon.d.ts.map +0 -1
  123. package/dist/src/components/icons/svg-icons/ForwardIcon.js +0 -3
  124. package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +0 -1
  125. package/dist/src/components/icons/svg-icons/FullscreenEnterIcon.js +0 -3
  126. package/dist/src/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +0 -1
  127. package/dist/src/components/icons/svg-icons/FullscreenExitIcon.js +0 -3
  128. package/dist/src/components/icons/svg-icons/LoadingIcon.d.ts.map +0 -1
  129. package/dist/src/components/icons/svg-icons/LoadingIcon.js +0 -3
  130. package/dist/src/components/icons/svg-icons/PauseIcon.d.ts.map +0 -1
  131. package/dist/src/components/icons/svg-icons/PauseIcon.js +0 -3
  132. package/dist/src/components/icons/svg-icons/PlayIcon.d.ts.map +0 -1
  133. package/dist/src/components/icons/svg-icons/PlayIcon.js +0 -3
  134. package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +0 -1
  135. package/dist/src/components/icons/svg-icons/PlaybackSpeedIcon.js +0 -3
  136. package/dist/src/components/icons/svg-icons/QualityIcon.d.ts.map +0 -1
  137. package/dist/src/components/icons/svg-icons/QualityIcon.js +0 -3
  138. package/dist/src/components/icons/svg-icons/SettingsIcon.d.ts.map +0 -1
  139. package/dist/src/components/icons/svg-icons/SettingsIcon.js +0 -3
  140. package/dist/src/components/icons/svg-icons/SliderIcon.d.ts.map +0 -1
  141. package/dist/src/components/icons/svg-icons/SliderIcon.js +0 -3
  142. package/dist/src/components/icons/svg-icons/SubtitleIcon.d.ts.map +0 -1
  143. package/dist/src/components/icons/svg-icons/SubtitleIcon.js +0 -3
  144. package/dist/src/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +0 -1
  145. package/dist/src/components/icons/svg-icons/SubtitleOffIcon.js +0 -3
  146. package/dist/src/components/icons/svg-icons/UnPiPIcon.d.ts.map +0 -1
  147. package/dist/src/components/icons/svg-icons/UnPiPIcon.js +0 -5
  148. package/dist/src/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +0 -1
  149. package/dist/src/components/icons/svg-icons/VolumeMutedIcon.js +0 -3
  150. package/dist/src/components/icons/svg-icons/VolumeOneIcon.d.ts.map +0 -1
  151. package/dist/src/components/icons/svg-icons/VolumeOneIcon.js +0 -3
  152. package/dist/src/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +0 -1
  153. package/dist/src/components/icons/svg-icons/VolumeThreeIcon.js +0 -3
  154. package/dist/src/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +0 -1
  155. package/dist/src/components/icons/svg-icons/VolumeTwoIcon.js +0 -3
  156. package/dist/src/components/legacy.d.ts.map +0 -1
  157. package/dist/src/components/legacy.js +0 -52
  158. package/dist/src/components/media-metadata-display.d.ts.map +0 -1
  159. package/dist/src/components/media-metadata-display.js +0 -20
  160. package/dist/src/components/media-player-audio.d.ts.map +0 -1
  161. package/dist/src/components/media-player-audio.js +0 -18
  162. package/dist/src/components/media-player-controls.d.ts.map +0 -1
  163. package/dist/src/components/media-player-controls.js +0 -150
  164. package/dist/src/components/media-player-error.d.ts.map +0 -1
  165. package/dist/src/components/media-player-error.js +0 -85
  166. package/dist/src/components/media-player-fullscreen.d.ts.map +0 -1
  167. package/dist/src/components/media-player-fullscreen.js +0 -68
  168. package/dist/src/components/media-player-hls.d.ts.map +0 -1
  169. package/dist/src/components/media-player-hls.js +0 -20
  170. package/dist/src/components/media-player-loading.d.ts.map +0 -1
  171. package/dist/src/components/media-player-loading.js +0 -53
  172. package/dist/src/components/media-player-play.d.ts.map +0 -1
  173. package/dist/src/components/media-player-play.js +0 -44
  174. package/dist/src/components/media-player-root.d.ts.map +0 -1
  175. package/dist/src/components/media-player-root.js +0 -243
  176. package/dist/src/components/media-player-seek.d.ts.map +0 -1
  177. package/dist/src/components/media-player-seek.js +0 -92
  178. package/dist/src/components/media-player-time.d.ts.map +0 -1
  179. package/dist/src/components/media-player-time.js +0 -57
  180. package/dist/src/components/media-player-tooltip.d.ts.map +0 -1
  181. package/dist/src/components/media-player-tooltip.js +0 -14
  182. package/dist/src/components/media-player-video.d.ts.map +0 -1
  183. package/dist/src/components/media-player-video.js +0 -18
  184. package/dist/src/components/media-player-volume.d.ts.map +0 -1
  185. package/dist/src/components/media-player-volume.js +0 -88
  186. package/dist/src/components/media-player.d.ts.map +0 -1
  187. package/dist/src/components/media-player.js +0 -67
  188. package/dist/src/components/media-suspense.d.ts.map +0 -1
  189. package/dist/src/components/media-suspense.js +0 -173
  190. package/dist/src/components/player-settings-form.d.ts.map +0 -1
  191. package/dist/src/components/player-settings-form.js +0 -46
  192. package/dist/src/components/react-player-wrapper.d.ts.map +0 -1
  193. package/dist/src/components/react-player-wrapper.js +0 -163
  194. package/dist/src/components/simple-video-player.d.ts.map +0 -1
  195. package/dist/src/components/simple-video-player.js +0 -41
  196. package/dist/src/components/ui/enhanced-seek-bar.d.ts.map +0 -1
  197. package/dist/src/components/ui/enhanced-seek-bar.js +0 -112
  198. package/dist/src/components/ui/fullscreen-button.d.ts.map +0 -1
  199. package/dist/src/components/ui/fullscreen-button.js +0 -21
  200. package/dist/src/components/ui/media-resource-preloader.d.ts.map +0 -1
  201. package/dist/src/components/ui/media-resource-preloader.js +0 -295
  202. package/dist/src/components/ui/play-button.d.ts.map +0 -1
  203. package/dist/src/components/ui/play-button.js +0 -26
  204. package/dist/src/components/ui/seek-bar.d.ts.map +0 -1
  205. package/dist/src/components/ui/seek-bar.js +0 -54
  206. package/dist/src/components/ui/time-display.d.ts.map +0 -1
  207. package/dist/src/components/ui/time-display.js +0 -18
  208. package/dist/src/components/ui/volume-control.d.ts.map +0 -1
  209. package/dist/src/components/ui/volume-control.js +0 -71
  210. package/dist/src/components/unified/base-media-player.d.ts.map +0 -1
  211. package/dist/src/components/unified/base-media-player.js +0 -104
  212. package/dist/src/components/unified/media-player.d.ts.map +0 -1
  213. package/dist/src/components/unified/media-player.js +0 -41
  214. package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.d.ts.map +0 -1
  215. package/dist/src/components/variants/minimal/AccessibleMinimalPlayer.js +0 -322
  216. package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.d.ts.map +0 -1
  217. package/dist/src/components/variants/minimal/EnhancedMinimalMediaPlayer.js +0 -280
  218. package/dist/src/components/variants/minimal/MinimalControls.d.ts.map +0 -1
  219. package/dist/src/components/variants/minimal/MinimalControls.js +0 -19
  220. package/dist/src/components/variants/minimal/MinimalLoading.d.ts.map +0 -1
  221. package/dist/src/components/variants/minimal/MinimalLoading.js +0 -6
  222. package/dist/src/components/variants/minimal/MinimalMediaPlayer.d.ts.map +0 -1
  223. package/dist/src/components/variants/minimal/MinimalMediaPlayer.js +0 -135
  224. package/dist/src/components/variants/minimal/MinimalOverlay.d.ts.map +0 -1
  225. package/dist/src/components/variants/minimal/MinimalOverlay.js +0 -15
  226. package/dist/src/components/variants/minimal/MinimalPlayButton.d.ts.map +0 -1
  227. package/dist/src/components/variants/minimal/MinimalPlayButton.js +0 -29
  228. package/dist/src/components/variants/minimal/MinimalSeekBar.d.ts.map +0 -1
  229. package/dist/src/components/variants/minimal/MinimalSeekBar.js +0 -73
  230. package/dist/src/components/variants/minimal/MinimalVolumeControl.d.ts.map +0 -1
  231. package/dist/src/components/variants/minimal/MinimalVolumeControl.js +0 -29
  232. package/dist/src/components/variants/minimal/SimpleMinimalPlayer.d.ts.map +0 -1
  233. package/dist/src/components/variants/minimal/SimpleMinimalPlayer.js +0 -51
  234. package/dist/src/components/variants/minimal/components/CenterPlayButton.d.ts.map +0 -1
  235. package/dist/src/components/variants/minimal/components/CenterPlayButton.js +0 -8
  236. package/dist/src/components/variants/minimal/components/ControlBar.d.ts.map +0 -1
  237. package/dist/src/components/variants/minimal/components/ControlBar.js +0 -10
  238. package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.d.ts.map +0 -1
  239. package/dist/src/components/variants/minimal/components/EnhancedSettingsMenu.js +0 -68
  240. package/dist/src/components/variants/minimal/components/PlaybackControls.d.ts.map +0 -1
  241. package/dist/src/components/variants/minimal/components/PlaybackControls.js +0 -9
  242. package/dist/src/components/variants/minimal/components/RightControls.d.ts.map +0 -1
  243. package/dist/src/components/variants/minimal/components/RightControls.js +0 -40
  244. package/dist/src/components/variants/minimal/components/SeekBar.d.ts.map +0 -1
  245. package/dist/src/components/variants/minimal/components/SeekBar.js +0 -43
  246. package/dist/src/components/variants/minimal/components/SettingsDropdown.d.ts.map +0 -1
  247. package/dist/src/components/variants/minimal/components/SettingsDropdown.js +0 -18
  248. package/dist/src/components/variants/minimal/components/SubtitleDisplay.d.ts.map +0 -1
  249. package/dist/src/components/variants/minimal/components/SubtitleDisplay.js +0 -6
  250. package/dist/src/components/variants/minimal/components/TimeDisplay.d.ts.map +0 -1
  251. package/dist/src/components/variants/minimal/components/TimeDisplay.js +0 -5
  252. package/dist/src/components/variants/minimal/components/VideoElement.d.ts.map +0 -1
  253. package/dist/src/components/variants/minimal/components/VideoElement.js +0 -4
  254. package/dist/src/components/variants/minimal/components/VolumeControl.d.ts.map +0 -1
  255. package/dist/src/components/variants/minimal/components/VolumeControl.js +0 -99
  256. package/dist/src/components/variants/minimal/index.d.ts.map +0 -1
  257. package/dist/src/components/variants/minimal/index.js +0 -8
  258. package/dist/src/components/video-player.d.ts.map +0 -1
  259. package/dist/src/components/video-player.js +0 -38
  260. package/dist/src/context/error-handling.d.ts.map +0 -1
  261. package/dist/src/context/error-handling.js +0 -300
  262. package/dist/src/context/media-context.d.ts.map +0 -1
  263. package/dist/src/context/media-context.js +0 -121
  264. package/dist/src/context/media-provider.d.ts.map +0 -1
  265. package/dist/src/context/media-provider.js +0 -164
  266. package/dist/src/context/media-store.d.ts.map +0 -1
  267. package/dist/src/context/media-store.js +0 -273
  268. package/dist/src/context/persistence.d.ts.map +0 -1
  269. package/dist/src/context/persistence.js +0 -356
  270. package/dist/src/core/events/event-system.d.ts.map +0 -1
  271. package/dist/src/core/events/event-system.js +0 -288
  272. package/dist/src/core/events/hooks.d.ts.map +0 -1
  273. package/dist/src/core/events/hooks.js +0 -198
  274. package/dist/src/core/events/index.d.ts.map +0 -1
  275. package/dist/src/core/events/index.js +0 -7
  276. package/dist/src/core/events/middleware.d.ts.map +0 -1
  277. package/dist/src/core/events/middleware.js +0 -219
  278. package/dist/src/core/index.d.ts.map +0 -1
  279. package/dist/src/core/index.js +0 -15
  280. package/dist/src/core/optimization/bundle-optimizer.d.ts.map +0 -1
  281. package/dist/src/core/optimization/bundle-optimizer.js +0 -217
  282. package/dist/src/core/performance/cicd.d.ts.map +0 -1
  283. package/dist/src/core/performance/cicd.js +0 -83
  284. package/dist/src/core/performance/index.d.ts.map +0 -1
  285. package/dist/src/core/performance/index.js +0 -14
  286. package/dist/src/core/performance/media-loading-optimizer.d.ts.map +0 -1
  287. package/dist/src/core/performance/media-loading-optimizer.js +0 -404
  288. package/dist/src/core/performance/performance-budgets.d.ts.map +0 -1
  289. package/dist/src/core/performance/performance-budgets.js +0 -326
  290. package/dist/src/core/performance/performance-monitor.d.ts.map +0 -1
  291. package/dist/src/core/performance/performance-monitor.js +0 -297
  292. package/dist/src/core/performance/performance-testing.d.ts.map +0 -1
  293. package/dist/src/core/performance/performance-testing.js +0 -314
  294. package/dist/src/core/plugins/base-plugin.d.ts.map +0 -1
  295. package/dist/src/core/plugins/base-plugin.js +0 -151
  296. package/dist/src/core/plugins/enhanced-plugin-system.d.ts.map +0 -1
  297. package/dist/src/core/plugins/enhanced-plugin-system.js +0 -305
  298. package/dist/src/core/plugins/examples/analytics-plugin.d.ts.map +0 -1
  299. package/dist/src/core/plugins/examples/analytics-plugin.js +0 -191
  300. package/dist/src/core/plugins/index.d.ts.map +0 -1
  301. package/dist/src/core/plugins/index.js +0 -9
  302. package/dist/src/core/plugins/registry.d.ts.map +0 -1
  303. package/dist/src/core/plugins/registry.js +0 -261
  304. package/dist/src/core/plugins/types.d.ts.map +0 -1
  305. package/dist/src/core/plugins/types.js +0 -31
  306. package/dist/src/core/plugins/utils.d.ts.map +0 -1
  307. package/dist/src/core/plugins/utils.js +0 -274
  308. package/dist/src/core/progressive-loading.d.ts.map +0 -1
  309. package/dist/src/core/progressive-loading.js +0 -239
  310. package/dist/src/core/providers/enhanced-hls-provider.d.ts.map +0 -1
  311. package/dist/src/core/providers/enhanced-hls-provider.js +0 -273
  312. package/dist/src/core/providers/service-provider.d.ts.map +0 -1
  313. package/dist/src/core/providers/service-provider.js +0 -105
  314. package/dist/src/core/utils.d.ts.map +0 -1
  315. package/dist/src/core/utils.js +0 -21
  316. package/dist/src/features/media-session/media-session-manager.d.ts.map +0 -1
  317. package/dist/src/features/media-session/media-session-manager.js +0 -331
  318. package/dist/src/features/picture-in-picture/pip-manager.d.ts.map +0 -1
  319. package/dist/src/features/picture-in-picture/pip-manager.js +0 -353
  320. package/dist/src/features/playlist/playlist-manager.d.ts.map +0 -1
  321. package/dist/src/features/playlist/playlist-manager.js +0 -475
  322. package/dist/src/features/subtitles/subtitle-manager.d.ts.map +0 -1
  323. package/dist/src/features/subtitles/subtitle-manager.js +0 -335
  324. package/dist/src/features/subtitles/subtitle-parser.d.ts.map +0 -1
  325. package/dist/src/features/subtitles/subtitle-parser.js +0 -217
  326. package/dist/src/features/thumbnails/thumbnail-generator.d.ts.map +0 -1
  327. package/dist/src/features/thumbnails/thumbnail-generator.js +0 -388
  328. package/dist/src/hooks/accessibility/index.d.ts.map +0 -1
  329. package/dist/src/hooks/accessibility/index.js +0 -4
  330. package/dist/src/hooks/accessibility/use-accessibility-preferences.d.ts.map +0 -1
  331. package/dist/src/hooks/accessibility/use-accessibility-preferences.js +0 -156
  332. package/dist/src/hooks/accessibility/use-focus-management.d.ts.map +0 -1
  333. package/dist/src/hooks/accessibility/use-focus-management.js +0 -142
  334. package/dist/src/hooks/accessibility/use-keyboard-shortcuts.d.ts.map +0 -1
  335. package/dist/src/hooks/accessibility/use-keyboard-shortcuts.js +0 -101
  336. package/dist/src/hooks/accessibility/use-screen-reader.d.ts.map +0 -1
  337. package/dist/src/hooks/accessibility/use-screen-reader.js +0 -148
  338. package/dist/src/hooks/core/index.d.ts.map +0 -1
  339. package/dist/src/hooks/core/index.js +0 -19
  340. package/dist/src/hooks/legacy.d.ts.map +0 -1
  341. package/dist/src/hooks/legacy.js +0 -17
  342. package/dist/src/hooks/use-enhanced-media-player.d.ts.map +0 -1
  343. package/dist/src/hooks/use-enhanced-media-player.js +0 -395
  344. package/dist/src/hooks/use-intelligent-preloading.d.ts.map +0 -1
  345. package/dist/src/hooks/use-intelligent-preloading.js +0 -258
  346. package/dist/src/hooks/use-keyboard-controls.d.ts.map +0 -1
  347. package/dist/src/hooks/use-keyboard-controls.js +0 -83
  348. package/dist/src/hooks/use-media-actions.d.ts.map +0 -1
  349. package/dist/src/hooks/use-media-actions.js +0 -121
  350. package/dist/src/hooks/use-media-metadata.d.ts.map +0 -1
  351. package/dist/src/hooks/use-media-metadata.js +0 -74
  352. package/dist/src/hooks/use-media-optimistic.d.ts.map +0 -1
  353. package/dist/src/hooks/use-media-optimistic.js +0 -205
  354. package/dist/src/hooks/use-media-player.d.ts.map +0 -1
  355. package/dist/src/hooks/use-media-player.js +0 -251
  356. package/dist/src/hooks/use-media-state.d.ts.map +0 -1
  357. package/dist/src/hooks/use-media-state.js +0 -162
  358. package/dist/src/hooks/use-memory-optimization.d.ts.map +0 -1
  359. package/dist/src/hooks/use-memory-optimization.js +0 -288
  360. package/dist/src/hooks/use-optimistic-controls.d.ts.map +0 -1
  361. package/dist/src/hooks/use-optimistic-controls.js +0 -60
  362. package/dist/src/hooks/use-optimized-media.d.ts.map +0 -1
  363. package/dist/src/hooks/use-optimized-media.js +0 -211
  364. package/dist/src/hooks/use-touch-gestures.d.ts.map +0 -1
  365. package/dist/src/hooks/use-touch-gestures.js +0 -289
  366. package/dist/src/hooks/useEnhancedSubtitles.d.ts.map +0 -1
  367. package/dist/src/hooks/useEnhancedSubtitles.js +0 -205
  368. package/dist/src/hooks/useKeyboardShortcuts.d.ts.map +0 -1
  369. package/dist/src/hooks/useKeyboardShortcuts.js +0 -59
  370. package/dist/src/hooks/useMediaControls.d.ts.map +0 -1
  371. package/dist/src/hooks/useMediaControls.js +0 -44
  372. package/dist/src/hooks/useScreenshot.d.ts.map +0 -1
  373. package/dist/src/hooks/useScreenshot.js +0 -56
  374. package/dist/src/hooks/useSubtitles.d.ts.map +0 -1
  375. package/dist/src/hooks/useSubtitles.js +0 -73
  376. package/dist/src/hooks/useVideoPlayer.d.ts.map +0 -1
  377. package/dist/src/hooks/useVideoPlayer.js +0 -184
  378. package/dist/src/icons/components/FullscreenIcon.d.ts.map +0 -1
  379. package/dist/src/icons/components/FullscreenIcon.js +0 -11
  380. package/dist/src/icons/components/SettingsIcon.d.ts.map +0 -1
  381. package/dist/src/icons/components/SettingsIcon.js +0 -11
  382. package/dist/src/icons/components/animated/LoadingIcon.d.ts.map +0 -1
  383. package/dist/src/icons/components/animated/LoadingIcon.js +0 -11
  384. package/dist/src/icons/components/animated/PlayPauseIcon.d.ts.map +0 -1
  385. package/dist/src/icons/components/animated/PlayPauseIcon.js +0 -9
  386. package/dist/src/icons/components/media/PauseIcon.d.ts.map +0 -1
  387. package/dist/src/icons/components/media/PauseIcon.js +0 -12
  388. package/dist/src/icons/components/media/PlayIcon.d.ts.map +0 -1
  389. package/dist/src/icons/components/media/PlayIcon.js +0 -12
  390. package/dist/src/icons/components/volume/VolumeIcon.d.ts.map +0 -1
  391. package/dist/src/icons/components/volume/VolumeIcon.js +0 -11
  392. package/dist/src/icons/components/volume/VolumeOffIcon.d.ts.map +0 -1
  393. package/dist/src/icons/components/volume/VolumeOffIcon.js +0 -11
  394. package/dist/src/icons/index.d.ts.map +0 -1
  395. package/dist/src/icons/index.js +0 -45
  396. package/dist/src/icons/provider.d.ts.map +0 -1
  397. package/dist/src/icons/provider.js +0 -37
  398. package/dist/src/icons/types.d.ts.map +0 -1
  399. package/dist/src/icons/types.js +0 -1
  400. package/dist/src/index-enhanced.d.ts.map +0 -1
  401. package/dist/src/index-enhanced.js +0 -16
  402. package/dist/src/index-legacy.d.ts.map +0 -1
  403. package/dist/src/index-legacy.js +0 -97
  404. package/dist/src/index.d.ts.map +0 -1
  405. package/dist/src/index.js +0 -90
  406. package/dist/src/index.minimal.d.ts.map +0 -1
  407. package/dist/src/index.minimal.js +0 -3
  408. package/dist/src/lib/deprecation.d.ts.map +0 -1
  409. package/dist/src/lib/deprecation.js +0 -31
  410. package/dist/src/lib/format-time.d.ts.map +0 -1
  411. package/dist/src/lib/format-time.js +0 -32
  412. package/dist/src/lib/index.d.ts.map +0 -1
  413. package/dist/src/lib/index.js +0 -3
  414. package/dist/src/lib/utils.d.ts.map +0 -1
  415. package/dist/src/lib/utils.js +0 -5
  416. package/dist/src/test/setup.d.ts.map +0 -1
  417. package/dist/src/test/setup.js +0 -65
  418. package/dist/src/types/events.d.ts.map +0 -1
  419. package/dist/src/types/events.js +0 -2
  420. package/dist/src/types/formats.d.ts.map +0 -1
  421. package/dist/src/types/formats.js +0 -63
  422. package/dist/src/types/index.d.ts.map +0 -1
  423. package/dist/src/types/index.js +0 -4
  424. package/dist/utils-Db13763z.cjs +0 -9
  425. package/dist/utils-Db13763z.cjs.map +0 -1
  426. package/dist/utils-nTO4AnHo.js +0 -2809
  427. package/dist/utils-nTO4AnHo.js.map +0 -1
  428. package/dist/utils.js +0 -2
  429. package/dist/utils.js.map +0 -1
  430. package/dist/utils.mjs +0 -7
  431. package/dist/utils.mjs.map +0 -1
  432. package/src/adapters/videojs-adapter.js +0 -350
  433. package/src/components/AnimateLoading.js +0 -41
  434. package/src/components/LoadingState.js +0 -111
  435. package/src/components/accessibility/keyboard-help-overlay.js +0 -90
  436. package/src/components/audio-player.js +0 -31
  437. package/src/components/basic/index.js +0 -29
  438. package/src/components/enhanced/advanced-features.js +0 -64
  439. package/src/components/enhanced/debug-panel.js +0 -94
  440. package/src/components/enhanced/enhanced-controls.js +0 -233
  441. package/src/components/enhanced/enhanced-media-player.js +0 -316
  442. package/src/components/enhanced/error-handling.js +0 -153
  443. package/src/components/enhanced/index.js +0 -10
  444. package/src/components/enhanced/media-player-enhanced.js +0 -250
  445. package/src/components/examples/basic-video-player.js +0 -16
  446. package/src/components/examples/custom-controls-example.js +0 -12
  447. package/src/components/examples/enhanced-controls-example.js +0 -18
  448. package/src/components/examples/enhanced-media-player-example.js +0 -13
  449. package/src/components/examples/loading-states-demo.js +0 -41
  450. package/src/components/examples/react-19-demo.js +0 -104
  451. package/src/components/examples/volume-orientation-demo.js +0 -31
  452. package/src/components/icon-demo.js +0 -16
  453. package/src/components/icons/index.js +0 -59
  454. package/src/components/icons/svg-icons/ArrowLeftIcon.js +0 -3
  455. package/src/components/icons/svg-icons/ArrowRightIcon.js +0 -3
  456. package/src/components/icons/svg-icons/AudioIcon.js +0 -4
  457. package/src/components/icons/svg-icons/BackwardIcon.js +0 -3
  458. package/src/components/icons/svg-icons/CameraIcon.js +0 -4
  459. package/src/components/icons/svg-icons/CheckIcon.js +0 -4
  460. package/src/components/icons/svg-icons/EnablePiPIcon.js +0 -5
  461. package/src/components/icons/svg-icons/ForwardIcon.js +0 -3
  462. package/src/components/icons/svg-icons/FullscreenEnterIcon.js +0 -3
  463. package/src/components/icons/svg-icons/FullscreenExitIcon.js +0 -3
  464. package/src/components/icons/svg-icons/LoadingIcon.js +0 -3
  465. package/src/components/icons/svg-icons/PauseIcon.js +0 -3
  466. package/src/components/icons/svg-icons/PlayIcon.js +0 -3
  467. package/src/components/icons/svg-icons/PlaybackSpeedIcon.js +0 -3
  468. package/src/components/icons/svg-icons/QualityIcon.js +0 -3
  469. package/src/components/icons/svg-icons/SettingsIcon.js +0 -3
  470. package/src/components/icons/svg-icons/SliderIcon.js +0 -3
  471. package/src/components/icons/svg-icons/SubtitleIcon.js +0 -3
  472. package/src/components/icons/svg-icons/SubtitleOffIcon.js +0 -3
  473. package/src/components/icons/svg-icons/UnPiPIcon.js +0 -5
  474. package/src/components/icons/svg-icons/VolumeMutedIcon.js +0 -3
  475. package/src/components/icons/svg-icons/VolumeOneIcon.js +0 -3
  476. package/src/components/icons/svg-icons/VolumeThreeIcon.js +0 -3
  477. package/src/components/icons/svg-icons/VolumeTwoIcon.js +0 -3
  478. package/src/components/legacy.js +0 -52
  479. package/src/components/media-metadata-display.js +0 -20
  480. package/src/components/media-player-audio.js +0 -18
  481. package/src/components/media-player-controls.js +0 -150
  482. package/src/components/media-player-error.js +0 -85
  483. package/src/components/media-player-fullscreen.js +0 -68
  484. package/src/components/media-player-hls.js +0 -20
  485. package/src/components/media-player-loading.js +0 -53
  486. package/src/components/media-player-play.js +0 -44
  487. package/src/components/media-player-root.js +0 -243
  488. package/src/components/media-player-seek.js +0 -92
  489. package/src/components/media-player-time.js +0 -57
  490. package/src/components/media-player-tooltip.js +0 -14
  491. package/src/components/media-player-video.js +0 -18
  492. package/src/components/media-player-volume.js +0 -88
  493. package/src/components/media-player.js +0 -67
  494. package/src/components/media-suspense.js +0 -173
  495. package/src/components/player-settings-form.js +0 -46
  496. package/src/components/react-player-wrapper.js +0 -163
  497. package/src/components/simple-video-player.js +0 -41
  498. package/src/components/ui/enhanced-seek-bar.js +0 -112
  499. package/src/components/ui/fullscreen-button.js +0 -21
  500. package/src/components/ui/media-resource-preloader.js +0 -295
  501. package/src/components/ui/play-button.js +0 -26
  502. package/src/components/ui/seek-bar.js +0 -54
  503. package/src/components/ui/time-display.js +0 -18
  504. package/src/components/ui/volume-control.js +0 -71
  505. package/src/components/unified/base-media-player.js +0 -104
  506. package/src/components/unified/media-player.js +0 -41
  507. package/src/components/variants/minimal/AccessibleMinimalPlayer.js +0 -322
  508. package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.js +0 -280
  509. package/src/components/variants/minimal/MinimalControls.js +0 -19
  510. package/src/components/variants/minimal/MinimalLoading.js +0 -6
  511. package/src/components/variants/minimal/MinimalMediaPlayer.js +0 -135
  512. package/src/components/variants/minimal/MinimalOverlay.js +0 -15
  513. package/src/components/variants/minimal/MinimalPlayButton.js +0 -29
  514. package/src/components/variants/minimal/MinimalSeekBar.js +0 -73
  515. package/src/components/variants/minimal/MinimalVolumeControl.js +0 -29
  516. package/src/components/variants/minimal/SimpleMinimalPlayer.js +0 -51
  517. package/src/components/variants/minimal/components/CenterPlayButton.js +0 -8
  518. package/src/components/variants/minimal/components/ControlBar.js +0 -10
  519. package/src/components/variants/minimal/components/EnhancedSettingsMenu.js +0 -68
  520. package/src/components/variants/minimal/components/PlaybackControls.js +0 -9
  521. package/src/components/variants/minimal/components/RightControls.js +0 -40
  522. package/src/components/variants/minimal/components/SeekBar.js +0 -43
  523. package/src/components/variants/minimal/components/SettingsDropdown.js +0 -18
  524. package/src/components/variants/minimal/components/SubtitleDisplay.js +0 -6
  525. package/src/components/variants/minimal/components/TimeDisplay.js +0 -5
  526. package/src/components/variants/minimal/components/VideoElement.js +0 -4
  527. package/src/components/variants/minimal/components/VolumeControl.js +0 -99
  528. package/src/components/variants/minimal/index.js +0 -8
  529. package/src/components/video-player.js +0 -38
  530. package/src/context/error-handling.js +0 -300
  531. package/src/context/media-context.js +0 -121
  532. package/src/context/media-provider.js +0 -164
  533. package/src/context/media-store.js +0 -273
  534. package/src/context/persistence.js +0 -356
  535. package/src/core/events/event-system.js +0 -288
  536. package/src/core/events/hooks.js +0 -198
  537. package/src/core/events/index.js +0 -7
  538. package/src/core/events/middleware.js +0 -219
  539. package/src/core/index.js +0 -15
  540. package/src/core/optimization/bundle-optimizer.js +0 -217
  541. package/src/core/performance/cicd.js +0 -83
  542. package/src/core/performance/index.js +0 -14
  543. package/src/core/performance/media-loading-optimizer.js +0 -404
  544. package/src/core/performance/performance-budgets.js +0 -326
  545. package/src/core/performance/performance-monitor.js +0 -297
  546. package/src/core/performance/performance-testing.js +0 -314
  547. package/src/core/plugins/base-plugin.js +0 -151
  548. package/src/core/plugins/enhanced-plugin-system.js +0 -305
  549. package/src/core/plugins/examples/analytics-plugin.js +0 -191
  550. package/src/core/plugins/index.js +0 -9
  551. package/src/core/plugins/registry.js +0 -261
  552. package/src/core/plugins/types.js +0 -31
  553. package/src/core/plugins/utils.js +0 -274
  554. package/src/core/progressive-loading.js +0 -239
  555. package/src/core/providers/enhanced-hls-provider.js +0 -273
  556. package/src/core/providers/service-provider.js +0 -105
  557. package/src/core/utils.js +0 -21
  558. package/src/features/media-session/media-session-manager.js +0 -331
  559. package/src/features/picture-in-picture/pip-manager.js +0 -353
  560. package/src/features/playlist/playlist-manager.js +0 -475
  561. package/src/features/subtitles/subtitle-manager.js +0 -335
  562. package/src/features/subtitles/subtitle-parser.js +0 -217
  563. package/src/features/thumbnails/thumbnail-generator.js +0 -388
  564. package/src/hooks/accessibility/index.js +0 -4
  565. package/src/hooks/accessibility/use-accessibility-preferences.js +0 -156
  566. package/src/hooks/accessibility/use-focus-management.js +0 -142
  567. package/src/hooks/accessibility/use-keyboard-shortcuts.js +0 -101
  568. package/src/hooks/accessibility/use-screen-reader.js +0 -148
  569. package/src/hooks/core/index.js +0 -19
  570. package/src/hooks/legacy.js +0 -17
  571. package/src/hooks/use-enhanced-media-player.js +0 -395
  572. package/src/hooks/use-intelligent-preloading.js +0 -258
  573. package/src/hooks/use-keyboard-controls.js +0 -83
  574. package/src/hooks/use-media-actions.js +0 -121
  575. package/src/hooks/use-media-metadata.js +0 -74
  576. package/src/hooks/use-media-optimistic.js +0 -205
  577. package/src/hooks/use-media-player.js +0 -251
  578. package/src/hooks/use-media-state.js +0 -162
  579. package/src/hooks/use-memory-optimization.js +0 -288
  580. package/src/hooks/use-optimistic-controls.js +0 -60
  581. package/src/hooks/use-optimized-media.js +0 -211
  582. package/src/hooks/use-touch-gestures.js +0 -289
  583. package/src/hooks/useEnhancedSubtitles.js +0 -205
  584. package/src/hooks/useKeyboardShortcuts.js +0 -59
  585. package/src/hooks/useMediaControls.js +0 -44
  586. package/src/hooks/useScreenshot.js +0 -56
  587. package/src/hooks/useSubtitles.js +0 -73
  588. package/src/hooks/useVideoPlayer.js +0 -184
  589. package/src/icons/components/FullscreenIcon.js +0 -11
  590. package/src/icons/components/SettingsIcon.js +0 -11
  591. package/src/icons/components/animated/LoadingIcon.js +0 -11
  592. package/src/icons/components/animated/PlayPauseIcon.js +0 -9
  593. package/src/icons/components/media/PauseIcon.js +0 -12
  594. package/src/icons/components/media/PlayIcon.js +0 -12
  595. package/src/icons/components/volume/VolumeIcon.js +0 -11
  596. package/src/icons/components/volume/VolumeOffIcon.js +0 -11
  597. package/src/icons/index.js +0 -45
  598. package/src/icons/provider.js +0 -37
  599. package/src/icons/types.js +0 -1
  600. package/src/index-enhanced.js +0 -16
  601. package/src/index-legacy.js +0 -97
  602. package/src/index.js +0 -90
  603. package/src/index.minimal.js +0 -3
  604. package/src/lib/deprecation.js +0 -31
  605. package/src/lib/format-time.js +0 -32
  606. package/src/lib/index.js +0 -3
  607. package/src/lib/utils.js +0 -5
  608. package/src/test/setup.js +0 -65
  609. package/src/types/events.js +0 -2
  610. package/src/types/formats.js +0 -63
  611. package/src/types/index.js +0 -4
package/dist/core.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.mjs","sources":["../src/core/performance/performance-testing.ts","../src/core/performance/performance-budgets.ts","../src/core/performance/media-loading-optimizer.ts","../src/core/providers/service-provider.tsx","../src/core/utils.tsx","../src/core/progressive-loading.tsx","../src/core/index.ts"],"sourcesContent":["import { performanceMonitor, PerformanceRegressionDetector } from './performance-monitor';\nimport type { PerformanceMetrics } from './performance-monitor';\n\n// Performance test configuration\nexport interface PerformanceTestConfig {\n name: string;\n iterations: number;\n warmupIterations: number;\n timeout: number;\n expectedThreshold: {\n renderTime: number;\n memoryUsage: number;\n };\n}\n\n// Performance test result\nexport interface PerformanceTestResult {\n testName: string;\n passed: boolean;\n metrics: {\n averageRenderTime: number;\n minRenderTime: number;\n maxRenderTime: number;\n memoryUsage: number;\n iterations: number;\n };\n threshold: PerformanceTestConfig['expectedThreshold'];\n error?: string;\n}\n\n// Performance benchmark suite\nexport class PerformanceBenchmark {\n private results: PerformanceTestResult[] = [];\n private regressionDetector = new PerformanceRegressionDetector();\n\n async runTest(\n config: PerformanceTestConfig,\n testFunction: () => any | Promise<any>\n ): Promise<PerformanceTestResult> {\n const renderTimes: number[] = [];\n let memoryBefore = 0;\n let memoryAfter = 0;\n let error: string | undefined;\n\n try {\n // Warmup iterations\n for (let i = 0; i < config.warmupIterations; i++) {\n await testFunction();\n }\n\n // Force garbage collection if available\n if (global.gc) {\n global.gc();\n }\n\n memoryBefore = this.getMemoryUsage();\n\n // Main test iterations\n for (let i = 0; i < config.iterations; i++) {\n const startTime = performance.now();\n await testFunction();\n const endTime = performance.now();\n renderTimes.push(endTime - startTime);\n }\n\n memoryAfter = this.getMemoryUsage();\n\n } catch (err) {\n error = err instanceof Error ? err.message : String(err);\n }\n\n const averageRenderTime = renderTimes.reduce((sum, time) => sum + time, 0) / renderTimes.length;\n const minRenderTime = Math.min(...renderTimes);\n const maxRenderTime = Math.max(...renderTimes);\n const memoryUsage = memoryAfter - memoryBefore;\n\n const passed = !error && \n averageRenderTime <= config.expectedThreshold.renderTime &&\n memoryUsage <= config.expectedThreshold.memoryUsage;\n\n const result: PerformanceTestResult = {\n testName: config.name,\n passed,\n metrics: {\n averageRenderTime,\n minRenderTime: isFinite(minRenderTime) ? minRenderTime : 0,\n maxRenderTime: isFinite(maxRenderTime) ? maxRenderTime : 0,\n memoryUsage,\n iterations: config.iterations\n },\n threshold: config.expectedThreshold,\n error\n };\n\n this.results.push(result);\n return result;\n }\n\n private getMemoryUsage(): number {\n if ('memory' in performance) {\n return (performance as any).memory.usedJSHeapSize || 0;\n }\n return 0;\n }\n\n // Component rendering performance test\n async testComponentRender(\n componentName: string,\n renderFunction: () => any,\n expectedRenderTime = 16 // 60fps target\n ): Promise<PerformanceTestResult> {\n const config: PerformanceTestConfig = {\n name: `${componentName} Render Performance`,\n iterations: 100,\n warmupIterations: 10,\n timeout: 5000,\n expectedThreshold: {\n renderTime: expectedRenderTime,\n memoryUsage: 1024 * 1024 // 1MB\n }\n };\n\n return this.runTest(config, renderFunction);\n }\n\n // Bundle loading performance test\n async testBundleLoading(\n bundlePath: string,\n expectedLoadTime = 1000 // 1 second\n ): Promise<PerformanceTestResult> {\n const config: PerformanceTestConfig = {\n name: `Bundle Loading: ${bundlePath}`,\n iterations: 5,\n warmupIterations: 1,\n timeout: 10000,\n expectedThreshold: {\n renderTime: expectedLoadTime,\n memoryUsage: 5 * 1024 * 1024 // 5MB\n }\n };\n\n return this.runTest(config, async () => {\n // Simulate bundle loading\n const startTime = performance.now();\n try {\n // Use fetch instead of dynamic import to avoid bundler issues\n const response = await fetch(bundlePath);\n if (!response.ok) {\n throw new Error(`Failed to load bundle: ${response.status}`);\n }\n await response.blob(); // Consume the response\n } catch (error) {\n console.warn(`Bundle loading test failed for ${bundlePath}:`, error);\n // Return a mock time for testing purposes\n }\n const endTime = performance.now();\n return endTime - startTime;\n });\n }\n\n // Memory leak detection test\n async testMemoryLeaks(\n testFunction: () => any,\n iterations = 1000\n ): Promise<PerformanceTestResult> {\n const config: PerformanceTestConfig = {\n name: 'Memory Leak Detection',\n iterations,\n warmupIterations: 100,\n timeout: 30000,\n expectedThreshold: {\n renderTime: Infinity, // Not testing render time\n memoryUsage: 10 * 1024 * 1024 // 10MB max increase\n }\n };\n\n const memoryBefore = this.getMemoryUsage();\n \n const result = await this.runTest(config, testFunction);\n \n const memoryAfter = this.getMemoryUsage();\n const memoryIncrease = memoryAfter - memoryBefore;\n \n // Check for memory leaks (memory should not increase significantly)\n const hasMemoryLeak = memoryIncrease > config.expectedThreshold.memoryUsage;\n \n return {\n ...result,\n passed: result.passed && !hasMemoryLeak,\n error: hasMemoryLeak ? `Potential memory leak detected: ${Math.round(memoryIncrease / 1024 / 1024)}MB increase` : result.error\n };\n }\n\n // Interaction delay test\n async testInteractionDelay(\n interactionFunction: () => any,\n expectedDelay = 100 // 100ms\n ): Promise<PerformanceTestResult> {\n const config: PerformanceTestConfig = {\n name: 'Interaction Delay',\n iterations: 50,\n warmupIterations: 5,\n timeout: 5000,\n expectedThreshold: {\n renderTime: expectedDelay,\n memoryUsage: 1024 * 1024 // 1MB\n }\n };\n\n return this.runTest(config, interactionFunction);\n }\n\n // Regression testing\n async runRegressionTests(\n currentMetrics: PerformanceMetrics,\n baselineMetrics?: PerformanceMetrics\n ): Promise<{\n passed: boolean;\n regressions: ReturnType<PerformanceRegressionDetector['detectRegression']>;\n }> {\n if (baselineMetrics) {\n this.regressionDetector.setBaseline(baselineMetrics);\n }\n\n const regressions = this.regressionDetector.detectRegression(currentMetrics);\n const passed = regressions.length === 0;\n\n return { passed, regressions };\n }\n\n // Get all test results\n getResults(): PerformanceTestResult[] {\n return [...this.results];\n }\n\n // Get test summary\n getSummary(): {\n totalTests: number;\n passedTests: number;\n failedTests: number;\n passRate: number;\n } {\n const totalTests = this.results.length;\n const passedTests = this.results.filter(result => result.passed).length;\n const failedTests = totalTests - passedTests;\n const passRate = totalTests > 0 ? (passedTests / totalTests) * 100 : 0;\n\n return { totalTests, passedTests, failedTests, passRate };\n }\n\n // Clear test results\n clearResults(): void {\n this.results = [];\n }\n\n // Generate performance report\n generateReport(): string {\n const summary = this.getSummary();\n let report = `Performance Test Report\\n`;\n report += `========================\\n\\n`;\n report += `Total Tests: ${summary.totalTests}\\n`;\n report += `Passed: ${summary.passedTests}\\n`;\n report += `Failed: ${summary.failedTests}\\n`;\n report += `Pass Rate: ${summary.passRate.toFixed(1)}%\\n\\n`;\n\n if (this.results.length > 0) {\n report += `Detailed Results:\\n`;\n report += `-----------------\\n\\n`;\n\n this.results.forEach((result, index) => {\n report += `${index + 1}. ${result.testName}\\n`;\n report += ` Status: ${result.passed ? 'PASS' : 'FAIL'}\\n`;\n report += ` Average Render Time: ${result.metrics.averageRenderTime.toFixed(2)}ms\\n`;\n report += ` Min/Max Render Time: ${result.metrics.minRenderTime.toFixed(2)}ms / ${result.metrics.maxRenderTime.toFixed(2)}ms\\n`;\n report += ` Memory Usage: ${Math.round(result.metrics.memoryUsage / 1024)} KB\\n`;\n report += ` Iterations: ${result.metrics.iterations}\\n`;\n \n if (result.error) {\n report += ` Error: ${result.error}\\n`;\n }\n \n report += `\\n`;\n });\n }\n\n return report;\n }\n}\n\n// Global performance benchmark instance\nexport const performanceBenchmark = new PerformanceBenchmark();\n\n// Utility functions for common performance tests\nexport const performanceTestUtils = {\n // Test component rendering performance\n async testComponent(\n Component: any,\n props: any = {},\n expectedRenderTime = 16\n ): Promise<PerformanceTestResult> {\n return performanceBenchmark.testComponentRender(\n Component.displayName || Component.name || 'Component',\n () => {\n // This would need React Testing Library in a real test environment\n // For now, we'll simulate component rendering\n return { type: Component, props }; // Mock element\n },\n expectedRenderTime\n );\n },\n\n // Test hook performance\n async testHook(\n hookFunction: () => any,\n hookName: string,\n expectedExecutionTime = 1\n ): Promise<PerformanceTestResult> {\n const config: PerformanceTestConfig = {\n name: `Hook Performance: ${hookName}`,\n iterations: 1000,\n warmupIterations: 100,\n timeout: 5000,\n expectedThreshold: {\n renderTime: expectedExecutionTime,\n memoryUsage: 1024 * 1024 // 1MB\n }\n };\n\n return performanceBenchmark.runTest(config, hookFunction);\n },\n\n // Test async operation performance\n async testAsyncOperation(\n operation: () => Promise<any>,\n operationName: string,\n expectedTime = 1000\n ): Promise<PerformanceTestResult> {\n const config: PerformanceTestConfig = {\n name: `Async Operation: ${operationName}`,\n iterations: 10,\n warmupIterations: 2,\n timeout: 30000,\n expectedThreshold: {\n renderTime: expectedTime,\n memoryUsage: 2 * 1024 * 1024 // 2MB\n }\n };\n\n return performanceBenchmark.runTest(config, operation);\n },\n\n // Test bundle size impact\n async measureBundleImpact(\n beforeFunction: () => void,\n afterFunction: () => void,\n featureName: string\n ): Promise<{\n bundleIncrease: number;\n memoryIncrease: number;\n renderTimeImpact: number;\n }> {\n const beforeMemory = (performance as any).memory?.usedJSHeapSize || 0;\n const beforeTime = performance.now();\n \n beforeFunction();\n \n const midMemory = (performance as any).memory?.usedJSHeapSize || 0;\n const midTime = performance.now();\n \n afterFunction();\n \n const afterMemory = (performance as any).memory?.usedJSHeapSize || 0;\n const afterTime = performance.now();\n\n return {\n bundleIncrease: afterMemory - beforeMemory,\n memoryIncrease: midMemory - beforeMemory,\n renderTimeImpact: (afterTime - midTime) - (midTime - beforeTime)\n };\n }\n};\n\n// Performance testing framework\nexport class PerformanceTestFramework {\n private benchmark = new PerformanceBenchmark();\n private suites: Map<string, PerformanceTestConfig[]> = new Map();\n\n // Register a test suite\n registerSuite(suiteName: string, tests: PerformanceTestConfig[]) {\n this.suites.set(suiteName, tests);\n }\n\n // Run all tests in a suite\n async runSuite(\n suiteName: string,\n testImplementations: Map<string, () => any>\n ): Promise<PerformanceTestResult[]> {\n const tests = this.suites.get(suiteName);\n if (!tests) {\n throw new Error(`Test suite '${suiteName}' not found`);\n }\n\n const results: PerformanceTestResult[] = [];\n\n for (const test of tests) {\n const implementation = testImplementations.get(test.name);\n if (!implementation) {\n console.warn(`No implementation found for test '${test.name}'`);\n continue;\n }\n\n const result = await this.benchmark.runTest(test, implementation);\n results.push(result);\n }\n\n return results;\n }\n\n // Run all registered test suites\n async runAllSuites(\n implementations: Map<string, Map<string, () => any>>\n ): Promise<Map<string, PerformanceTestResult[]>> {\n const allResults = new Map<string, PerformanceTestResult[]>();\n\n for (const [suiteName] of this.suites) {\n const suiteImplementations = implementations.get(suiteName);\n if (!suiteImplementations) {\n console.warn(`No implementations found for suite '${suiteName}'`);\n continue;\n }\n\n const results = await this.runSuite(suiteName, suiteImplementations);\n allResults.set(suiteName, results);\n }\n\n return allResults;\n }\n\n // Generate comprehensive report\n generateComprehensiveReport(): string {\n const summary = this.benchmark.getSummary();\n let report = this.benchmark.generateReport();\n\n // Add suite breakdown if available\n if (this.suites.size > 0) {\n report += `\\nTest Suites:\\n`;\n report += `============\\n\\n`;\n\n for (const [suiteName, tests] of this.suites) {\n report += `Suite: ${suiteName}\\n`;\n report += `Tests: ${tests.length}\\n\\n`;\n }\n }\n\n return report;\n }\n}\n\nexport const performanceTestFramework = new PerformanceTestFramework();","// Performance budget configuration\nexport interface PerformanceBudget {\n name: string;\n category: 'bundle' | 'runtime' | 'network' | 'memory';\n limit: number;\n unit: 'bytes' | 'ms' | 'score' | 'percent';\n severity: 'error' | 'warning' | 'info';\n description: string;\n}\n\n// Performance budget violation\nexport interface BudgetViolation {\n budget: PerformanceBudget;\n actualValue: number;\n overageAmount: number;\n overagePercentage: number;\n timestamp: number;\n}\n\n// Alert configuration\nexport interface AlertConfig {\n enabled: boolean;\n channels: AlertChannel[];\n threshold: number; // Number of violations before alerting\n cooldown: number; // Minimum time between alerts (ms)\n}\n\nexport interface AlertChannel {\n type: 'console' | 'webhook' | 'email' | 'slack';\n config: {\n url?: string;\n email?: string;\n token?: string;\n channel?: string;\n };\n}\n\n// Default performance budgets for media player\nexport const defaultPerformanceBudgets: PerformanceBudget[] = [\n // Bundle size budgets\n {\n name: 'Main Bundle Size (ESM)',\n category: 'bundle',\n limit: 250 * 1024, // 250KB\n unit: 'bytes',\n severity: 'error',\n description: 'Main bundle should stay under 250KB for fast initial loading'\n },\n {\n name: 'Main Bundle Size (CJS)',\n category: 'bundle', \n limit: 200 * 1024, // 200KB\n unit: 'bytes',\n severity: 'error',\n description: 'CJS bundle should be smaller due to better compression'\n },\n {\n name: 'Core Module Size',\n category: 'bundle',\n limit: 15 * 1024, // 15KB\n unit: 'bytes',\n severity: 'warning',\n description: 'Core architecture should remain lightweight'\n },\n {\n name: 'Enhanced Components Size',\n category: 'bundle',\n limit: 40 * 1024, // 40KB\n unit: 'bytes',\n severity: 'warning',\n description: 'Enhanced components bundle size'\n },\n \n // Runtime performance budgets\n {\n name: 'Component Render Time',\n category: 'runtime',\n limit: 16, // 16ms for 60fps\n unit: 'ms',\n severity: 'error',\n description: 'Component rendering should complete within one frame'\n },\n {\n name: 'First Input Delay',\n category: 'runtime',\n limit: 100, // 100ms\n unit: 'ms',\n severity: 'error',\n description: 'First Input Delay should be under 100ms for good UX'\n },\n {\n name: 'Largest Contentful Paint',\n category: 'runtime',\n limit: 2500, // 2.5s\n unit: 'ms',\n severity: 'warning',\n description: 'LCP should be under 2.5s for good Core Web Vitals score'\n },\n {\n name: 'Cumulative Layout Shift',\n category: 'runtime',\n limit: 0.1,\n unit: 'score',\n severity: 'warning',\n description: 'CLS should be under 0.1 for good visual stability'\n },\n \n // Memory budgets\n {\n name: 'Memory Usage',\n category: 'memory',\n limit: 50 * 1024 * 1024, // 50MB\n unit: 'bytes',\n severity: 'warning',\n description: 'Memory usage should stay under 50MB for good performance'\n },\n {\n name: 'Memory Increase Per Operation',\n category: 'memory',\n limit: 1024 * 1024, // 1MB\n unit: 'bytes',\n severity: 'error',\n description: 'Each operation should not increase memory by more than 1MB'\n },\n \n // Network budgets (for media loading)\n {\n name: 'Media Load Time',\n category: 'network',\n limit: 3000, // 3s\n unit: 'ms',\n severity: 'warning',\n description: 'Media should start loading within 3 seconds'\n }\n];\n\n// Performance budget monitor\nexport class PerformanceBudgetMonitor {\n private budgets: Map<string, PerformanceBudget> = new Map();\n private violations: BudgetViolation[] = [];\n private alertConfig: AlertConfig;\n private lastAlertTime = 0;\n\n constructor(\n budgets: PerformanceBudget[] = defaultPerformanceBudgets,\n alertConfig: AlertConfig = {\n enabled: true,\n channels: [{ type: 'console', config: {} }],\n threshold: 1,\n cooldown: 5 * 60 * 1000 // 5 minutes\n }\n ) {\n budgets.forEach(budget => {\n this.budgets.set(budget.name, budget);\n });\n this.alertConfig = alertConfig;\n }\n\n // Check a single metric against budgets\n checkMetric(\n metricName: string,\n value: number,\n category: PerformanceBudget['category'] = 'runtime'\n ): BudgetViolation[] {\n const violations: BudgetViolation[] = [];\n \n for (const [name, budget] of this.budgets) {\n if (budget.category === category && \n (name.includes(metricName) || metricName.includes(name.split(' ')[0]?.toLowerCase() || ''))) {\n \n if (value > budget.limit) {\n const violation: BudgetViolation = {\n budget,\n actualValue: value,\n overageAmount: value - budget.limit,\n overagePercentage: ((value - budget.limit) / budget.limit) * 100,\n timestamp: Date.now()\n };\n \n violations.push(violation);\n this.violations.push(violation);\n }\n }\n }\n\n if (violations.length > 0) {\n this.handleViolations(violations);\n }\n\n return violations;\n }\n\n // Check bundle sizes\n async checkBundleSizes(distPath: string): Promise<BudgetViolation[]> {\n const violations: BudgetViolation[] = [];\n \n // Only check bundle sizes in Node.js environment\n if (typeof window !== 'undefined' || typeof process === 'undefined') {\n console.warn('Bundle size checking is only available in Node.js environment');\n return violations;\n }\n \n // Bundle size checking is disabled in browser environments\n console.warn('Bundle size checking disabled - use Node.js cicdIntegration from @rp/baroiplayer/core/performance/cicd for CI/CD environments');\n\n return violations;\n }\n\n // Check runtime performance\n checkRuntimeMetrics(metrics: {\n renderTime?: number;\n fid?: number;\n lcp?: number;\n cls?: number;\n memoryUsage?: number;\n mediaLoadTime?: number;\n }): BudgetViolation[] {\n const allViolations: BudgetViolation[] = [];\n\n if (metrics.renderTime !== undefined) {\n allViolations.push(...this.checkMetric('Component Render Time', metrics.renderTime, 'runtime'));\n }\n \n if (metrics.fid !== undefined) {\n allViolations.push(...this.checkMetric('First Input Delay', metrics.fid, 'runtime'));\n }\n \n if (metrics.lcp !== undefined) {\n allViolations.push(...this.checkMetric('Largest Contentful Paint', metrics.lcp, 'runtime'));\n }\n \n if (metrics.cls !== undefined) {\n allViolations.push(...this.checkMetric('Cumulative Layout Shift', metrics.cls, 'runtime'));\n }\n \n if (metrics.memoryUsage !== undefined) {\n allViolations.push(...this.checkMetric('Memory Usage', metrics.memoryUsage, 'memory'));\n }\n \n if (metrics.mediaLoadTime !== undefined) {\n allViolations.push(...this.checkMetric('Media Load Time', metrics.mediaLoadTime, 'network'));\n }\n\n return allViolations;\n }\n\n // Handle budget violations\n private async handleViolations(violations: BudgetViolation[]) {\n if (!this.alertConfig.enabled) return;\n \n const now = Date.now();\n const errorViolations = violations.filter(v => v.budget.severity === 'error');\n \n // Check if we should send an alert based on threshold and cooldown\n if (errorViolations.length >= this.alertConfig.threshold &&\n now - this.lastAlertTime >= this.alertConfig.cooldown) {\n \n await this.sendAlerts(violations);\n this.lastAlertTime = now;\n }\n }\n\n // Send alerts through configured channels\n private async sendAlerts(violations: BudgetViolation[]) {\n const message = this.formatAlertMessage(violations);\n \n for (const channel of this.alertConfig.channels) {\n try {\n await this.sendAlert(channel, message);\n } catch (error) {\n console.error(`Failed to send alert via ${channel.type}:`, error);\n }\n }\n }\n\n // Format alert message\n private formatAlertMessage(violations: BudgetViolation[]): string {\n let message = `🚨 Performance Budget Violations Detected!\\n\\n`;\n \n violations.forEach(violation => {\n const { budget, actualValue, overageAmount, overagePercentage } = violation;\n const unit = this.getUnitDisplay(budget.unit);\n \n message += `❌ ${budget.name}\\n`;\n message += ` Limit: ${this.formatValue(budget.limit, budget.unit)}\\n`;\n message += ` Actual: ${this.formatValue(actualValue, budget.unit)}\\n`;\n message += ` Overage: ${this.formatValue(overageAmount, budget.unit)} (+${overagePercentage.toFixed(1)}%)\\n`;\n message += ` Severity: ${budget.severity.toUpperCase()}\\n\\n`;\n });\n \n message += `Time: ${new Date().toISOString()}\\n`;\n message += `Total Violations: ${violations.length}`;\n \n return message;\n }\n\n // Send alert to specific channel\n private async sendAlert(channel: AlertChannel, message: string) {\n switch (channel.type) {\n case 'console':\n console.error(message);\n break;\n \n case 'webhook':\n if (channel.config.url) {\n const response = await fetch(channel.config.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: message, timestamp: Date.now() })\n });\n if (!response.ok) {\n throw new Error(`Webhook failed: ${response.status}`);\n }\n }\n break;\n \n case 'slack':\n if (channel.config.url) {\n const response = await fetch(channel.config.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n text: message,\n channel: channel.config.channel,\n username: 'BaroiPlayer Performance Monitor'\n })\n });\n if (!response.ok) {\n throw new Error(`Slack webhook failed: ${response.status}`);\n }\n }\n break;\n \n default:\n console.warn(`Unsupported alert channel: ${channel.type}`);\n }\n }\n\n // Helper methods\n private formatValue(value: number, unit: PerformanceBudget['unit']): string {\n switch (unit) {\n case 'bytes':\n return this.formatBytes(value);\n case 'ms':\n return `${value.toFixed(2)}ms`;\n case 'score':\n return value.toFixed(3);\n case 'percent':\n return `${value.toFixed(1)}%`;\n default:\n return value.toString();\n }\n }\n\n private formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${(bytes / 1024 / 1024).toFixed(2)}MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(2)}KB`;\n }\n return `${bytes}B`;\n }\n\n private getUnitDisplay(unit: PerformanceBudget['unit']): string {\n const displays = {\n 'bytes': 'bytes',\n 'ms': 'milliseconds', \n 'score': 'score',\n 'percent': 'percent'\n };\n return displays[unit] || unit;\n }\n\n // Management methods\n addBudget(budget: PerformanceBudget) {\n this.budgets.set(budget.name, budget);\n }\n\n removeBudget(name: string) {\n this.budgets.delete(name);\n }\n\n updateBudget(name: string, updates: Partial<PerformanceBudget>) {\n const existing = this.budgets.get(name);\n if (existing) {\n this.budgets.set(name, { ...existing, ...updates });\n }\n }\n\n getBudgets(): PerformanceBudget[] {\n return Array.from(this.budgets.values());\n }\n\n getViolations(since?: number): BudgetViolation[] {\n if (since) {\n return this.violations.filter(v => v.timestamp >= since);\n }\n return [...this.violations];\n }\n\n clearViolations() {\n this.violations = [];\n }\n\n getViolationSummary(): {\n total: number;\n byCategory: Record<string, number>;\n bySeverity: Record<string, number>;\n } {\n const byCategory: Record<string, number> = {};\n const bySeverity: Record<string, number> = {};\n\n this.violations.forEach(violation => {\n const category = violation.budget.category;\n const severity = violation.budget.severity;\n \n byCategory[category] = (byCategory[category] || 0) + 1;\n bySeverity[severity] = (bySeverity[severity] || 0) + 1;\n });\n\n return {\n total: this.violations.length,\n byCategory,\n bySeverity\n };\n }\n}\n\n// Global performance budget monitor\nexport const performanceBudgetMonitor = new PerformanceBudgetMonitor();\n\n","import React from 'react';\n\n// Network monitoring and adaptive loading\nexport interface NetworkInfo {\n effectiveType: '2g' | '3g' | '4g' | '5g' | 'unknown';\n downlink: number; // Mbps\n rtt: number; // Round trip time in ms\n saveData: boolean;\n isOnline: boolean;\n}\n\nexport interface MediaLoadingConfig {\n preloadStrategy: 'none' | 'metadata' | 'auto';\n adaptiveBitrate: boolean;\n maxPreloadSize: number; // bytes\n networkThresholds: {\n '2g': { maxBitrate: number; preload: boolean };\n '3g': { maxBitrate: number; preload: boolean };\n '4g': { maxBitrate: number; preload: boolean };\n '5g': { maxBitrate: number; preload: boolean };\n };\n bufferSize: number; // seconds\n enableServiceWorker: boolean;\n}\n\nexport const defaultMediaLoadingConfig: MediaLoadingConfig = {\n preloadStrategy: 'metadata',\n adaptiveBitrate: true,\n maxPreloadSize: 2 * 1024 * 1024, // 2MB\n networkThresholds: {\n '2g': { maxBitrate: 128, preload: false }, // 128 kbps\n '3g': { maxBitrate: 500, preload: false }, // 500 kbps \n '4g': { maxBitrate: 2000, preload: true }, // 2 Mbps\n '5g': { maxBitrate: 10000, preload: true } // 10 Mbps\n },\n bufferSize: 10, // 10 seconds\n enableServiceWorker: true\n};\n\n// Media loading performance tracker\nexport interface MediaLoadingMetrics {\n loadStartTime: number;\n firstByteTime?: number;\n loadCompleteTime?: number;\n totalLoadTime?: number;\n bytesLoaded: number;\n loadSpeed: number; // bytes per second\n networkType: string;\n quality: string;\n bufferHealth: number; // 0-1 scale\n stallsCount: number;\n stallsDuration: number;\n}\n\n// Network monitoring utility\nexport class NetworkMonitor {\n private connection: any;\n private listeners: Set<(info: NetworkInfo) => void> = new Set();\n private currentInfo: NetworkInfo;\n\n constructor() {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n // Server-side rendering fallback\n this.connection = null;\n this.currentInfo = {\n effectiveType: 'unknown',\n downlink: 0,\n rtt: 0,\n saveData: false,\n isOnline: true\n };\n return;\n }\n\n this.connection = (navigator as any).connection || \n (navigator as any).mozConnection || \n (navigator as any).webkitConnection;\n \n this.currentInfo = this.getNetworkInfo();\n this.initializeListeners();\n }\n\n private getNetworkInfo(): NetworkInfo {\n if (typeof navigator === 'undefined') {\n // Server-side rendering fallback\n return {\n effectiveType: 'unknown',\n downlink: 0,\n rtt: 0,\n saveData: false,\n isOnline: true\n };\n }\n\n const isOnline = navigator.onLine;\n \n if (this.connection) {\n return {\n effectiveType: this.connection.effectiveType || 'unknown',\n downlink: this.connection.downlink || 0,\n rtt: this.connection.rtt || 0,\n saveData: this.connection.saveData || false,\n isOnline\n };\n }\n\n // Fallback for browsers without Network Information API\n return {\n effectiveType: 'unknown',\n downlink: 0,\n rtt: 0,\n saveData: false,\n isOnline\n };\n }\n\n private initializeListeners() {\n if (typeof window === 'undefined') {\n // Server-side rendering - skip event listeners\n return;\n }\n\n if (this.connection) {\n this.connection.addEventListener('change', this.handleNetworkChange.bind(this));\n }\n \n window.addEventListener('online', this.handleNetworkChange.bind(this));\n window.addEventListener('offline', this.handleNetworkChange.bind(this));\n }\n\n private handleNetworkChange() {\n const newInfo = this.getNetworkInfo();\n this.currentInfo = newInfo;\n this.listeners.forEach(listener => listener(newInfo));\n }\n\n getCurrentNetworkInfo(): NetworkInfo {\n return { ...this.currentInfo };\n }\n\n subscribe(listener: (info: NetworkInfo) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n // Estimate available bandwidth with fallback detection\n async estimateBandwidth(): Promise<number> {\n if (this.connection && this.connection.downlink) {\n return this.connection.downlink * 1000; // Convert to kbps\n }\n\n // Fallback: simple bandwidth test\n try {\n const startTime = performance.now();\n const testUrl = '/api/bandwidth-test?size=100kb'; // Would need to be implemented\n const response = await fetch(testUrl);\n const blob = await response.blob();\n const endTime = performance.now();\n \n const timeInSeconds = (endTime - startTime) / 1000;\n const bytesLoaded = blob.size;\n const bitsPerSecond = (bytesLoaded * 8) / timeInSeconds;\n \n return bitsPerSecond / 1000; // Return in kbps\n } catch (error) {\n console.warn('Bandwidth estimation failed:', error);\n return 1000; // Default to 1Mbps\n }\n }\n}\n\n// Media loading optimizer\nexport class MediaLoadingOptimizer {\n private config: MediaLoadingConfig;\n private networkMonitor: NetworkMonitor;\n private loadingMetrics: Map<string, MediaLoadingMetrics> = new Map();\n private preloadCache: Map<string, Promise<Blob>> = new Map();\n\n constructor(config: Partial<MediaLoadingConfig> = {}) {\n this.config = { ...defaultMediaLoadingConfig, ...config };\n this.networkMonitor = new NetworkMonitor();\n this.initializeNetworkMonitoring();\n }\n\n private initializeNetworkMonitoring() {\n this.networkMonitor.subscribe((networkInfo) => {\n this.handleNetworkChange(networkInfo);\n });\n }\n\n private handleNetworkChange(networkInfo: NetworkInfo) {\n console.log('Network changed:', networkInfo);\n \n // Adjust quality based on network conditions\n if (this.config.adaptiveBitrate) {\n this.adjustQualityForNetwork(networkInfo);\n }\n\n // Clear preload cache if on slow network\n if (networkInfo.effectiveType === '2g' || networkInfo.saveData) {\n this.clearPreloadCache();\n }\n }\n\n // Optimize media loading based on network conditions\n async optimizeMediaLoading(\n mediaUrl: string,\n element: HTMLMediaElement,\n options: {\n quality?: string;\n preload?: boolean;\n priority?: 'high' | 'normal' | 'low';\n } = {}\n ): Promise<MediaLoadingMetrics> {\n const startTime = performance.now();\n const networkInfo = this.networkMonitor.getCurrentNetworkInfo();\n \n const metrics: MediaLoadingMetrics = {\n loadStartTime: startTime,\n bytesLoaded: 0,\n loadSpeed: 0,\n networkType: networkInfo.effectiveType,\n quality: options.quality || 'auto',\n bufferHealth: 0,\n stallsCount: 0,\n stallsDuration: 0\n };\n\n this.loadingMetrics.set(mediaUrl, metrics);\n\n try {\n // Choose optimal loading strategy\n const loadingStrategy = this.chooseLoadingStrategy(networkInfo, options);\n \n // Apply preload strategy\n if (loadingStrategy.shouldPreload) {\n await this.preloadMedia(mediaUrl, loadingStrategy.preloadAmount);\n }\n\n // Set appropriate preload attribute\n element.preload = loadingStrategy.preloadAttribute;\n\n // Monitor loading progress\n this.monitorLoadingProgress(element, metrics);\n\n // Apply quality adjustments\n if (this.config.adaptiveBitrate && loadingStrategy.suggestedQuality) {\n this.applyQualitySettings(element, loadingStrategy.suggestedQuality);\n }\n\n return metrics;\n } catch (error) {\n console.error('Media loading optimization failed:', error);\n return metrics;\n }\n }\n\n private chooseLoadingStrategy(\n networkInfo: NetworkInfo,\n options: { preload?: boolean; priority?: string; quality?: string }\n ) {\n const effectiveType = networkInfo.effectiveType === 'unknown' ? '4g' : networkInfo.effectiveType;\n const threshold = this.config.networkThresholds[effectiveType] || \n this.config.networkThresholds['4g'];\n \n return {\n shouldPreload: options.preload !== false && threshold.preload && !networkInfo.saveData,\n preloadAmount: networkInfo.saveData ? 0 : this.config.maxPreloadSize,\n preloadAttribute: this.getPreloadAttribute(networkInfo),\n suggestedQuality: this.getSuggestedQuality(networkInfo, threshold.maxBitrate),\n bufferTarget: this.getBufferTarget(networkInfo)\n };\n }\n\n private getPreloadAttribute(networkInfo: NetworkInfo): 'none' | 'metadata' | 'auto' {\n if (networkInfo.saveData || networkInfo.effectiveType === '2g') {\n return 'none';\n }\n \n if (networkInfo.effectiveType === '3g') {\n return 'metadata';\n }\n \n return this.config.preloadStrategy;\n }\n\n private getSuggestedQuality(networkInfo: NetworkInfo, maxBitrate: number): string {\n const availableBandwidth = networkInfo.downlink * 1000; // Convert to kbps\n \n if (availableBandwidth >= maxBitrate * 2) return 'high';\n if (availableBandwidth >= maxBitrate) return 'medium';\n return 'low';\n }\n\n private getBufferTarget(networkInfo: NetworkInfo): number {\n switch (networkInfo.effectiveType) {\n case '2g': return 2; // 2 seconds\n case '3g': return 5; // 5 seconds\n case '4g': return this.config.bufferSize;\n case '5g': return this.config.bufferSize * 1.5;\n default: return this.config.bufferSize;\n }\n }\n\n // Preload media content\n async preloadMedia(url: string, maxSize: number): Promise<void> {\n if (this.preloadCache.has(url)) {\n return; // Already preloading or preloaded\n }\n\n const preloadPromise = this.fetchWithProgress(url, maxSize);\n this.preloadCache.set(url, preloadPromise);\n\n try {\n await preloadPromise;\n } catch (error) {\n console.warn(`Preload failed for ${url}:`, error);\n this.preloadCache.delete(url);\n }\n }\n\n private async fetchWithProgress(url: string, maxSize: number): Promise<Blob> {\n const response = await fetch(url, {\n headers: {\n 'Range': `bytes=0-${maxSize - 1}` // Limit preload size\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to preload: ${response.status}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body not readable');\n }\n\n const chunks: Uint8Array[] = [];\n let bytesRead = 0;\n\n try {\n while (bytesRead < maxSize) {\n const { done, value } = await reader.read();\n if (done) break;\n \n chunks.push(value);\n bytesRead += value.length;\n }\n } finally {\n reader.releaseLock();\n }\n\n return new Blob(chunks);\n }\n\n // Monitor loading progress and update metrics\n private monitorLoadingProgress(element: HTMLMediaElement, metrics: MediaLoadingMetrics) {\n let stallStartTime: number | null = null;\n\n const updateMetrics = () => {\n if (element.buffered.length > 0) {\n const bufferedEnd = element.buffered.end(element.buffered.length - 1);\n const currentTime = element.currentTime;\n metrics.bufferHealth = Math.min((bufferedEnd - currentTime) / this.config.bufferSize, 1);\n }\n };\n\n // Track first byte\n const onLoadStart = () => {\n metrics.firstByteTime = performance.now();\n };\n\n // Track load completion\n const onCanPlay = () => {\n metrics.loadCompleteTime = performance.now();\n metrics.totalLoadTime = metrics.loadCompleteTime - metrics.loadStartTime;\n \n // Calculate load speed\n if (metrics.totalLoadTime && metrics.bytesLoaded > 0) {\n metrics.loadSpeed = metrics.bytesLoaded / (metrics.totalLoadTime / 1000);\n }\n };\n\n // Track stalls\n const onWaiting = () => {\n if (stallStartTime === null) {\n stallStartTime = performance.now();\n metrics.stallsCount++;\n }\n };\n\n const onPlaying = () => {\n if (stallStartTime !== null) {\n metrics.stallsDuration += performance.now() - stallStartTime;\n stallStartTime = null;\n }\n updateMetrics();\n };\n\n // Track progress\n const onProgress = () => {\n if (element.buffered.length > 0) {\n const bufferedBytes = element.buffered.end(0) * 1000; // Rough estimate\n metrics.bytesLoaded = bufferedBytes;\n }\n updateMetrics();\n };\n\n // Add event listeners\n element.addEventListener('loadstart', onLoadStart);\n element.addEventListener('canplay', onCanPlay);\n element.addEventListener('waiting', onWaiting);\n element.addEventListener('playing', onPlaying);\n element.addEventListener('progress', onProgress);\n\n // Cleanup function\n const cleanup = () => {\n element.removeEventListener('loadstart', onLoadStart);\n element.removeEventListener('canplay', onCanPlay);\n element.removeEventListener('waiting', onWaiting);\n element.removeEventListener('playing', onPlaying);\n element.removeEventListener('progress', onProgress);\n };\n\n // Auto-cleanup after 5 minutes\n setTimeout(cleanup, 5 * 60 * 1000);\n }\n\n // Apply quality settings (would integrate with HLS.js or similar)\n private applyQualitySettings(element: HTMLMediaElement, quality: string) {\n // This would integrate with your video streaming library\n console.log(`Applying quality setting: ${quality} to`, element);\n \n // Example integration with HLS.js:\n // if (element.hls) {\n // element.hls.currentLevel = this.getQualityLevel(quality);\n // }\n }\n\n private adjustQualityForNetwork(networkInfo: NetworkInfo) {\n // Auto-adjust quality for all active media elements\n console.log('Adjusting quality for network conditions:', networkInfo.effectiveType);\n }\n\n // Clear preload cache to save memory\n clearPreloadCache() {\n this.preloadCache.clear();\n }\n\n // Get loading metrics for a specific media URL\n getLoadingMetrics(url: string): MediaLoadingMetrics | undefined {\n return this.loadingMetrics.get(url);\n }\n\n // Get all loading metrics\n getAllMetrics(): MediaLoadingMetrics[] {\n return Array.from(this.loadingMetrics.values());\n }\n\n // Calculate average loading performance\n getAverageLoadingTime(): number {\n const metrics = this.getAllMetrics();\n const completedLoads = metrics.filter(m => m.totalLoadTime !== undefined);\n \n if (completedLoads.length === 0) return 0;\n \n const total = completedLoads.reduce((sum, m) => sum + (m.totalLoadTime || 0), 0);\n return total / completedLoads.length;\n }\n\n // Get network-specific performance stats\n getNetworkPerformanceStats(): {\n networkType: string;\n avgLoadTime: number;\n avgStalls: number;\n avgBufferHealth: number;\n }[] {\n const statsByNetwork = new Map<string, MediaLoadingMetrics[]>();\n \n this.getAllMetrics().forEach(metrics => {\n const network = metrics.networkType;\n if (!statsByNetwork.has(network)) {\n statsByNetwork.set(network, []);\n }\n statsByNetwork.get(network)!.push(metrics);\n });\n\n return Array.from(statsByNetwork.entries()).map(([networkType, metrics]) => ({\n networkType,\n avgLoadTime: metrics.reduce((sum, m) => sum + (m.totalLoadTime || 0), 0) / metrics.length,\n avgStalls: metrics.reduce((sum, m) => sum + m.stallsCount, 0) / metrics.length,\n avgBufferHealth: metrics.reduce((sum, m) => sum + m.bufferHealth, 0) / metrics.length\n }));\n }\n}\n\n// Global media loading optimizer instance\nexport const mediaLoadingOptimizer = new MediaLoadingOptimizer();\n\n// React hook for media loading optimization\nexport function useMediaLoadingOptimizer(config?: Partial<MediaLoadingConfig>) {\n const [optimizer] = React.useState(() => \n config ? new MediaLoadingOptimizer(config) : mediaLoadingOptimizer\n );\n \n const [networkInfo, setNetworkInfo] = React.useState<NetworkInfo | null>(null);\n const [loadingMetrics, setLoadingMetrics] = React.useState<MediaLoadingMetrics[]>([]);\n\n React.useEffect(() => {\n const unsubscribe = optimizer['networkMonitor'].subscribe(setNetworkInfo);\n setNetworkInfo(optimizer['networkMonitor'].getCurrentNetworkInfo());\n\n // Update metrics periodically\n const interval = setInterval(() => {\n setLoadingMetrics(optimizer.getAllMetrics());\n }, 1000);\n\n return () => {\n unsubscribe();\n clearInterval(interval);\n };\n }, [optimizer]);\n\n const optimizeLoading = React.useCallback(\n (mediaUrl: string, element: HTMLMediaElement, options?: any) => {\n return optimizer.optimizeMediaLoading(mediaUrl, element, options);\n },\n [optimizer]\n );\n\n return {\n networkInfo,\n loadingMetrics,\n optimizeLoading,\n averageLoadTime: optimizer.getAverageLoadingTime(),\n networkStats: optimizer.getNetworkPerformanceStats()\n };\n}","import React, { createContext, useContext, useMemo } from 'react'\nimport { EventBus } from '../events'\nimport { PluginRegistry, ConsolePluginLogger } from '../plugins'\n\n// Service interfaces\nexport interface MediaService {\n loadMedia(src: string): Promise<void>\n play(): Promise<void>\n pause(): Promise<void>\n seek(time: number): Promise<void>\n setVolume(volume: number): Promise<void>\n}\n\nexport interface StorageService {\n get<T>(key: string): T | null\n set<T>(key: string, value: T): void\n remove(key: string): void\n clear(): void\n}\n\nexport interface AnalyticsService {\n track(event: string, data?: any): void\n identify(userId: string, traits?: any): void\n page(name: string, properties?: any): void\n}\n\nexport interface LoggerService {\n info(message: string, data?: any): void\n warn(message: string, data?: any): void\n error(message: string, data?: any): void\n debug(message: string, data?: any): void\n}\n\n// Service implementations\nclass LocalStorageService implements StorageService {\n get<T>(key: string): T | null {\n try {\n const item = localStorage.getItem(`baroi-player-${key}`)\n return item ? JSON.parse(item) as T : null\n } catch {\n return null\n }\n }\n\n set<T>(key: string, value: T): void {\n try {\n localStorage.setItem(`baroi-player-${key}`, JSON.stringify(value))\n } catch (error) {\n console.warn('Failed to store data:', error)\n }\n }\n\n remove(key: string): void {\n try {\n localStorage.removeItem(`baroi-player-${key}`)\n } catch (error) {\n console.warn('Failed to remove data:', error)\n }\n }\n\n clear(): void {\n try {\n Object.keys(localStorage).forEach(key => {\n if (key.startsWith('baroi-player-')) {\n localStorage.removeItem(key)\n }\n })\n } catch (error) {\n console.warn('Failed to clear data:', error)\n }\n }\n}\n\nclass NoOpAnalyticsService implements AnalyticsService {\n track(event: string, data?: any): void {\n console.log('Analytics:', event, data)\n }\n\n identify(userId: string, traits?: any): void {\n console.log('Analytics identify:', userId, traits)\n }\n\n page(name: string, properties?: any): void {\n console.log('Analytics page:', name, properties)\n }\n}\n\n// Service container\nexport interface ServiceContainer {\n eventBus: EventBus\n pluginRegistry: PluginRegistry\n storage: StorageService\n analytics: AnalyticsService\n logger: LoggerService\n}\n\n// Service provider context\nconst ServiceContext = createContext<ServiceContainer | null>(null)\n\n// Service provider props\nexport interface ServiceProviderProps {\n children: React.ReactNode\n services?: Partial<ServiceContainer>\n}\n\n// Service provider component\nexport function ServiceProvider({ children, services = {} }: ServiceProviderProps) {\n const container = useMemo<ServiceContainer>(() => {\n const logger = services.logger || new ConsolePluginLogger('[BaroiPlayer]')\n const eventBus = services.eventBus || new EventBus()\n const pluginRegistry = services.pluginRegistry || new PluginRegistry(logger)\n const storage = services.storage || new LocalStorageService()\n const analytics = services.analytics || new NoOpAnalyticsService()\n\n return {\n eventBus,\n pluginRegistry,\n storage,\n analytics,\n logger\n }\n }, [services])\n\n return (\n <ServiceContext.Provider value={container}>\n {children}\n </ServiceContext.Provider>\n )\n}\n\n// Service hooks\nexport function useServices(): ServiceContainer {\n const context = useContext(ServiceContext)\n if (!context) {\n throw new Error('useServices must be used within ServiceProvider')\n }\n return context\n}\n\nexport function useServiceEventBus(): EventBus {\n return useServices().eventBus\n}\n\nexport function usePluginRegistry(): PluginRegistry {\n return useServices().pluginRegistry\n}\n\nexport function useStorage(): StorageService {\n return useServices().storage\n}\n\nexport function useAnalytics(): AnalyticsService {\n return useServices().analytics\n}\n\nexport function useLogger(): LoggerService {\n return useServices().logger\n}\n\n// Service decorators for dependency injection\nexport function withServices<P extends object>(\n Component: React.ComponentType<P & { services: ServiceContainer }>\n): React.ComponentType<P> {\n return function WithServicesComponent(props: P) {\n const services = useServices()\n return <Component {...props} services={services} />\n }\n}","import React from 'react'\nimport { EventBus } from './events'\nimport { PluginRegistry } from './plugins'\nimport { ServiceProvider, type ServiceContainer } from './providers/service-provider'\n\n// Architecture configuration\nexport interface ArchitectureConfig {\n plugins?: string[]\n services?: Partial<ServiceContainer>\n eventMiddleware?: any[]\n debug?: boolean\n}\n\n// Create architecture wrapper component\nexport function createArchitecture(config: ArchitectureConfig = {}) {\n return function ArchitectureProvider({ children }: { children: React.ReactNode }) {\n return (\n <ServiceProvider services={config.services}>\n {children}\n </ServiceProvider>\n )\n }\n}\n\n// Architecture health check\nexport async function healthCheck(services: ServiceContainer) {\n const results = {\n eventBus: {\n healthy: true,\n listenerCount: services.eventBus.getListenerCount(),\n eventTypes: services.eventBus.getEventTypes().length\n },\n plugins: await services.pluginRegistry.healthCheck(),\n timestamp: Date.now()\n }\n\n return results\n}","import React, { lazy, Suspense } from 'react';\n\n// Feature flags for progressive loading\nexport const FEATURES = {\n SUBTITLES: 'subtitles',\n PLAYLISTS: 'playlists', \n ADVANCED_CONTROLS: 'advanced_controls',\n ANALYTICS: 'analytics',\n PICTURE_IN_PICTURE: 'picture_in_picture',\n QUALITY_SELECTOR: 'quality_selector',\n PLAYBACK_SPEED: 'playback_speed',\n CHAPTERS: 'chapters',\n THUMBNAILS: 'thumbnails',\n KEYBOARD_SHORTCUTS: 'keyboard_shortcuts'\n} as const;\n\nexport type FeatureType = typeof FEATURES[keyof typeof FEATURES];\n\n// Progressive loading configuration\nexport interface ProgressiveLoadingConfig {\n enabledFeatures: FeatureType[];\n loadingStrategy: 'lazy' | 'preload' | 'immediate';\n fallbackTimeout: number;\n retryAttempts: number;\n}\n\nexport const defaultProgressiveConfig: ProgressiveLoadingConfig = {\n enabledFeatures: [\n FEATURES.SUBTITLES,\n FEATURES.ADVANCED_CONTROLS,\n FEATURES.KEYBOARD_SHORTCUTS\n ],\n loadingStrategy: 'lazy',\n fallbackTimeout: 5000,\n retryAttempts: 3\n};\n\n// Dynamic imports with error handling and retry logic\nexport const lazyComponents = {\n // Subtitle system\n SubtitleSelector: lazy(() => \n import('../components/enhanced/advanced-features')\n .then(module => ({ default: module.SubtitleSelector }))\n ),\n\n // Playlist functionality \n PlaylistManager: lazy(() =>\n import('../components/enhanced/advanced-features')\n .then(module => ({ default: module.SubtitleSelector })) // Use existing component as placeholder\n ),\n\n // Advanced controls\n QualitySelector: lazy(() =>\n import('../components/enhanced/advanced-features')\n .then(module => ({ default: module.QualitySelector }))\n ),\n\n PlaybackSpeedSelector: lazy(() =>\n import('../components/enhanced/advanced-features')\n .then(module => ({ default: module.PlaybackSpeedSelector }))\n ),\n\n ChaptersPanel: lazy(() =>\n import('../components/enhanced/advanced-features')\n .then(module => ({ default: module.ChaptersPanel }))\n ),\n\n PictureInPictureButton: lazy(() =>\n import('../components/enhanced/advanced-features')\n .then(module => ({ default: module.PictureInPictureButton }))\n ),\n\n // Analytics\n AnalyticsTracker: lazy(() =>\n import('../components/enhanced/advanced-features')\n .then(module => ({ default: module.SubtitleSelector })) // Use existing component as placeholder\n ),\n};\n\n// Feature detection utilities\nexport class FeatureDetector {\n private static cache = new Map<FeatureType, boolean>();\n\n static async isSupported(feature: FeatureType): Promise<boolean> {\n if (this.cache.has(feature)) {\n return this.cache.get(feature)!;\n }\n\n const supported = await this.checkFeatureSupport(feature);\n this.cache.set(feature, supported);\n return supported;\n }\n\n private static async checkFeatureSupport(feature: FeatureType): Promise<boolean> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n // Server-side rendering - assume basic support\n return true;\n }\n\n switch (feature) {\n case FEATURES.SUBTITLES:\n return 'TextTrack' in window;\n \n case FEATURES.PICTURE_IN_PICTURE:\n return 'pictureInPictureEnabled' in document;\n \n case FEATURES.ADVANCED_CONTROLS:\n return true; // Always supported\n \n case FEATURES.PLAYLISTS:\n return 'MediaSession' in window;\n \n case FEATURES.ANALYTICS:\n return 'IntersectionObserver' in window;\n \n case FEATURES.QUALITY_SELECTOR:\n return 'MediaSource' in window;\n \n case FEATURES.PLAYBACK_SPEED:\n return true; // HTML5 video supports this\n \n case FEATURES.CHAPTERS:\n return 'TextTrack' in window;\n \n case FEATURES.THUMBNAILS:\n return 'OffscreenCanvas' in window || 'canvas' in document.createElement('canvas');\n \n case FEATURES.KEYBOARD_SHORTCUTS:\n return 'KeyboardEvent' in window;\n \n default:\n return false;\n }\n }\n}\n\n// Progressive loading manager\nexport class ProgressiveLoader {\n private config: ProgressiveLoadingConfig;\n private loadedFeatures = new Set<FeatureType>();\n private loadingPromises = new Map<FeatureType, Promise<any>>();\n\n constructor(config: Partial<ProgressiveLoadingConfig> = {}) {\n this.config = { ...defaultProgressiveConfig, ...config };\n }\n\n async loadFeature<T = any>(feature: FeatureType): Promise<T | null> {\n // Check if feature is enabled\n if (!this.config.enabledFeatures.includes(feature)) {\n return null;\n }\n\n // Check if already loaded\n if (this.loadedFeatures.has(feature)) {\n return this.getLoadedFeature(feature);\n }\n\n // Check if currently loading\n if (this.loadingPromises.has(feature)) {\n return this.loadingPromises.get(feature);\n }\n\n // Check browser support\n const isSupported = await FeatureDetector.isSupported(feature);\n if (!isSupported) {\n console.warn(`Feature ${feature} is not supported in this browser`);\n return null;\n }\n\n // Start loading with retry logic\n const loadingPromise = this.loadWithRetry(feature);\n this.loadingPromises.set(feature, loadingPromise);\n\n try {\n const result = await loadingPromise;\n this.loadedFeatures.add(feature);\n return result as T;\n } catch (error) {\n console.error(`Failed to load feature ${feature}:`, error);\n this.loadingPromises.delete(feature);\n return null;\n }\n }\n\n private async loadWithRetry<T>(feature: FeatureType, attempt = 1): Promise<T> {\n try {\n const result = await this.loadFeatureModule(feature);\n return result as T;\n } catch (error) {\n if (attempt < this.config.retryAttempts) {\n console.warn(`Loading feature ${feature} failed, retrying (${attempt}/${this.config.retryAttempts})`);\n await new Promise(resolve => setTimeout(resolve, 1000 * attempt));\n return this.loadWithRetry(feature, attempt + 1);\n }\n throw error;\n }\n }\n\n private async loadFeatureModule(feature: FeatureType) {\n switch (feature) {\n case FEATURES.SUBTITLES:\n return import('../hooks/useEnhancedSubtitles');\n \n case FEATURES.PLAYLISTS:\n return import('../components/enhanced/advanced-features'); // Use existing features\n \n case FEATURES.ADVANCED_CONTROLS:\n return import('../components/enhanced/advanced-features');\n \n case FEATURES.ANALYTICS:\n return import('../components/enhanced/advanced-features'); // Use existing features\n \n case FEATURES.PICTURE_IN_PICTURE:\n return import('../components/enhanced/advanced-features'); // Use existing features\n \n case FEATURES.QUALITY_SELECTOR:\n return import('../components/enhanced/advanced-features'); // Use existing features\n \n case FEATURES.PLAYBACK_SPEED:\n return import('../components/enhanced/advanced-features'); // Use existing features\n \n case FEATURES.CHAPTERS:\n return import('../components/enhanced/advanced-features'); // Use existing features\n \n case FEATURES.THUMBNAILS:\n return import('../components/enhanced/advanced-features'); // Use existing features\n \n case FEATURES.KEYBOARD_SHORTCUTS:\n return import('../hooks/use-keyboard-controls');\n \n default:\n throw new Error(`Unknown feature: ${feature}`);\n }\n }\n\n private getLoadedFeature(feature: FeatureType) {\n // Return cached feature instance\n return this.loadingPromises.get(feature);\n }\n\n // Preload features for faster access\n async preloadFeatures(features: FeatureType[] = this.config.enabledFeatures) {\n const preloadPromises = features.map(feature => this.loadFeature(feature));\n await Promise.allSettled(preloadPromises);\n }\n\n // Get loading state\n getLoadingState() {\n return {\n loaded: Array.from(this.loadedFeatures),\n loading: Array.from(this.loadingPromises.keys()),\n enabled: this.config.enabledFeatures\n };\n }\n}\n\n// Global progressive loader instance\nexport const progressiveLoader = new ProgressiveLoader();\n\n// React hook for progressive loading\nexport function useProgressiveFeature<T = any>(feature: FeatureType): {\n feature: T | null;\n loading: boolean;\n error: Error | null;\n load: () => Promise<void>;\n} {\n const [featureModule, setFeatureModule] = React.useState<T | null>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | null>(null);\n\n const load = React.useCallback(async () => {\n if (loading || featureModule) return;\n \n setLoading(true);\n setError(null);\n \n try {\n const module = await progressiveLoader.loadFeature<T>(feature);\n setFeatureModule(module);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [feature, loading, featureModule]);\n\n // Auto-load if strategy is immediate\n React.useEffect(() => {\n if (progressiveLoader['config'].loadingStrategy === 'immediate') {\n load();\n }\n }, [load]);\n\n return {\n feature: featureModule,\n loading,\n error,\n load\n };\n}\n\n// HOC for progressive feature loading\nexport function withProgressiveFeature<P extends object>(\n WrappedComponent: React.ComponentType<P>,\n feature: FeatureType,\n fallback?: React.ComponentType<P>\n) {\n return function ProgressiveFeatureWrapper(props: P) {\n const { feature: featureModule, loading, error } = useProgressiveFeature(feature);\n\n if (loading) {\n return <div className=\"h-8 animate-pulse rounded bg-gray-200\" />;\n }\n\n if (error || !featureModule) {\n const Fallback = fallback;\n return Fallback ? <Fallback {...props} /> : null;\n }\n\n return <WrappedComponent {...props} />;\n };\n}\n","// Core architecture exports\n\n// Plugin system\nexport * from './plugins'\n\n// Event system \nexport * from './events'\n\n// Service providers\nexport * from './providers/service-provider'\n\n// Version\nexport const CORE_ARCHITECTURE_VERSION = '1.0.0'\n\n// Architecture utilities\nexport { createArchitecture } from './utils'\n\n// Progressive loading system\nexport * from './progressive-loading'\n\n// Performance monitoring and testing\nexport * from './performance'\n"],"names":["PerformanceBenchmark","__publicField","PerformanceRegressionDetector","config","testFunction","renderTimes","memoryBefore","memoryAfter","error","i","startTime","endTime","err","averageRenderTime","sum","time","minRenderTime","maxRenderTime","memoryUsage","passed","result","componentName","renderFunction","expectedRenderTime","bundlePath","expectedLoadTime","response","iterations","memoryIncrease","hasMemoryLeak","interactionFunction","expectedDelay","currentMetrics","baselineMetrics","regressions","totalTests","passedTests","failedTests","passRate","summary","report","index","performanceBenchmark","performanceTestUtils","Component","props","hookFunction","hookName","expectedExecutionTime","operation","operationName","expectedTime","beforeFunction","afterFunction","featureName","beforeMemory","beforeTime","midMemory","midTime","afterMemory","afterTime","PerformanceTestFramework","suiteName","tests","testImplementations","results","test","implementation","implementations","allResults","suiteImplementations","performanceTestFramework","defaultPerformanceBudgets","PerformanceBudgetMonitor","budgets","alertConfig","budget","metricName","value","category","violations","name","violation","distPath","metrics","allViolations","now","v","message","channel","actualValue","overageAmount","overagePercentage","unit","bytes","updates","existing","since","byCategory","bySeverity","severity","performanceBudgetMonitor","defaultMediaLoadingConfig","NetworkMonitor","isOnline","newInfo","listener","blob","timeInSeconds","MediaLoadingOptimizer","networkInfo","mediaUrl","element","options","loadingStrategy","effectiveType","threshold","maxBitrate","availableBandwidth","url","maxSize","preloadPromise","reader","chunks","bytesRead","done","stallStartTime","updateMetrics","bufferedEnd","currentTime","onLoadStart","onCanPlay","onWaiting","onPlaying","onProgress","bufferedBytes","quality","completedLoads","m","statsByNetwork","network","networkType","mediaLoadingOptimizer","useMediaLoadingOptimizer","optimizer","React","setNetworkInfo","loadingMetrics","setLoadingMetrics","unsubscribe","interval","optimizeLoading","LocalStorageService","key","item","NoOpAnalyticsService","event","data","userId","traits","properties","ServiceContext","createContext","ServiceProvider","children","services","container","useMemo","logger","ConsolePluginLogger","eventBus","EventBus","pluginRegistry","PluginRegistry","storage","analytics","useServices","context","useContext","useServiceEventBus","usePluginRegistry","useStorage","useAnalytics","useLogger","withServices","jsx","createArchitecture","FEATURES","defaultProgressiveConfig","lazyComponents","lazy","n","module","FeatureDetector","feature","supported","ProgressiveLoader","loadingPromise","attempt","resolve","features","preloadPromises","progressiveLoader","useProgressiveFeature","featureModule","setFeatureModule","loading","setLoading","setError","load","withProgressiveFeature","WrappedComponent","fallback","Fallback","CORE_ARCHITECTURE_VERSION"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const e=require("./context-CwZnPdz0.cjs"),i=require("react"),x=require("./utils-Db13763z.cjs");function Y(u,o,s,n){const[t,a]=i.useState(!0),[r,c]=i.useState(!1),[l,p]=i.useState(!1),d=i.useRef(null),v=i.useCallback(()=>{d.current&&clearTimeout(d.current),u&&(d.current=setTimeout(()=>{!r&&!l&&a(!1)},o))},[u,o,r,l]),N=i.useCallback(()=>{a(!0),v()},[v]);i.useEffect(()=>(u?v():a(!0),()=>{d.current&&clearTimeout(d.current)}),[u,v]);const f=i.useCallback(()=>{s&&(c(!0),a(!0))},[s]),R=i.useCallback(()=>{s&&(c(!1),v())},[s,v]),m=i.useCallback(()=>{n&&(p(!0),N())},[n,N]),b=i.useCallback(()=>{n&&(p(!1),v())},[n,v]);return{showControls:t,showControlsTemporarily:N,handleMouseEnter:f,handleMouseLeave:R,handleTouchStart:m,handleTouchEnd:b}}function W(u){const o=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]=i.useState(null),[l,p]=i.useState(!1),d=i.useCallback(f=>{if(!u)return;const R=f.touches[0];if(!R)return;const m=Date.now();r&&m-r.time<300?(p(!0),o({type:s?e.MediaActionTypes.PAUSE:e.MediaActionTypes.PLAY})):(c({x:R.clientX,y:R.clientY,time:m}),p(!1))},[u,r,s,o]),v=i.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));o({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));o({type:e.MediaActionTypes.SET_VOLUME,detail:M})}},[u,r,l,t,n,a,o]),N=i.useCallback(()=>{u&&setTimeout(()=>{c(null),p(!1)},300)},[u]);return{handleTouchStart:d,handleTouchMove:v,handleTouchEnd:N}}const D=function({children:o,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(i.useCallback(y=>y.isPlaying,[])),g=e.useMediaSelector(i.useCallback(y=>y.isFullscreen,[])),M=e.useMediaSelector(i.useCallback(y=>y.currentTime,[])),C=e.useMediaSelector(i.useCallback(y=>y.volume,[])),h=e.useMediaSelector(i.useCallback(y=>y.error,[])),{showControls:j,showControlsTemporarily:S,handleMouseEnter:k,handleMouseLeave:P,handleTouchStart:E,handleTouchEnd:w}=Y(n,t,a,r),{handleTouchStart:A,handleTouchMove:L,handleTouchEnd:z}=W(l),U=i.useCallback(y=>{E(),A(y)},[E,A]),X=i.useCallback(()=>{w(),z()},[w,z]),G=i.useCallback(()=>{S()},[S]);return i.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]),i.useEffect(()=>{b?p?.():d?.()},[b,p,d]),i.useEffect(()=>{v?.(M)},[M,v]),i.useEffect(()=>{N?.(C)},[C,N]),i.useEffect(()=>{f?.(g)},[g,f]),e.jsxRuntimeExports.jsx("div",{ref: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:U,onTouchMove:L,onTouchEnd:X,onClick:G,children:o})};D.displayName="EnhancedMediaPlayer";const F=function({qualities:o,currentQuality:s,onQualityChange:n,className:t}){const[a,r]=i.useState(!1),c=i.useMemo(()=>o.find(l=>l.id===s)?.label||"Auto",[o,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:o.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:o,currentSubtitle:s,onSubtitleChange:n,className:t}){const[a,r]=i.useState(!1),c=i.useMemo(()=>s&&o.find(l=>l.id===s)?.label||"Off",[o,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"}),o.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:o}){const s=e.useMediaDispatch(),n=e.useMediaSelector(l=>l.playbackRate),[t,a]=i.useState(!1),r=[.25,.5,.75,1,1.25,1.5,1.75,2],c=i.useCallback(l=>{s({type:e.MediaActionTypes.SET_PLAYBACK_RATE,detail:l}),a(!1)},[s]);return e.jsxRuntimeExports.jsxs("div",{className:x.cn("relative",o),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:o,onChapterSelect:s,className:n}){const t=e.useMediaSelector(r=>r.currentTime),a=i.useMemo(()=>o.find(r=>t>=r.startTime&&t<r.endTime),[o,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:o.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:o}){const s=e.useMediaDispatch(),n=e.useMediaSelector(a=>a.isPictureInPicture),t=i.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",o),"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:o,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=i.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],o),"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"})})})})},$=function({className:o}){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]=i.useState(!1),[p,d]=i.useState(null),v=i.useRef(null),N=t>0?n/t*100:0,f=t>0&&r!==null?r/t*100:null,R=i.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=i.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=i.useCallback(h=>{if(!c){const j=m(h.clientX);d(j),s({type:e.MediaActionTypes.PREVIEW_TIME,detail:j})}},[c,m,s]),g=i.useCallback(()=>{c||(d(null),s({type:e.MediaActionTypes.CLEAR_PREVIEW}))},[c,s]),M=i.useCallback(h=>{l(!0);const j=m(h.clientX);s({type:e.MediaActionTypes.SEEK,detail:j})},[m,s]),C=i.useCallback(h=>{l(!0);const j=m(h.touches[0]?.clientX||0);s({type:e.MediaActionTypes.SEEK,detail:j})},[m,s]);return i.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",o),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%)"}})]})]})},K=function({className:o}){const s=e.useMediaDispatch(),n=e.useMediaSelector(d=>d.volume),t=e.useMediaSelector(d=>d.isMuted),[a,r]=i.useState(!1),c=i.useCallback(()=>{s({type:e.MediaActionTypes.TOGGLE_MUTE})},[s]),l=i.useCallback(d=>{s({type:e.MediaActionTypes.SET_VOLUME,detail:d})},[s]),p=i.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",o),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"})})]})},q=function({className:o,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=i.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],o),"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})]})})},J=function({className:o,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=i.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],o),"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:o="current",className:s}){const n=e.useMediaSelector(r=>r.currentTime),t=e.useMediaSelector(r=>r.duration),a=i.useMemo(()=>{switch(o){case"current":return x.formatTime(n);case"duration":return x.formatTime(t);case"remaining":return`-${x.formatTime(t-n)}`;default:return x.formatTime(n)}},[o,n,t]);return e.jsxRuntimeExports.jsx("div",{className:x.cn("font-mono text-sm text-white tabular-nums",s),children:a})},Z=function({metrics:o,className:s}){if(!o||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:[o.fps!==void 0&&e.jsxRuntimeExports.jsxs("div",{className:x.cn("flex items-center gap-1",n(o.fps)),children:[e.jsxRuntimeExports.jsx("div",{className:"h-2 w-2 rounded-full bg-current"}),e.jsxRuntimeExports.jsxs("span",{children:[o.fps," FPS"]})]}),o.bufferHealth!==void 0&&e.jsxRuntimeExports.jsxs("div",{className:x.cn("flex items-center gap-1",t(o.bufferHealth)),children:[e.jsxRuntimeExports.jsx("div",{className:"h-2 w-2 rounded-full bg-current"}),e.jsxRuntimeExports.jsxs("span",{children:[o.bufferHealth.toFixed(1),"s"]})]}),o.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:[o.quality,"p"]})]})]})},ee=function({className:o,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",o),children:[e.jsxRuntimeExports.jsx($,{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(q,{size:r,skipTime:c,className:"shrink-0"}),e.jsxRuntimeExports.jsx(O,{size:a,className:"shrink-0"}),s&&e.jsxRuntimeExports.jsx(J,{size:r,skipTime:c,className:"shrink-0"}),n&&e.jsxRuntimeExports.jsx(K,{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(Z,{metrics:p,className:"text-white/80"})})]})]})},se=({performanceMetrics:u={},preloadingStats:o={},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]=i.useState(l),[N,f]=i.useState("performance"),R=i.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:[o.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:[(o.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:[o.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:[(o.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(o.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$1("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$1("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=se;exports.EnhancedControlBar=ee;exports.EnhancedMediaPlayer=D;exports.EnhancedPlayButton=O;exports.EnhancedSeekBar=$;exports.EnhancedTimeDisplay=B;exports.EnhancedVolumeControl=K;exports.PictureInPictureButton=H;exports.PlaybackSpeedSelector=I;exports.QualitySelector=F;exports.SubtitleSelector=V;exports.advancedFeatures=Q;
2
- //# sourceMappingURL=enhanced-components-CXnYiOt6.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enhanced-components-CXnYiOt6.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 { useMediaContext, useMediaSelector, useMediaDispatch, MediaActionTypes } from \"../../context/media-context\"\nimport { cn } from \"../../lib/utils\"\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 const 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>(null)\n\tconst [isDoubleTap, setIsDoubleTap] = React.useState(false)\n\n\tconst handleTouchStart = React.useCallback((e: React.TouchEvent) => {\n\t\tif (!enabled) return\n\t\t\n\t\tconst touch = e.touches[0]\n\t\tif (!touch) return\n\t\t\n\t\tconst now = Date.now()\n\t\t\n\t\tif (touchStart && now - touchStart.time < 300) {\n\t\t\tsetIsDoubleTap(true)\n\t\t\t// Double tap to play/pause\n\t\t\tdispatch({\n\t\t\t\ttype: isPlaying ? MediaActionTypes.PAUSE : MediaActionTypes.PLAY\n\t\t\t})\n\t\t} else {\n\t\t\tsetTouchStart({\n\t\t\t\tx: touch.clientX,\n\t\t\t\ty: touch.clientY,\n\t\t\t\ttime: now\n\t\t\t})\n\t\t\tsetIsDoubleTap(false)\n\t\t}\n\t}, [enabled, touchStart, isPlaying, dispatch])\n\n\tconst handleTouchMove = React.useCallback((e: React.TouchEvent) => {\n\t\tif (!enabled || !touchStart || isDoubleTap) return\n\n\t\tconst touch = e.touches[0]\n\t\tif (!touch) return\n\t\t\n\t\tconst deltaX = touch.clientX - touchStart.x\n\t\tconst deltaY = touch.clientY - touchStart.y\n\n\t\t// Horizontal swipe for seeking\n\t\tif (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 50) {\n\t\t\tconst seekAmount = (deltaX / window.innerWidth) * 30 // 30 seconds max\n\t\t\tconst newTime = Math.max(0, Math.min(duration, currentTime + seekAmount))\n\t\t\tdispatch({\n\t\t\t\ttype: MediaActionTypes.SEEK,\n\t\t\t\tdetail: newTime\n\t\t\t})\n\t\t}\n\n\t\t// Vertical swipe for volume (right side of screen)\n\t\tif (Math.abs(deltaY) > Math.abs(deltaX) && Math.abs(deltaY) > 50 && touchStart.x > window.innerWidth / 2) {\n\t\t\tconst volumeChange = -(deltaY / window.innerHeight) * 1 // Full range\n\t\t\tconst newVolume = Math.max(0, Math.min(1, volume + volumeChange))\n\t\t\tdispatch({\n\t\t\t\ttype: MediaActionTypes.SET_VOLUME,\n\t\t\t\tdetail: newVolume\n\t\t\t})\n\t\t}\n\t}, [enabled, touchStart, isDoubleTap, duration, currentTime, volume, dispatch])\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\t\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((e: React.TouchEvent) => {\n\t\thandleControlsTouch()\n\t\thandleGestureStart(e)\n\t}, [handleControlsTouch, handleGestureStart])\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 ? MediaActionTypes.EXIT_FULLSCREEN : 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={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>\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 { useMediaSelector, useMediaDispatch, MediaActionTypes } from \"../../context/media-context\"\nimport { cn } from \"../../lib/utils\"\nimport { formatTime } from \"../../lib/format-time\"\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>\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>\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>\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>\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>\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>\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>\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((speed: number) => {\n\t\tdispatch({ type: MediaActionTypes.SET_PLAYBACK_RATE, detail: speed })\n\t\tsetIsOpen(false)\n\t}, [dispatch])\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>\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>\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>\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(chapter => \n\t\t\tcurrentTime >= chapter.startTime && currentTime < chapter.endTime\n\t\t)\n\t}, [chapters, currentTime])\n\n\treturn (\n\t\t<div className={cn(\"rounded-lg border border-white/20 bg-black/90 p-4 backdrop-blur-sm\", className)}>\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>\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>\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 { useMediaSelector, useMediaDispatch, MediaActionTypes } from \"../../context/media-context\"\nimport { cn } from \"../../lib/utils\"\nimport { formatTime } from \"../../lib/format-time\"\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>\n\t\t\t{isLoading ? (\n\t\t\t\t<div className={cn(\"animate-spin rounded-full border-2 border-white/30 border-t-white\", iconSizes[size])} />\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 = duration > 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((clientX: number) => {\n\t\tif (!progressRef.current) return 0\n\t\tconst rect = progressRef.current.getBoundingClientRect()\n\t\tconst position = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n\t\treturn position * duration\n\t}, [duration])\n\n\tconst handleMouseMove = React.useCallback((e: React.MouseEvent) => {\n\t\tif (!isDragging) {\n\t\t\tconst time = getTimeFromPosition(e.clientX)\n\t\t\tsetHoverTime(time)\n\t\t\tdispatch({ type: MediaActionTypes.PREVIEW_TIME, detail: time })\n\t\t}\n\t}, [isDragging, getTimeFromPosition, dispatch])\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((e: React.MouseEvent) => {\n\t\tsetIsDragging(true)\n\t\tconst time = getTimeFromPosition(e.clientX)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t}, [getTimeFromPosition, dispatch])\n\n\tconst handleTouchStart = React.useCallback((e: React.TouchEvent) => {\n\t\tsetIsDragging(true)\n\t\tconst time = getTimeFromPosition(e.touches[0]?.clientX || 0)\n\t\tdispatch({ type: MediaActionTypes.SEEK, detail: time })\n\t}, [getTimeFromPosition, dispatch])\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>\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>\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((newVolume: number) => {\n\t\tdispatch({ type: MediaActionTypes.SET_VOLUME, detail: newVolume })\n\t}, [dispatch])\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>\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>\n\t\t\t\t{VolumeIcon}\n\t\t\t</button>\n\n\t\t\t{/* Volume slider */}\n\t\t\t<div className={cn(\n\t\t\t\t\"absolute left-full ml-2 flex items-center transition-all duration-200\",\n\t\t\t\tshowSlider ? \"translate-x-0 opacity-100\" : \"-translate-x-2 pointer-events-none opacity-0\"\n\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>\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 && (\n\t\t\t\t\t<span className=\"-bottom-1 absolute font-bold text-[10px]\">\n\t\t\t\t\t\t{skipTime}\n\t\t\t\t\t</span>\n\t\t\t\t)}\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>\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 && (\n\t\t\t\t\t<span className=\"-bottom-1 absolute font-bold text-[10px]\">\n\t\t\t\t\t\t{skipTime}\n\t\t\t\t\t</span>\n\t\t\t\t)}\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)}>\n\t\t\t{displayTime}\n\t\t</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 className={cn(\"flex flex-col gap-4 bg-gradient-to-t from-black/80 to-transparent p-4\", className)}>\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 \n\t\t\t\t\t\tsize={playButtonSize}\n\t\t\t\t\t\tclassName=\"shrink-0\" \n\t\t\t\t\t/>\n\n\t\t\t\t\t{showSkipButtons && (\n\t\t\t\t\t\t<EnhancedForwardButton \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{showVolumeControl && (\n\t\t\t\t\t\t<EnhancedVolumeControl className=\"shrink-0\" />\n\t\t\t\t\t)}\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\n\t\t\t\t\t\t\tmetrics={performanceMetrics}\n\t\t\t\t\t\t\tclassName=\"text-white/80\"\n\t\t\t\t\t\t/>\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'>('performance');\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\">{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)} MB</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\">{(performanceMetrics.bufferHealth || 0).toFixed(2)}s</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\">{formatBytes(performanceMetrics.networkBandwidth || 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\">{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\">{(preloadingStats.engagementScore || 0).toFixed(1)}%</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\">• {plugin}</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 && pluginInfo.loadedPlugins.length > (pluginInfo.activePlugins?.length ?? 0) && (\n\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t<span className=\"text-yellow-400\">Loaded (inactive):</span>\n\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{pluginInfo.loadedPlugins\n\t\t\t\t\t\t\t\t.filter(plugin => !pluginInfo.activePlugins?.includes(plugin))\n\t\t\t\t\t\t\t\t.map((plugin, index) => (\n\t\t\t\t\t\t\t\t\t<div key={index} className=\"text-yellow-300\">• {plugin}</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\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 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>\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>\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>\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 d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\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 d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\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\">{((performanceMetrics.memoryUsage || 0) / 1024 / 1024).toFixed(1)}MB</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\">\n\t\t\t\t\t\t{renderTabContent()}\n\t\t\t\t\t</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<Omit<DebugPanelProps, 'position' | 'defaultCollapsed' | 'title'>> = (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;"],"names":["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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"}