stormcloud-video-player 0.7.31 → 0.7.33

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
@@ -461,6 +461,9 @@ __export(index_exports, {
461
461
  createAdStormPlayer: function createAdStormPlayer1() {
462
462
  return createAdStormPlayer;
463
463
  },
464
+ createDemoStockTickerOverlay: function createDemoStockTickerOverlay1() {
465
+ return createDemoStockTickerOverlay;
466
+ },
464
467
  createStormcloudPlayer: function createStormcloudPlayer1() {
465
468
  return createStormcloudPlayer;
466
469
  },
@@ -5827,6 +5830,42 @@ function isOverlayActive(overlay, currentTime) {
5827
5830
  if (durationSec <= 0) return false;
5828
5831
  return currentTime >= startSec && currentTime < startSec + durationSec;
5829
5832
  }
5833
+ function createDemoStockTickerOverlay(projectId) {
5834
+ return {
5835
+ id: -9001,
5836
+ project_id: projectId,
5837
+ name: "Demo stock ticker",
5838
+ type: "scroller",
5839
+ visible: true,
5840
+ x: 144,
5841
+ y: 950,
5842
+ width: 1632,
5843
+ height: 97,
5844
+ opacity: 100,
5845
+ start_time: "00:00:00.000",
5846
+ duration: "24:00:00.000",
5847
+ z_index: 120,
5848
+ scroller_config: {
5849
+ use_custom_text: true,
5850
+ custom_text: "AAPL +1.24% \u2022 MSFT +0.42% \u2022 GOOGL \u22120.11% \u2022 TSLA +2.31% \u2022 NVDA +1.87% \u2022 AMZN +0.65% \u2022 META +0.38% \u2022 DJIA +0.52% \u2022 S&P 500 +0.33% \u2022 NDAQ +0.41%",
5851
+ direction: "left",
5852
+ scroll_speed: 42,
5853
+ font_size: 15,
5854
+ font_weight: "700",
5855
+ text_color: "#f8fafc",
5856
+ background_color: "#0f172a",
5857
+ background_opacity: 92,
5858
+ border_radius: 4,
5859
+ label: "MARKETS",
5860
+ label_line2: "LIVE",
5861
+ label_color: "#0ea5e9",
5862
+ label_text_color: "#ffffff",
5863
+ accent_color: "#38bdf8",
5864
+ show_accent_line: true,
5865
+ separator_char: "\u2022"
5866
+ }
5867
+ };
5868
+ }
5830
5869
  function fetchProjectOverlays(_0) {
5831
5870
  return _async_to_generator(function(projectId) {
5832
5871
  var apiBaseUrl, response, data;
@@ -6709,10 +6748,10 @@ function ComingUpNextOverlay(param) {
6709
6748
  var overlay = param.overlay, size = param.size;
6710
6749
  var cfg = parseConfig(overlay.content);
6711
6750
  if (!cfg) return null;
6712
- var f = Math.max(9, Math.min(size.h * 0.19, size.w * 0.075));
6713
- var showSubtitle = size.h >= 68;
6714
- var showThumbnail = !!(cfg.thumbnailUrl && size.h >= 58);
6715
- var thumbW = showThumbnail ? Math.max(40, size.h * 0.7) : 0;
6751
+ var f = Math.max(8, Math.min(size.h * 0.13, size.w * 0.048));
6752
+ var showSubtitle = size.h >= 60;
6753
+ var showThumbnail = false;
6754
+ var thumbW = 0;
6716
6755
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
6717
6756
  style: {
6718
6757
  width: "100%",
@@ -6760,9 +6799,9 @@ function ComingUpNextOverlay(param) {
6760
6799
  }),
6761
6800
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6762
6801
  style: {
6763
- fontSize: "1.35em",
6802
+ fontSize: "1.2em",
6764
6803
  fontWeight: 700,
6765
- lineHeight: 1.15,
6804
+ lineHeight: 1.2,
6766
6805
  overflow: "hidden",
6767
6806
  textOverflow: "ellipsis",
6768
6807
  whiteSpace: "nowrap"
@@ -7237,12 +7276,63 @@ function hexToRgb(hex) {
7237
7276
  return "".concat(num >> 16 & 255, ",").concat(num >> 8 & 255, ",").concat(num & 255);
7238
7277
  }
7239
7278
  var FADE_DURATION_MS = 1e3;
7279
+ var SHOWCASE_CYCLE_MS_DEFAULT = 6e4;
7280
+ var SHOWCASE_POP_IN_MS = 420;
7281
+ var SHOWCASE_STEADY_END_MS = 46e3;
7282
+ var SHOWCASE_POP_OUT_MS = 450;
7283
+ var SHOWCASE_POP_OUT_END_MS = SHOWCASE_STEADY_END_MS + SHOWCASE_POP_OUT_MS;
7284
+ function easeOutCubic(t) {
7285
+ var u = 1 - t;
7286
+ return 1 - u * u * u;
7287
+ }
7288
+ function easeInCubic(t) {
7289
+ return t * t * t;
7290
+ }
7291
+ function easeOutBack(t) {
7292
+ var c1 = 1.70158;
7293
+ var c3 = c1 + 1;
7294
+ return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);
7295
+ }
7296
+ function showcaseOpacity(phase) {
7297
+ if (phase < SHOWCASE_POP_IN_MS) return easeOutCubic(phase / SHOWCASE_POP_IN_MS);
7298
+ if (phase >= SHOWCASE_STEADY_END_MS && phase < SHOWCASE_POP_OUT_END_MS) {
7299
+ return 1 - easeInCubic((phase - SHOWCASE_STEADY_END_MS) / SHOWCASE_POP_OUT_MS);
7300
+ }
7301
+ return 1;
7302
+ }
7303
+ function showcaseScale(phase) {
7304
+ if (phase < SHOWCASE_POP_IN_MS) {
7305
+ return 0.78 + 0.22 * easeOutBack(phase / SHOWCASE_POP_IN_MS);
7306
+ }
7307
+ if (phase >= SHOWCASE_STEADY_END_MS && phase < SHOWCASE_POP_OUT_END_MS) {
7308
+ return 1 - 0.14 * easeInCubic((phase - SHOWCASE_STEADY_END_MS) / SHOWCASE_POP_OUT_MS);
7309
+ }
7310
+ return 1;
7311
+ }
7312
+ function useShowcasePhase(enabled, cycleMs) {
7313
+ var _ref = _sliced_to_array((0, import_react.useState)(0), 2), phase = _ref[0], setPhase = _ref[1];
7314
+ (0, import_react.useEffect)(function() {
7315
+ if (!enabled) return;
7316
+ setPhase(Date.now() % cycleMs);
7317
+ var id = window.setInterval(function() {
7318
+ setPhase(Date.now() % cycleMs);
7319
+ }, 48);
7320
+ return function() {
7321
+ return clearInterval(id);
7322
+ };
7323
+ }, [
7324
+ enabled,
7325
+ cycleMs
7326
+ ]);
7327
+ return phase;
7328
+ }
7240
7329
  var OverlayRenderer = function OverlayRenderer(param) {
7241
- var overlays = param.overlays, currentTime = param.currentTime, videoRef = param.videoRef, coordinateSpace = param.coordinateSpace;
7330
+ 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;
7242
7331
  var _ref = _sliced_to_array((0, import_react.useState)(null), 2), dims = _ref[0], setDims = _ref[1];
7243
7332
  var rafRef = (0, import_react.useRef)(null);
7244
7333
  var _ref1 = _sliced_to_array((0, import_react.useState)(/* @__PURE__ */ new Map()), 2), fadeMap = _ref1[0], setFadeMap = _ref1[1];
7245
7334
  var removeTimers = (0, import_react.useRef)(/* @__PURE__ */ new Map());
7335
+ var showcasePhase = useShowcasePhase(showcaseMode, showcaseCycleMs);
7246
7336
  var updateDims = (0, import_react.useCallback)(function() {
7247
7337
  var video = videoRef.current;
7248
7338
  if (video) {
@@ -7274,12 +7364,26 @@ var OverlayRenderer = function OverlayRenderer(param) {
7274
7364
  updateDims
7275
7365
  ]);
7276
7366
  var activeOverlays = (0, import_react.useMemo)(function() {
7367
+ if (showcaseMode) {
7368
+ return overlays.filter(function(o) {
7369
+ return o.visible && showcasePhase < SHOWCASE_POP_OUT_END_MS;
7370
+ });
7371
+ }
7277
7372
  return overlays.filter(function(o) {
7278
7373
  return isOverlayActive(o, currentTime);
7279
7374
  });
7280
7375
  }, [
7281
7376
  overlays,
7282
- currentTime
7377
+ currentTime,
7378
+ showcaseMode,
7379
+ showcasePhase
7380
+ ]);
7381
+ var activeBeatIds = (0, import_react.useMemo)(function() {
7382
+ return new Set(activeOverlays.map(function(o) {
7383
+ return o.id;
7384
+ }));
7385
+ }, [
7386
+ activeOverlays
7283
7387
  ]);
7284
7388
  (0, import_react.useEffect)(function() {
7285
7389
  var activeIds = new Set(activeOverlays.map(function(o) {
@@ -7469,7 +7573,9 @@ var OverlayRenderer = function OverlayRenderer(param) {
7469
7573
  var width = overlay.width * scaleX;
7470
7574
  var height = overlay.height * scaleY;
7471
7575
  var baseOpacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7472
- var opacity = visible ? baseOpacity : 0;
7576
+ var inShowcaseBeat = showcaseMode && activeBeatIds.has(overlay.id);
7577
+ var opacity = inShowcaseBeat ? baseOpacity * showcaseOpacity(showcasePhase) : visible ? baseOpacity : 0;
7578
+ var popScale = inShowcaseBeat ? showcaseScale(showcasePhase) : 1;
7473
7579
  var sz = {
7474
7580
  w: width,
7475
7581
  h: height
@@ -7482,7 +7588,9 @@ var OverlayRenderer = function OverlayRenderer(param) {
7482
7588
  width: "".concat(width, "px"),
7483
7589
  height: "".concat(height, "px"),
7484
7590
  opacity: opacity,
7485
- transition: "opacity ".concat(FADE_DURATION_MS, "ms ease"),
7591
+ transition: inShowcaseBeat ? "none" : "opacity ".concat(FADE_DURATION_MS, "ms ease"),
7592
+ transform: showcaseMode ? "scale(".concat(popScale, ")") : void 0,
7593
+ transformOrigin: showcaseMode ? "center center" : void 0,
7486
7594
  zIndex: overlay.z_index,
7487
7595
  overflow: "hidden"
7488
7596
  },
@@ -7608,7 +7716,7 @@ var PANEL_BASE_RIGHT_OFFSET = 10;
7608
7716
  var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props) {
7609
7717
  var _ref;
7610
7718
  var _aiLiveContext_context;
7611
- var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, driftToleranceMs = props.driftToleranceMs, immediateManifestAds = props.immediateManifestAds, debugAdTiming = props.debugAdTiming, showCustomControls = props.showCustomControls, hideLoadingIndicator = props.hideLoadingIndicator, onVolumeToggle = props.onVolumeToggle, onFullscreenToggle = props.onFullscreenToggle, onControlClick = props.onControlClick, onReady = props.onReady, wrapperClassName = props.wrapperClassName, wrapperStyle = props.wrapperStyle, className = props.className, style = props.style, controls = props.controls, playsInline = props.playsInline, preload = props.preload, poster = props.poster, children = props.children, licenseKey = props.licenseKey, minSegmentsBeforePlay = props.minSegmentsBeforePlay, disableAds = props.disableAds, disableFiller = props.disableFiller, swirlProjectId = props.swirlProjectId, adcisionChannelId = props.adcisionChannelId, disableOverlays = props.disableOverlays, showAdsControl = props.showAdsControl, showOverlaysControl = props.showOverlaysControl, showAiContextControl = props.showAiContextControl, showDebugControl = props.showDebugControl, restVideoAttrs = _object_without_properties(props, [
7719
+ var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, driftToleranceMs = props.driftToleranceMs, immediateManifestAds = props.immediateManifestAds, debugAdTiming = props.debugAdTiming, showCustomControls = props.showCustomControls, hideLoadingIndicator = props.hideLoadingIndicator, onVolumeToggle = props.onVolumeToggle, onFullscreenToggle = props.onFullscreenToggle, onControlClick = props.onControlClick, onReady = props.onReady, wrapperClassName = props.wrapperClassName, wrapperStyle = props.wrapperStyle, className = props.className, style = props.style, controls = props.controls, playsInline = props.playsInline, preload = props.preload, poster = props.poster, children = props.children, licenseKey = props.licenseKey, minSegmentsBeforePlay = props.minSegmentsBeforePlay, disableAds = props.disableAds, disableFiller = props.disableFiller, swirlProjectId = props.swirlProjectId, swirlShowcaseDemo = props.swirlShowcaseDemo, adcisionChannelId = props.adcisionChannelId, disableOverlays = props.disableOverlays, showAdsControl = props.showAdsControl, showOverlaysControl = props.showOverlaysControl, showAiContextControl = props.showAiContextControl, showDebugControl = props.showDebugControl, restVideoAttrs = _object_without_properties(props, [
7612
7720
  "src",
7613
7721
  "autoplay",
7614
7722
  "muted",
@@ -7637,6 +7745,7 @@ var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props)
7637
7745
  "disableAds",
7638
7746
  "disableFiller",
7639
7747
  "swirlProjectId",
7748
+ "swirlShowcaseDemo",
7640
7749
  "adcisionChannelId",
7641
7750
  "disableOverlays",
7642
7751
  "showAdsControl",
@@ -7673,6 +7782,19 @@ var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props)
7673
7782
  var _import_react2_default_useState14 = _sliced_to_array(import_react2.default.useState(false), 2), showLicenseWarning = _import_react2_default_useState14[0], setShowLicenseWarning = _import_react2_default_useState14[1];
7674
7783
  var _import_react2_default_useState15 = _sliced_to_array(import_react2.default.useState(true), 2), controlsVisible = _import_react2_default_useState15[0], setControlsVisible = _import_react2_default_useState15[1];
7675
7784
  var _import_react2_default_useState16 = _sliced_to_array(import_react2.default.useState([]), 2), overlays = _import_react2_default_useState16[0], setOverlays = _import_react2_default_useState16[1];
7785
+ var displayOverlays = import_react2.default.useMemo(function() {
7786
+ if (!swirlProjectId || !swirlShowcaseDemo) return overlays;
7787
+ if (overlays.some(function(o) {
7788
+ return o.type === "scroller";
7789
+ })) return overlays;
7790
+ return _to_consumable_array(overlays).concat([
7791
+ createDemoStockTickerOverlay(swirlProjectId)
7792
+ ]);
7793
+ }, [
7794
+ overlays,
7795
+ swirlProjectId,
7796
+ swirlShowcaseDemo
7797
+ ]);
7676
7798
  var _import_react2_default_useState17 = _sliced_to_array(import_react2.default.useState(null), 2), overlayCoordSpace = _import_react2_default_useState17[0], setOverlayCoordSpace = _import_react2_default_useState17[1];
7677
7799
  var _import_react2_default_useState18 = _sliced_to_array(import_react2.default.useState(typeof window !== "undefined" ? window.innerWidth : 1920), 2), viewportWidth = _import_react2_default_useState18[0], setViewportWidth = _import_react2_default_useState18[1];
7678
7800
  var _import_react2_default_useState19 = _sliced_to_array(import_react2.default.useState(typeof window !== "undefined" ? window.innerHeight > window.innerWidth : false), 2), isPortrait = _import_react2_default_useState19[0], setIsPortrait = _import_react2_default_useState19[1];
@@ -8418,11 +8540,12 @@ var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props)
8418
8540
  }, restVideoAttrs), {
8419
8541
  children: children
8420
8542
  })),
8421
- overlays.length > 0 && !adStatus.showAds && !overlaysDisabled && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(OverlayRenderer, {
8422
- overlays: overlays,
8543
+ displayOverlays.length > 0 && !adStatus.showAds && !overlaysDisabled && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(OverlayRenderer, {
8544
+ overlays: displayOverlays,
8423
8545
  currentTime: currentTime,
8424
8546
  videoRef: videoRef,
8425
- coordinateSpace: overlayCoordSpace
8547
+ coordinateSpace: overlayCoordSpace,
8548
+ showcaseMode: !!swirlShowcaseDemo
8426
8549
  }),
8427
8550
  (isLoading || isBuffering) && !hideLoadingIndicator && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
8428
8551
  className: "sc-loading-indicator",
@@ -9791,6 +9914,7 @@ var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props)
9791
9914
  "poster",
9792
9915
  "children",
9793
9916
  "swirlProjectId",
9917
+ "swirlShowcaseDemo",
9794
9918
  "adcisionChannelId",
9795
9919
  "disableOverlays",
9796
9920
  "showAdsControl",
@@ -11025,6 +11149,7 @@ var StormcloudPlayer_default = StormcloudPlayer;
11025
11149
  StormcloudVideoPlayerComponent: StormcloudVideoPlayerComponent,
11026
11150
  canPlay: canPlay,
11027
11151
  createAdStormPlayer: createAdStormPlayer,
11152
+ createDemoStockTickerOverlay: createDemoStockTickerOverlay,
11028
11153
  createStormcloudPlayer: createStormcloudPlayer,
11029
11154
  detectBrowser: detectBrowser,
11030
11155
  fetchProjectOverlays: fetchProjectOverlays,