@therealtinhtute/baroiplayer 1.0.0

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 (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +384 -0
  3. package/dist/context/media.js +2 -0
  4. package/dist/context/media.js.map +1 -0
  5. package/dist/context/media.mjs +15 -0
  6. package/dist/context/media.mjs.map +1 -0
  7. package/dist/context/store.js +2 -0
  8. package/dist/context/store.js.map +1 -0
  9. package/dist/context/store.mjs +5 -0
  10. package/dist/context/store.mjs.map +1 -0
  11. package/dist/context-BMteAJDN.js +1140 -0
  12. package/dist/context-BMteAJDN.js.map +1 -0
  13. package/dist/context-DCJ_scmO.cjs +23 -0
  14. package/dist/context-DCJ_scmO.cjs.map +1 -0
  15. package/dist/core-events-B5W_j8yU.js +480 -0
  16. package/dist/core-events-B5W_j8yU.js.map +1 -0
  17. package/dist/core-events-CN0-Vhhq.cjs +2 -0
  18. package/dist/core-events-CN0-Vhhq.cjs.map +1 -0
  19. package/dist/core-plugins-Bq9KLany.js +696 -0
  20. package/dist/core-plugins-Bq9KLany.js.map +1 -0
  21. package/dist/core-plugins-CPDSHMiQ.cjs +2 -0
  22. package/dist/core-plugins-CPDSHMiQ.cjs.map +1 -0
  23. package/dist/core.js +37 -0
  24. package/dist/core.js.map +1 -0
  25. package/dist/core.mjs +1217 -0
  26. package/dist/core.mjs.map +1 -0
  27. package/dist/enhanced-components-DHv0MFvG.js +1073 -0
  28. package/dist/enhanced-components-DHv0MFvG.js.map +1 -0
  29. package/dist/enhanced-components-DTIObgB7.cjs +2 -0
  30. package/dist/enhanced-components-DTIObgB7.cjs.map +1 -0
  31. package/dist/hooks-C_r8wexn.cjs +4 -0
  32. package/dist/hooks-C_r8wexn.cjs.map +1 -0
  33. package/dist/hooks-Da2wVXlF.js +1630 -0
  34. package/dist/hooks-Da2wVXlF.js.map +1 -0
  35. package/dist/index.css +1 -0
  36. package/dist/index.js +112 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/index.mjs +6126 -0
  39. package/dist/index.mjs.map +1 -0
  40. package/dist/minimal-components-DSq5sQpy.js +2002 -0
  41. package/dist/minimal-components-DSq5sQpy.js.map +1 -0
  42. package/dist/minimal-components-DflWiihN.cjs +2 -0
  43. package/dist/minimal-components-DflWiihN.cjs.map +1 -0
  44. package/dist/minimal-components.css +1 -0
  45. package/dist/mona-loading.gif +0 -0
  46. package/dist/performance-monitor-CUW6f5ll.cjs +2 -0
  47. package/dist/performance-monitor-CUW6f5ll.cjs.map +1 -0
  48. package/dist/performance-monitor-rMW1RgV3.js +302 -0
  49. package/dist/performance-monitor-rMW1RgV3.js.map +1 -0
  50. package/dist/utils-BnscpYYd.js +2798 -0
  51. package/dist/utils-BnscpYYd.js.map +1 -0
  52. package/dist/utils-D_czS_0K.cjs +9 -0
  53. package/dist/utils-D_czS_0K.cjs.map +1 -0
  54. package/dist/utils.js +2 -0
  55. package/dist/utils.js.map +1 -0
  56. package/dist/utils.mjs +7 -0
  57. package/dist/utils.mjs.map +1 -0
  58. package/package.json +114 -0
  59. package/src/adapters/videojs-adapter.tsx +470 -0
  60. package/src/assets/mona-loading.gif +0 -0
  61. package/src/components/AnimateLoading.tsx +115 -0
  62. package/src/components/LoadingState.tsx +248 -0
  63. package/src/components/accessibility/keyboard-help-overlay.tsx +213 -0
  64. package/src/components/audio-player.tsx +85 -0
  65. package/src/components/basic/index.ts +37 -0
  66. package/src/components/enhanced/advanced-features.tsx +316 -0
  67. package/src/components/enhanced/debug-panel.tsx +422 -0
  68. package/src/components/enhanced/enhanced-controls.tsx +600 -0
  69. package/src/components/enhanced/enhanced-media-player.tsx +509 -0
  70. package/src/components/enhanced/error-handling.tsx +345 -0
  71. package/src/components/enhanced/index.ts +39 -0
  72. package/src/components/enhanced/media-player-enhanced.tsx +349 -0
  73. package/src/components/examples/basic-video-player.tsx +55 -0
  74. package/src/components/examples/custom-controls-example.tsx +63 -0
  75. package/src/components/examples/enhanced-controls-example.tsx +114 -0
  76. package/src/components/examples/enhanced-media-player-example.tsx +293 -0
  77. package/src/components/examples/loading-states-demo.tsx +142 -0
  78. package/src/components/examples/react-19-demo.tsx +381 -0
  79. package/src/components/examples/volume-orientation-demo.tsx +114 -0
  80. package/src/components/icon-demo.tsx +209 -0
  81. package/src/components/icons/index.tsx +166 -0
  82. package/src/components/icons/svg-icons/ArrowLeftIcon.tsx +18 -0
  83. package/src/components/icons/svg-icons/ArrowRightIcon.tsx +18 -0
  84. package/src/components/icons/svg-icons/AudioIcon.tsx +22 -0
  85. package/src/components/icons/svg-icons/BackwardIcon.tsx +12 -0
  86. package/src/components/icons/svg-icons/CameraIcon.tsx +19 -0
  87. package/src/components/icons/svg-icons/CheckIcon.tsx +19 -0
  88. package/src/components/icons/svg-icons/EnablePiPIcon.tsx +17 -0
  89. package/src/components/icons/svg-icons/ForwardIcon.tsx +12 -0
  90. package/src/components/icons/svg-icons/FullscreenEnterIcon.tsx +23 -0
  91. package/src/components/icons/svg-icons/FullscreenExitIcon.tsx +23 -0
  92. package/src/components/icons/svg-icons/LoadingIcon.tsx +32 -0
  93. package/src/components/icons/svg-icons/PauseIcon.tsx +23 -0
  94. package/src/components/icons/svg-icons/PlayIcon.tsx +21 -0
  95. package/src/components/icons/svg-icons/PlaybackSpeedIcon.tsx +23 -0
  96. package/src/components/icons/svg-icons/QualityIcon.tsx +21 -0
  97. package/src/components/icons/svg-icons/SettingsIcon.tsx +12 -0
  98. package/src/components/icons/svg-icons/SliderIcon.tsx +21 -0
  99. package/src/components/icons/svg-icons/SubtitleIcon.tsx +21 -0
  100. package/src/components/icons/svg-icons/SubtitleOffIcon.tsx +25 -0
  101. package/src/components/icons/svg-icons/UnPiPIcon.tsx +17 -0
  102. package/src/components/icons/svg-icons/VolumeMutedIcon.tsx +16 -0
  103. package/src/components/icons/svg-icons/VolumeOneIcon.tsx +22 -0
  104. package/src/components/icons/svg-icons/VolumeThreeIcon.tsx +16 -0
  105. package/src/components/icons/svg-icons/VolumeTwoIcon.tsx +16 -0
  106. package/src/components/legacy.tsx +93 -0
  107. package/src/components/media-metadata-display.tsx +100 -0
  108. package/src/components/media-player-audio.tsx +39 -0
  109. package/src/components/media-player-controls.tsx +226 -0
  110. package/src/components/media-player-error.tsx +163 -0
  111. package/src/components/media-player-fullscreen.tsx +109 -0
  112. package/src/components/media-player-hls.tsx +111 -0
  113. package/src/components/media-player-loading.tsx +76 -0
  114. package/src/components/media-player-play.tsx +75 -0
  115. package/src/components/media-player-root.tsx +340 -0
  116. package/src/components/media-player-seek.tsx +168 -0
  117. package/src/components/media-player-time.tsx +99 -0
  118. package/src/components/media-player-tooltip.tsx +58 -0
  119. package/src/components/media-player-video.tsx +39 -0
  120. package/src/components/media-player-volume.tsx +155 -0
  121. package/src/components/media-player.tsx +257 -0
  122. package/src/components/media-suspense.tsx +362 -0
  123. package/src/components/player-settings-form.tsx +163 -0
  124. package/src/components/react-player-wrapper.tsx +651 -0
  125. package/src/components/simple-video-player.tsx +60 -0
  126. package/src/components/ui/enhanced-seek-bar.tsx +235 -0
  127. package/src/components/ui/fullscreen-button.tsx +60 -0
  128. package/src/components/ui/media-resource-preloader.tsx +395 -0
  129. package/src/components/ui/play-button.tsx +107 -0
  130. package/src/components/ui/seek-bar.tsx +161 -0
  131. package/src/components/ui/time-display.tsx +40 -0
  132. package/src/components/ui/volume-control.tsx +143 -0
  133. package/src/components/unified/base-media-player.tsx +246 -0
  134. package/src/components/unified/media-player.tsx +75 -0
  135. package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +561 -0
  136. package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +552 -0
  137. package/src/components/variants/minimal/MinimalControls.tsx +142 -0
  138. package/src/components/variants/minimal/MinimalLoading.tsx +32 -0
  139. package/src/components/variants/minimal/MinimalMediaPlayer.tsx +315 -0
  140. package/src/components/variants/minimal/MinimalOverlay.tsx +64 -0
  141. package/src/components/variants/minimal/MinimalPlayButton.tsx +65 -0
  142. package/src/components/variants/minimal/MinimalSeekBar.tsx +150 -0
  143. package/src/components/variants/minimal/MinimalVolumeControl.tsx +80 -0
  144. package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +210 -0
  145. package/src/components/variants/minimal/components/CenterPlayButton.tsx +22 -0
  146. package/src/components/variants/minimal/components/ControlBar.tsx +146 -0
  147. package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +361 -0
  148. package/src/components/variants/minimal/components/PlaybackControls.tsx +51 -0
  149. package/src/components/variants/minimal/components/RightControls.tsx +173 -0
  150. package/src/components/variants/minimal/components/SeekBar.tsx +131 -0
  151. package/src/components/variants/minimal/components/SettingsDropdown.tsx +70 -0
  152. package/src/components/variants/minimal/components/SubtitleDisplay.tsx +21 -0
  153. package/src/components/variants/minimal/components/TimeDisplay.tsx +18 -0
  154. package/src/components/variants/minimal/components/VideoElement.tsx +40 -0
  155. package/src/components/variants/minimal/components/VolumeControl.tsx +217 -0
  156. package/src/components/variants/minimal/index.ts +23 -0
  157. package/src/components/video-player.tsx +100 -0
  158. package/src/context/error-handling.ts +394 -0
  159. package/src/context/media-context.tsx +208 -0
  160. package/src/context/media-provider.tsx +265 -0
  161. package/src/context/media-store.ts +379 -0
  162. package/src/context/persistence.ts +453 -0
  163. package/src/core/events/event-system.ts +442 -0
  164. package/src/core/events/hooks.ts +302 -0
  165. package/src/core/events/index.ts +22 -0
  166. package/src/core/events/middleware.ts +269 -0
  167. package/src/core/index.ts +22 -0
  168. package/src/core/optimization/bundle-optimizer.tsx +308 -0
  169. package/src/core/performance/cicd.ts +96 -0
  170. package/src/core/performance/index.ts +38 -0
  171. package/src/core/performance/media-loading-optimizer.ts +538 -0
  172. package/src/core/performance/performance-budgets.ts +432 -0
  173. package/src/core/performance/performance-monitor.tsx +476 -0
  174. package/src/core/performance/performance-testing.ts +459 -0
  175. package/src/core/plugins/base-plugin.ts +224 -0
  176. package/src/core/plugins/enhanced-plugin-system.ts +411 -0
  177. package/src/core/plugins/examples/analytics-plugin.ts +242 -0
  178. package/src/core/plugins/index.ts +39 -0
  179. package/src/core/plugins/registry.ts +327 -0
  180. package/src/core/plugins/types.ts +159 -0
  181. package/src/core/plugins/utils.ts +316 -0
  182. package/src/core/progressive-loading.tsx +322 -0
  183. package/src/core/providers/enhanced-hls-provider.ts +339 -0
  184. package/src/core/providers/service-provider.tsx +168 -0
  185. package/src/core/utils.tsx +38 -0
  186. package/src/features/media-session/media-session-manager.ts +429 -0
  187. package/src/features/picture-in-picture/pip-manager.ts +429 -0
  188. package/src/features/playlist/playlist-manager.ts +606 -0
  189. package/src/features/subtitles/subtitle-manager.ts +441 -0
  190. package/src/features/subtitles/subtitle-parser.ts +280 -0
  191. package/src/features/thumbnails/thumbnail-generator.ts +519 -0
  192. package/src/hooks/accessibility/index.ts +27 -0
  193. package/src/hooks/accessibility/use-accessibility-preferences.ts +188 -0
  194. package/src/hooks/accessibility/use-focus-management.ts +176 -0
  195. package/src/hooks/accessibility/use-keyboard-shortcuts.ts +144 -0
  196. package/src/hooks/accessibility/use-screen-reader.ts +182 -0
  197. package/src/hooks/core/index.ts +47 -0
  198. package/src/hooks/legacy.ts +27 -0
  199. package/src/hooks/use-enhanced-media-player.ts +468 -0
  200. package/src/hooks/use-intelligent-preloading.ts +358 -0
  201. package/src/hooks/use-keyboard-controls.ts +115 -0
  202. package/src/hooks/use-media-actions.ts +175 -0
  203. package/src/hooks/use-media-metadata.ts +89 -0
  204. package/src/hooks/use-media-optimistic.ts +270 -0
  205. package/src/hooks/use-media-player.ts +312 -0
  206. package/src/hooks/use-media-state.ts +190 -0
  207. package/src/hooks/use-memory-optimization.ts +358 -0
  208. package/src/hooks/use-optimistic-controls.ts +92 -0
  209. package/src/hooks/use-optimized-media.ts +263 -0
  210. package/src/hooks/use-touch-gestures.ts +417 -0
  211. package/src/hooks/useEnhancedSubtitles.ts +258 -0
  212. package/src/hooks/useKeyboardShortcuts.ts +74 -0
  213. package/src/hooks/useMediaControls.ts +52 -0
  214. package/src/hooks/useScreenshot.ts +57 -0
  215. package/src/hooks/useSubtitles.ts +91 -0
  216. package/src/hooks/useVideoPlayer.ts +232 -0
  217. package/src/icons/components/FullscreenIcon.tsx +37 -0
  218. package/src/icons/components/SettingsIcon.tsx +38 -0
  219. package/src/icons/components/animated/LoadingIcon.tsx +43 -0
  220. package/src/icons/components/animated/PlayPauseIcon.tsx +50 -0
  221. package/src/icons/components/media/PauseIcon.tsx +39 -0
  222. package/src/icons/components/media/PlayIcon.tsx +38 -0
  223. package/src/icons/components/volume/VolumeIcon.tsx +39 -0
  224. package/src/icons/components/volume/VolumeOffIcon.tsx +39 -0
  225. package/src/icons/index.ts +56 -0
  226. package/src/icons/provider.tsx +64 -0
  227. package/src/icons/types.ts +40 -0
  228. package/src/index-enhanced.ts +35 -0
  229. package/src/index-legacy.ts +326 -0
  230. package/src/index.css +102 -0
  231. package/src/index.ts +216 -0
  232. package/src/lib/deprecation.ts +51 -0
  233. package/src/lib/format-time.ts +37 -0
  234. package/src/lib/index.ts +3 -0
  235. package/src/lib/utils.ts +6 -0
  236. package/src/styles/globals.css +462 -0
  237. package/src/styles/minimal-player.css +589 -0
  238. package/src/styles/pixel-art.css +46 -0
  239. package/src/styles/videojs.css +100 -0
  240. package/src/test/setup.ts +79 -0
  241. package/src/types/events.ts +47 -0
  242. package/src/types/formats.ts +95 -0
  243. package/src/types/index.ts +190 -0
  244. package/src/types/videojs-plugins.d.ts +14 -0
@@ -0,0 +1,302 @@
1
+ var u = Object.defineProperty;
2
+ var p = (n, e, r) => e in n ? u(n, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : n[e] = r;
3
+ var d = (n, e, r) => p(n, typeof e != "symbol" ? e + "" : e, r);
4
+ import { j as t } from "./context-BMteAJDN.js";
5
+ import { useState as m, useEffect as g, useCallback as b, useRef as M } from "react";
6
+ const x = {
7
+ lcp: { good: 2500, poor: 4e3 },
8
+ fid: { good: 100, poor: 300 },
9
+ cls: { good: 0.1, poor: 0.25 },
10
+ renderTime: { good: 16, poor: 100 },
11
+ // Target 60fps = 16.67ms per frame
12
+ memoryUsage: { good: 50 * 1024 * 1024, poor: 100 * 1024 * 1024 }
13
+ // 50MB good, 100MB poor
14
+ };
15
+ class v {
16
+ constructor(e = x) {
17
+ d(this, "metrics", []);
18
+ d(this, "listeners", /* @__PURE__ */ new Set());
19
+ d(this, "thresholds");
20
+ d(this, "observer");
21
+ d(this, "isMonitoring", !1);
22
+ this.thresholds = e, this.initializeWebVitals(), this.initializePerformanceObserver();
23
+ }
24
+ async initializeWebVitals() {
25
+ if (!(typeof window > "u"))
26
+ try {
27
+ const e = await import("web-vitals").catch(() => null);
28
+ if (!e) {
29
+ console.warn("web-vitals package not available, Core Web Vitals tracking disabled");
30
+ return;
31
+ }
32
+ const r = (o) => {
33
+ this.updateMetric(o.name.toLowerCase(), o.value);
34
+ }, s = e;
35
+ s.getCLS && s.getCLS(r), s.getFID && s.getFID(r), s.getFCP && s.getFCP(r), s.getLCP && s.getLCP(r), s.getTTFB && s.getTTFB(r), s.onINP && s.onINP(r);
36
+ } catch (e) {
37
+ console.warn("Web Vitals initialization failed:", e);
38
+ }
39
+ }
40
+ initializePerformanceObserver() {
41
+ if (!(typeof window > "u" || !("PerformanceObserver" in window)))
42
+ try {
43
+ this.observer = new PerformanceObserver((e) => {
44
+ for (const r of e.getEntries())
45
+ this.handlePerformanceEntry(r);
46
+ }), this.observer.observe({ entryTypes: ["measure", "navigation", "resource", "paint"] });
47
+ } catch (e) {
48
+ console.warn("PerformanceObserver not supported:", e);
49
+ }
50
+ }
51
+ handlePerformanceEntry(e) {
52
+ switch (e.entryType) {
53
+ case "measure":
54
+ e.name.startsWith("baroiplayer-render") && this.updateMetric("componentRenderTime", e.duration);
55
+ break;
56
+ case "resource":
57
+ (e.name.includes(".js") || e.name.includes(".css")) && this.updateMetric("bundleLoadTime", e.duration);
58
+ break;
59
+ case "paint":
60
+ e.name === "first-contentful-paint" && this.updateMetric("fcp", e.startTime);
61
+ break;
62
+ }
63
+ }
64
+ updateMetric(e, r) {
65
+ const s = this.getCurrentMetrics(), o = {
66
+ ...s,
67
+ [e]: r,
68
+ timestamp: Date.now(),
69
+ performanceScore: this.calculatePerformanceScore({ ...s, [e]: r })
70
+ };
71
+ this.metrics.push(o), this.metrics.length > 100 && (this.metrics = this.metrics.slice(-100)), this.listeners.forEach((i) => i(o));
72
+ }
73
+ getCurrentMetrics() {
74
+ return this.metrics[this.metrics.length - 1] || {
75
+ componentRenderTime: 0,
76
+ bundleLoadTime: 0,
77
+ mediaLoadTime: 0,
78
+ memoryUsage: this.getMemoryUsage(),
79
+ performanceScore: 0,
80
+ timestamp: Date.now()
81
+ };
82
+ }
83
+ getMemoryUsage() {
84
+ return "memory" in performance && performance.memory.usedJSHeapSize || 0;
85
+ }
86
+ calculatePerformanceScore(e) {
87
+ let r = 100;
88
+ return e.lcp && e.lcp > this.thresholds.lcp.good && (r -= e.lcp > this.thresholds.lcp.poor ? 30 : 15), e.fid && e.fid > this.thresholds.fid.good && (r -= e.fid > this.thresholds.fid.poor ? 25 : 10), e.cls && e.cls > this.thresholds.cls.good && (r -= e.cls > this.thresholds.cls.poor ? 20 : 10), e.componentRenderTime > this.thresholds.renderTime.good && (r -= e.componentRenderTime > this.thresholds.renderTime.poor ? 20 : 10), e.memoryUsage > this.thresholds.memoryUsage.good && (r -= e.memoryUsage > this.thresholds.memoryUsage.poor ? 15 : 5), Math.max(0, r);
89
+ }
90
+ // Public API
91
+ startMonitoring() {
92
+ this.isMonitoring = !0, this.startMemoryMonitoring();
93
+ }
94
+ stopMonitoring() {
95
+ this.isMonitoring = !1, this.observer && this.observer.disconnect();
96
+ }
97
+ startMemoryMonitoring() {
98
+ this.isMonitoring && (this.updateMetric("memoryUsage", this.getMemoryUsage()), setTimeout(() => this.startMemoryMonitoring(), 5e3));
99
+ }
100
+ measureComponentRender(e, r) {
101
+ const s = `baroiplayer-render-${e}-start`, o = `baroiplayer-render-${e}-end`, i = `baroiplayer-render-${e}`;
102
+ performance.mark(s);
103
+ const a = r();
104
+ performance.mark(o);
105
+ try {
106
+ performance.measure(i, s, o);
107
+ } catch (c) {
108
+ console.warn("Performance measurement failed:", c);
109
+ }
110
+ return a;
111
+ }
112
+ subscribe(e) {
113
+ return this.listeners.add(e), () => this.listeners.delete(e);
114
+ }
115
+ getLatestMetrics() {
116
+ return this.metrics[this.metrics.length - 1] || null;
117
+ }
118
+ getAllMetrics() {
119
+ return [...this.metrics];
120
+ }
121
+ getAverageMetrics(e = 10) {
122
+ const r = this.metrics.slice(-e);
123
+ if (r.length === 0) return {};
124
+ const s = {};
125
+ return [
126
+ "lcp",
127
+ "fid",
128
+ "cls",
129
+ "fcp",
130
+ "ttfb",
131
+ "inp",
132
+ "componentRenderTime",
133
+ "bundleLoadTime",
134
+ "mediaLoadTime",
135
+ "memoryUsage",
136
+ "performanceScore"
137
+ ].forEach((i) => {
138
+ const a = r.map((c) => c[i]).filter((c) => typeof c == "number" && !isNaN(c));
139
+ a.length > 0 && (s[i] = a.reduce((c, f) => c + f, 0) / a.length);
140
+ }), s;
141
+ }
142
+ getThresholds() {
143
+ return this.thresholds;
144
+ }
145
+ updateThresholds(e) {
146
+ this.thresholds = { ...this.thresholds, ...e };
147
+ }
148
+ }
149
+ const l = new v();
150
+ function h() {
151
+ const [n, e] = m(null), [r, s] = m(!0);
152
+ g(() => {
153
+ if (s(typeof window < "u" && "performance" in window), !r) return;
154
+ l.startMonitoring();
155
+ const i = l.subscribe(e);
156
+ return () => {
157
+ i(), l.stopMonitoring();
158
+ };
159
+ }, [r]);
160
+ const o = b(
161
+ (i, a) => l.measureComponentRender(i, a),
162
+ []
163
+ );
164
+ return {
165
+ metrics: n,
166
+ isSupported: r,
167
+ measureRender: o,
168
+ averageMetrics: l.getAverageMetrics(),
169
+ allMetrics: l.getAllMetrics(),
170
+ thresholds: l.getThresholds()
171
+ };
172
+ }
173
+ function w(n, e) {
174
+ const r = e || n.displayName || n.name || "Component";
175
+ function s(o) {
176
+ const i = M(0), { measureRender: a } = h();
177
+ return a(`${r}-${i.current++}`, () => /* @__PURE__ */ t.jsx(n, { ...o }));
178
+ }
179
+ return s.displayName = `withPerformanceMonitoring(${r})`, s;
180
+ }
181
+ class P {
182
+ constructor() {
183
+ d(this, "baselineMetrics", null);
184
+ d(this, "regressionThreshold", 0.2);
185
+ }
186
+ // 20% degradation threshold
187
+ setBaseline(e) {
188
+ this.baselineMetrics = e;
189
+ }
190
+ detectRegression(e) {
191
+ if (!this.baselineMetrics) return [];
192
+ const r = [];
193
+ return [
194
+ "componentRenderTime",
195
+ "bundleLoadTime",
196
+ "mediaLoadTime",
197
+ "memoryUsage"
198
+ ].forEach((o) => {
199
+ const i = this.baselineMetrics[o], a = e[o];
200
+ if (i && a && i > 0) {
201
+ const c = (a - i) / i;
202
+ c > this.regressionThreshold && r.push({ metric: o, baseline: i, current: a, degradation: c });
203
+ }
204
+ }), r;
205
+ }
206
+ setRegressionThreshold(e) {
207
+ this.regressionThreshold = Math.max(0, Math.min(1, e));
208
+ }
209
+ }
210
+ function S({
211
+ className: n = "",
212
+ showAdvanced: e = !1
213
+ }) {
214
+ const { metrics: r, averageMetrics: s, isSupported: o } = h();
215
+ if (!o || !r)
216
+ return /* @__PURE__ */ t.jsx("div", { className: `performance-dashboard ${n}`, children: /* @__PURE__ */ t.jsx("p", { children: "Performance monitoring not supported in this environment" }) });
217
+ const i = (c) => c >= 90 ? "text-green-600" : c >= 70 ? "text-yellow-600" : "text-red-600", a = (c) => `${(c / 1024 / 1024).toFixed(2)} MB`;
218
+ return /* @__PURE__ */ t.jsxs("div", { className: `performance-dashboard rounded-lg bg-white p-4 shadow ${n}`, children: [
219
+ /* @__PURE__ */ t.jsx("h3", { className: "mb-4 font-semibold text-lg", children: "Performance Dashboard" }),
220
+ /* @__PURE__ */ t.jsxs("div", { className: "mb-4", children: [
221
+ /* @__PURE__ */ t.jsxs("div", { className: "flex items-center justify-between", children: [
222
+ /* @__PURE__ */ t.jsx("span", { children: "Performance Score" }),
223
+ /* @__PURE__ */ t.jsx("span", { className: `font-bold ${i(r.performanceScore)}`, children: r.performanceScore.toFixed(0) })
224
+ ] }),
225
+ /* @__PURE__ */ t.jsx("div", { className: "mt-1 h-2 w-full rounded-full bg-gray-200", children: /* @__PURE__ */ t.jsx(
226
+ "div",
227
+ {
228
+ className: `h-2 rounded-full transition-all duration-300 ${r.performanceScore >= 90 ? "bg-green-500" : r.performanceScore >= 70 ? "bg-yellow-500" : "bg-red-500"}`,
229
+ style: { width: `${r.performanceScore}%` }
230
+ }
231
+ ) })
232
+ ] }),
233
+ /* @__PURE__ */ t.jsxs("div", { className: "mb-4 grid grid-cols-2 gap-4", children: [
234
+ /* @__PURE__ */ t.jsxs("div", { children: [
235
+ /* @__PURE__ */ t.jsx("h4", { className: "mb-2 font-medium", children: "Core Web Vitals" }),
236
+ /* @__PURE__ */ t.jsxs("div", { className: "space-y-1 text-sm", children: [
237
+ r.lcp && /* @__PURE__ */ t.jsxs("div", { children: [
238
+ "LCP: ",
239
+ r.lcp.toFixed(0),
240
+ "ms"
241
+ ] }),
242
+ r.fid && /* @__PURE__ */ t.jsxs("div", { children: [
243
+ "FID: ",
244
+ r.fid.toFixed(0),
245
+ "ms"
246
+ ] }),
247
+ r.cls && /* @__PURE__ */ t.jsxs("div", { children: [
248
+ "CLS: ",
249
+ r.cls.toFixed(3)
250
+ ] })
251
+ ] })
252
+ ] }),
253
+ /* @__PURE__ */ t.jsxs("div", { children: [
254
+ /* @__PURE__ */ t.jsx("h4", { className: "mb-2 font-medium", children: "Custom Metrics" }),
255
+ /* @__PURE__ */ t.jsxs("div", { className: "space-y-1 text-sm", children: [
256
+ /* @__PURE__ */ t.jsxs("div", { children: [
257
+ "Render: ",
258
+ r.componentRenderTime.toFixed(2),
259
+ "ms"
260
+ ] }),
261
+ /* @__PURE__ */ t.jsxs("div", { children: [
262
+ "Memory: ",
263
+ a(r.memoryUsage)
264
+ ] }),
265
+ r.bundleLoadTime > 0 && /* @__PURE__ */ t.jsxs("div", { children: [
266
+ "Bundle: ",
267
+ r.bundleLoadTime.toFixed(0),
268
+ "ms"
269
+ ] })
270
+ ] })
271
+ ] })
272
+ ] }),
273
+ e && /* @__PURE__ */ t.jsxs("div", { children: [
274
+ /* @__PURE__ */ t.jsx("h4", { className: "mb-2 font-medium", children: "Advanced Metrics" }),
275
+ /* @__PURE__ */ t.jsxs("div", { className: "space-y-1 text-sm", children: [
276
+ /* @__PURE__ */ t.jsxs("div", { children: [
277
+ "Average Render Time: ",
278
+ (s.componentRenderTime || 0).toFixed(2),
279
+ "ms"
280
+ ] }),
281
+ /* @__PURE__ */ t.jsxs("div", { children: [
282
+ "Average Memory: ",
283
+ a(s.memoryUsage || 0)
284
+ ] }),
285
+ /* @__PURE__ */ t.jsxs("div", { children: [
286
+ "Average Score: ",
287
+ (s.performanceScore || 0).toFixed(0)
288
+ ] })
289
+ ] })
290
+ ] })
291
+ ] });
292
+ }
293
+ export {
294
+ v as P,
295
+ P as a,
296
+ S as b,
297
+ x as d,
298
+ l as p,
299
+ h as u,
300
+ w
301
+ };
302
+ //# sourceMappingURL=performance-monitor-rMW1RgV3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-monitor-rMW1RgV3.js","sources":["../src/core/performance/performance-monitor.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useCallback } from 'react';\n// Import type safely with fallback\ntype ReportHandler = (metric: { name: string; value: number }) => void;\n\n// Performance metrics types\nexport interface PerformanceMetrics {\n // Core Web Vitals\n lcp?: number; // Largest Contentful Paint\n fid?: number; // First Input Delay \n cls?: number; // Cumulative Layout Shift\n fcp?: number; // First Contentful Paint\n ttfb?: number; // Time to First Byte\n inp?: number; // Interaction to Next Paint\n\n // Custom metrics\n componentRenderTime: number;\n bundleLoadTime: number;\n mediaLoadTime: number;\n memoryUsage: number;\n \n // Performance scores\n performanceScore: number;\n timestamp: number;\n}\n\nexport interface PerformanceThresholds {\n lcp: { good: number; poor: number };\n fid: { good: number; poor: number };\n cls: { good: number; poor: number };\n renderTime: { good: number; poor: number };\n memoryUsage: { good: number; poor: number };\n}\n\nexport const defaultThresholds: PerformanceThresholds = {\n lcp: { good: 2500, poor: 4000 },\n fid: { good: 100, poor: 300 },\n cls: { good: 0.1, poor: 0.25 },\n renderTime: { good: 16, poor: 100 }, // Target 60fps = 16.67ms per frame\n memoryUsage: { good: 50 * 1024 * 1024, poor: 100 * 1024 * 1024 } // 50MB good, 100MB poor\n};\n\n// Performance monitoring class\nexport class PerformanceMonitor {\n private metrics: PerformanceMetrics[] = [];\n private listeners: Set<(metrics: PerformanceMetrics) => void> = new Set();\n private thresholds: PerformanceThresholds;\n private observer?: PerformanceObserver;\n private isMonitoring = false;\n\n constructor(thresholds: PerformanceThresholds = defaultThresholds) {\n this.thresholds = thresholds;\n this.initializeWebVitals();\n this.initializePerformanceObserver();\n }\n\n private async initializeWebVitals() {\n if (typeof window === 'undefined') return;\n \n try {\n // Try to import web-vitals dynamically and handle different versions\n const webVitals = await import('web-vitals').catch(() => null);\n \n if (!webVitals) {\n console.warn('web-vitals package not available, Core Web Vitals tracking disabled');\n return;\n }\n \n const reportHandler: ReportHandler = (metric) => {\n this.updateMetric(metric.name.toLowerCase() as keyof PerformanceMetrics, metric.value);\n };\n\n // Handle different web-vitals versions safely\n const vitalsAny = webVitals as any;\n if (vitalsAny.getCLS) vitalsAny.getCLS(reportHandler);\n if (vitalsAny.getFID) vitalsAny.getFID(reportHandler);\n if (vitalsAny.getFCP) vitalsAny.getFCP(reportHandler);\n if (vitalsAny.getLCP) vitalsAny.getLCP(reportHandler);\n if (vitalsAny.getTTFB) vitalsAny.getTTFB(reportHandler);\n if (vitalsAny.onINP) vitalsAny.onINP(reportHandler);\n } catch (error) {\n console.warn('Web Vitals initialization failed:', error);\n }\n }\n\n private initializePerformanceObserver() {\n if (typeof window === 'undefined' || !('PerformanceObserver' in window)) return;\n\n try {\n this.observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.handlePerformanceEntry(entry);\n }\n });\n\n this.observer.observe({ entryTypes: ['measure', 'navigation', 'resource', 'paint'] });\n } catch (error) {\n console.warn('PerformanceObserver not supported:', error);\n }\n }\n\n private handlePerformanceEntry(entry: PerformanceEntry) {\n switch (entry.entryType) {\n case 'measure':\n if (entry.name.startsWith('baroiplayer-render')) {\n this.updateMetric('componentRenderTime', entry.duration);\n }\n break;\n \n case 'resource':\n if (entry.name.includes('.js') || entry.name.includes('.css')) {\n this.updateMetric('bundleLoadTime', entry.duration);\n }\n break;\n \n case 'paint':\n if (entry.name === 'first-contentful-paint') {\n this.updateMetric('fcp', entry.startTime);\n }\n break;\n }\n }\n\n private updateMetric(key: keyof PerformanceMetrics, value: number) {\n const currentMetrics = this.getCurrentMetrics();\n const updatedMetrics = {\n ...currentMetrics,\n [key]: value,\n timestamp: Date.now(),\n performanceScore: this.calculatePerformanceScore({ ...currentMetrics, [key]: value })\n };\n\n this.metrics.push(updatedMetrics);\n \n // Keep only last 100 metrics\n if (this.metrics.length > 100) {\n this.metrics = this.metrics.slice(-100);\n }\n\n this.listeners.forEach(listener => listener(updatedMetrics));\n }\n\n private getCurrentMetrics(): PerformanceMetrics {\n const latest = this.metrics[this.metrics.length - 1];\n return latest || {\n componentRenderTime: 0,\n bundleLoadTime: 0,\n mediaLoadTime: 0,\n memoryUsage: this.getMemoryUsage(),\n performanceScore: 0,\n timestamp: Date.now()\n };\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 private calculatePerformanceScore(metrics: PerformanceMetrics): number {\n let score = 100;\n \n // Penalize based on thresholds\n if (metrics.lcp && metrics.lcp > this.thresholds.lcp.good) {\n score -= metrics.lcp > this.thresholds.lcp.poor ? 30 : 15;\n }\n \n if (metrics.fid && metrics.fid > this.thresholds.fid.good) {\n score -= metrics.fid > this.thresholds.fid.poor ? 25 : 10;\n }\n \n if (metrics.cls && metrics.cls > this.thresholds.cls.good) {\n score -= metrics.cls > this.thresholds.cls.poor ? 20 : 10;\n }\n \n if (metrics.componentRenderTime > this.thresholds.renderTime.good) {\n score -= metrics.componentRenderTime > this.thresholds.renderTime.poor ? 20 : 10;\n }\n \n if (metrics.memoryUsage > this.thresholds.memoryUsage.good) {\n score -= metrics.memoryUsage > this.thresholds.memoryUsage.poor ? 15 : 5;\n }\n\n return Math.max(0, score);\n }\n\n // Public API\n public startMonitoring() {\n this.isMonitoring = true;\n this.startMemoryMonitoring();\n }\n\n public stopMonitoring() {\n this.isMonitoring = false;\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n\n private startMemoryMonitoring() {\n if (!this.isMonitoring) return;\n \n this.updateMetric('memoryUsage', this.getMemoryUsage());\n setTimeout(() => this.startMemoryMonitoring(), 5000); // Check every 5 seconds\n }\n\n public measureComponentRender(componentName: string, renderFn: () => any): any {\n const startMark = `baroiplayer-render-${componentName}-start`;\n const endMark = `baroiplayer-render-${componentName}-end`;\n const measureName = `baroiplayer-render-${componentName}`;\n\n performance.mark(startMark);\n const result = renderFn();\n performance.mark(endMark);\n \n try {\n performance.measure(measureName, startMark, endMark);\n } catch (error) {\n console.warn('Performance measurement failed:', error);\n }\n\n return result;\n }\n\n public subscribe(listener: (metrics: PerformanceMetrics) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n public getLatestMetrics(): PerformanceMetrics | null {\n return this.metrics[this.metrics.length - 1] || null;\n }\n\n public getAllMetrics(): PerformanceMetrics[] {\n return [...this.metrics];\n }\n\n public getAverageMetrics(count = 10): Partial<PerformanceMetrics> {\n const recentMetrics = this.metrics.slice(-count);\n if (recentMetrics.length === 0) return {};\n\n const averages: Partial<PerformanceMetrics> = {};\n const keys: Array<keyof PerformanceMetrics> = [\n 'lcp', 'fid', 'cls', 'fcp', 'ttfb', 'inp',\n 'componentRenderTime', 'bundleLoadTime', 'mediaLoadTime',\n 'memoryUsage', 'performanceScore'\n ];\n\n keys.forEach(key => {\n const values = recentMetrics\n .map(m => m[key] as number)\n .filter(v => typeof v === 'number' && !isNaN(v));\n \n if (values.length > 0) {\n (averages as any)[key] = values.reduce((sum, v) => sum + v, 0) / values.length;\n }\n });\n\n return averages;\n }\n\n public getThresholds(): PerformanceThresholds {\n return this.thresholds;\n }\n\n public updateThresholds(newThresholds: Partial<PerformanceThresholds>) {\n this.thresholds = { ...this.thresholds, ...newThresholds };\n }\n}\n\n// Global performance monitor instance\nexport const performanceMonitor = new PerformanceMonitor();\n\n// React hook for performance monitoring\nexport function usePerformanceMonitor() {\n const [metrics, setMetrics] = useState<PerformanceMetrics | null>(null);\n const [isSupported, setIsSupported] = useState(true);\n\n useEffect(() => {\n setIsSupported(typeof window !== 'undefined' && 'performance' in window);\n \n if (!isSupported) return;\n\n performanceMonitor.startMonitoring();\n const unsubscribe = performanceMonitor.subscribe(setMetrics);\n\n return () => {\n unsubscribe();\n performanceMonitor.stopMonitoring();\n };\n }, [isSupported]);\n\n const measureRender = useCallback(\n (componentName: string, renderFn: () => any): any => {\n return performanceMonitor.measureComponentRender(componentName, renderFn);\n },\n []\n );\n\n return {\n metrics,\n isSupported,\n measureRender,\n averageMetrics: performanceMonitor.getAverageMetrics(),\n allMetrics: performanceMonitor.getAllMetrics(),\n thresholds: performanceMonitor.getThresholds()\n };\n}\n\n// HOC for performance monitoring\nexport function withPerformanceMonitoring(\n WrappedComponent: React.ComponentType<any>,\n componentName?: string\n) {\n const displayName = componentName || WrappedComponent.displayName || WrappedComponent.name || 'Component';\n \n function PerformanceMonitoredComponent(props: any) {\n const renderRef = useRef(0);\n const { measureRender } = usePerformanceMonitor();\n\n return measureRender(`${displayName}-${renderRef.current++}`, () => (\n <WrappedComponent {...props} />\n ));\n }\n\n PerformanceMonitoredComponent.displayName = `withPerformanceMonitoring(${displayName})`;\n return PerformanceMonitoredComponent;\n}\n\n// Performance regression detector\nexport class PerformanceRegressionDetector {\n private baselineMetrics: PerformanceMetrics | null = null;\n private regressionThreshold = 0.2; // 20% degradation threshold\n\n setBaseline(metrics: PerformanceMetrics) {\n this.baselineMetrics = metrics;\n }\n\n detectRegression(currentMetrics: PerformanceMetrics): Array<{\n metric: keyof PerformanceMetrics;\n baseline: number;\n current: number;\n degradation: number;\n }> {\n if (!this.baselineMetrics) return [];\n\n const regressions: Array<{\n metric: keyof PerformanceMetrics;\n baseline: number;\n current: number;\n degradation: number;\n }> = [];\n\n const metricsToCheck: Array<keyof PerformanceMetrics> = [\n 'componentRenderTime', 'bundleLoadTime', 'mediaLoadTime', 'memoryUsage'\n ];\n\n metricsToCheck.forEach(metric => {\n const baseline = this.baselineMetrics![metric] as number;\n const current = currentMetrics[metric] as number;\n \n if (baseline && current && baseline > 0) {\n const degradation = (current - baseline) / baseline;\n if (degradation > this.regressionThreshold) {\n regressions.push({ metric, baseline, current, degradation });\n }\n }\n });\n\n return regressions;\n }\n\n setRegressionThreshold(threshold: number) {\n this.regressionThreshold = Math.max(0, Math.min(1, threshold));\n }\n}\n\n// Development dashboard component\nexport interface PerformanceDashboardProps {\n className?: string;\n showAdvanced?: boolean;\n}\n\nexport function PerformanceDashboard({ \n className = '', \n showAdvanced = false \n}: PerformanceDashboardProps) {\n const { metrics, averageMetrics, thresholds, isSupported } = usePerformanceMonitor();\n\n if (!isSupported || !metrics) {\n return (\n <div className={`performance-dashboard ${className}`}>\n <p>Performance monitoring not supported in this environment</p>\n </div>\n );\n }\n\n const getScoreColor = (score: number) => {\n if (score >= 90) return 'text-green-600';\n if (score >= 70) return 'text-yellow-600';\n return 'text-red-600';\n };\n\n const formatBytes = (bytes: number) => {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n };\n\n return (\n <div className={`performance-dashboard rounded-lg bg-white p-4 shadow ${className}`}>\n <h3 className=\"mb-4 font-semibold text-lg\">Performance Dashboard</h3>\n \n {/* Performance Score */}\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between\">\n <span>Performance Score</span>\n <span className={`font-bold ${getScoreColor(metrics.performanceScore)}`}>\n {metrics.performanceScore.toFixed(0)}\n </span>\n </div>\n <div className=\"mt-1 h-2 w-full rounded-full bg-gray-200\">\n <div \n className={`h-2 rounded-full transition-all duration-300 ${\n metrics.performanceScore >= 90 ? 'bg-green-500' :\n metrics.performanceScore >= 70 ? 'bg-yellow-500' : 'bg-red-500'\n }`}\n style={{ width: `${metrics.performanceScore}%` }}\n />\n </div>\n </div>\n\n {/* Core Web Vitals */}\n <div className=\"mb-4 grid grid-cols-2 gap-4\">\n <div>\n <h4 className=\"mb-2 font-medium\">Core Web Vitals</h4>\n <div className=\"space-y-1 text-sm\">\n {metrics.lcp && (\n <div>LCP: {metrics.lcp.toFixed(0)}ms</div>\n )}\n {metrics.fid && (\n <div>FID: {metrics.fid.toFixed(0)}ms</div>\n )}\n {metrics.cls && (\n <div>CLS: {metrics.cls.toFixed(3)}</div>\n )}\n </div>\n </div>\n \n <div>\n <h4 className=\"mb-2 font-medium\">Custom Metrics</h4>\n <div className=\"space-y-1 text-sm\">\n <div>Render: {metrics.componentRenderTime.toFixed(2)}ms</div>\n <div>Memory: {formatBytes(metrics.memoryUsage)}</div>\n {metrics.bundleLoadTime > 0 && (\n <div>Bundle: {metrics.bundleLoadTime.toFixed(0)}ms</div>\n )}\n </div>\n </div>\n </div>\n\n {/* Advanced metrics */}\n {showAdvanced && (\n <div>\n <h4 className=\"mb-2 font-medium\">Advanced Metrics</h4>\n <div className=\"space-y-1 text-sm\">\n <div>Average Render Time: {(averageMetrics.componentRenderTime || 0).toFixed(2)}ms</div>\n <div>Average Memory: {formatBytes(averageMetrics.memoryUsage || 0)}</div>\n <div>Average Score: {(averageMetrics.performanceScore || 0).toFixed(0)}</div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default PerformanceMonitor;"],"names":["defaultThresholds","PerformanceMonitor","thresholds","__publicField","webVitals","reportHandler","metric","vitalsAny","error","list","entry","key","value","currentMetrics","updatedMetrics","listener","metrics","score","componentName","renderFn","startMark","endMark","measureName","result","count","recentMetrics","averages","values","m","v","sum","newThresholds","performanceMonitor","usePerformanceMonitor","setMetrics","useState","isSupported","setIsSupported","useEffect","unsubscribe","measureRender","useCallback","withPerformanceMonitoring","WrappedComponent","displayName","PerformanceMonitoredComponent","props","renderRef","useRef","jsx","PerformanceRegressionDetector","regressions","baseline","current","degradation","threshold","PerformanceDashboard","className","showAdvanced","averageMetrics","getScoreColor","formatBytes","bytes","jsxs"],"mappings":"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"}