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.
@@ -6329,15 +6329,38 @@ function ScoreBugOverlay(param) {
6329
6329
  })
6330
6330
  ]
6331
6331
  }),
6332
- cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6332
+ (cfg.sponsorText || cfg.sponsorImageUrl) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
6333
6333
  style: {
6334
6334
  fontSize: "0.7em",
6335
6335
  textAlign: "center",
6336
- opacity: 0.5,
6337
- padding: "".concat(f * 0.2, "px 0"),
6338
- borderTop: "1px solid ".concat(cfg.accentColor, "40")
6336
+ opacity: 0.6,
6337
+ padding: "".concat(f * 0.2, "px ").concat(f * 0.4, "px"),
6338
+ borderTop: "1px solid ".concat(cfg.accentColor, "40"),
6339
+ display: "flex",
6340
+ alignItems: "center",
6341
+ justifyContent: "center",
6342
+ gap: f * 0.4,
6343
+ overflow: "hidden"
6339
6344
  },
6340
- children: cfg.sponsorText
6345
+ children: [
6346
+ cfg.sponsorImageUrl && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
6347
+ src: cfg.sponsorImageUrl,
6348
+ alt: "sponsor",
6349
+ style: {
6350
+ height: "".concat(f * 1.4, "px"),
6351
+ objectFit: "contain",
6352
+ flexShrink: 0
6353
+ }
6354
+ }),
6355
+ cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
6356
+ style: {
6357
+ overflow: "hidden",
6358
+ textOverflow: "ellipsis",
6359
+ whiteSpace: "nowrap"
6360
+ },
6361
+ children: cfg.sponsorText
6362
+ })
6363
+ ]
6341
6364
  })
6342
6365
  ]
6343
6366
  });
@@ -6399,13 +6422,35 @@ function LowerThirdOverlay(param) {
6399
6422
  })
6400
6423
  ]
6401
6424
  }),
6402
- cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6425
+ (cfg.sponsorText || cfg.sponsorImageUrl) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
6403
6426
  style: {
6404
6427
  fontSize: "0.7em",
6405
- opacity: 0.4,
6406
- padding: "0 ".concat(f * 1.2, "px ").concat(f * 0.4, "px")
6428
+ opacity: 0.5,
6429
+ padding: "0 ".concat(f * 1.2, "px ").concat(f * 0.4, "px"),
6430
+ display: "flex",
6431
+ alignItems: "center",
6432
+ gap: f * 0.4,
6433
+ overflow: "hidden"
6407
6434
  },
6408
- children: cfg.sponsorText
6435
+ children: [
6436
+ cfg.sponsorImageUrl && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
6437
+ src: cfg.sponsorImageUrl,
6438
+ alt: "sponsor",
6439
+ style: {
6440
+ height: "".concat(f * 1.4, "px"),
6441
+ objectFit: "contain",
6442
+ flexShrink: 0
6443
+ }
6444
+ }),
6445
+ cfg.sponsorText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
6446
+ style: {
6447
+ overflow: "hidden",
6448
+ textOverflow: "ellipsis",
6449
+ whiteSpace: "nowrap"
6450
+ },
6451
+ children: cfg.sponsorText
6452
+ })
6453
+ ]
6409
6454
  })
6410
6455
  ]
6411
6456
  });
@@ -6562,6 +6607,23 @@ function ComingUpNextOverlay(param) {
6562
6607
  children: cfg.scheduledTime
6563
6608
  })
6564
6609
  ]
6610
+ }),
6611
+ cfg.thumbnailUrl && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6612
+ style: {
6613
+ flexShrink: 0,
6614
+ width: Math.max(40, size.h * 0.75),
6615
+ overflow: "hidden"
6616
+ },
6617
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
6618
+ src: cfg.thumbnailUrl,
6619
+ alt: "thumbnail",
6620
+ style: {
6621
+ width: "100%",
6622
+ height: "100%",
6623
+ objectFit: "cover",
6624
+ display: "block"
6625
+ }
6626
+ })
6565
6627
  })
6566
6628
  ]
6567
6629
  });
@@ -6797,35 +6859,41 @@ function BreakingNewsOverlay(param) {
6797
6859
  ]
6798
6860
  });
6799
6861
  }
6862
+ function calcCountdownRemaining(targetTime) {
6863
+ var diff = Math.max(0, new Date(targetTime).getTime() - Date.now());
6864
+ return {
6865
+ d: Math.floor(diff / 864e5),
6866
+ h: Math.floor(diff % 864e5 / 36e5),
6867
+ m: Math.floor(diff % 36e5 / 6e4),
6868
+ s: Math.floor(diff % 6e4 / 1e3),
6869
+ expired: diff === 0
6870
+ };
6871
+ }
6800
6872
  function CountdownOverlay(param) {
6801
6873
  var overlay = param.overlay, size = param.size;
6874
+ var _ref;
6802
6875
  var cfg = parseConfig(overlay.content);
6803
- var _ref = _sliced_to_array((0, import_react.useState)({
6804
- d: 0,
6805
- h: 0,
6806
- m: 0,
6807
- s: 0
6808
- }), 2), remaining = _ref[0], setRemaining = _ref[1];
6809
- (0, import_react.useEffect)(function() {
6810
- if (!cfg) return;
6811
- var update = function update() {
6812
- var target = new Date(cfg.targetTime).getTime();
6813
- var now = Date.now();
6814
- var diff = Math.max(0, target - now);
6815
- setRemaining({
6816
- d: Math.floor(diff / 864e5),
6817
- h: Math.floor(diff % 864e5 / 36e5),
6818
- m: Math.floor(diff % 36e5 / 6e4),
6819
- s: Math.floor(diff % 6e4 / 1e3)
6820
- });
6876
+ var targetTime = (_ref = cfg === null || cfg === void 0 ? void 0 : cfg.targetTime) !== null && _ref !== void 0 ? _ref : "";
6877
+ var _ref1 = _sliced_to_array((0, import_react.useState)(function() {
6878
+ return targetTime ? calcCountdownRemaining(targetTime) : {
6879
+ d: 0,
6880
+ h: 0,
6881
+ m: 0,
6882
+ s: 0,
6883
+ expired: false
6821
6884
  };
6822
- update();
6823
- var id = setInterval(update, 1e3);
6885
+ }), 2), remaining = _ref1[0], setRemaining = _ref1[1];
6886
+ (0, import_react.useEffect)(function() {
6887
+ if (!targetTime) return;
6888
+ setRemaining(calcCountdownRemaining(targetTime));
6889
+ var id = setInterval(function() {
6890
+ return setRemaining(calcCountdownRemaining(targetTime));
6891
+ }, 1e3);
6824
6892
  return function() {
6825
6893
  return clearInterval(id);
6826
6894
  };
6827
6895
  }, [
6828
- cfg === null || cfg === void 0 ? void 0 : cfg.targetTime
6896
+ targetTime
6829
6897
  ]);
6830
6898
  if (!cfg) return null;
6831
6899
  var f = Math.max(6, size.w * 0.055);
@@ -6884,7 +6952,14 @@ function CountdownOverlay(param) {
6884
6952
  },
6885
6953
  children: cfg.eventName
6886
6954
  }),
6887
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6955
+ remaining.expired ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6956
+ style: {
6957
+ fontSize: "1em",
6958
+ fontWeight: 700,
6959
+ opacity: 0.6
6960
+ },
6961
+ children: cfg.message || "Event ended"
6962
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6888
6963
  style: {
6889
6964
  display: "flex",
6890
6965
  gap: f * 0.6,
@@ -6933,7 +7008,7 @@ function CountdownOverlay(param) {
6933
7008
  }, u.label);
6934
7009
  })
6935
7010
  }),
6936
- cfg.message && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7011
+ !remaining.expired && cfg.message && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6937
7012
  style: {
6938
7013
  fontSize: "0.8em",
6939
7014
  opacity: 0.6,
@@ -6978,10 +7053,13 @@ function hexToRgb(hex) {
6978
7053
  var num = parseInt(clean.length === 3 ? clean.replace(/./g, "$&$&") : clean, 16);
6979
7054
  return "".concat(num >> 16 & 255, ",").concat(num >> 8 & 255, ",").concat(num & 255);
6980
7055
  }
7056
+ var FADE_DURATION_MS = 1e3;
6981
7057
  var OverlayRenderer = function OverlayRenderer(param) {
6982
7058
  var overlays = param.overlays, currentTime = param.currentTime, videoRef = param.videoRef, coordinateSpace = param.coordinateSpace;
6983
7059
  var _ref = _sliced_to_array((0, import_react.useState)(null), 2), dims = _ref[0], setDims = _ref[1];
6984
7060
  var rafRef = (0, import_react.useRef)(null);
7061
+ var _ref1 = _sliced_to_array((0, import_react.useState)(/* @__PURE__ */ new Map()), 2), fadeMap = _ref1[0], setFadeMap = _ref1[1];
7062
+ var removeTimers = (0, import_react.useRef)(/* @__PURE__ */ new Map());
6985
7063
  var updateDims = (0, import_react.useCallback)(function() {
6986
7064
  var video = videoRef.current;
6987
7065
  if (video) {
@@ -7012,10 +7090,181 @@ var OverlayRenderer = function OverlayRenderer(param) {
7012
7090
  }, [
7013
7091
  updateDims
7014
7092
  ]);
7015
- var activeOverlays = overlays.filter(function(o) {
7016
- return isOverlayActive(o, currentTime);
7017
- });
7018
- if (!dims || activeOverlays.length === 0) return null;
7093
+ var activeOverlays = (0, import_react.useMemo)(function() {
7094
+ return overlays.filter(function(o) {
7095
+ return isOverlayActive(o, currentTime);
7096
+ });
7097
+ }, [
7098
+ overlays,
7099
+ currentTime
7100
+ ]);
7101
+ (0, import_react.useEffect)(function() {
7102
+ var activeIds = new Set(activeOverlays.map(function(o) {
7103
+ return o.id;
7104
+ }));
7105
+ setFadeMap(function(prev) {
7106
+ var next = new Map(prev);
7107
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7108
+ try {
7109
+ for(var _iterator = activeOverlays[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7110
+ var overlay = _step.value;
7111
+ if (!next.has(overlay.id)) {
7112
+ next.set(overlay.id, {
7113
+ overlay: overlay,
7114
+ visible: false
7115
+ });
7116
+ } else {
7117
+ var existing = next.get(overlay.id);
7118
+ next.set(overlay.id, _object_spread_props(_object_spread({}, existing), {
7119
+ overlay: overlay
7120
+ }));
7121
+ }
7122
+ }
7123
+ } catch (err) {
7124
+ _didIteratorError = true;
7125
+ _iteratorError = err;
7126
+ } finally{
7127
+ try {
7128
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7129
+ _iterator.return();
7130
+ }
7131
+ } finally{
7132
+ if (_didIteratorError) {
7133
+ throw _iteratorError;
7134
+ }
7135
+ }
7136
+ }
7137
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
7138
+ try {
7139
+ var _loop = function() {
7140
+ var _step_value = _sliced_to_array(_step1.value, 2), id = _step_value[0], state = _step_value[1];
7141
+ if (!activeIds.has(id) && state.visible) {
7142
+ next.set(id, _object_spread_props(_object_spread({}, state), {
7143
+ visible: false
7144
+ }));
7145
+ if (!removeTimers.current.has(id)) {
7146
+ var timer = setTimeout(function() {
7147
+ setFadeMap(function(m) {
7148
+ var updated = new Map(m);
7149
+ updated.delete(id);
7150
+ return updated;
7151
+ });
7152
+ removeTimers.current.delete(id);
7153
+ }, FADE_DURATION_MS);
7154
+ removeTimers.current.set(id, timer);
7155
+ }
7156
+ } else if (!activeIds.has(id) && !state.visible) {}
7157
+ };
7158
+ for(var _iterator1 = next[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true)_loop();
7159
+ } catch (err) {
7160
+ _didIteratorError1 = true;
7161
+ _iteratorError1 = err;
7162
+ } finally{
7163
+ try {
7164
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
7165
+ _iterator1.return();
7166
+ }
7167
+ } finally{
7168
+ if (_didIteratorError1) {
7169
+ throw _iteratorError1;
7170
+ }
7171
+ }
7172
+ }
7173
+ return next;
7174
+ });
7175
+ }, [
7176
+ activeOverlays
7177
+ ]);
7178
+ (0, import_react.useEffect)(function() {
7179
+ var toFadeIn = [];
7180
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7181
+ try {
7182
+ var _loop = function() {
7183
+ var _step_value = _sliced_to_array(_step.value, 2), id = _step_value[0], state = _step_value[1];
7184
+ if (!state.visible) {
7185
+ var isActive = activeOverlays.some(function(o) {
7186
+ return o.id === id;
7187
+ });
7188
+ if (isActive) toFadeIn.push(id);
7189
+ }
7190
+ };
7191
+ for(var _iterator = fadeMap[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
7192
+ } catch (err) {
7193
+ _didIteratorError = true;
7194
+ _iteratorError = err;
7195
+ } finally{
7196
+ try {
7197
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7198
+ _iterator.return();
7199
+ }
7200
+ } finally{
7201
+ if (_didIteratorError) {
7202
+ throw _iteratorError;
7203
+ }
7204
+ }
7205
+ }
7206
+ if (toFadeIn.length === 0) return;
7207
+ var raf = requestAnimationFrame(function() {
7208
+ setFadeMap(function(prev) {
7209
+ var next = new Map(prev);
7210
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7211
+ try {
7212
+ for(var _iterator = toFadeIn[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7213
+ var id = _step.value;
7214
+ var state = next.get(id);
7215
+ if (state) next.set(id, _object_spread_props(_object_spread({}, state), {
7216
+ visible: true
7217
+ }));
7218
+ }
7219
+ } catch (err) {
7220
+ _didIteratorError = true;
7221
+ _iteratorError = err;
7222
+ } finally{
7223
+ try {
7224
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7225
+ _iterator.return();
7226
+ }
7227
+ } finally{
7228
+ if (_didIteratorError) {
7229
+ throw _iteratorError;
7230
+ }
7231
+ }
7232
+ }
7233
+ return next;
7234
+ });
7235
+ });
7236
+ return function() {
7237
+ return cancelAnimationFrame(raf);
7238
+ };
7239
+ }, [
7240
+ fadeMap,
7241
+ activeOverlays
7242
+ ]);
7243
+ (0, import_react.useEffect)(function() {
7244
+ return function() {
7245
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7246
+ try {
7247
+ for(var _iterator = removeTimers.current.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7248
+ var timer = _step.value;
7249
+ clearTimeout(timer);
7250
+ }
7251
+ } catch (err) {
7252
+ _didIteratorError = true;
7253
+ _iteratorError = err;
7254
+ } finally{
7255
+ try {
7256
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7257
+ _iterator.return();
7258
+ }
7259
+ } finally{
7260
+ if (_didIteratorError) {
7261
+ throw _iteratorError;
7262
+ }
7263
+ }
7264
+ }
7265
+ };
7266
+ }, []);
7267
+ if (!dims || fadeMap.size === 0) return null;
7019
7268
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7020
7269
  "aria-hidden": "true",
7021
7270
  style: {
@@ -7028,14 +7277,16 @@ var OverlayRenderer = function OverlayRenderer(param) {
7028
7277
  overflow: "hidden",
7029
7278
  zIndex: 8
7030
7279
  },
7031
- children: activeOverlays.map(function(overlay) {
7280
+ children: _to_consumable_array(fadeMap.values()).map(function(param) {
7281
+ var overlay = param.overlay, visible = param.visible;
7032
7282
  var scaleX = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.width) ? dims.displayWidth / coordinateSpace.width : dims.scaleX;
7033
7283
  var scaleY = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.height) ? dims.displayHeight / coordinateSpace.height : dims.scaleY;
7034
7284
  var left = overlay.x * scaleX;
7035
7285
  var top = overlay.y * scaleY;
7036
7286
  var width = overlay.width * scaleX;
7037
7287
  var height = overlay.height * scaleY;
7038
- var opacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7288
+ var baseOpacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7289
+ var opacity = visible ? baseOpacity : 0;
7039
7290
  var sz = {
7040
7291
  w: width,
7041
7292
  h: height
@@ -7048,6 +7299,7 @@ var OverlayRenderer = function OverlayRenderer(param) {
7048
7299
  width: "".concat(width, "px"),
7049
7300
  height: "".concat(height, "px"),
7050
7301
  opacity: opacity,
7302
+ transition: "opacity ".concat(FADE_DURATION_MS, "ms ease"),
7051
7303
  zIndex: overlay.z_index,
7052
7304
  overflow: "hidden"
7053
7305
  },