@livepeer-frameworks/player-react 0.1.0 → 0.1.2

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 (187) hide show
  1. package/README.md +7 -9
  2. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +359 -0
  3. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  4. package/dist/cjs/assets/logomark.svg.js +8 -0
  5. package/dist/cjs/assets/logomark.svg.js.map +1 -0
  6. package/dist/cjs/components/DevModePanel.js +826 -0
  7. package/dist/cjs/components/DevModePanel.js.map +1 -0
  8. package/dist/cjs/components/DvdLogo.js +200 -0
  9. package/dist/cjs/components/DvdLogo.js.map +1 -0
  10. package/dist/cjs/components/Icons.js +439 -0
  11. package/dist/cjs/components/Icons.js.map +1 -0
  12. package/dist/cjs/components/IdleScreen.js +587 -0
  13. package/dist/cjs/components/IdleScreen.js.map +1 -0
  14. package/dist/cjs/components/LoadingScreen.js +523 -0
  15. package/dist/cjs/components/LoadingScreen.js.map +1 -0
  16. package/dist/cjs/components/Player.js +420 -0
  17. package/dist/cjs/components/Player.js.map +1 -0
  18. package/dist/cjs/components/PlayerControls.js +798 -0
  19. package/dist/cjs/components/PlayerControls.js.map +1 -0
  20. package/dist/cjs/components/PlayerErrorBoundary.js +80 -0
  21. package/dist/cjs/components/PlayerErrorBoundary.js.map +1 -0
  22. package/dist/cjs/components/SeekBar.js +253 -0
  23. package/dist/cjs/components/SeekBar.js.map +1 -0
  24. package/dist/cjs/components/SkipIndicator.js +92 -0
  25. package/dist/cjs/components/SkipIndicator.js.map +1 -0
  26. package/dist/cjs/components/SpeedIndicator.js +43 -0
  27. package/dist/cjs/components/SpeedIndicator.js.map +1 -0
  28. package/dist/cjs/components/StatsPanel.js +202 -0
  29. package/dist/cjs/components/StatsPanel.js.map +1 -0
  30. package/dist/cjs/components/StreamStateOverlay.js +229 -0
  31. package/dist/cjs/components/StreamStateOverlay.js.map +1 -0
  32. package/dist/cjs/components/ThumbnailOverlay.js +86 -0
  33. package/dist/cjs/components/ThumbnailOverlay.js.map +1 -0
  34. package/dist/cjs/components/TitleOverlay.js +32 -0
  35. package/dist/cjs/components/TitleOverlay.js.map +1 -0
  36. package/dist/cjs/context/PlayerContext.js +46 -0
  37. package/dist/cjs/context/PlayerContext.js.map +1 -0
  38. package/dist/cjs/hooks/useMetaTrack.js +165 -0
  39. package/dist/cjs/hooks/useMetaTrack.js.map +1 -0
  40. package/dist/cjs/hooks/usePlaybackQuality.js +131 -0
  41. package/dist/cjs/hooks/usePlaybackQuality.js.map +1 -0
  42. package/dist/cjs/hooks/usePlayerController.js +518 -0
  43. package/dist/cjs/hooks/usePlayerController.js.map +1 -0
  44. package/dist/cjs/hooks/usePlayerSelection.js +90 -0
  45. package/dist/cjs/hooks/usePlayerSelection.js.map +1 -0
  46. package/dist/cjs/hooks/useStreamState.js +360 -0
  47. package/dist/cjs/hooks/useStreamState.js.map +1 -0
  48. package/dist/cjs/hooks/useTelemetry.js +120 -0
  49. package/dist/cjs/hooks/useTelemetry.js.map +1 -0
  50. package/dist/cjs/hooks/useViewerEndpoints.js +222 -0
  51. package/dist/cjs/hooks/useViewerEndpoints.js.map +1 -0
  52. package/dist/cjs/index.js +97 -1
  53. package/dist/cjs/index.js.map +1 -1
  54. package/dist/cjs/ui/badge.js +34 -0
  55. package/dist/cjs/ui/badge.js.map +1 -0
  56. package/dist/cjs/ui/button.js +74 -0
  57. package/dist/cjs/ui/button.js.map +1 -0
  58. package/dist/cjs/ui/context-menu.js +163 -0
  59. package/dist/cjs/ui/context-menu.js.map +1 -0
  60. package/dist/cjs/ui/slider.js +60 -0
  61. package/dist/cjs/ui/slider.js.map +1 -0
  62. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +329 -0
  63. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  64. package/dist/esm/assets/logomark.svg.js +4 -0
  65. package/dist/esm/assets/logomark.svg.js.map +1 -0
  66. package/dist/esm/components/DevModePanel.js +822 -0
  67. package/dist/esm/components/DevModePanel.js.map +1 -0
  68. package/dist/esm/components/DvdLogo.js +196 -0
  69. package/dist/esm/components/DvdLogo.js.map +1 -0
  70. package/dist/esm/components/Icons.js +421 -0
  71. package/dist/esm/components/Icons.js.map +1 -0
  72. package/dist/esm/components/IdleScreen.js +582 -0
  73. package/dist/esm/components/IdleScreen.js.map +1 -0
  74. package/dist/esm/components/LoadingScreen.js +519 -0
  75. package/dist/esm/components/LoadingScreen.js.map +1 -0
  76. package/dist/esm/components/Player.js +416 -0
  77. package/dist/esm/components/Player.js.map +1 -0
  78. package/dist/esm/components/PlayerControls.js +794 -0
  79. package/dist/esm/components/PlayerControls.js.map +1 -0
  80. package/dist/esm/components/PlayerErrorBoundary.js +76 -0
  81. package/dist/esm/components/PlayerErrorBoundary.js.map +1 -0
  82. package/dist/esm/components/SeekBar.js +249 -0
  83. package/dist/esm/components/SeekBar.js.map +1 -0
  84. package/dist/esm/components/SkipIndicator.js +88 -0
  85. package/dist/esm/components/SkipIndicator.js.map +1 -0
  86. package/dist/esm/components/SpeedIndicator.js +39 -0
  87. package/dist/esm/components/SpeedIndicator.js.map +1 -0
  88. package/dist/esm/components/StatsPanel.js +198 -0
  89. package/dist/esm/components/StatsPanel.js.map +1 -0
  90. package/dist/esm/components/StreamStateOverlay.js +224 -0
  91. package/dist/esm/components/StreamStateOverlay.js.map +1 -0
  92. package/dist/esm/components/ThumbnailOverlay.js +82 -0
  93. package/dist/esm/components/ThumbnailOverlay.js.map +1 -0
  94. package/dist/esm/components/TitleOverlay.js +28 -0
  95. package/dist/esm/components/TitleOverlay.js.map +1 -0
  96. package/dist/esm/context/PlayerContext.js +41 -0
  97. package/dist/esm/context/PlayerContext.js.map +1 -0
  98. package/dist/esm/hooks/useMetaTrack.js +163 -0
  99. package/dist/esm/hooks/useMetaTrack.js.map +1 -0
  100. package/dist/esm/hooks/usePlaybackQuality.js +129 -0
  101. package/dist/esm/hooks/usePlaybackQuality.js.map +1 -0
  102. package/dist/esm/hooks/usePlayerController.js +516 -0
  103. package/dist/esm/hooks/usePlayerController.js.map +1 -0
  104. package/dist/esm/hooks/usePlayerSelection.js +88 -0
  105. package/dist/esm/hooks/usePlayerSelection.js.map +1 -0
  106. package/dist/esm/hooks/useStreamState.js +358 -0
  107. package/dist/esm/hooks/useStreamState.js.map +1 -0
  108. package/dist/esm/hooks/useTelemetry.js +118 -0
  109. package/dist/esm/hooks/useTelemetry.js.map +1 -0
  110. package/dist/esm/hooks/useViewerEndpoints.js +220 -0
  111. package/dist/esm/hooks/useViewerEndpoints.js.map +1 -0
  112. package/dist/esm/index.js +23 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/ui/badge.js +31 -0
  115. package/dist/esm/ui/badge.js.map +1 -0
  116. package/dist/esm/ui/button.js +52 -0
  117. package/dist/esm/ui/button.js.map +1 -0
  118. package/dist/esm/ui/context-menu.js +132 -0
  119. package/dist/esm/ui/context-menu.js.map +1 -0
  120. package/dist/esm/ui/slider.js +38 -0
  121. package/dist/esm/ui/slider.js.map +1 -0
  122. package/dist/types/components/DvdLogo.d.ts +1 -1
  123. package/dist/types/components/Icons.d.ts +1 -1
  124. package/dist/types/components/Player.d.ts +1 -1
  125. package/dist/types/components/PlayerErrorBoundary.d.ts +2 -1
  126. package/dist/types/components/StreamStateOverlay.d.ts +2 -2
  127. package/dist/types/components/SubtitleRenderer.d.ts +2 -2
  128. package/dist/types/context/PlayerContext.d.ts +2 -2
  129. package/dist/types/context/index.d.ts +2 -2
  130. package/dist/types/hooks/useMetaTrack.d.ts +3 -3
  131. package/dist/types/hooks/usePlaybackQuality.d.ts +2 -2
  132. package/dist/types/hooks/usePlayerController.d.ts +26 -3
  133. package/dist/types/hooks/usePlayerSelection.d.ts +1 -1
  134. package/dist/types/hooks/useStreamState.d.ts +1 -1
  135. package/dist/types/hooks/useTelemetry.d.ts +1 -1
  136. package/dist/types/hooks/useViewerEndpoints.d.ts +3 -3
  137. package/dist/types/index.d.ts +28 -28
  138. package/dist/types/types.d.ts +3 -3
  139. package/dist/types/ui/select.d.ts +1 -1
  140. package/package.json +22 -14
  141. package/src/components/DevModePanel.tsx +244 -143
  142. package/src/components/DvdLogo.tsx +1 -1
  143. package/src/components/Icons.tsx +105 -25
  144. package/src/components/IdleScreen.tsx +262 -128
  145. package/src/components/LoadingScreen.tsx +169 -151
  146. package/src/components/LogoOverlay.tsx +3 -6
  147. package/src/components/Player.tsx +126 -59
  148. package/src/components/PlayerControls.tsx +384 -272
  149. package/src/components/PlayerErrorBoundary.tsx +7 -13
  150. package/src/components/SeekBar.tsx +96 -88
  151. package/src/components/SkipIndicator.tsx +2 -12
  152. package/src/components/SpeedIndicator.tsx +2 -11
  153. package/src/components/StatsPanel.tsx +31 -22
  154. package/src/components/StreamStateOverlay.tsx +105 -49
  155. package/src/components/SubtitleRenderer.tsx +29 -29
  156. package/src/components/ThumbnailOverlay.tsx +5 -6
  157. package/src/components/TitleOverlay.tsx +2 -8
  158. package/src/context/PlayerContext.tsx +4 -8
  159. package/src/context/index.ts +3 -3
  160. package/src/hooks/useMetaTrack.ts +27 -27
  161. package/src/hooks/usePlaybackQuality.ts +3 -3
  162. package/src/hooks/usePlayerController.ts +246 -138
  163. package/src/hooks/usePlayerSelection.ts +6 -6
  164. package/src/hooks/useStreamState.ts +51 -56
  165. package/src/hooks/useTelemetry.ts +18 -3
  166. package/src/hooks/useViewerEndpoints.ts +34 -23
  167. package/src/index.tsx +36 -28
  168. package/src/types.ts +8 -8
  169. package/src/ui/badge.tsx +6 -5
  170. package/src/ui/button.tsx +9 -8
  171. package/src/ui/context-menu.tsx +42 -61
  172. package/src/ui/select.tsx +13 -7
  173. package/src/ui/slider.tsx +18 -29
  174. package/dist/types/components/players/DashJsPlayer.d.ts +0 -18
  175. package/dist/types/components/players/HlsJsPlayer.d.ts +0 -18
  176. package/dist/types/components/players/MewsWsPlayer/index.d.ts +0 -18
  177. package/dist/types/components/players/MistPlayer.d.ts +0 -20
  178. package/dist/types/components/players/MistWebRTCPlayer/index.d.ts +0 -20
  179. package/dist/types/components/players/NativePlayer.d.ts +0 -19
  180. package/dist/types/components/players/VideoJsPlayer.d.ts +0 -18
  181. package/src/components/players/DashJsPlayer.tsx +0 -56
  182. package/src/components/players/HlsJsPlayer.tsx +0 -56
  183. package/src/components/players/MewsWsPlayer/index.tsx +0 -56
  184. package/src/components/players/MistPlayer.tsx +0 -60
  185. package/src/components/players/MistWebRTCPlayer/index.tsx +0 -59
  186. package/src/components/players/NativePlayer.tsx +0 -58
  187. package/src/components/players/VideoJsPlayer.tsx +0 -56
@@ -0,0 +1,587 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var React = require('react');
8
+ var DvdLogo = require('./DvdLogo.js');
9
+ var logomark = require('../assets/logomark.svg.js');
10
+
11
+ var AnimatedBubble = function AnimatedBubble(_ref) {
12
+ var index = _ref.index;
13
+ var _useState = React.useState({
14
+ top: 0,
15
+ left: 0
16
+ }),
17
+ _useState2 = _rollupPluginBabelHelpers.slicedToArray(_useState, 2),
18
+ position = _useState2[0],
19
+ setPosition = _useState2[1];
20
+ var _useState3 = React.useState(40),
21
+ _useState4 = _rollupPluginBabelHelpers.slicedToArray(_useState3, 2),
22
+ size = _useState4[0],
23
+ setSize = _useState4[1];
24
+ var _useState5 = React.useState(0),
25
+ _useState6 = _rollupPluginBabelHelpers.slicedToArray(_useState5, 2),
26
+ opacity = _useState6[0],
27
+ setOpacity = _useState6[1];
28
+ var getRandomPosition = function getRandomPosition() {
29
+ return {
30
+ top: Math.random() * 80 + 10,
31
+ left: Math.random() * 80 + 10
32
+ };
33
+ };
34
+ var getRandomSize = function getRandomSize() {
35
+ return Math.random() * 60 + 30;
36
+ };
37
+ React.useEffect(function () {
38
+ setPosition(getRandomPosition());
39
+ setSize(getRandomSize());
40
+ var _animationCycle = function animationCycle() {
41
+ setOpacity(0.15);
42
+ setTimeout(function () {
43
+ setOpacity(0);
44
+ setTimeout(function () {
45
+ setPosition(getRandomPosition());
46
+ setSize(getRandomSize());
47
+ setTimeout(function () {
48
+ _animationCycle();
49
+ }, 200);
50
+ }, 1500);
51
+ }, 4000 + Math.random() * 3000);
52
+ };
53
+ var timeout = setTimeout(_animationCycle, index * 500);
54
+ return function () {
55
+ return clearTimeout(timeout);
56
+ };
57
+ }, [index]);
58
+ var bubbleColors = ["rgba(122, 162, 247, 0.2)", "rgba(187, 154, 247, 0.2)", "rgba(158, 206, 106, 0.2)", "rgba(115, 218, 202, 0.2)", "rgba(125, 207, 255, 0.2)", "rgba(247, 118, 142, 0.2)", "rgba(224, 175, 104, 0.2)", "rgba(42, 195, 222, 0.2)"];
59
+ return jsxRuntime.jsx("div", {
60
+ style: {
61
+ position: "absolute",
62
+ top: "".concat(position.top, "%"),
63
+ left: "".concat(position.left, "%"),
64
+ width: "".concat(size, "px"),
65
+ height: "".concat(size, "px"),
66
+ borderRadius: "50%",
67
+ background: bubbleColors[index % bubbleColors.length],
68
+ opacity: opacity,
69
+ transition: "opacity 1s ease-in-out",
70
+ pointerEvents: "none",
71
+ userSelect: "none"
72
+ }
73
+ });
74
+ };
75
+ var CenterLogo = function CenterLogo(_ref2) {
76
+ var containerRef = _ref2.containerRef,
77
+ _ref2$scale = _ref2.scale,
78
+ scale = _ref2$scale === void 0 ? 0.2 : _ref2$scale,
79
+ onHitmarker = _ref2.onHitmarker;
80
+ var _useState7 = React.useState(100),
81
+ _useState8 = _rollupPluginBabelHelpers.slicedToArray(_useState7, 2),
82
+ logoSize = _useState8[0],
83
+ setLogoSize = _useState8[1];
84
+ var _useState9 = React.useState({
85
+ x: 0,
86
+ y: 0
87
+ }),
88
+ _useState0 = _rollupPluginBabelHelpers.slicedToArray(_useState9, 2),
89
+ offset = _useState0[0],
90
+ setOffset = _useState0[1];
91
+ var _useState1 = React.useState(false),
92
+ _useState10 = _rollupPluginBabelHelpers.slicedToArray(_useState1, 2),
93
+ isHovered = _useState10[0],
94
+ setIsHovered = _useState10[1];
95
+ React.useEffect(function () {
96
+ if (containerRef.current) {
97
+ var containerWidth = containerRef.current.clientWidth;
98
+ var containerHeight = containerRef.current.clientHeight;
99
+ var minDimension = Math.min(containerWidth, containerHeight);
100
+ setLogoSize(minDimension * scale);
101
+ }
102
+ }, [containerRef, scale]);
103
+ var handleLogoClick = function handleLogoClick(e) {
104
+ e.stopPropagation();
105
+ if (onHitmarker) {
106
+ onHitmarker({
107
+ clientX: e.clientX,
108
+ clientY: e.clientY
109
+ });
110
+ }
111
+ };
112
+ var handleMouseMove = function handleMouseMove(e) {
113
+ if (!containerRef.current) return;
114
+ var rect = containerRef.current.getBoundingClientRect();
115
+ var centerX = rect.left + rect.width / 2;
116
+ var centerY = rect.top + rect.height / 2;
117
+ var deltaX = e.clientX - centerX;
118
+ var deltaY = e.clientY - centerY;
119
+ var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
120
+ var maxDistance = logoSize * 1.5;
121
+ if (distance < maxDistance && distance > 0) {
122
+ var pushStrength = (maxDistance - distance) / maxDistance;
123
+ var pushDistance = 50 * pushStrength;
124
+ var pushX = -(deltaX / distance) * pushDistance;
125
+ var pushY = -(deltaY / distance) * pushDistance;
126
+ setOffset({
127
+ x: pushX,
128
+ y: pushY
129
+ });
130
+ setIsHovered(true);
131
+ } else {
132
+ setOffset({
133
+ x: 0,
134
+ y: 0
135
+ });
136
+ setIsHovered(false);
137
+ }
138
+ };
139
+ var handleMouseLeave = function handleMouseLeave() {
140
+ setOffset({
141
+ x: 0,
142
+ y: 0
143
+ });
144
+ setIsHovered(false);
145
+ };
146
+ React.useEffect(function () {
147
+ if (containerRef.current) {
148
+ var container = containerRef.current;
149
+ container.addEventListener("mousemove", handleMouseMove);
150
+ container.addEventListener("mouseleave", handleMouseLeave);
151
+ return function () {
152
+ container.removeEventListener("mousemove", handleMouseMove);
153
+ container.removeEventListener("mouseleave", handleMouseLeave);
154
+ };
155
+ }
156
+ }, [logoSize, containerRef]);
157
+ return jsxRuntime.jsxs("div", {
158
+ style: {
159
+ position: "absolute",
160
+ top: "50%",
161
+ left: "50%",
162
+ transform: "translate(-50%, -50%) translate(".concat(offset.x, "px, ").concat(offset.y, "px)"),
163
+ display: "flex",
164
+ alignItems: "center",
165
+ justifyContent: "center",
166
+ zIndex: 10,
167
+ transition: "transform 0.3s ease-out",
168
+ userSelect: "none"
169
+ },
170
+ children: [jsxRuntime.jsx("div", {
171
+ style: {
172
+ position: "absolute",
173
+ width: "".concat(logoSize * 1.4, "px"),
174
+ height: "".concat(logoSize * 1.4, "px"),
175
+ borderRadius: "50%",
176
+ background: "rgba(122, 162, 247, 0.15)",
177
+ animation: isHovered ? "logoPulse 1s ease-in-out infinite" : "logoPulse 3s ease-in-out infinite",
178
+ transform: isHovered ? "scale(1.2)" : "scale(1)",
179
+ transition: "transform 0.3s ease-out",
180
+ pointerEvents: "none"
181
+ }
182
+ }), jsxRuntime.jsx("img", {
183
+ src: logomark.default,
184
+ alt: "FrameWorks Logo",
185
+ onClick: handleLogoClick,
186
+ style: {
187
+ width: "".concat(logoSize, "px"),
188
+ height: "".concat(logoSize, "px"),
189
+ position: "relative",
190
+ zIndex: 1,
191
+ filter: isHovered ? "drop-shadow(0 6px 12px rgba(36, 40, 59, 0.4)) brightness(1.1)" : "drop-shadow(0 4px 8px rgba(36, 40, 59, 0.3))",
192
+ transform: isHovered ? "scale(1.1)" : "scale(1)",
193
+ transition: "all 0.3s ease-out",
194
+ cursor: isHovered ? "pointer" : "default",
195
+ userSelect: "none",
196
+ WebkitUserDrag: "none"
197
+ }
198
+ })]
199
+ });
200
+ };
201
+ function StatusIcon(_ref3) {
202
+ var status = _ref3.status;
203
+ var iconClass = "w-5 h-5";
204
+ // Spinner for loading states
205
+ if (status === "INITIALIZING" || status === "BOOTING" || status === "WAITING_FOR_DATA" || !status) {
206
+ return jsxRuntime.jsxs("svg", {
207
+ className: "".concat(iconClass, " animate-spin"),
208
+ fill: "none",
209
+ viewBox: "0 0 24 24",
210
+ style: {
211
+ color: "hsl(var(--tn-yellow, 40 95% 64%))"
212
+ },
213
+ children: [jsxRuntime.jsx("circle", {
214
+ className: "opacity-25",
215
+ cx: "12",
216
+ cy: "12",
217
+ r: "10",
218
+ stroke: "currentColor",
219
+ strokeWidth: "4"
220
+ }), jsxRuntime.jsx("path", {
221
+ className: "opacity-75",
222
+ fill: "currentColor",
223
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
224
+ })]
225
+ });
226
+ }
227
+ // Offline icon
228
+ if (status === "OFFLINE") {
229
+ return jsxRuntime.jsx("svg", {
230
+ className: iconClass,
231
+ fill: "none",
232
+ viewBox: "0 0 24 24",
233
+ stroke: "currentColor",
234
+ style: {
235
+ color: "hsl(var(--tn-red, 348 100% 72%))"
236
+ },
237
+ children: jsxRuntime.jsx("path", {
238
+ strokeLinecap: "round",
239
+ strokeLinejoin: "round",
240
+ strokeWidth: 2,
241
+ d: "M18.364 5.636a9 9 0 010 12.728m0 0l-2.829-2.829m2.829 2.829L21 21M15.536 8.464a5 5 0 010 7.072m0 0l-2.829-2.829m-4.243 2.829a4.978 4.978 0 01-1.414-2.83m-1.414 5.658a9 9 0 01-2.167-9.238m7.824 2.167a1 1 0 111.414 1.414m-1.414-1.414L3 3m8.293 8.293l1.414 1.414"
242
+ })
243
+ });
244
+ }
245
+ // Error icon
246
+ if (status === "ERROR" || status === "INVALID") {
247
+ return jsxRuntime.jsx("svg", {
248
+ className: iconClass,
249
+ fill: "none",
250
+ viewBox: "0 0 24 24",
251
+ stroke: "currentColor",
252
+ style: {
253
+ color: "hsl(var(--tn-red, 348 100% 72%))"
254
+ },
255
+ children: jsxRuntime.jsx("path", {
256
+ strokeLinecap: "round",
257
+ strokeLinejoin: "round",
258
+ strokeWidth: 2,
259
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
260
+ })
261
+ });
262
+ }
263
+ // Default spinner
264
+ return jsxRuntime.jsxs("svg", {
265
+ className: "".concat(iconClass, " animate-spin"),
266
+ fill: "none",
267
+ viewBox: "0 0 24 24",
268
+ style: {
269
+ color: "hsl(var(--tn-cyan, 193 100% 75%))"
270
+ },
271
+ children: [jsxRuntime.jsx("circle", {
272
+ className: "opacity-25",
273
+ cx: "12",
274
+ cy: "12",
275
+ r: "10",
276
+ stroke: "currentColor",
277
+ strokeWidth: "4"
278
+ }), jsxRuntime.jsx("path", {
279
+ className: "opacity-75",
280
+ fill: "currentColor",
281
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
282
+ })]
283
+ });
284
+ }
285
+ var StatusOverlay = function StatusOverlay(_ref4) {
286
+ var status = _ref4.status,
287
+ message = _ref4.message,
288
+ percentage = _ref4.percentage,
289
+ error = _ref4.error,
290
+ onRetry = _ref4.onRetry;
291
+ var showRetry = (status === "ERROR" || status === "INVALID") && onRetry;
292
+ var showProgress = status === "INITIALIZING" && percentage !== undefined;
293
+ var displayMessage = error || message;
294
+ return jsxRuntime.jsxs("div", {
295
+ style: {
296
+ position: "absolute",
297
+ bottom: "16px",
298
+ left: "50%",
299
+ transform: "translateX(-50%)",
300
+ zIndex: 20,
301
+ display: "flex",
302
+ flexDirection: "column",
303
+ alignItems: "center",
304
+ gap: "8px",
305
+ maxWidth: "280px",
306
+ textAlign: "center"
307
+ },
308
+ children: [jsxRuntime.jsxs("div", {
309
+ style: {
310
+ display: "flex",
311
+ alignItems: "center",
312
+ gap: "8px",
313
+ color: "#787c99",
314
+ fontSize: "13px",
315
+ fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif"
316
+ },
317
+ children: [jsxRuntime.jsx(StatusIcon, {
318
+ status: status
319
+ }), jsxRuntime.jsx("span", {
320
+ children: displayMessage
321
+ })]
322
+ }), showProgress && jsxRuntime.jsx("div", {
323
+ style: {
324
+ width: "160px",
325
+ height: "4px",
326
+ background: "rgba(65, 72, 104, 0.4)",
327
+ borderRadius: "2px",
328
+ overflow: "hidden"
329
+ },
330
+ children: jsxRuntime.jsx("div", {
331
+ style: {
332
+ width: "".concat(Math.min(100, percentage), "%"),
333
+ height: "100%",
334
+ background: "hsl(var(--tn-cyan, 193 100% 75%))",
335
+ transition: "width 0.3s ease-out"
336
+ }
337
+ })
338
+ }), showRetry && jsxRuntime.jsx("button", {
339
+ type: "button",
340
+ onClick: onRetry,
341
+ style: {
342
+ padding: "6px 16px",
343
+ background: "transparent",
344
+ border: "1px solid rgba(122, 162, 247, 0.4)",
345
+ borderRadius: "4px",
346
+ color: "#7aa2f7",
347
+ fontSize: "11px",
348
+ fontWeight: 500,
349
+ cursor: "pointer",
350
+ transition: "all 0.2s ease",
351
+ fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif"
352
+ },
353
+ onMouseEnter: function onMouseEnter(e) {
354
+ e.currentTarget.style.background = "rgba(122, 162, 247, 0.1)";
355
+ },
356
+ onMouseLeave: function onMouseLeave(e) {
357
+ e.currentTarget.style.background = "transparent";
358
+ },
359
+ children: "Retry"
360
+ })]
361
+ });
362
+ };
363
+ var playHitmarkerSound = function playHitmarkerSound() {
364
+ try {
365
+ // Embedded hitmarker sound as base64 data URL
366
+ var hitmarkerDataUrl = "data:audio/mpeg;base64,SUQzBAAAAAAANFRDT04AAAAHAAADT3RoZXIAVFNTRQAAAA8AAANMYXZmNTcuODMuMTAwAAAAAAAAAAAA" + "AAD/+1QAAAAAAAAAAAAAAAAAAAAA" + "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" + "qqqqqqqqqqqqqqqqqqqqqqqqqqo=";
367
+ var audio = new Audio(hitmarkerDataUrl);
368
+ audio.volume = 0.3;
369
+ audio.play()["catch"](function () {
370
+ return createSyntheticHitmarkerSound();
371
+ });
372
+ } catch (_unused) {
373
+ createSyntheticHitmarkerSound();
374
+ }
375
+ };
376
+ var createSyntheticHitmarkerSound = function createSyntheticHitmarkerSound() {
377
+ try {
378
+ var audioContext = new (window.AudioContext || window.webkitAudioContext)();
379
+ var oscillator1 = audioContext.createOscillator();
380
+ var oscillator2 = audioContext.createOscillator();
381
+ var gainNode1 = audioContext.createGain();
382
+ var gainNode2 = audioContext.createGain();
383
+ var masterGain = audioContext.createGain();
384
+ oscillator1.connect(gainNode1);
385
+ oscillator2.connect(gainNode2);
386
+ gainNode1.connect(masterGain);
387
+ gainNode2.connect(masterGain);
388
+ masterGain.connect(audioContext.destination);
389
+ oscillator1.frequency.setValueAtTime(1800, audioContext.currentTime);
390
+ oscillator1.frequency.exponentialRampToValueAtTime(900, audioContext.currentTime + 0.08);
391
+ oscillator2.frequency.setValueAtTime(3600, audioContext.currentTime);
392
+ oscillator2.frequency.exponentialRampToValueAtTime(1800, audioContext.currentTime + 0.04);
393
+ oscillator1.type = "triangle";
394
+ oscillator2.type = "sine";
395
+ gainNode1.gain.setValueAtTime(0, audioContext.currentTime);
396
+ gainNode1.gain.linearRampToValueAtTime(0.4, audioContext.currentTime + 0.002);
397
+ gainNode1.gain.exponentialRampToValueAtTime(0.001, audioContext.currentTime + 0.12);
398
+ gainNode2.gain.setValueAtTime(0, audioContext.currentTime);
399
+ gainNode2.gain.linearRampToValueAtTime(0.3, audioContext.currentTime + 0.001);
400
+ gainNode2.gain.exponentialRampToValueAtTime(0.001, audioContext.currentTime + 0.06);
401
+ masterGain.gain.setValueAtTime(0.5, audioContext.currentTime);
402
+ var startTime = audioContext.currentTime;
403
+ var stopTime = startTime + 0.15;
404
+ oscillator1.start(startTime);
405
+ oscillator2.start(startTime);
406
+ oscillator1.stop(stopTime);
407
+ oscillator2.stop(stopTime);
408
+ } catch (_unused2) {
409
+ // Audio context not available
410
+ }
411
+ };
412
+ var IdleScreen = function IdleScreen(_ref5) {
413
+ var status = _ref5.status,
414
+ _ref5$message = _ref5.message,
415
+ message = _ref5$message === void 0 ? "Waiting for stream..." : _ref5$message,
416
+ percentage = _ref5.percentage,
417
+ error = _ref5.error,
418
+ onRetry = _ref5.onRetry;
419
+ var containerRef = React.useRef(null);
420
+ var _useState11 = React.useState([]),
421
+ _useState12 = _rollupPluginBabelHelpers.slicedToArray(_useState11, 2),
422
+ hitmarkers = _useState12[0],
423
+ setHitmarkers = _useState12[1];
424
+ var createHitmarker = function createHitmarker(e) {
425
+ if (!containerRef.current) return;
426
+ var rect = containerRef.current.getBoundingClientRect();
427
+ var x = e.clientX - rect.left;
428
+ var y = e.clientY - rect.top;
429
+ var newHitmarker = {
430
+ id: Date.now() + Math.random(),
431
+ x: x,
432
+ y: y
433
+ };
434
+ setHitmarkers(function (prev) {
435
+ return [].concat(_rollupPluginBabelHelpers.toConsumableArray(prev), [newHitmarker]);
436
+ });
437
+ playHitmarkerSound();
438
+ setTimeout(function () {
439
+ setHitmarkers(function (prev) {
440
+ return prev.filter(function (h) {
441
+ return h.id !== newHitmarker.id;
442
+ });
443
+ });
444
+ }, 600);
445
+ };
446
+ // Inject CSS animations
447
+ React.useEffect(function () {
448
+ var styleId = "idle-screen-animations";
449
+ if (!document.getElementById(styleId)) {
450
+ var style = document.createElement("style");
451
+ style.id = styleId;
452
+ style.textContent = "\n @keyframes fadeInOut {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 0.9; }\n }\n @keyframes logoPulse {\n 0%, 100% { opacity: 0.15; transform: scale(1); }\n 50% { opacity: 0.25; transform: scale(1.05); }\n }\n @keyframes floatUp {\n 0% { transform: translateY(100vh) rotate(0deg); opacity: 0; }\n 10% { opacity: 0.6; }\n 90% { opacity: 0.6; }\n 100% { transform: translateY(-100px) rotate(360deg); opacity: 0; }\n }\n @keyframes gradientShift {\n 0%, 100% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n }\n @keyframes hitmarkerFade45 {\n 0% { opacity: 1; transform: translate(-50%, -50%) rotate(45deg) scale(0.5); }\n 20% { opacity: 1; transform: translate(-50%, -50%) rotate(45deg) scale(1.2); }\n 100% { opacity: 0; transform: translate(-50%, -50%) rotate(45deg) scale(1); }\n }\n @keyframes hitmarkerFadeNeg45 {\n 0% { opacity: 1; transform: translate(-50%, -50%) rotate(-45deg) scale(0.5); }\n 20% { opacity: 1; transform: translate(-50%, -50%) rotate(-45deg) scale(1.2); }\n 100% { opacity: 0; transform: translate(-50%, -50%) rotate(-45deg) scale(1); }\n }\n ";
453
+ document.head.appendChild(style);
454
+ }
455
+ }, []);
456
+ return jsxRuntime.jsxs("div", {
457
+ ref: containerRef,
458
+ className: "fw-player-root",
459
+ style: {
460
+ position: "absolute",
461
+ inset: 0,
462
+ zIndex: 5,
463
+ background: "\n linear-gradient(135deg,\n hsl(var(--tn-bg-dark, 235 21% 11%)) 0%,\n hsl(var(--tn-bg, 233 23% 17%)) 25%,\n hsl(var(--tn-bg-dark, 235 21% 11%)) 50%,\n hsl(var(--tn-bg, 233 23% 17%)) 75%,\n hsl(var(--tn-bg-dark, 235 21% 11%)) 100%\n )\n ",
464
+ backgroundSize: "400% 400%",
465
+ animation: "gradientShift 16s ease-in-out infinite",
466
+ display: "flex",
467
+ flexDirection: "column",
468
+ alignItems: "center",
469
+ justifyContent: "center",
470
+ overflow: "hidden",
471
+ borderRadius: "0",
472
+ userSelect: "none"
473
+ },
474
+ children: [hitmarkers.map(function (hitmarker) {
475
+ return jsxRuntime.jsxs("div", {
476
+ style: {
477
+ position: "absolute",
478
+ left: "".concat(hitmarker.x, "px"),
479
+ top: "".concat(hitmarker.y, "px"),
480
+ transform: "translate(-50%, -50%)",
481
+ pointerEvents: "none",
482
+ zIndex: 100,
483
+ width: "40px",
484
+ height: "40px"
485
+ },
486
+ children: [jsxRuntime.jsx("div", {
487
+ style: {
488
+ position: "absolute",
489
+ top: "25%",
490
+ left: "25%",
491
+ width: "12px",
492
+ height: "3px",
493
+ backgroundColor: "#ffffff",
494
+ transform: "translate(-50%, -50%) rotate(45deg)",
495
+ animation: "hitmarkerFade45 0.6s ease-out forwards",
496
+ boxShadow: "0 0 8px rgba(255, 255, 255, 0.8)",
497
+ borderRadius: "1px"
498
+ }
499
+ }), jsxRuntime.jsx("div", {
500
+ style: {
501
+ position: "absolute",
502
+ top: "25%",
503
+ left: "75%",
504
+ width: "12px",
505
+ height: "3px",
506
+ backgroundColor: "#ffffff",
507
+ transform: "translate(-50%, -50%) rotate(-45deg)",
508
+ animation: "hitmarkerFadeNeg45 0.6s ease-out forwards",
509
+ boxShadow: "0 0 8px rgba(255, 255, 255, 0.8)",
510
+ borderRadius: "1px"
511
+ }
512
+ }), jsxRuntime.jsx("div", {
513
+ style: {
514
+ position: "absolute",
515
+ top: "75%",
516
+ left: "25%",
517
+ width: "12px",
518
+ height: "3px",
519
+ backgroundColor: "#ffffff",
520
+ transform: "translate(-50%, -50%) rotate(-45deg)",
521
+ animation: "hitmarkerFadeNeg45 0.6s ease-out forwards",
522
+ boxShadow: "0 0 8px rgba(255, 255, 255, 0.8)",
523
+ borderRadius: "1px"
524
+ }
525
+ }), jsxRuntime.jsx("div", {
526
+ style: {
527
+ position: "absolute",
528
+ top: "75%",
529
+ left: "75%",
530
+ width: "12px",
531
+ height: "3px",
532
+ backgroundColor: "#ffffff",
533
+ transform: "translate(-50%, -50%) rotate(45deg)",
534
+ animation: "hitmarkerFade45 0.6s ease-out forwards",
535
+ boxShadow: "0 0 8px rgba(255, 255, 255, 0.8)",
536
+ borderRadius: "1px"
537
+ }
538
+ })]
539
+ }, hitmarker.id);
540
+ }), _rollupPluginBabelHelpers.toConsumableArray(Array(12)).map(function (_, index) {
541
+ return jsxRuntime.jsx("div", {
542
+ style: {
543
+ position: "absolute",
544
+ left: "".concat(Math.random() * 100, "%"),
545
+ width: "".concat(Math.random() * 4 + 2, "px"),
546
+ height: "".concat(Math.random() * 4 + 2, "px"),
547
+ borderRadius: "50%",
548
+ background: ["#7aa2f7", "#bb9af7", "#9ece6a", "#73daca", "#7dcfff", "#f7768e", "#e0af68", "#2ac3de"][index % 8],
549
+ opacity: 0,
550
+ animation: "floatUp ".concat(8 + Math.random() * 4, "s linear infinite"),
551
+ animationDelay: "".concat(Math.random() * 8, "s"),
552
+ pointerEvents: "none"
553
+ }
554
+ }, "particle-".concat(index));
555
+ }), _rollupPluginBabelHelpers.toConsumableArray(Array(8)).map(function (_, index) {
556
+ return jsxRuntime.jsx(AnimatedBubble, {
557
+ index: index
558
+ }, index);
559
+ }), jsxRuntime.jsx(CenterLogo, {
560
+ containerRef: containerRef,
561
+ onHitmarker: createHitmarker
562
+ }), jsxRuntime.jsx(DvdLogo.default, {
563
+ parentRef: containerRef,
564
+ scale: 0.08
565
+ }), jsxRuntime.jsx(StatusOverlay, {
566
+ status: status,
567
+ message: message,
568
+ percentage: percentage,
569
+ error: error,
570
+ onRetry: onRetry
571
+ }), jsxRuntime.jsx("div", {
572
+ style: {
573
+ position: "absolute",
574
+ top: 0,
575
+ left: 0,
576
+ right: 0,
577
+ bottom: 0,
578
+ background: "\n radial-gradient(circle at 20% 80%, rgba(122, 162, 247, 0.03) 0%, transparent 50%),\n radial-gradient(circle at 80% 20%, rgba(187, 154, 247, 0.03) 0%, transparent 50%),\n radial-gradient(circle at 40% 40%, rgba(158, 206, 106, 0.02) 0%, transparent 50%)\n ",
579
+ pointerEvents: "none"
580
+ }
581
+ })]
582
+ });
583
+ };
584
+
585
+ exports.IdleScreen = IdleScreen;
586
+ exports.default = IdleScreen;
587
+ //# sourceMappingURL=IdleScreen.js.map