stormcloud-video-player 0.7.8 → 0.7.10

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.
package/lib/index.cjs CHANGED
@@ -6507,15 +6507,38 @@ function ScoreBugOverlay(param) {
6507
6507
  })
6508
6508
  ]
6509
6509
  }),
6510
- cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6510
+ (cfg.sponsorText || cfg.sponsorImageUrl) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
6511
6511
  style: {
6512
6512
  fontSize: "0.7em",
6513
6513
  textAlign: "center",
6514
- opacity: 0.5,
6515
- padding: "".concat(f * 0.2, "px 0"),
6516
- borderTop: "1px solid ".concat(cfg.accentColor, "40")
6514
+ opacity: 0.6,
6515
+ padding: "".concat(f * 0.2, "px ").concat(f * 0.4, "px"),
6516
+ borderTop: "1px solid ".concat(cfg.accentColor, "40"),
6517
+ display: "flex",
6518
+ alignItems: "center",
6519
+ justifyContent: "center",
6520
+ gap: f * 0.4,
6521
+ overflow: "hidden"
6517
6522
  },
6518
- children: cfg.sponsorText
6523
+ children: [
6524
+ cfg.sponsorImageUrl && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
6525
+ src: cfg.sponsorImageUrl,
6526
+ alt: "sponsor",
6527
+ style: {
6528
+ height: "".concat(f * 1.4, "px"),
6529
+ objectFit: "contain",
6530
+ flexShrink: 0
6531
+ }
6532
+ }),
6533
+ cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
6534
+ style: {
6535
+ overflow: "hidden",
6536
+ textOverflow: "ellipsis",
6537
+ whiteSpace: "nowrap"
6538
+ },
6539
+ children: cfg.sponsorText
6540
+ })
6541
+ ]
6519
6542
  })
6520
6543
  ]
6521
6544
  });
@@ -6577,13 +6600,35 @@ function LowerThirdOverlay(param) {
6577
6600
  })
6578
6601
  ]
6579
6602
  }),
6580
- cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6603
+ (cfg.sponsorText || cfg.sponsorImageUrl) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
6581
6604
  style: {
6582
6605
  fontSize: "0.7em",
6583
- opacity: 0.4,
6584
- padding: "0 ".concat(f * 1.2, "px ").concat(f * 0.4, "px")
6606
+ opacity: 0.5,
6607
+ padding: "0 ".concat(f * 1.2, "px ").concat(f * 0.4, "px"),
6608
+ display: "flex",
6609
+ alignItems: "center",
6610
+ gap: f * 0.4,
6611
+ overflow: "hidden"
6585
6612
  },
6586
- children: cfg.sponsorText
6613
+ children: [
6614
+ cfg.sponsorImageUrl && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
6615
+ src: cfg.sponsorImageUrl,
6616
+ alt: "sponsor",
6617
+ style: {
6618
+ height: "".concat(f * 1.4, "px"),
6619
+ objectFit: "contain",
6620
+ flexShrink: 0
6621
+ }
6622
+ }),
6623
+ cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
6624
+ style: {
6625
+ overflow: "hidden",
6626
+ textOverflow: "ellipsis",
6627
+ whiteSpace: "nowrap"
6628
+ },
6629
+ children: cfg.sponsorText
6630
+ })
6631
+ ]
6587
6632
  })
6588
6633
  ]
6589
6634
  });
@@ -6740,6 +6785,23 @@ function ComingUpNextOverlay(param) {
6740
6785
  children: cfg.scheduledTime
6741
6786
  })
6742
6787
  ]
6788
+ }),
6789
+ cfg.thumbnailUrl && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6790
+ style: {
6791
+ flexShrink: 0,
6792
+ width: Math.max(40, size.h * 0.75),
6793
+ overflow: "hidden"
6794
+ },
6795
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
6796
+ src: cfg.thumbnailUrl,
6797
+ alt: "thumbnail",
6798
+ style: {
6799
+ width: "100%",
6800
+ height: "100%",
6801
+ objectFit: "cover",
6802
+ display: "block"
6803
+ }
6804
+ })
6743
6805
  })
6744
6806
  ]
6745
6807
  });
@@ -6975,35 +7037,41 @@ function BreakingNewsOverlay(param) {
6975
7037
  ]
6976
7038
  });
6977
7039
  }
7040
+ function calcCountdownRemaining(targetTime) {
7041
+ var diff = Math.max(0, new Date(targetTime).getTime() - Date.now());
7042
+ return {
7043
+ d: Math.floor(diff / 864e5),
7044
+ h: Math.floor(diff % 864e5 / 36e5),
7045
+ m: Math.floor(diff % 36e5 / 6e4),
7046
+ s: Math.floor(diff % 6e4 / 1e3),
7047
+ expired: diff === 0
7048
+ };
7049
+ }
6978
7050
  function CountdownOverlay(param) {
6979
7051
  var overlay = param.overlay, size = param.size;
7052
+ var _ref;
6980
7053
  var cfg = parseConfig(overlay.content);
6981
- var _ref = _sliced_to_array((0, import_react.useState)({
6982
- d: 0,
6983
- h: 0,
6984
- m: 0,
6985
- s: 0
6986
- }), 2), remaining = _ref[0], setRemaining = _ref[1];
6987
- (0, import_react.useEffect)(function() {
6988
- if (!cfg) return;
6989
- var update = function update() {
6990
- var target = new Date(cfg.targetTime).getTime();
6991
- var now = Date.now();
6992
- var diff = Math.max(0, target - now);
6993
- setRemaining({
6994
- d: Math.floor(diff / 864e5),
6995
- h: Math.floor(diff % 864e5 / 36e5),
6996
- m: Math.floor(diff % 36e5 / 6e4),
6997
- s: Math.floor(diff % 6e4 / 1e3)
6998
- });
7054
+ var targetTime = (_ref = cfg === null || cfg === void 0 ? void 0 : cfg.targetTime) !== null && _ref !== void 0 ? _ref : "";
7055
+ var _ref1 = _sliced_to_array((0, import_react.useState)(function() {
7056
+ return targetTime ? calcCountdownRemaining(targetTime) : {
7057
+ d: 0,
7058
+ h: 0,
7059
+ m: 0,
7060
+ s: 0,
7061
+ expired: false
6999
7062
  };
7000
- update();
7001
- var id = setInterval(update, 1e3);
7063
+ }), 2), remaining = _ref1[0], setRemaining = _ref1[1];
7064
+ (0, import_react.useEffect)(function() {
7065
+ if (!targetTime) return;
7066
+ setRemaining(calcCountdownRemaining(targetTime));
7067
+ var id = setInterval(function() {
7068
+ return setRemaining(calcCountdownRemaining(targetTime));
7069
+ }, 1e3);
7002
7070
  return function() {
7003
7071
  return clearInterval(id);
7004
7072
  };
7005
7073
  }, [
7006
- cfg === null || cfg === void 0 ? void 0 : cfg.targetTime
7074
+ targetTime
7007
7075
  ]);
7008
7076
  if (!cfg) return null;
7009
7077
  var f = Math.max(6, size.w * 0.055);
@@ -7062,7 +7130,14 @@ function CountdownOverlay(param) {
7062
7130
  },
7063
7131
  children: cfg.eventName
7064
7132
  }),
7065
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7133
+ remaining.expired ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7134
+ style: {
7135
+ fontSize: "1em",
7136
+ fontWeight: 700,
7137
+ opacity: 0.6
7138
+ },
7139
+ children: cfg.message || "Event ended"
7140
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7066
7141
  style: {
7067
7142
  display: "flex",
7068
7143
  gap: f * 0.6,
@@ -7111,7 +7186,7 @@ function CountdownOverlay(param) {
7111
7186
  }, u.label);
7112
7187
  })
7113
7188
  }),
7114
- cfg.message && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7189
+ !remaining.expired && cfg.message && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7115
7190
  style: {
7116
7191
  fontSize: "0.8em",
7117
7192
  opacity: 0.6,
@@ -7156,10 +7231,13 @@ function hexToRgb(hex) {
7156
7231
  var num = parseInt(clean.length === 3 ? clean.replace(/./g, "$&$&") : clean, 16);
7157
7232
  return "".concat(num >> 16 & 255, ",").concat(num >> 8 & 255, ",").concat(num & 255);
7158
7233
  }
7234
+ var FADE_DURATION_MS = 1e3;
7159
7235
  var OverlayRenderer = function OverlayRenderer(param) {
7160
7236
  var overlays = param.overlays, currentTime = param.currentTime, videoRef = param.videoRef, coordinateSpace = param.coordinateSpace;
7161
7237
  var _ref = _sliced_to_array((0, import_react.useState)(null), 2), dims = _ref[0], setDims = _ref[1];
7162
7238
  var rafRef = (0, import_react.useRef)(null);
7239
+ var _ref1 = _sliced_to_array((0, import_react.useState)(/* @__PURE__ */ new Map()), 2), fadeMap = _ref1[0], setFadeMap = _ref1[1];
7240
+ var removeTimers = (0, import_react.useRef)(/* @__PURE__ */ new Map());
7163
7241
  var updateDims = (0, import_react.useCallback)(function() {
7164
7242
  var video = videoRef.current;
7165
7243
  if (video) {
@@ -7190,10 +7268,181 @@ var OverlayRenderer = function OverlayRenderer(param) {
7190
7268
  }, [
7191
7269
  updateDims
7192
7270
  ]);
7193
- var activeOverlays = overlays.filter(function(o) {
7194
- return isOverlayActive(o, currentTime);
7195
- });
7196
- if (!dims || activeOverlays.length === 0) return null;
7271
+ var activeOverlays = (0, import_react.useMemo)(function() {
7272
+ return overlays.filter(function(o) {
7273
+ return isOverlayActive(o, currentTime);
7274
+ });
7275
+ }, [
7276
+ overlays,
7277
+ currentTime
7278
+ ]);
7279
+ (0, import_react.useEffect)(function() {
7280
+ var activeIds = new Set(activeOverlays.map(function(o) {
7281
+ return o.id;
7282
+ }));
7283
+ setFadeMap(function(prev) {
7284
+ var next = new Map(prev);
7285
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7286
+ try {
7287
+ for(var _iterator = activeOverlays[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7288
+ var overlay = _step.value;
7289
+ if (!next.has(overlay.id)) {
7290
+ next.set(overlay.id, {
7291
+ overlay: overlay,
7292
+ visible: false
7293
+ });
7294
+ } else {
7295
+ var existing = next.get(overlay.id);
7296
+ next.set(overlay.id, _object_spread_props(_object_spread({}, existing), {
7297
+ overlay: overlay
7298
+ }));
7299
+ }
7300
+ }
7301
+ } catch (err) {
7302
+ _didIteratorError = true;
7303
+ _iteratorError = err;
7304
+ } finally{
7305
+ try {
7306
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7307
+ _iterator.return();
7308
+ }
7309
+ } finally{
7310
+ if (_didIteratorError) {
7311
+ throw _iteratorError;
7312
+ }
7313
+ }
7314
+ }
7315
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
7316
+ try {
7317
+ var _loop = function() {
7318
+ var _step_value = _sliced_to_array(_step1.value, 2), id = _step_value[0], state = _step_value[1];
7319
+ if (!activeIds.has(id) && state.visible) {
7320
+ next.set(id, _object_spread_props(_object_spread({}, state), {
7321
+ visible: false
7322
+ }));
7323
+ if (!removeTimers.current.has(id)) {
7324
+ var timer = setTimeout(function() {
7325
+ setFadeMap(function(m) {
7326
+ var updated = new Map(m);
7327
+ updated.delete(id);
7328
+ return updated;
7329
+ });
7330
+ removeTimers.current.delete(id);
7331
+ }, FADE_DURATION_MS);
7332
+ removeTimers.current.set(id, timer);
7333
+ }
7334
+ } else if (!activeIds.has(id) && !state.visible) {}
7335
+ };
7336
+ for(var _iterator1 = next[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true)_loop();
7337
+ } catch (err) {
7338
+ _didIteratorError1 = true;
7339
+ _iteratorError1 = err;
7340
+ } finally{
7341
+ try {
7342
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
7343
+ _iterator1.return();
7344
+ }
7345
+ } finally{
7346
+ if (_didIteratorError1) {
7347
+ throw _iteratorError1;
7348
+ }
7349
+ }
7350
+ }
7351
+ return next;
7352
+ });
7353
+ }, [
7354
+ activeOverlays
7355
+ ]);
7356
+ (0, import_react.useEffect)(function() {
7357
+ var toFadeIn = [];
7358
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7359
+ try {
7360
+ var _loop = function() {
7361
+ var _step_value = _sliced_to_array(_step.value, 2), id = _step_value[0], state = _step_value[1];
7362
+ if (!state.visible) {
7363
+ var isActive = activeOverlays.some(function(o) {
7364
+ return o.id === id;
7365
+ });
7366
+ if (isActive) toFadeIn.push(id);
7367
+ }
7368
+ };
7369
+ for(var _iterator = fadeMap[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
7370
+ } catch (err) {
7371
+ _didIteratorError = true;
7372
+ _iteratorError = err;
7373
+ } finally{
7374
+ try {
7375
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7376
+ _iterator.return();
7377
+ }
7378
+ } finally{
7379
+ if (_didIteratorError) {
7380
+ throw _iteratorError;
7381
+ }
7382
+ }
7383
+ }
7384
+ if (toFadeIn.length === 0) return;
7385
+ var raf = requestAnimationFrame(function() {
7386
+ setFadeMap(function(prev) {
7387
+ var next = new Map(prev);
7388
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7389
+ try {
7390
+ for(var _iterator = toFadeIn[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7391
+ var id = _step.value;
7392
+ var state = next.get(id);
7393
+ if (state) next.set(id, _object_spread_props(_object_spread({}, state), {
7394
+ visible: true
7395
+ }));
7396
+ }
7397
+ } catch (err) {
7398
+ _didIteratorError = true;
7399
+ _iteratorError = err;
7400
+ } finally{
7401
+ try {
7402
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7403
+ _iterator.return();
7404
+ }
7405
+ } finally{
7406
+ if (_didIteratorError) {
7407
+ throw _iteratorError;
7408
+ }
7409
+ }
7410
+ }
7411
+ return next;
7412
+ });
7413
+ });
7414
+ return function() {
7415
+ return cancelAnimationFrame(raf);
7416
+ };
7417
+ }, [
7418
+ fadeMap,
7419
+ activeOverlays
7420
+ ]);
7421
+ (0, import_react.useEffect)(function() {
7422
+ return function() {
7423
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7424
+ try {
7425
+ for(var _iterator = removeTimers.current.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7426
+ var timer = _step.value;
7427
+ clearTimeout(timer);
7428
+ }
7429
+ } catch (err) {
7430
+ _didIteratorError = true;
7431
+ _iteratorError = err;
7432
+ } finally{
7433
+ try {
7434
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7435
+ _iterator.return();
7436
+ }
7437
+ } finally{
7438
+ if (_didIteratorError) {
7439
+ throw _iteratorError;
7440
+ }
7441
+ }
7442
+ }
7443
+ };
7444
+ }, []);
7445
+ if (!dims || fadeMap.size === 0) return null;
7197
7446
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7198
7447
  "aria-hidden": "true",
7199
7448
  style: {
@@ -7206,14 +7455,16 @@ var OverlayRenderer = function OverlayRenderer(param) {
7206
7455
  overflow: "hidden",
7207
7456
  zIndex: 8
7208
7457
  },
7209
- children: activeOverlays.map(function(overlay) {
7458
+ children: _to_consumable_array(fadeMap.values()).map(function(param) {
7459
+ var overlay = param.overlay, visible = param.visible;
7210
7460
  var scaleX = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.width) ? dims.displayWidth / coordinateSpace.width : dims.scaleX;
7211
7461
  var scaleY = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.height) ? dims.displayHeight / coordinateSpace.height : dims.scaleY;
7212
7462
  var left = overlay.x * scaleX;
7213
7463
  var top = overlay.y * scaleY;
7214
7464
  var width = overlay.width * scaleX;
7215
7465
  var height = overlay.height * scaleY;
7216
- var opacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7466
+ var baseOpacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7467
+ var opacity = visible ? baseOpacity : 0;
7217
7468
  var sz = {
7218
7469
  w: width,
7219
7470
  h: height
@@ -7226,6 +7477,7 @@ var OverlayRenderer = function OverlayRenderer(param) {
7226
7477
  width: "".concat(width, "px"),
7227
7478
  height: "".concat(height, "px"),
7228
7479
  opacity: opacity,
7480
+ transition: "opacity ".concat(FADE_DURATION_MS, "ms ease"),
7229
7481
  zIndex: overlay.z_index,
7230
7482
  overflow: "hidden"
7231
7483
  },