stormcloud-video-player 0.7.50 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +269 -228
  2. package/dist/stormcloud-vp.min.js +1 -1
  3. package/lib/index.cjs +5197 -6747
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +196 -195
  6. package/lib/index.d.ts +196 -195
  7. package/lib/index.js +5321 -6863
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/StormcloudVideoPlayer.cjs +4802 -3170
  10. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  11. package/lib/player/StormcloudVideoPlayer.d.cts +113 -70
  12. package/lib/players/HlsPlayer.cjs +4810 -3179
  13. package/lib/players/HlsPlayer.cjs.map +1 -1
  14. package/lib/players/HlsPlayer.d.cts +1 -1
  15. package/lib/players/index.cjs +4877 -3246
  16. package/lib/players/index.cjs.map +1 -1
  17. package/lib/sdk/hlsAdPlayer.cjs +1021 -0
  18. package/lib/sdk/hlsAdPlayer.cjs.map +1 -0
  19. package/lib/sdk/hlsAdPlayer.d.cts +10 -0
  20. package/lib/sdk/pal.cjs +358 -0
  21. package/lib/sdk/pal.cjs.map +1 -0
  22. package/lib/sdk/pal.d.cts +28 -0
  23. package/lib/{types-CIHDHY7A.d.cts → types-DDwAfBLt.d.cts} +11 -10
  24. package/lib/ui/StormcloudVideoPlayer.cjs +5070 -6609
  25. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  26. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -14
  27. package/lib/utils/browserCompat.cjs +10 -114
  28. package/lib/utils/browserCompat.cjs.map +1 -1
  29. package/lib/utils/browserCompat.d.cts +3 -7
  30. package/lib/utils/tracking.cjs +179 -150
  31. package/lib/utils/tracking.cjs.map +1 -1
  32. package/lib/utils/tracking.d.cts +11 -6
  33. package/package.json +1 -2
  34. package/lib/sdk/adstormPlayer.cjs +0 -1567
  35. package/lib/sdk/adstormPlayer.cjs.map +0 -1
  36. package/lib/sdk/adstormPlayer.d.cts +0 -23
  37. package/lib/sdk/vastParser.cjs +0 -517
  38. package/lib/sdk/vastParser.cjs.map +0 -1
  39. package/lib/sdk/vastParser.d.cts +0 -45
  40. package/lib/ui/OverlayRenderer.cjs +0 -2376
  41. package/lib/ui/OverlayRenderer.cjs.map +0 -1
  42. package/lib/ui/OverlayRenderer.d.cts +0 -17
  43. package/lib/utils/adcision.cjs +0 -282
  44. package/lib/utils/adcision.cjs.map +0 -1
  45. package/lib/utils/adcision.d.cts +0 -31
  46. package/lib/utils/overlays.cjs +0 -354
  47. package/lib/utils/overlays.cjs.map +0 -1
  48. package/lib/utils/overlays.d.cts +0 -70
@@ -1,2376 +0,0 @@
1
- "use strict";
2
- function _array_like_to_array(arr, len) {
3
- if (len == null || len > arr.length) len = arr.length;
4
- for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
5
- return arr2;
6
- }
7
- function _array_with_holes(arr) {
8
- if (Array.isArray(arr)) return arr;
9
- }
10
- function _array_without_holes(arr) {
11
- if (Array.isArray(arr)) return _array_like_to_array(arr);
12
- }
13
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
14
- try {
15
- var info = gen[key](arg);
16
- var value = info.value;
17
- } catch (error) {
18
- reject(error);
19
- return;
20
- }
21
- if (info.done) {
22
- resolve(value);
23
- } else {
24
- Promise.resolve(value).then(_next, _throw);
25
- }
26
- }
27
- function _async_to_generator(fn) {
28
- return function() {
29
- var self = this, args = arguments;
30
- return new Promise(function(resolve, reject) {
31
- var gen = fn.apply(self, args);
32
- function _next(value) {
33
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
34
- }
35
- function _throw(err) {
36
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
37
- }
38
- _next(undefined);
39
- });
40
- };
41
- }
42
- function _define_property(obj, key, value) {
43
- if (key in obj) {
44
- Object.defineProperty(obj, key, {
45
- value: value,
46
- enumerable: true,
47
- configurable: true,
48
- writable: true
49
- });
50
- } else {
51
- obj[key] = value;
52
- }
53
- return obj;
54
- }
55
- function _iterable_to_array(iter) {
56
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
57
- }
58
- function _iterable_to_array_limit(arr, i) {
59
- var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
60
- if (_i == null) return;
61
- var _arr = [];
62
- var _n = true;
63
- var _d = false;
64
- var _s, _e;
65
- try {
66
- for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
67
- _arr.push(_s.value);
68
- if (i && _arr.length === i) break;
69
- }
70
- } catch (err) {
71
- _d = true;
72
- _e = err;
73
- } finally{
74
- try {
75
- if (!_n && _i["return"] != null) _i["return"]();
76
- } finally{
77
- if (_d) throw _e;
78
- }
79
- }
80
- return _arr;
81
- }
82
- function _non_iterable_rest() {
83
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
84
- }
85
- function _non_iterable_spread() {
86
- throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
87
- }
88
- function _object_spread(target) {
89
- for(var i = 1; i < arguments.length; i++){
90
- var source = arguments[i] != null ? arguments[i] : {};
91
- var ownKeys = Object.keys(source);
92
- if (typeof Object.getOwnPropertySymbols === "function") {
93
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
94
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
95
- }));
96
- }
97
- ownKeys.forEach(function(key) {
98
- _define_property(target, key, source[key]);
99
- });
100
- }
101
- return target;
102
- }
103
- function ownKeys(object, enumerableOnly) {
104
- var keys = Object.keys(object);
105
- if (Object.getOwnPropertySymbols) {
106
- var symbols = Object.getOwnPropertySymbols(object);
107
- if (enumerableOnly) {
108
- symbols = symbols.filter(function(sym) {
109
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
110
- });
111
- }
112
- keys.push.apply(keys, symbols);
113
- }
114
- return keys;
115
- }
116
- function _object_spread_props(target, source) {
117
- source = source != null ? source : {};
118
- if (Object.getOwnPropertyDescriptors) {
119
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
120
- } else {
121
- ownKeys(Object(source)).forEach(function(key) {
122
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
123
- });
124
- }
125
- return target;
126
- }
127
- function _sliced_to_array(arr, i) {
128
- return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
129
- }
130
- function _to_consumable_array(arr) {
131
- return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
132
- }
133
- function _type_of(obj) {
134
- "@swc/helpers - typeof";
135
- return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
136
- }
137
- function _unsupported_iterable_to_array(o, minLen) {
138
- if (!o) return;
139
- if (typeof o === "string") return _array_like_to_array(o, minLen);
140
- var n = Object.prototype.toString.call(o).slice(8, -1);
141
- if (n === "Object" && o.constructor) n = o.constructor.name;
142
- if (n === "Map" || n === "Set") return Array.from(n);
143
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
144
- }
145
- function _ts_generator(thisArg, body) {
146
- var f, y, t, _ = {
147
- label: 0,
148
- sent: function() {
149
- if (t[0] & 1) throw t[1];
150
- return t[1];
151
- },
152
- trys: [],
153
- ops: []
154
- }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
155
- return d(g, "next", {
156
- value: verb(0)
157
- }), d(g, "throw", {
158
- value: verb(1)
159
- }), d(g, "return", {
160
- value: verb(2)
161
- }), typeof Symbol === "function" && d(g, Symbol.iterator, {
162
- value: function() {
163
- return this;
164
- }
165
- }), g;
166
- function verb(n) {
167
- return function(v) {
168
- return step([
169
- n,
170
- v
171
- ]);
172
- };
173
- }
174
- function step(op) {
175
- if (f) throw new TypeError("Generator is already executing.");
176
- while(g && (g = 0, op[0] && (_ = 0)), _)try {
177
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
178
- if (y = 0, t) op = [
179
- op[0] & 2,
180
- t.value
181
- ];
182
- switch(op[0]){
183
- case 0:
184
- case 1:
185
- t = op;
186
- break;
187
- case 4:
188
- _.label++;
189
- return {
190
- value: op[1],
191
- done: false
192
- };
193
- case 5:
194
- _.label++;
195
- y = op[1];
196
- op = [
197
- 0
198
- ];
199
- continue;
200
- case 7:
201
- op = _.ops.pop();
202
- _.trys.pop();
203
- continue;
204
- default:
205
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
206
- _ = 0;
207
- continue;
208
- }
209
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
210
- _.label = op[1];
211
- break;
212
- }
213
- if (op[0] === 6 && _.label < t[1]) {
214
- _.label = t[1];
215
- t = op;
216
- break;
217
- }
218
- if (t && _.label < t[2]) {
219
- _.label = t[2];
220
- _.ops.push(op);
221
- break;
222
- }
223
- if (t[2]) _.ops.pop();
224
- _.trys.pop();
225
- continue;
226
- }
227
- op = body.call(thisArg, _);
228
- } catch (e) {
229
- op = [
230
- 6,
231
- e
232
- ];
233
- y = 0;
234
- } finally{
235
- f = t = 0;
236
- }
237
- if (op[0] & 5) throw op[1];
238
- return {
239
- value: op[0] ? op[1] : void 0,
240
- done: true
241
- };
242
- }
243
- }
244
- var __create = Object.create;
245
- var __defProp = Object.defineProperty;
246
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
247
- var __getOwnPropNames = Object.getOwnPropertyNames;
248
- var __getProtoOf = Object.getPrototypeOf;
249
- var __hasOwnProp = Object.prototype.hasOwnProperty;
250
- var __export = function __export(target, all) {
251
- for(var name in all)__defProp(target, name, {
252
- get: all[name],
253
- enumerable: true
254
- });
255
- };
256
- var __copyProps = function __copyProps(to, from, except, desc) {
257
- if (from && (typeof from === "undefined" ? "undefined" : _type_of(from)) === "object" || typeof from === "function") {
258
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
259
- try {
260
- var _loop = function() {
261
- var key = _step.value;
262
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
263
- get: function get() {
264
- return from[key];
265
- },
266
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
267
- });
268
- };
269
- for(var _iterator = __getOwnPropNames(from)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
270
- } catch (err) {
271
- _didIteratorError = true;
272
- _iteratorError = err;
273
- } finally{
274
- try {
275
- if (!_iteratorNormalCompletion && _iterator.return != null) {
276
- _iterator.return();
277
- }
278
- } finally{
279
- if (_didIteratorError) {
280
- throw _iteratorError;
281
- }
282
- }
283
- }
284
- }
285
- return to;
286
- };
287
- var __toESM = function __toESM(mod, isNodeMode, target) {
288
- return target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(// If the importer is in node compatibility mode or this is not an ESM
289
- // file that has been converted to a CommonJS file using a Babel-
290
- // compatible transform (i.e. "__esModule" has not been set), then set
291
- // "default" to the CommonJS "module.exports" for node compatibility.
292
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
293
- value: mod,
294
- enumerable: true
295
- }) : target, mod);
296
- };
297
- var __toCommonJS = function __toCommonJS(mod) {
298
- return __copyProps(__defProp({}, "__esModule", {
299
- value: true
300
- }), mod);
301
- };
302
- // src/ui/OverlayRenderer.tsx
303
- var OverlayRenderer_exports = {};
304
- __export(OverlayRenderer_exports, {
305
- OverlayRenderer: function OverlayRenderer1() {
306
- return OverlayRenderer;
307
- }
308
- });
309
- module.exports = __toCommonJS(OverlayRenderer_exports);
310
- var import_react = __toESM(require("react"), 1);
311
- // src/utils/overlays.ts
312
- var OVERLAY_API_BASE = "https://adstorm.co/api-adstorm-dev";
313
- function timeStringToSeconds(timeStr) {
314
- if (!timeStr) return 0;
315
- var parts = timeStr.split(":");
316
- if (parts.length >= 3) {
317
- var _parts_, _parts_1, _parts_2;
318
- var hours = parseInt((_parts_ = parts[0]) !== null && _parts_ !== void 0 ? _parts_ : "0", 10) || 0;
319
- var minutes = parseInt((_parts_1 = parts[1]) !== null && _parts_1 !== void 0 ? _parts_1 : "0", 10) || 0;
320
- var secStr = (_parts_2 = parts[2]) !== null && _parts_2 !== void 0 ? _parts_2 : "0";
321
- var dotIdx = secStr.indexOf(".");
322
- var seconds = parseInt(dotIdx >= 0 ? secStr.substring(0, dotIdx) : secStr, 10) || 0;
323
- var msFrag = dotIdx >= 0 ? secStr.substring(dotIdx + 1) : "";
324
- var ms = msFrag ? parseInt(msFrag.padEnd(3, "0").substring(0, 3), 10) || 0 : 0;
325
- return hours * 3600 + minutes * 60 + seconds + ms / 1e3;
326
- }
327
- if (parts.length === 2) {
328
- var _parts_3, _parts_4;
329
- var minutes1 = parseInt((_parts_3 = parts[0]) !== null && _parts_3 !== void 0 ? _parts_3 : "0", 10) || 0;
330
- var secStr1 = (_parts_4 = parts[1]) !== null && _parts_4 !== void 0 ? _parts_4 : "0";
331
- var dotIdx1 = secStr1.indexOf(".");
332
- var seconds1 = parseInt(dotIdx1 >= 0 ? secStr1.substring(0, dotIdx1) : secStr1, 10) || 0;
333
- var msFrag1 = dotIdx1 >= 0 ? secStr1.substring(dotIdx1 + 1) : "";
334
- var ms1 = msFrag1 ? parseInt(msFrag1.padEnd(3, "0").substring(0, 3), 10) || 0 : 0;
335
- return minutes1 * 60 + seconds1 + ms1 / 1e3;
336
- }
337
- var num = parseFloat(timeStr);
338
- return isFinite(num) ? Math.max(0, num) : 0;
339
- }
340
- function isOverlayActive(overlay, currentTime) {
341
- if (!overlay.visible) return false;
342
- var startSec = timeStringToSeconds(overlay.start_time);
343
- var durationSec = timeStringToSeconds(overlay.duration);
344
- if (durationSec <= 0) return false;
345
- return currentTime >= startSec && currentTime < startSec + durationSec;
346
- }
347
- function resolveImageUrl(imageUrl) {
348
- var apiBaseUrl = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : OVERLAY_API_BASE;
349
- if (!imageUrl) return "";
350
- if (imageUrl.startsWith("http://") || imageUrl.startsWith("https://")) {
351
- return imageUrl;
352
- }
353
- if (imageUrl.startsWith("/")) {
354
- try {
355
- var url = new URL(apiBaseUrl);
356
- return "".concat(url.origin).concat(imageUrl);
357
- } catch (unused) {
358
- return imageUrl;
359
- }
360
- }
361
- return "".concat(apiBaseUrl, "/").concat(imageUrl);
362
- }
363
- // src/ui/OverlayRenderer.tsx
364
- var import_jsx_runtime = require("react/jsx-runtime");
365
- function computeVideoDimensions(video) {
366
- var nativeWidth = video.videoWidth;
367
- var nativeHeight = video.videoHeight;
368
- if (!nativeWidth || !nativeHeight) return null;
369
- var displayWidth = video.offsetWidth;
370
- var displayHeight = video.offsetHeight;
371
- if (!displayWidth || !displayHeight) return null;
372
- var videoAspect = nativeWidth / nativeHeight;
373
- var displayAspect = displayWidth / displayHeight;
374
- var renderWidth;
375
- var renderHeight;
376
- var offsetX;
377
- var offsetY;
378
- if (videoAspect > displayAspect) {
379
- renderWidth = displayWidth;
380
- renderHeight = displayWidth / videoAspect;
381
- offsetX = 0;
382
- offsetY = (displayHeight - renderHeight) / 2;
383
- } else {
384
- renderHeight = displayHeight;
385
- renderWidth = displayHeight * videoAspect;
386
- offsetX = (displayWidth - renderWidth) / 2;
387
- offsetY = 0;
388
- }
389
- return {
390
- nativeWidth: nativeWidth,
391
- nativeHeight: nativeHeight,
392
- displayWidth: renderWidth,
393
- displayHeight: renderHeight,
394
- offsetX: offsetX,
395
- offsetY: offsetY,
396
- scaleX: renderWidth / nativeWidth,
397
- scaleY: renderHeight / nativeHeight
398
- };
399
- }
400
- function ImageOverlay(param) {
401
- var overlay = param.overlay;
402
- var src = resolveImageUrl(overlay.image_url || "");
403
- if (!src) return null;
404
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
405
- src: src,
406
- alt: overlay.name,
407
- draggable: false,
408
- style: {
409
- width: "100%",
410
- height: "100%",
411
- objectFit: "contain",
412
- display: "block",
413
- pointerEvents: "none",
414
- userSelect: "none"
415
- }
416
- });
417
- }
418
- function TextOverlay(param) {
419
- var overlay = param.overlay;
420
- var text = overlay.content || "";
421
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
422
- style: {
423
- width: "100%",
424
- height: "100%",
425
- display: "flex",
426
- alignItems: "center",
427
- justifyContent: "center",
428
- color: "#ffffff",
429
- fontSize: "clamp(10px, 1.4vw, 20px)",
430
- fontFamily: "Roboto, 'Segoe UI', Arial, sans-serif",
431
- fontWeight: 600,
432
- textAlign: "center",
433
- padding: "4px 8px",
434
- boxSizing: "border-box",
435
- wordBreak: "break-word",
436
- textShadow: "0 1px 4px rgba(0,0,0,0.7)",
437
- pointerEvents: "none",
438
- userSelect: "none",
439
- lineHeight: 1.3
440
- },
441
- children: text
442
- });
443
- }
444
- function parseRSSXml(xmlText, maxItems) {
445
- var stripped = xmlText.replace(/^<\?xml[^?]*\?>\s*/, "");
446
- var parser = new DOMParser();
447
- var doc = parser.parseFromString(stripped, "text/xml");
448
- var items = Array.from(doc.querySelectorAll("item")).map(function(item) {
449
- var _item_querySelector, _item_querySelector1, _item_querySelector2, _item_querySelector3, _item_querySelector4;
450
- return {
451
- title: (((_item_querySelector = item.querySelector("title")) === null || _item_querySelector === void 0 ? void 0 : _item_querySelector.textContent) || "").replace(/<[^>]*>/g, "").trim(),
452
- description: (((_item_querySelector1 = item.querySelector("description")) === null || _item_querySelector1 === void 0 ? void 0 : _item_querySelector1.textContent) || "").replace(/<[^>]*>/g, "").trim(),
453
- pubDate: ((_item_querySelector2 = item.querySelector("pubDate")) === null || _item_querySelector2 === void 0 ? void 0 : _item_querySelector2.textContent) || "",
454
- author: ((_item_querySelector3 = item.querySelector("author, dc\\:creator")) === null || _item_querySelector3 === void 0 ? void 0 : _item_querySelector3.textContent) || "",
455
- category: ((_item_querySelector4 = item.querySelector("category")) === null || _item_querySelector4 === void 0 ? void 0 : _item_querySelector4.textContent) || ""
456
- };
457
- }).filter(function(i) {
458
- return i.title;
459
- }).slice(0, maxItems);
460
- if (items.length === 0 && doc.querySelector("parsererror")) {
461
- throw new Error("Invalid RSS XML");
462
- }
463
- return items;
464
- }
465
- var RSS_CACHE_TTL_MS = 6e4;
466
- var rssCache = /* @__PURE__ */ new Map();
467
- function cachedFetchRSSItems(rssUrl, maxItems) {
468
- var now = Date.now();
469
- var cached = rssCache.get(rssUrl);
470
- if (cached && cached.expiresAt > now) return cached.promise;
471
- var promise = fetchRSSItems(rssUrl, maxItems).catch(function(err) {
472
- rssCache.delete(rssUrl);
473
- throw err;
474
- });
475
- rssCache.set(rssUrl, {
476
- promise: promise,
477
- expiresAt: now + RSS_CACHE_TTL_MS
478
- });
479
- return promise;
480
- }
481
- function fetchRSSItems(rssUrl, maxItems) {
482
- return _async_to_generator(function() {
483
- var encoded, origin, resp, text, unused, resp1, data, unused1, resp2, text1, unused2;
484
- return _ts_generator(this, function(_state) {
485
- switch(_state.label){
486
- case 0:
487
- encoded = encodeURIComponent(rssUrl);
488
- _state.label = 1;
489
- case 1:
490
- _state.trys.push([
491
- 1,
492
- 5,
493
- ,
494
- 6
495
- ]);
496
- origin = typeof window !== "undefined" ? window.location.origin : "";
497
- return [
498
- 4,
499
- fetch("".concat(origin, "/api/rss-proxy?url=").concat(encoded))
500
- ];
501
- case 2:
502
- resp = _state.sent();
503
- if (!resp.ok) return [
504
- 3,
505
- 4
506
- ];
507
- return [
508
- 4,
509
- resp.text()
510
- ];
511
- case 3:
512
- text = _state.sent();
513
- if (text.includes("<item")) return [
514
- 2,
515
- parseRSSXml(text, maxItems)
516
- ];
517
- _state.label = 4;
518
- case 4:
519
- return [
520
- 3,
521
- 6
522
- ];
523
- case 5:
524
- unused = _state.sent();
525
- return [
526
- 3,
527
- 6
528
- ];
529
- case 6:
530
- _state.trys.push([
531
- 6,
532
- 10,
533
- ,
534
- 11
535
- ]);
536
- return [
537
- 4,
538
- fetch("https://api.allorigins.win/get?url=".concat(encoded))
539
- ];
540
- case 7:
541
- resp1 = _state.sent();
542
- if (!resp1.ok) return [
543
- 3,
544
- 9
545
- ];
546
- return [
547
- 4,
548
- resp1.json()
549
- ];
550
- case 8:
551
- data = _state.sent();
552
- if (data.contents) return [
553
- 2,
554
- parseRSSXml(data.contents, maxItems)
555
- ];
556
- _state.label = 9;
557
- case 9:
558
- return [
559
- 3,
560
- 11
561
- ];
562
- case 10:
563
- unused1 = _state.sent();
564
- return [
565
- 3,
566
- 11
567
- ];
568
- case 11:
569
- _state.trys.push([
570
- 11,
571
- 15,
572
- ,
573
- 16
574
- ]);
575
- return [
576
- 4,
577
- fetch("https://corsproxy.io/?url=".concat(encoded))
578
- ];
579
- case 12:
580
- resp2 = _state.sent();
581
- if (!resp2.ok) return [
582
- 3,
583
- 14
584
- ];
585
- return [
586
- 4,
587
- resp2.text()
588
- ];
589
- case 13:
590
- text1 = _state.sent();
591
- if (text1) return [
592
- 2,
593
- parseRSSXml(text1, maxItems)
594
- ];
595
- _state.label = 14;
596
- case 14:
597
- return [
598
- 3,
599
- 16
600
- ];
601
- case 15:
602
- unused2 = _state.sent();
603
- return [
604
- 3,
605
- 16
606
- ];
607
- case 16:
608
- throw new Error("All RSS proxies failed");
609
- }
610
- });
611
- })();
612
- }
613
- function ScrollerOverlay(param) {
614
- var overlay = param.overlay;
615
- var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _ref10, _ref11, _ref12;
616
- var cfg = overlay.scroller_config;
617
- var uid = (0, import_react.useId)().replace(/:/g, "");
618
- var _ref13 = _sliced_to_array((0, import_react.useState)([]), 2), rssItems = _ref13[0], setRssItems = _ref13[1];
619
- var _ref14 = _sliced_to_array((0, import_react.useState)(true), 2), rssLoading = _ref14[0], setRssLoading = _ref14[1];
620
- var _ref15 = _sliced_to_array((0, import_react.useState)(false), 2), rssError = _ref15[0], setRssError = _ref15[1];
621
- var rssUrl = (cfg === null || cfg === void 0 ? void 0 : cfg.rss_url) || "";
622
- var maxItems = (_ref = cfg === null || cfg === void 0 ? void 0 : cfg.max_items) !== null && _ref !== void 0 ? _ref : 10;
623
- var autoRefresh = (cfg === null || cfg === void 0 ? void 0 : cfg.auto_refresh) !== false;
624
- var updateInterval = (_ref1 = cfg === null || cfg === void 0 ? void 0 : cfg.update_interval) !== null && _ref1 !== void 0 ? _ref1 : 5;
625
- (0, import_react.useEffect)(function() {
626
- if (!rssUrl || (cfg === null || cfg === void 0 ? void 0 : cfg.use_custom_text) && (cfg === null || cfg === void 0 ? void 0 : cfg.custom_text)) {
627
- setRssLoading(false);
628
- return;
629
- }
630
- var cancelled = false;
631
- setRssLoading(true);
632
- setRssError(false);
633
- cachedFetchRSSItems(rssUrl, maxItems).then(function(items) {
634
- if (!cancelled) {
635
- setRssItems(items);
636
- setRssError(false);
637
- }
638
- }).catch(function() {
639
- if (!cancelled) setRssError(true);
640
- }).finally(function() {
641
- if (!cancelled) setRssLoading(false);
642
- });
643
- return function() {
644
- cancelled = true;
645
- };
646
- }, [
647
- rssUrl,
648
- maxItems,
649
- cfg === null || cfg === void 0 ? void 0 : cfg.use_custom_text,
650
- cfg === null || cfg === void 0 ? void 0 : cfg.custom_text
651
- ]);
652
- (0, import_react.useEffect)(function() {
653
- if (!rssUrl || !autoRefresh || (cfg === null || cfg === void 0 ? void 0 : cfg.use_custom_text) && (cfg === null || cfg === void 0 ? void 0 : cfg.custom_text)) return;
654
- var interval = setInterval(function() {
655
- rssCache.delete(rssUrl);
656
- cachedFetchRSSItems(rssUrl, maxItems).then(function(items) {
657
- setRssItems(items);
658
- setRssError(false);
659
- }).catch(function() {});
660
- }, updateInterval * 60 * 1e3);
661
- return function() {
662
- return clearInterval(interval);
663
- };
664
- }, [
665
- rssUrl,
666
- autoRefresh,
667
- updateInterval,
668
- maxItems,
669
- cfg === null || cfg === void 0 ? void 0 : cfg.use_custom_text,
670
- cfg === null || cfg === void 0 ? void 0 : cfg.custom_text
671
- ]);
672
- var sep = (_ref2 = cfg === null || cfg === void 0 ? void 0 : cfg.separator_char) !== null && _ref2 !== void 0 ? _ref2 : "\u25C6";
673
- var segments;
674
- if ((cfg === null || cfg === void 0 ? void 0 : cfg.use_custom_text) && (cfg === null || cfg === void 0 ? void 0 : cfg.custom_text)) {
675
- segments = [
676
- cfg.custom_text
677
- ];
678
- } else if (rssItems.length > 0) {
679
- segments = rssItems.map(function(item) {
680
- var parts = [];
681
- if ((cfg === null || cfg === void 0 ? void 0 : cfg.show_title) !== false && item.title) parts.push(item.title);
682
- if ((cfg === null || cfg === void 0 ? void 0 : cfg.show_description) && item.description) parts.push(item.description);
683
- if ((cfg === null || cfg === void 0 ? void 0 : cfg.show_timestamp) && item.pubDate) {
684
- try {
685
- parts.push(new Date(item.pubDate).toLocaleDateString());
686
- } catch (unused) {}
687
- }
688
- if ((cfg === null || cfg === void 0 ? void 0 : cfg.show_author) && item.author) parts.push("— ".concat(item.author));
689
- if ((cfg === null || cfg === void 0 ? void 0 : cfg.show_category) && item.category) parts.push("[".concat(item.category, "]"));
690
- return parts.join(" ");
691
- });
692
- } else if (rssLoading) {
693
- segments = [
694
- "Loading feed\u2026"
695
- ];
696
- } else if (rssError) {
697
- segments = overlay.content ? [
698
- overlay.content
699
- ] : [
700
- "RSS feed unavailable"
701
- ];
702
- } else if (overlay.content) {
703
- segments = [
704
- overlay.content
705
- ];
706
- } else {
707
- segments = rssUrl ? [
708
- "Loading feed\u2026"
709
- ] : [
710
- "RSS Ticker"
711
- ];
712
- }
713
- var scrollSpeed = (_ref3 = cfg === null || cfg === void 0 ? void 0 : cfg.scroll_speed) !== null && _ref3 !== void 0 ? _ref3 : 40;
714
- var direction = (_ref4 = cfg === null || cfg === void 0 ? void 0 : cfg.direction) !== null && _ref4 !== void 0 ? _ref4 : "left";
715
- var fontSize = (_ref5 = cfg === null || cfg === void 0 ? void 0 : cfg.font_size) !== null && _ref5 !== void 0 ? _ref5 : 15;
716
- var fontFamily = (cfg === null || cfg === void 0 ? void 0 : cfg.font_family) || "Roboto, 'Segoe UI', Arial, sans-serif";
717
- var fontWeight = (cfg === null || cfg === void 0 ? void 0 : cfg.font_weight) || "700";
718
- var textColor = (cfg === null || cfg === void 0 ? void 0 : cfg.text_color) || "#ffffff";
719
- var bgColor = (cfg === null || cfg === void 0 ? void 0 : cfg.background_color) || "#0d0d1a";
720
- var bgOpacity = (cfg === null || cfg === void 0 ? void 0 : cfg.background_opacity) !== void 0 ? cfg.background_opacity / 100 : 0.95;
721
- var borderRadius = (_ref6 = cfg === null || cfg === void 0 ? void 0 : cfg.border_radius) !== null && _ref6 !== void 0 ? _ref6 : 0;
722
- var itemSpacing = (_ref7 = cfg === null || cfg === void 0 ? void 0 : cfg.item_spacing) !== null && _ref7 !== void 0 ? _ref7 : 60;
723
- var pad = (cfg === null || cfg === void 0 ? void 0 : cfg.padding) !== void 0 && cfg.padding >= 0 ? cfg.padding : 8;
724
- var label = (_ref8 = cfg === null || cfg === void 0 ? void 0 : cfg.label) !== null && _ref8 !== void 0 ? _ref8 : "NEWS";
725
- var labelLine2 = (_ref9 = cfg === null || cfg === void 0 ? void 0 : cfg.label_line2) !== null && _ref9 !== void 0 ? _ref9 : "";
726
- var labelColor = (_ref10 = cfg === null || cfg === void 0 ? void 0 : cfg.label_color) !== null && _ref10 !== void 0 ? _ref10 : "#f97316";
727
- var labelTextColor = (_ref11 = cfg === null || cfg === void 0 ? void 0 : cfg.label_text_color) !== null && _ref11 !== void 0 ? _ref11 : "#ffffff";
728
- var accentColor = (_ref12 = cfg === null || cfg === void 0 ? void 0 : cfg.accent_color) !== null && _ref12 !== void 0 ? _ref12 : labelColor;
729
- var showAccentLine = (cfg === null || cfg === void 0 ? void 0 : cfg.show_accent_line) !== false;
730
- var isEquitiesStrip = (cfg === null || cfg === void 0 ? void 0 : cfg.preset) === "equities_strip";
731
- var isHorizontal = direction === "left" || direction === "right";
732
- var isReverse = direction === "right" || direction === "down";
733
- var fullText = segments.join(" ".concat(sep, " "));
734
- var durationSec = Math.max(6, fullText.length * 9 / scrollSpeed);
735
- var animId = "sc-ticker-".concat(overlay.id, "-").concat(uid);
736
- var keyframes = isHorizontal ? "@keyframes ".concat(animId, " {\n ").concat(isReverse ? "0% { transform: translateX(-50%); } 100% { transform: translateX(0%); }" : "0% { transform: translateX(0); } 100% { transform: translateX(-50%); }", "\n }") : "@keyframes ".concat(animId, " {\n ").concat(isReverse ? "0% { transform: translateY(-50%); } 100% { transform: translateY(0%); }" : "0% { transform: translateY(0); } 100% { transform: translateY(-50%); }", "\n }");
737
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, {
738
- children: [
739
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", {
740
- children: keyframes
741
- }),
742
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
743
- style: {
744
- width: "100%",
745
- height: "100%",
746
- display: "flex",
747
- flexDirection: "column",
748
- overflow: "hidden",
749
- borderRadius: borderRadius > 0 ? "".concat(borderRadius, "px") : void 0,
750
- backgroundColor: "rgba(".concat(hexToRgb(bgColor), ", ").concat(bgOpacity, ")"),
751
- fontFamily: fontFamily,
752
- fontSize: "".concat(fontSize, "px"),
753
- fontWeight: fontWeight,
754
- color: textColor,
755
- pointerEvents: "none",
756
- userSelect: "none"
757
- },
758
- children: [
759
- showAccentLine && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
760
- style: {
761
- height: isEquitiesStrip ? 2 : 3,
762
- background: accentColor,
763
- flexShrink: 0,
764
- width: "100%"
765
- }
766
- }),
767
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
768
- style: {
769
- display: "flex",
770
- flex: 1,
771
- overflow: "hidden",
772
- minHeight: 0,
773
- alignItems: "center",
774
- padding: isEquitiesStrip ? "".concat(Math.max(2, pad * 0.5), "px ").concat(pad, "px") : "".concat(Math.max(4, pad * 0.75), "px ").concat(pad, "px"),
775
- gap: isEquitiesStrip ? Math.max(4, Math.round(pad * 0.75)) : Math.max(6, pad),
776
- boxSizing: "border-box"
777
- },
778
- children: [
779
- label && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
780
- style: {
781
- background: labelColor,
782
- color: labelTextColor,
783
- padding: isEquitiesStrip ? "6px 12px" : "10px 14px",
784
- display: "flex",
785
- flexDirection: isEquitiesStrip ? "row" : "column",
786
- alignItems: "center",
787
- justifyContent: "center",
788
- flexShrink: 0,
789
- textAlign: "center",
790
- gap: isEquitiesStrip ? 0 : 2,
791
- borderRadius: Math.max(2, borderRadius > 0 ? borderRadius : 6),
792
- boxShadow: isEquitiesStrip ? "inset 0 1px 0 rgba(255,255,255,0.08)" : "0 2px 8px rgba(0,0,0,0.35)",
793
- alignSelf: "stretch",
794
- maxWidth: isEquitiesStrip ? "min(200px, 28%)" : void 0
795
- },
796
- children: [
797
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
798
- style: {
799
- fontWeight: isEquitiesStrip ? 700 : 800,
800
- fontSize: isEquitiesStrip ? "0.82em" : "0.78em",
801
- letterSpacing: isEquitiesStrip ? "0.04em" : "0.08em",
802
- lineHeight: 1.2,
803
- textTransform: isEquitiesStrip ? "none" : "uppercase",
804
- whiteSpace: isEquitiesStrip ? "normal" : "nowrap",
805
- textAlign: isEquitiesStrip ? "left" : "center"
806
- },
807
- children: label
808
- }),
809
- labelLine2 && !isEquitiesStrip && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
810
- style: {
811
- fontWeight: 600,
812
- fontSize: "0.58em",
813
- letterSpacing: "0.06em",
814
- lineHeight: 1.15,
815
- opacity: 0.92,
816
- whiteSpace: "nowrap"
817
- },
818
- children: labelLine2
819
- })
820
- ]
821
- }),
822
- label && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
823
- style: {
824
- width: isEquitiesStrip ? 1 : 2,
825
- alignSelf: "stretch",
826
- minHeight: isEquitiesStrip ? 20 : 24,
827
- background: accentColor,
828
- flexShrink: 0,
829
- borderRadius: 1,
830
- opacity: 0.85
831
- }
832
- }),
833
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
834
- style: {
835
- flex: 1,
836
- overflow: "hidden",
837
- position: "relative",
838
- display: "flex",
839
- alignItems: "center",
840
- minWidth: 0
841
- },
842
- children: isHorizontal ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
843
- style: {
844
- display: "inline-flex",
845
- whiteSpace: "nowrap",
846
- animation: "".concat(animId, " ").concat(durationSec, "s linear infinite"),
847
- willChange: "transform"
848
- },
849
- children: [
850
- 0,
851
- 1
852
- ].map(function(copy) {
853
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
854
- style: {
855
- paddingRight: "".concat(itemSpacing, "px")
856
- },
857
- children: segments.map(function(seg, i) {
858
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react.default.Fragment, {
859
- children: [
860
- i > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
861
- style: {
862
- opacity: 0.5,
863
- margin: "0 8px"
864
- },
865
- children: sep
866
- }),
867
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
868
- style: {
869
- textShadow: "0 1px 3px rgba(0,0,0,0.6)"
870
- },
871
- children: seg
872
- })
873
- ]
874
- }, i);
875
- })
876
- }, copy);
877
- })
878
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
879
- style: {
880
- display: "flex",
881
- flexDirection: "column",
882
- whiteSpace: "nowrap",
883
- animation: "".concat(animId, " ").concat(durationSec, "s linear infinite"),
884
- willChange: "transform"
885
- },
886
- children: [
887
- 0,
888
- 1
889
- ].map(function(copy) {
890
- return segments.map(function(seg, i) {
891
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
892
- style: {
893
- paddingBottom: "".concat(itemSpacing / 4, "px")
894
- },
895
- children: seg
896
- }, "".concat(copy, "-").concat(i));
897
- });
898
- })
899
- })
900
- })
901
- ]
902
- })
903
- ]
904
- })
905
- ]
906
- });
907
- }
908
- function parseConfig(content) {
909
- if (!content) return null;
910
- try {
911
- return JSON.parse(content);
912
- } catch (unused) {
913
- return null;
914
- }
915
- }
916
- function parseClockMMSS(clock) {
917
- if (!clock) return null;
918
- var m = /^\s*(\d{1,3}):([0-5]?\d)\s*$/.exec(clock);
919
- if (!m) return null;
920
- return parseInt(m[1], 10) * 60 + parseInt(m[2], 10);
921
- }
922
- function formatClockMMSS(totalSec) {
923
- var s = Math.max(0, Math.floor(totalSec));
924
- var mm = Math.floor(s / 60);
925
- var ss = s % 60;
926
- return "".concat(mm, ":").concat(ss.toString().padStart(2, "0"));
927
- }
928
- function useScoreBugClock(overlayId, sourceClock) {
929
- var initialSec = parseClockMMSS(sourceClock);
930
- var _ref = _sliced_to_array((0, import_react.useState)(function() {
931
- return Date.now();
932
- }), 2), now = _ref[0], setNow = _ref[1];
933
- var startRef = (0, import_react.useRef)(null);
934
- (0, import_react.useEffect)(function() {
935
- if (initialSec === null) {
936
- startRef.current = null;
937
- return;
938
- }
939
- startRef.current = {
940
- id: overlayId,
941
- source: sourceClock || "",
942
- at: Date.now(),
943
- seconds: initialSec
944
- };
945
- setNow(Date.now());
946
- var tick = window.setInterval(function() {
947
- return setNow(Date.now());
948
- }, 500);
949
- return function() {
950
- return clearInterval(tick);
951
- };
952
- }, [
953
- overlayId,
954
- sourceClock,
955
- initialSec
956
- ]);
957
- if (initialSec === null || !startRef.current) return null;
958
- var elapsed = Math.floor((now - startRef.current.at) / 1e3);
959
- var remaining = Math.max(0, startRef.current.seconds - elapsed);
960
- return formatClockMMSS(remaining);
961
- }
962
- function ScoreBugOverlay(param) {
963
- var overlay = param.overlay, size = param.size;
964
- var _ref, _cfg_period;
965
- var cfg = parseConfig(overlay.content);
966
- var liveClock = useScoreBugClock(overlay.id, cfg === null || cfg === void 0 ? void 0 : cfg.clock);
967
- if (!cfg) return null;
968
- var f = Math.max(6, size.w * 0.052);
969
- var displayClock = (_ref = liveClock !== null && liveClock !== void 0 ? liveClock : cfg.clock) !== null && _ref !== void 0 ? _ref : "";
970
- var displayPeriod = (_cfg_period = cfg.period) !== null && _cfg_period !== void 0 ? _cfg_period : "";
971
- var showMiddleCol = Boolean(displayPeriod || displayClock);
972
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
973
- style: {
974
- width: "100%",
975
- height: "100%",
976
- borderRadius: Math.max(2, size.w * 0.028),
977
- display: "flex",
978
- flexDirection: "column",
979
- background: cfg.backgroundColor,
980
- color: cfg.textColor,
981
- fontFamily: "'Inter', 'Roboto', 'Segoe UI', system-ui, sans-serif",
982
- overflow: "hidden",
983
- pointerEvents: "none",
984
- userSelect: "none",
985
- fontSize: "".concat(f, "px"),
986
- boxShadow: "0 8px 28px rgba(0,0,0,0.45)"
987
- },
988
- children: [
989
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
990
- style: {
991
- flex: 1,
992
- display: "flex",
993
- alignItems: "center",
994
- padding: "".concat(f * 0.42, "px ").concat(f * 0.85, "px"),
995
- gap: f * 0.45,
996
- minHeight: 0
997
- },
998
- children: [
999
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1000
- style: {
1001
- flex: 1,
1002
- textAlign: "center",
1003
- minWidth: 0,
1004
- padding: "0 ".concat(f * 0.15, "px")
1005
- },
1006
- children: [
1007
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1008
- style: {
1009
- fontSize: "1.05em",
1010
- fontWeight: 800,
1011
- letterSpacing: "0.02em",
1012
- overflow: "hidden",
1013
- textOverflow: "ellipsis",
1014
- whiteSpace: "nowrap"
1015
- },
1016
- children: cfg.homeTeam
1017
- }),
1018
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1019
- style: {
1020
- fontSize: "1.75em",
1021
- fontWeight: 900,
1022
- lineHeight: 1.05,
1023
- marginTop: f * 0.08
1024
- },
1025
- children: cfg.homeScore
1026
- })
1027
- ]
1028
- }),
1029
- showMiddleCol && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1030
- style: {
1031
- fontSize: "0.88em",
1032
- textAlign: "center",
1033
- fontWeight: 600,
1034
- opacity: 0.92,
1035
- color: cfg.textColor,
1036
- padding: "0 ".concat(f * 0.5, "px"),
1037
- flexShrink: 0,
1038
- lineHeight: 1.25,
1039
- textTransform: "uppercase",
1040
- letterSpacing: "0.04em"
1041
- },
1042
- children: [
1043
- displayPeriod && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1044
- children: displayPeriod
1045
- }),
1046
- displayClock && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1047
- style: {
1048
- fontWeight: 700,
1049
- opacity: 1
1050
- },
1051
- children: displayClock
1052
- })
1053
- ]
1054
- }),
1055
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1056
- style: {
1057
- flex: 1,
1058
- textAlign: "center",
1059
- minWidth: 0,
1060
- padding: "0 ".concat(f * 0.15, "px")
1061
- },
1062
- children: [
1063
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1064
- style: {
1065
- fontSize: "1.05em",
1066
- fontWeight: 800,
1067
- letterSpacing: "0.02em",
1068
- overflow: "hidden",
1069
- textOverflow: "ellipsis",
1070
- whiteSpace: "nowrap"
1071
- },
1072
- children: cfg.awayTeam
1073
- }),
1074
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1075
- style: {
1076
- fontSize: "1.75em",
1077
- fontWeight: 900,
1078
- lineHeight: 1.05,
1079
- marginTop: f * 0.08
1080
- },
1081
- children: cfg.awayScore
1082
- })
1083
- ]
1084
- })
1085
- ]
1086
- }),
1087
- (cfg.sponsorText || cfg.sponsorImageUrl) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1088
- style: {
1089
- fontSize: "0.72em",
1090
- textAlign: "center",
1091
- fontWeight: 600,
1092
- opacity: 0.88,
1093
- padding: "".concat(f * 0.34, "px ").concat(f * 0.55, "px"),
1094
- borderTop: "1px solid ".concat(cfg.accentColor, "55"),
1095
- display: "flex",
1096
- alignItems: "center",
1097
- justifyContent: "center",
1098
- gap: f * 0.45,
1099
- overflow: "hidden",
1100
- letterSpacing: "0.04em",
1101
- textTransform: "uppercase",
1102
- background: "linear-gradient(180deg, rgba(0,0,0,0.12) 0%, rgba(0,0,0,0.22) 100%)"
1103
- },
1104
- children: [
1105
- cfg.sponsorImageUrl && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
1106
- src: cfg.sponsorImageUrl,
1107
- alt: "sponsor",
1108
- style: {
1109
- height: "".concat(f * 1.35, "px"),
1110
- objectFit: "contain",
1111
- flexShrink: 0
1112
- }
1113
- }),
1114
- cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1115
- style: {
1116
- overflow: "hidden",
1117
- textOverflow: "ellipsis",
1118
- whiteSpace: "nowrap"
1119
- },
1120
- children: cfg.sponsorText
1121
- })
1122
- ]
1123
- })
1124
- ]
1125
- });
1126
- }
1127
- function LowerThirdOverlay(param) {
1128
- var overlay = param.overlay, size = param.size;
1129
- var cfg = parseConfig(overlay.content);
1130
- if (!cfg) return null;
1131
- var f = Math.max(6, size.w * 0.05);
1132
- var accentH = Math.max(3, size.h * 0.038);
1133
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1134
- style: {
1135
- width: "100%",
1136
- height: "100%",
1137
- borderRadius: Math.max(2, size.w * 0.018),
1138
- display: "flex",
1139
- flexDirection: "column",
1140
- justifyContent: "flex-end",
1141
- background: cfg.backgroundColor,
1142
- color: cfg.textColor,
1143
- fontFamily: "'Inter', 'Roboto', 'Segoe UI', system-ui, sans-serif",
1144
- overflow: "hidden",
1145
- pointerEvents: "none",
1146
- userSelect: "none",
1147
- fontSize: "".concat(f, "px"),
1148
- boxShadow: "0 10px 32px rgba(0,0,0,0.4)"
1149
- },
1150
- children: [
1151
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1152
- style: {
1153
- width: "100%",
1154
- height: accentH,
1155
- backgroundColor: cfg.accentColor,
1156
- flexShrink: 0
1157
- }
1158
- }),
1159
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1160
- style: {
1161
- flex: 1,
1162
- display: "flex",
1163
- flexDirection: "column",
1164
- justifyContent: "center",
1165
- padding: "".concat(f * 0.62, "px ").concat(f * 1.05, "px"),
1166
- minHeight: 0,
1167
- gap: f * 0.18
1168
- },
1169
- children: [
1170
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1171
- style: {
1172
- fontSize: "1.28em",
1173
- fontWeight: 800,
1174
- lineHeight: 1.22,
1175
- letterSpacing: "0.01em",
1176
- textShadow: "0 2px 6px rgba(0,0,0,0.55)"
1177
- },
1178
- children: cfg.headline
1179
- }),
1180
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1181
- style: {
1182
- fontSize: "0.94em",
1183
- fontWeight: 500,
1184
- opacity: 0.92,
1185
- lineHeight: 1.35,
1186
- color: cfg.textColor
1187
- },
1188
- children: cfg.subtitle
1189
- })
1190
- ]
1191
- }),
1192
- (cfg.sponsorText || cfg.sponsorImageUrl) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1193
- style: {
1194
- fontSize: "0.68em",
1195
- fontWeight: 600,
1196
- opacity: 0.72,
1197
- padding: "".concat(f * 0.28, "px ").concat(f * 1.05, "px ").concat(f * 0.48, "px"),
1198
- display: "flex",
1199
- alignItems: "center",
1200
- gap: f * 0.4,
1201
- overflow: "hidden",
1202
- letterSpacing: "0.06em",
1203
- textTransform: "uppercase",
1204
- borderTop: "1px solid rgba(255,255,255,0.08)"
1205
- },
1206
- children: [
1207
- cfg.sponsorImageUrl && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
1208
- src: cfg.sponsorImageUrl,
1209
- alt: "sponsor",
1210
- style: {
1211
- height: "".concat(f * 1.25, "px"),
1212
- objectFit: "contain",
1213
- flexShrink: 0
1214
- }
1215
- }),
1216
- cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1217
- style: {
1218
- overflow: "hidden",
1219
- textOverflow: "ellipsis",
1220
- whiteSpace: "nowrap"
1221
- },
1222
- children: cfg.sponsorText
1223
- })
1224
- ]
1225
- })
1226
- ]
1227
- });
1228
- }
1229
- function QrCodeOverlay(param) {
1230
- var overlay = param.overlay, size = param.size;
1231
- var cfg = parseConfig(overlay.content);
1232
- if (!cfg) return null;
1233
- var qrSide = Math.max(32, Math.min(size.w, size.h) * 0.55);
1234
- var qrUrl = "https://api.qrserver.com/v1/create-qr-code/?size=".concat(Math.round(qrSide * 2), "x").concat(Math.round(qrSide * 2), "&data=").concat(encodeURIComponent(cfg.url || "https://example.com"));
1235
- var f = Math.max(6, size.w * 0.06);
1236
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1237
- style: {
1238
- width: "100%",
1239
- height: "100%",
1240
- borderRadius: Math.max(2, size.w * 0.035),
1241
- display: "flex",
1242
- flexDirection: "column",
1243
- alignItems: "center",
1244
- justifyContent: "center",
1245
- gap: f * 0.4,
1246
- background: cfg.backgroundColor,
1247
- color: cfg.textColor,
1248
- fontFamily: "Roboto, 'Segoe UI', Arial, sans-serif",
1249
- padding: f * 0.6,
1250
- boxSizing: "border-box",
1251
- pointerEvents: "none",
1252
- userSelect: "none",
1253
- overflow: "hidden"
1254
- },
1255
- children: [
1256
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1257
- style: {
1258
- flexShrink: 0,
1259
- background: "#fff",
1260
- borderRadius: Math.max(2, qrSide * 0.06),
1261
- padding: Math.max(2, qrSide * 0.06),
1262
- lineHeight: 0
1263
- },
1264
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
1265
- src: qrUrl,
1266
- alt: "QR Code",
1267
- style: {
1268
- width: "".concat(qrSide, "px"),
1269
- height: "".concat(qrSide, "px"),
1270
- display: "block"
1271
- }
1272
- })
1273
- }),
1274
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1275
- style: {
1276
- fontSize: "".concat(f * 1.1, "px"),
1277
- fontWeight: 700,
1278
- textAlign: "center",
1279
- color: cfg.accentColor,
1280
- overflow: "hidden",
1281
- textOverflow: "ellipsis",
1282
- whiteSpace: "nowrap",
1283
- width: "100%"
1284
- },
1285
- children: cfg.ctaText
1286
- }),
1287
- cfg.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1288
- style: {
1289
- fontSize: "".concat(f * 0.75, "px"),
1290
- opacity: 0.6,
1291
- textAlign: "center",
1292
- overflow: "hidden",
1293
- textOverflow: "ellipsis",
1294
- whiteSpace: "nowrap",
1295
- width: "100%"
1296
- },
1297
- children: cfg.description
1298
- })
1299
- ]
1300
- });
1301
- }
1302
- function ComingUpNextOverlay(param) {
1303
- var overlay = param.overlay, size = param.size;
1304
- var cfg = parseConfig(overlay.content);
1305
- if (!cfg) return null;
1306
- var f = Math.max(8, Math.min(size.h * 0.13, size.w * 0.048));
1307
- var showSubtitle = size.h >= 60;
1308
- var showThumbnail = false;
1309
- var thumbW = 0;
1310
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1311
- style: {
1312
- width: "100%",
1313
- height: "100%",
1314
- borderRadius: Math.max(2, size.w * 0.025),
1315
- display: "flex",
1316
- background: cfg.backgroundColor,
1317
- color: cfg.textColor,
1318
- fontFamily: "'Arial', 'Helvetica Neue', Helvetica, sans-serif",
1319
- overflow: "hidden",
1320
- pointerEvents: "none",
1321
- userSelect: "none",
1322
- fontSize: "".concat(f, "px"),
1323
- WebkitFontSmoothing: "antialiased"
1324
- },
1325
- children: [
1326
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1327
- style: {
1328
- width: Math.max(3, size.w * 0.018),
1329
- flexShrink: 0,
1330
- backgroundColor: cfg.accentColor
1331
- }
1332
- }),
1333
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1334
- style: {
1335
- flex: 1,
1336
- display: "flex",
1337
- flexDirection: "column",
1338
- justifyContent: "center",
1339
- padding: "".concat(f * 0.35, "px ").concat(f * 0.75, "px"),
1340
- minWidth: 0,
1341
- gap: "".concat(f * 0.08, "px")
1342
- },
1343
- children: [
1344
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1345
- style: {
1346
- fontSize: "0.7em",
1347
- fontWeight: 700,
1348
- textTransform: "uppercase",
1349
- letterSpacing: "0.09em",
1350
- color: cfg.accentColor,
1351
- lineHeight: 1
1352
- },
1353
- children: "Coming Up Next"
1354
- }),
1355
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1356
- style: {
1357
- fontSize: "1.2em",
1358
- fontWeight: 700,
1359
- lineHeight: 1.2,
1360
- overflow: "hidden",
1361
- textOverflow: "ellipsis",
1362
- whiteSpace: "nowrap"
1363
- },
1364
- children: cfg.title
1365
- }),
1366
- showSubtitle && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1367
- style: {
1368
- fontSize: "0.82em",
1369
- opacity: 0.65,
1370
- lineHeight: 1.1,
1371
- overflow: "hidden",
1372
- textOverflow: "ellipsis",
1373
- whiteSpace: "nowrap"
1374
- },
1375
- children: cfg.subtitle
1376
- }),
1377
- cfg.scheduledTime && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1378
- style: {
1379
- fontSize: "0.9em",
1380
- fontWeight: 700,
1381
- color: cfg.accentColor,
1382
- lineHeight: 1
1383
- },
1384
- children: cfg.scheduledTime
1385
- })
1386
- ]
1387
- }),
1388
- showThumbnail && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1389
- style: {
1390
- flexShrink: 0,
1391
- width: "".concat(thumbW, "px"),
1392
- overflow: "hidden"
1393
- },
1394
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
1395
- src: cfg.thumbnailUrl,
1396
- alt: "",
1397
- style: {
1398
- width: "100%",
1399
- height: "100%",
1400
- objectFit: "cover",
1401
- display: "block"
1402
- }
1403
- })
1404
- })
1405
- ]
1406
- });
1407
- }
1408
- function ContextualTriggerOverlay(param) {
1409
- var overlay = param.overlay, size = param.size;
1410
- var cfg = parseConfig(overlay.content);
1411
- if (!cfg) return null;
1412
- var icons = {
1413
- alert: "\u26A0\uFE0F",
1414
- celebration: "\uD83C\uDF89",
1415
- info: "\u2139\uFE0F",
1416
- warning: "\uD83D\uDD14"
1417
- };
1418
- var f = Math.max(6, size.w * 0.05);
1419
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1420
- style: {
1421
- width: "100%",
1422
- height: "100%",
1423
- borderRadius: Math.max(2, size.w * 0.035),
1424
- display: "flex",
1425
- alignItems: "center",
1426
- gap: f * 0.8,
1427
- padding: "0 ".concat(f * 1.2, "px"),
1428
- background: cfg.backgroundColor,
1429
- color: cfg.textColor,
1430
- fontFamily: "Roboto, 'Segoe UI', Arial, sans-serif",
1431
- borderLeft: "".concat(Math.max(2, size.w * 0.02), "px solid ").concat(cfg.accentColor),
1432
- boxSizing: "border-box",
1433
- pointerEvents: "none",
1434
- userSelect: "none",
1435
- fontSize: "".concat(f, "px")
1436
- },
1437
- children: [
1438
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1439
- style: {
1440
- fontSize: "2em",
1441
- flexShrink: 0
1442
- },
1443
- children: icons[cfg.iconType] || "\u26A1"
1444
- }),
1445
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1446
- style: {
1447
- flex: 1,
1448
- minWidth: 0
1449
- },
1450
- children: [
1451
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1452
- style: {
1453
- fontSize: "1.3em",
1454
- fontWeight: 700,
1455
- overflow: "hidden",
1456
- textOverflow: "ellipsis",
1457
- whiteSpace: "nowrap"
1458
- },
1459
- children: cfg.headline
1460
- }),
1461
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1462
- style: {
1463
- fontSize: "0.9em",
1464
- opacity: 0.7,
1465
- overflow: "hidden",
1466
- textOverflow: "ellipsis",
1467
- whiteSpace: "nowrap"
1468
- },
1469
- children: cfg.message
1470
- })
1471
- ]
1472
- })
1473
- ]
1474
- });
1475
- }
1476
- function OddsBettingOverlay(param) {
1477
- var overlay = param.overlay, size = param.size;
1478
- var cfg = parseConfig(overlay.content);
1479
- if (!cfg) return null;
1480
- var f = Math.max(6, size.w * 0.052);
1481
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1482
- style: {
1483
- width: "100%",
1484
- height: "100%",
1485
- borderRadius: Math.max(2, size.w * 0.035),
1486
- display: "flex",
1487
- flexDirection: "column",
1488
- padding: f * 0.8,
1489
- background: cfg.backgroundColor,
1490
- color: cfg.textColor,
1491
- fontFamily: "Roboto, 'Segoe UI', Arial, sans-serif",
1492
- boxSizing: "border-box",
1493
- pointerEvents: "none",
1494
- userSelect: "none",
1495
- fontSize: "".concat(f, "px")
1496
- },
1497
- children: [
1498
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1499
- style: {
1500
- fontSize: "0.9em",
1501
- fontWeight: 700,
1502
- textTransform: "uppercase",
1503
- letterSpacing: "0.05em",
1504
- color: cfg.accentColor,
1505
- marginBottom: f * 0.4
1506
- },
1507
- children: cfg.eventTitle
1508
- }),
1509
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1510
- style: {
1511
- flex: 1,
1512
- display: "flex",
1513
- flexDirection: "column",
1514
- gap: f * 0.2,
1515
- justifyContent: "center"
1516
- },
1517
- children: (cfg.options || []).slice(0, 5).map(function(opt, i) {
1518
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1519
- style: {
1520
- display: "flex",
1521
- justifyContent: "space-between",
1522
- alignItems: "center",
1523
- padding: "".concat(f * 0.2, "px ").concat(f * 0.6, "px"),
1524
- borderRadius: Math.max(2, f * 0.3),
1525
- background: "".concat(cfg.accentColor, "15"),
1526
- fontSize: "1em"
1527
- },
1528
- children: [
1529
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1530
- style: {
1531
- overflow: "hidden",
1532
- textOverflow: "ellipsis",
1533
- whiteSpace: "nowrap",
1534
- flex: 1
1535
- },
1536
- children: opt.label
1537
- }),
1538
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1539
- style: {
1540
- fontWeight: 700,
1541
- marginLeft: f * 0.8,
1542
- flexShrink: 0,
1543
- color: cfg.accentColor
1544
- },
1545
- children: opt.odds
1546
- })
1547
- ]
1548
- }, i);
1549
- })
1550
- }),
1551
- cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1552
- style: {
1553
- fontSize: "0.7em",
1554
- opacity: 0.4,
1555
- textAlign: "center",
1556
- marginTop: f * 0.4
1557
- },
1558
- children: cfg.sponsorText
1559
- })
1560
- ]
1561
- });
1562
- }
1563
- function BreakingNewsOverlay(param) {
1564
- var overlay = param.overlay, size = param.size;
1565
- var cfg = parseConfig(overlay.content);
1566
- if (!cfg) return null;
1567
- var urgencyColors = {
1568
- breaking: "#dc2626",
1569
- urgent: "#ea580c",
1570
- normal: "#2563eb"
1571
- };
1572
- var labelBg = urgencyColors[cfg.urgency] || urgencyColors.normal;
1573
- var label = cfg.urgency === "breaking" ? "BREAKING" : cfg.urgency === "urgent" ? "URGENT" : "NEWS";
1574
- var f = Math.max(6, size.w * 0.05);
1575
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1576
- style: {
1577
- width: "100%",
1578
- height: "100%",
1579
- borderRadius: Math.max(2, size.w * 0.02),
1580
- display: "flex",
1581
- alignItems: "center",
1582
- background: cfg.backgroundColor,
1583
- color: cfg.textColor,
1584
- fontFamily: "Roboto, 'Segoe UI', Arial, sans-serif",
1585
- overflow: "hidden",
1586
- pointerEvents: "none",
1587
- userSelect: "none",
1588
- fontSize: "".concat(f, "px")
1589
- },
1590
- children: [
1591
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1592
- style: {
1593
- padding: "0 ".concat(f * 0.8, "px"),
1594
- height: "100%",
1595
- display: "flex",
1596
- alignItems: "center",
1597
- background: labelBg,
1598
- color: "#fff",
1599
- fontSize: "1em",
1600
- fontWeight: 900,
1601
- textTransform: "uppercase",
1602
- letterSpacing: "0.05em",
1603
- flexShrink: 0
1604
- },
1605
- children: label
1606
- }),
1607
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1608
- style: {
1609
- flex: 1,
1610
- padding: "0 ".concat(f * 1, "px"),
1611
- minWidth: 0
1612
- },
1613
- children: [
1614
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1615
- style: {
1616
- fontSize: "1.3em",
1617
- fontWeight: 700,
1618
- overflow: "hidden",
1619
- textOverflow: "ellipsis",
1620
- whiteSpace: "nowrap"
1621
- },
1622
- children: cfg.headline
1623
- }),
1624
- cfg.body && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1625
- style: {
1626
- fontSize: "0.9em",
1627
- opacity: 0.7,
1628
- overflow: "hidden",
1629
- textOverflow: "ellipsis",
1630
- whiteSpace: "nowrap"
1631
- },
1632
- children: cfg.body
1633
- })
1634
- ]
1635
- })
1636
- ]
1637
- });
1638
- }
1639
- function calcCountdownRemaining(targetTime) {
1640
- var diff = Math.max(0, new Date(targetTime).getTime() - Date.now());
1641
- return {
1642
- d: Math.floor(diff / 864e5),
1643
- h: Math.floor(diff % 864e5 / 36e5),
1644
- m: Math.floor(diff % 36e5 / 6e4),
1645
- s: Math.floor(diff % 6e4 / 1e3),
1646
- expired: diff === 0
1647
- };
1648
- }
1649
- function CountdownOverlay(param) {
1650
- var overlay = param.overlay, size = param.size;
1651
- var _ref;
1652
- var cfg = parseConfig(overlay.content);
1653
- var targetTime = (_ref = cfg === null || cfg === void 0 ? void 0 : cfg.targetTime) !== null && _ref !== void 0 ? _ref : "";
1654
- var _ref1 = _sliced_to_array((0, import_react.useState)(function() {
1655
- return targetTime ? calcCountdownRemaining(targetTime) : {
1656
- d: 0,
1657
- h: 0,
1658
- m: 0,
1659
- s: 0,
1660
- expired: false
1661
- };
1662
- }), 2), remaining = _ref1[0], setRemaining = _ref1[1];
1663
- (0, import_react.useEffect)(function() {
1664
- if (!targetTime) return;
1665
- setRemaining(calcCountdownRemaining(targetTime));
1666
- var id = setInterval(function() {
1667
- return setRemaining(calcCountdownRemaining(targetTime));
1668
- }, 1e3);
1669
- return function() {
1670
- return clearInterval(id);
1671
- };
1672
- }, [
1673
- targetTime
1674
- ]);
1675
- if (!cfg) return null;
1676
- var f = Math.max(6, size.w * 0.055);
1677
- var pad = function pad(n) {
1678
- return String(n).padStart(2, "0");
1679
- };
1680
- var units = [
1681
- {
1682
- show: cfg.showDays,
1683
- value: pad(remaining.d),
1684
- label: "DAYS"
1685
- },
1686
- {
1687
- show: cfg.showHours,
1688
- value: pad(remaining.h),
1689
- label: "HRS"
1690
- },
1691
- {
1692
- show: cfg.showMinutes,
1693
- value: pad(remaining.m),
1694
- label: "MIN"
1695
- },
1696
- {
1697
- show: cfg.showSeconds,
1698
- value: pad(remaining.s),
1699
- label: "SEC"
1700
- }
1701
- ];
1702
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1703
- style: {
1704
- width: "100%",
1705
- height: "100%",
1706
- borderRadius: Math.max(2, size.w * 0.035),
1707
- display: "flex",
1708
- flexDirection: "column",
1709
- alignItems: "center",
1710
- justifyContent: "center",
1711
- padding: f * 0.8,
1712
- background: cfg.backgroundColor,
1713
- color: cfg.textColor,
1714
- fontFamily: "Roboto, 'Segoe UI', Arial, sans-serif",
1715
- boxSizing: "border-box",
1716
- pointerEvents: "none",
1717
- userSelect: "none",
1718
- fontSize: "".concat(f, "px")
1719
- },
1720
- children: [
1721
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1722
- style: {
1723
- fontSize: "0.8em",
1724
- fontWeight: 600,
1725
- textTransform: "uppercase",
1726
- letterSpacing: "0.05em",
1727
- color: cfg.accentColor,
1728
- marginBottom: f * 0.4
1729
- },
1730
- children: cfg.eventName
1731
- }),
1732
- remaining.expired ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1733
- style: {
1734
- fontSize: "1em",
1735
- fontWeight: 700,
1736
- opacity: 0.6
1737
- },
1738
- children: cfg.message || "Event ended"
1739
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1740
- style: {
1741
- display: "flex",
1742
- gap: f * 0.6,
1743
- alignItems: "center"
1744
- },
1745
- children: units.filter(function(u) {
1746
- return u.show;
1747
- }).map(function(u, i, arr) {
1748
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react.default.Fragment, {
1749
- children: [
1750
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1751
- style: {
1752
- textAlign: "center"
1753
- },
1754
- children: [
1755
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1756
- style: {
1757
- fontSize: "2em",
1758
- fontWeight: 900,
1759
- lineHeight: 1,
1760
- borderRadius: Math.max(2, f * 0.4),
1761
- padding: "".concat(f * 0.2, "px ").concat(f * 0.4, "px"),
1762
- background: "".concat(cfg.accentColor, "20")
1763
- },
1764
- children: u.value
1765
- }),
1766
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1767
- style: {
1768
- fontSize: "0.5em",
1769
- opacity: 0.5,
1770
- marginTop: f * 0.2
1771
- },
1772
- children: u.label
1773
- })
1774
- ]
1775
- }),
1776
- i < arr.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1777
- style: {
1778
- fontSize: "1.8em",
1779
- fontWeight: 700,
1780
- opacity: 0.3
1781
- },
1782
- children: ":"
1783
- })
1784
- ]
1785
- }, u.label);
1786
- })
1787
- }),
1788
- !remaining.expired && cfg.message && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1789
- style: {
1790
- fontSize: "0.8em",
1791
- opacity: 0.6,
1792
- marginTop: f * 0.4,
1793
- textAlign: "center"
1794
- },
1795
- children: cfg.message
1796
- })
1797
- ]
1798
- });
1799
- }
1800
- function ShapeOverlay(param) {
1801
- var overlay = param.overlay, size = param.size;
1802
- var f = Math.max(6, size.w * 0.05);
1803
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1804
- style: {
1805
- width: "100%",
1806
- height: "100%",
1807
- borderRadius: Math.max(2, size.w * 0.03),
1808
- background: "rgba(99, 102, 241, 0.2)",
1809
- border: "2px solid rgba(99, 102, 241, 0.4)",
1810
- display: "flex",
1811
- alignItems: "center",
1812
- justifyContent: "center",
1813
- pointerEvents: "none",
1814
- userSelect: "none"
1815
- },
1816
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1817
- style: {
1818
- fontSize: "".concat(f, "px"),
1819
- fontWeight: 500,
1820
- color: "rgba(163, 163, 163, 0.8)",
1821
- textTransform: "uppercase"
1822
- },
1823
- children: overlay.name
1824
- })
1825
- });
1826
- }
1827
- function hexToRgb(hex) {
1828
- if (!hex || !hex.startsWith("#")) return "0,0,0";
1829
- var clean = hex.slice(1);
1830
- var num = parseInt(clean.length === 3 ? clean.replace(/./g, "$&$&") : clean, 16);
1831
- return "".concat(num >> 16 & 255, ",").concat(num >> 8 & 255, ",").concat(num & 255);
1832
- }
1833
- var FADE_DURATION_MS = 1e3;
1834
- var ENTER_ANIMATION_ALIASES = {
1835
- fade: "fade",
1836
- slide_from_left: "slide_from_left",
1837
- slide_from_right: "slide_from_right",
1838
- slide_from_top: "slide_from_top",
1839
- slide_from_bottom: "slide_from_bottom",
1840
- slide_left: "slide_from_left",
1841
- slide_right: "slide_from_right",
1842
- slide_up: "slide_from_top",
1843
- slide_down: "slide_from_bottom"
1844
- };
1845
- function normalizeEnterAnimation(v) {
1846
- var _ENTER_ANIMATION_ALIASES_v;
1847
- if (typeof v !== "string") return null;
1848
- return (_ENTER_ANIMATION_ALIASES_v = ENTER_ANIMATION_ALIASES[v]) !== null && _ENTER_ANIMATION_ALIASES_v !== void 0 ? _ENTER_ANIMATION_ALIASES_v : null;
1849
- }
1850
- function getEnterAnimation(overlay) {
1851
- var flat = overlay.enter_animation;
1852
- var fromFlat = normalizeEnterAnimation(flat);
1853
- if (fromFlat) return fromFlat;
1854
- if (overlay.content) {
1855
- try {
1856
- var parsed = JSON.parse(overlay.content);
1857
- var fromContent = normalizeEnterAnimation(parsed === null || parsed === void 0 ? void 0 : parsed.enterAnimation);
1858
- if (fromContent) return fromContent;
1859
- } catch (unused) {}
1860
- }
1861
- return "fade";
1862
- }
1863
- function enterHiddenTransform(anim) {
1864
- switch(anim){
1865
- case "slide_from_left":
1866
- return "translateX(-120%)";
1867
- case "slide_from_right":
1868
- return "translateX(120%)";
1869
- case "slide_from_top":
1870
- return "translateY(-120%)";
1871
- case "slide_from_bottom":
1872
- return "translateY(120%)";
1873
- default:
1874
- return "";
1875
- }
1876
- }
1877
- var SHOWCASE_CYCLE_MS_DEFAULT = 36e3;
1878
- var SHOWCASE_MIN_BEAT_MS = 6e3;
1879
- var BEAT_POP_IN_MS = 520;
1880
- var BEAT_POP_OUT_MS = 520;
1881
- var SHOWCASE_PERSISTENT_TYPES = /* @__PURE__ */ new Set([
1882
- "scroller",
1883
- "breaking_news",
1884
- "image",
1885
- "text",
1886
- "shape",
1887
- "countdown",
1888
- "qr_code",
1889
- "coming_up_next",
1890
- "score_bug"
1891
- ]);
1892
- function easeOutCubic(t) {
1893
- var u = 1 - t;
1894
- return 1 - u * u * u;
1895
- }
1896
- function easeInCubic(t) {
1897
- return t * t * t;
1898
- }
1899
- function easeOutBack(t) {
1900
- var c1 = 1.70158;
1901
- var c3 = c1 + 1;
1902
- return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);
1903
- }
1904
- function beatOpacity(phase, beatMs) {
1905
- if (phase < BEAT_POP_IN_MS) return easeOutCubic(phase / BEAT_POP_IN_MS);
1906
- var holdEnd = beatMs - BEAT_POP_OUT_MS;
1907
- if (phase >= holdEnd) {
1908
- return Math.max(0, 1 - easeInCubic((phase - holdEnd) / BEAT_POP_OUT_MS));
1909
- }
1910
- return 1;
1911
- }
1912
- function beatScale(phase, beatMs) {
1913
- if (phase < BEAT_POP_IN_MS) {
1914
- return Math.min(1, 0.92 + 0.08 * easeOutBack(phase / BEAT_POP_IN_MS));
1915
- }
1916
- var holdEnd = beatMs - BEAT_POP_OUT_MS;
1917
- if (phase >= holdEnd) {
1918
- return 1 - 0.06 * easeInCubic((phase - holdEnd) / BEAT_POP_OUT_MS);
1919
- }
1920
- return 1;
1921
- }
1922
- function partitionShowcase(overlays) {
1923
- var visible = overlays.filter(function(o) {
1924
- return o.visible;
1925
- });
1926
- var persistent = [];
1927
- var spotlight = [];
1928
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1929
- try {
1930
- for(var _iterator = visible[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1931
- var o = _step.value;
1932
- if (SHOWCASE_PERSISTENT_TYPES.has(o.type)) persistent.push(o);
1933
- else spotlight.push(o);
1934
- }
1935
- } catch (err) {
1936
- _didIteratorError = true;
1937
- _iteratorError = err;
1938
- } finally{
1939
- try {
1940
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1941
- _iterator.return();
1942
- }
1943
- } finally{
1944
- if (_didIteratorError) {
1945
- throw _iteratorError;
1946
- }
1947
- }
1948
- }
1949
- spotlight.sort(function(a, b) {
1950
- return a.z_index - b.z_index || a.id - b.id;
1951
- });
1952
- var beats = [];
1953
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1954
- try {
1955
- for(var _iterator1 = spotlight[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1956
- var o1 = _step1.value;
1957
- beats.push([
1958
- o1
1959
- ]);
1960
- }
1961
- } catch (err) {
1962
- _didIteratorError1 = true;
1963
- _iteratorError1 = err;
1964
- } finally{
1965
- try {
1966
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1967
- _iterator1.return();
1968
- }
1969
- } finally{
1970
- if (_didIteratorError1) {
1971
- throw _iteratorError1;
1972
- }
1973
- }
1974
- }
1975
- return {
1976
- persistent: persistent,
1977
- beats: beats
1978
- };
1979
- }
1980
- function useShowcaseBeat(enabled, cycleMs, beats) {
1981
- var safeBeats = Math.max(1, beats);
1982
- var beatMs = Math.max(SHOWCASE_MIN_BEAT_MS, Math.floor(cycleMs / safeBeats));
1983
- var totalMs = beatMs * safeBeats;
1984
- var _ref = _sliced_to_array((0, import_react.useState)(function() {
1985
- return Date.now();
1986
- }), 2), now = _ref[0], setNow = _ref[1];
1987
- (0, import_react.useEffect)(function() {
1988
- if (!enabled) return;
1989
- var id = window.setInterval(function() {
1990
- return setNow(Date.now());
1991
- }, 64);
1992
- return function() {
1993
- return clearInterval(id);
1994
- };
1995
- }, [
1996
- enabled
1997
- ]);
1998
- var phase = now % totalMs;
1999
- var beatIndex = Math.min(safeBeats - 1, Math.floor(phase / beatMs));
2000
- var beatPhase = phase - beatIndex * beatMs;
2001
- return {
2002
- beatIndex: beatIndex,
2003
- beatPhase: beatPhase,
2004
- beatMs: beatMs
2005
- };
2006
- }
2007
- var OverlayRenderer = function OverlayRenderer(param) {
2008
- var overlays = param.overlays, currentTime = param.currentTime, videoRef = param.videoRef, coordinateSpace = param.coordinateSpace, _param_showcaseMode = param.showcaseMode, showcaseMode = _param_showcaseMode === void 0 ? false : _param_showcaseMode, _param_showcaseCycleMs = param.showcaseCycleMs, showcaseCycleMs = _param_showcaseCycleMs === void 0 ? SHOWCASE_CYCLE_MS_DEFAULT : _param_showcaseCycleMs;
2009
- var _ref = _sliced_to_array((0, import_react.useState)(null), 2), dims = _ref[0], setDims = _ref[1];
2010
- var rafRef = (0, import_react.useRef)(null);
2011
- var _ref1 = _sliced_to_array((0, import_react.useState)(/* @__PURE__ */ new Map()), 2), fadeMap = _ref1[0], setFadeMap = _ref1[1];
2012
- var removeTimers = (0, import_react.useRef)(/* @__PURE__ */ new Map());
2013
- var mountTimeRef = (0, import_react.useRef)(Date.now());
2014
- var _ref2 = _sliced_to_array((0, import_react.useState)(0), 2), wallclockSec = _ref2[0], setWallclockSec = _ref2[1];
2015
- (0, import_react.useEffect)(function() {
2016
- if (!showcaseMode) return;
2017
- var tick = function tick() {
2018
- return setWallclockSec((Date.now() - mountTimeRef.current) / 1e3);
2019
- };
2020
- tick();
2021
- var id = window.setInterval(tick, 200);
2022
- return function() {
2023
- return clearInterval(id);
2024
- };
2025
- }, [
2026
- showcaseMode
2027
- ]);
2028
- var _ref3 = (0, import_react.useMemo)(function() {
2029
- return partitionShowcase(overlays);
2030
- }, [
2031
- overlays
2032
- ]), showcasePersistent = _ref3.persistent, showcaseBeats = _ref3.beats;
2033
- var _useShowcaseBeat = useShowcaseBeat(showcaseMode, showcaseCycleMs, showcaseBeats.length), showcaseBeatIndex = _useShowcaseBeat.beatIndex, showcaseBeatPhase = _useShowcaseBeat.beatPhase, showcaseBeatMs = _useShowcaseBeat.beatMs;
2034
- var showcasePersistentIds = (0, import_react.useMemo)(function() {
2035
- return new Set(showcasePersistent.map(function(o) {
2036
- return o.id;
2037
- }));
2038
- }, [
2039
- showcasePersistent
2040
- ]);
2041
- var showcaseSpotlightIds = (0, import_react.useMemo)(function() {
2042
- var beat = showcaseBeats[showcaseBeatIndex];
2043
- return new Set((beat !== null && beat !== void 0 ? beat : []).map(function(o) {
2044
- return o.id;
2045
- }));
2046
- }, [
2047
- showcaseBeats,
2048
- showcaseBeatIndex
2049
- ]);
2050
- var updateDims = (0, import_react.useCallback)(function() {
2051
- var video = videoRef.current;
2052
- if (video) {
2053
- var computed = computeVideoDimensions(video);
2054
- setDims(function(prev) {
2055
- if (!computed || prev && prev.nativeWidth === computed.nativeWidth && prev.nativeHeight === computed.nativeHeight && prev.displayWidth === computed.displayWidth && prev.displayHeight === computed.displayHeight && prev.offsetX === computed.offsetX && prev.offsetY === computed.offsetY) {
2056
- return prev;
2057
- }
2058
- return computed;
2059
- });
2060
- }
2061
- }, [
2062
- videoRef
2063
- ]);
2064
- (0, import_react.useEffect)(function() {
2065
- updateDims();
2066
- var interval = setInterval(updateDims, 500);
2067
- var handleResize = function handleResize() {
2068
- if (rafRef.current) cancelAnimationFrame(rafRef.current);
2069
- rafRef.current = requestAnimationFrame(updateDims);
2070
- };
2071
- window.addEventListener("resize", handleResize);
2072
- return function() {
2073
- clearInterval(interval);
2074
- window.removeEventListener("resize", handleResize);
2075
- if (rafRef.current) cancelAnimationFrame(rafRef.current);
2076
- };
2077
- }, [
2078
- updateDims
2079
- ]);
2080
- var activeOverlays = (0, import_react.useMemo)(function() {
2081
- if (showcaseMode) {
2082
- var _showcaseBeats_showcaseBeatIndex;
2083
- var beat = (_showcaseBeats_showcaseBeatIndex = showcaseBeats[showcaseBeatIndex]) !== null && _showcaseBeats_showcaseBeatIndex !== void 0 ? _showcaseBeats_showcaseBeatIndex : [];
2084
- var scheduledPersistent = showcasePersistent.filter(function(o) {
2085
- return isOverlayActive(o, wallclockSec);
2086
- });
2087
- return _to_consumable_array(scheduledPersistent).concat(_to_consumable_array(beat));
2088
- }
2089
- return overlays.filter(function(o) {
2090
- return isOverlayActive(o, currentTime);
2091
- });
2092
- }, [
2093
- overlays,
2094
- currentTime,
2095
- wallclockSec,
2096
- showcaseMode,
2097
- showcasePersistent,
2098
- showcaseBeats,
2099
- showcaseBeatIndex
2100
- ]);
2101
- (0, import_react.useLayoutEffect)(function() {
2102
- var activeIds = new Set(activeOverlays.map(function(o) {
2103
- return o.id;
2104
- }));
2105
- setFadeMap(function(prev) {
2106
- var next = new Map(prev);
2107
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2108
- try {
2109
- for(var _iterator = activeOverlays[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2110
- var overlay = _step.value;
2111
- if (!next.has(overlay.id)) {
2112
- next.set(overlay.id, {
2113
- overlay: overlay,
2114
- visible: false
2115
- });
2116
- } else {
2117
- var existing = next.get(overlay.id);
2118
- next.set(overlay.id, _object_spread_props(_object_spread({}, existing), {
2119
- overlay: overlay
2120
- }));
2121
- }
2122
- }
2123
- } catch (err) {
2124
- _didIteratorError = true;
2125
- _iteratorError = err;
2126
- } finally{
2127
- try {
2128
- if (!_iteratorNormalCompletion && _iterator.return != null) {
2129
- _iterator.return();
2130
- }
2131
- } finally{
2132
- if (_didIteratorError) {
2133
- throw _iteratorError;
2134
- }
2135
- }
2136
- }
2137
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
2138
- try {
2139
- var _loop = function() {
2140
- var _step_value = _sliced_to_array(_step1.value, 2), id = _step_value[0], state = _step_value[1];
2141
- if (!activeIds.has(id) && state.visible) {
2142
- next.set(id, _object_spread_props(_object_spread({}, state), {
2143
- visible: false
2144
- }));
2145
- if (!removeTimers.current.has(id)) {
2146
- var timer = setTimeout(function() {
2147
- setFadeMap(function(m) {
2148
- var updated = new Map(m);
2149
- updated.delete(id);
2150
- return updated;
2151
- });
2152
- removeTimers.current.delete(id);
2153
- }, FADE_DURATION_MS);
2154
- removeTimers.current.set(id, timer);
2155
- }
2156
- } else if (!activeIds.has(id) && !state.visible) {}
2157
- };
2158
- for(var _iterator1 = next[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true)_loop();
2159
- } catch (err) {
2160
- _didIteratorError1 = true;
2161
- _iteratorError1 = err;
2162
- } finally{
2163
- try {
2164
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
2165
- _iterator1.return();
2166
- }
2167
- } finally{
2168
- if (_didIteratorError1) {
2169
- throw _iteratorError1;
2170
- }
2171
- }
2172
- }
2173
- return next;
2174
- });
2175
- }, [
2176
- activeOverlays
2177
- ]);
2178
- (0, import_react.useEffect)(function() {
2179
- var toFadeIn = [];
2180
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2181
- try {
2182
- var _loop = function() {
2183
- var _step_value = _sliced_to_array(_step.value, 2), id = _step_value[0], state = _step_value[1];
2184
- if (!state.visible) {
2185
- var isActive = activeOverlays.some(function(o) {
2186
- return o.id === id;
2187
- });
2188
- if (isActive) toFadeIn.push(id);
2189
- }
2190
- };
2191
- for(var _iterator = fadeMap[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
2192
- } catch (err) {
2193
- _didIteratorError = true;
2194
- _iteratorError = err;
2195
- } finally{
2196
- try {
2197
- if (!_iteratorNormalCompletion && _iterator.return != null) {
2198
- _iterator.return();
2199
- }
2200
- } finally{
2201
- if (_didIteratorError) {
2202
- throw _iteratorError;
2203
- }
2204
- }
2205
- }
2206
- if (toFadeIn.length === 0) return;
2207
- var raf = requestAnimationFrame(function() {
2208
- setFadeMap(function(prev) {
2209
- var next = new Map(prev);
2210
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2211
- try {
2212
- for(var _iterator = toFadeIn[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2213
- var id = _step.value;
2214
- var state = next.get(id);
2215
- if (state) next.set(id, _object_spread_props(_object_spread({}, state), {
2216
- visible: true
2217
- }));
2218
- }
2219
- } catch (err) {
2220
- _didIteratorError = true;
2221
- _iteratorError = err;
2222
- } finally{
2223
- try {
2224
- if (!_iteratorNormalCompletion && _iterator.return != null) {
2225
- _iterator.return();
2226
- }
2227
- } finally{
2228
- if (_didIteratorError) {
2229
- throw _iteratorError;
2230
- }
2231
- }
2232
- }
2233
- return next;
2234
- });
2235
- });
2236
- return function() {
2237
- return cancelAnimationFrame(raf);
2238
- };
2239
- }, [
2240
- fadeMap,
2241
- activeOverlays
2242
- ]);
2243
- (0, import_react.useEffect)(function() {
2244
- return function() {
2245
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2246
- try {
2247
- for(var _iterator = removeTimers.current.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2248
- var timer = _step.value;
2249
- clearTimeout(timer);
2250
- }
2251
- } catch (err) {
2252
- _didIteratorError = true;
2253
- _iteratorError = err;
2254
- } finally{
2255
- try {
2256
- if (!_iteratorNormalCompletion && _iterator.return != null) {
2257
- _iterator.return();
2258
- }
2259
- } finally{
2260
- if (_didIteratorError) {
2261
- throw _iteratorError;
2262
- }
2263
- }
2264
- }
2265
- };
2266
- }, []);
2267
- if (!dims || fadeMap.size === 0) return null;
2268
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
2269
- "aria-hidden": "true",
2270
- style: {
2271
- position: "absolute",
2272
- left: "".concat(dims.offsetX, "px"),
2273
- top: "".concat(dims.offsetY, "px"),
2274
- width: "".concat(dims.displayWidth, "px"),
2275
- height: "".concat(dims.displayHeight, "px"),
2276
- pointerEvents: "none",
2277
- overflow: "hidden",
2278
- zIndex: 8
2279
- },
2280
- children: _to_consumable_array(fadeMap.values()).map(function(param) {
2281
- var overlay = param.overlay, visible = param.visible;
2282
- var scaleX = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.width) ? dims.displayWidth / coordinateSpace.width : dims.scaleX;
2283
- var scaleY = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.height) ? dims.displayHeight / coordinateSpace.height : dims.scaleY;
2284
- var left = overlay.x * scaleX;
2285
- var top = overlay.y * scaleY;
2286
- var width = overlay.width * scaleX;
2287
- var height = overlay.height * scaleY;
2288
- var baseOpacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
2289
- var isShowcasePersistent = showcaseMode && showcasePersistentIds.has(overlay.id);
2290
- var isShowcaseSpotlight = showcaseMode && showcaseSpotlightIds.has(overlay.id);
2291
- var isShowcaseDormant = showcaseMode && !isShowcasePersistent && !isShowcaseSpotlight;
2292
- var useShowcasePop = isShowcaseSpotlight;
2293
- var opacity = useShowcasePop ? baseOpacity * beatOpacity(showcaseBeatPhase, showcaseBeatMs) : isShowcaseDormant ? 0 : visible ? baseOpacity : 0;
2294
- var popScale = useShowcasePop ? beatScale(showcaseBeatPhase, showcaseBeatMs) : 1;
2295
- var sz = {
2296
- w: width,
2297
- h: height
2298
- };
2299
- var enterAnim = getEnterAnimation(overlay);
2300
- var hasSlide = enterAnim !== "fade" && !useShowcasePop;
2301
- var slideTransform = hasSlide && !visible ? enterHiddenTransform(enterAnim) : "";
2302
- var popTransform = showcaseMode && useShowcasePop ? "scale(".concat(popScale, ")") : "";
2303
- var combinedTransform = [
2304
- slideTransform,
2305
- popTransform
2306
- ].filter(Boolean).join(" ");
2307
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
2308
- style: {
2309
- position: "absolute",
2310
- left: "".concat(left, "px"),
2311
- top: "".concat(top, "px"),
2312
- width: "".concat(width, "px"),
2313
- height: "".concat(height, "px"),
2314
- opacity: opacity,
2315
- transition: useShowcasePop ? "none" : hasSlide ? "opacity ".concat(FADE_DURATION_MS, "ms ease, transform ").concat(FADE_DURATION_MS, "ms cubic-bezier(0.22, 1, 0.36, 1)") : "opacity ".concat(FADE_DURATION_MS, "ms ease"),
2316
- transform: combinedTransform || void 0,
2317
- transformOrigin: showcaseMode && useShowcasePop ? "center center" : void 0,
2318
- zIndex: overlay.z_index,
2319
- overflow: "hidden"
2320
- },
2321
- children: [
2322
- overlay.type === "image" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ImageOverlay, {
2323
- overlay: overlay
2324
- }),
2325
- overlay.type === "text" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TextOverlay, {
2326
- overlay: overlay
2327
- }),
2328
- overlay.type === "scroller" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ScrollerOverlay, {
2329
- overlay: overlay
2330
- }),
2331
- overlay.type === "shape" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ShapeOverlay, {
2332
- overlay: overlay,
2333
- size: sz
2334
- }),
2335
- overlay.type === "score_bug" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ScoreBugOverlay, {
2336
- overlay: overlay,
2337
- size: sz
2338
- }),
2339
- overlay.type === "lower_third" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LowerThirdOverlay, {
2340
- overlay: overlay,
2341
- size: sz
2342
- }),
2343
- overlay.type === "qr_code" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(QrCodeOverlay, {
2344
- overlay: overlay,
2345
- size: sz
2346
- }),
2347
- overlay.type === "coming_up_next" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ComingUpNextOverlay, {
2348
- overlay: overlay,
2349
- size: sz
2350
- }),
2351
- overlay.type === "contextual_trigger" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ContextualTriggerOverlay, {
2352
- overlay: overlay,
2353
- size: sz
2354
- }),
2355
- overlay.type === "odds_betting" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(OddsBettingOverlay, {
2356
- overlay: overlay,
2357
- size: sz
2358
- }),
2359
- overlay.type === "breaking_news" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BreakingNewsOverlay, {
2360
- overlay: overlay,
2361
- size: sz
2362
- }),
2363
- overlay.type === "countdown" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CountdownOverlay, {
2364
- overlay: overlay,
2365
- size: sz
2366
- })
2367
- ]
2368
- }, overlay.id);
2369
- })
2370
- });
2371
- };
2372
- // Annotate the CommonJS export names for ESM import in node:
2373
- 0 && (module.exports = {
2374
- OverlayRenderer: OverlayRenderer
2375
- });
2376
- //# sourceMappingURL=OverlayRenderer.cjs.map