stormcloud-video-player 0.7.32 → 0.7.35

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.
@@ -9,6 +9,8 @@ interface OverlayRendererProps {
9
9
  width: number;
10
10
  height: number;
11
11
  } | null;
12
+ showcaseMode?: boolean;
13
+ showcaseCycleMs?: number;
12
14
  }
13
15
  declare const OverlayRenderer: React.FC<OverlayRendererProps>;
14
16
 
@@ -5649,6 +5649,42 @@ function isOverlayActive(overlay, currentTime) {
5649
5649
  if (durationSec <= 0) return false;
5650
5650
  return currentTime >= startSec && currentTime < startSec + durationSec;
5651
5651
  }
5652
+ function createDemoStockTickerOverlay(projectId) {
5653
+ return {
5654
+ id: -9001,
5655
+ project_id: projectId,
5656
+ name: "Demo stock ticker",
5657
+ type: "scroller",
5658
+ visible: true,
5659
+ x: 144,
5660
+ y: 950,
5661
+ width: 1632,
5662
+ height: 97,
5663
+ opacity: 100,
5664
+ start_time: "00:00:00.000",
5665
+ duration: "24:00:00.000",
5666
+ z_index: 120,
5667
+ scroller_config: {
5668
+ use_custom_text: true,
5669
+ 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%",
5670
+ direction: "left",
5671
+ scroll_speed: 42,
5672
+ font_size: 15,
5673
+ font_weight: "700",
5674
+ text_color: "#f8fafc",
5675
+ background_color: "#0f172a",
5676
+ background_opacity: 92,
5677
+ border_radius: 4,
5678
+ label: "MARKETS",
5679
+ label_line2: "LIVE",
5680
+ label_color: "#0ea5e9",
5681
+ label_text_color: "#ffffff",
5682
+ accent_color: "#38bdf8",
5683
+ show_accent_line: true,
5684
+ separator_char: "\u2022"
5685
+ }
5686
+ };
5687
+ }
5652
5688
  function fetchProjectOverlays(_0) {
5653
5689
  return _async_to_generator(function(projectId) {
5654
5690
  var apiBaseUrl, response, data;
@@ -7059,12 +7095,63 @@ function hexToRgb(hex) {
7059
7095
  return "".concat(num >> 16 & 255, ",").concat(num >> 8 & 255, ",").concat(num & 255);
7060
7096
  }
7061
7097
  var FADE_DURATION_MS = 1e3;
7098
+ var SHOWCASE_CYCLE_MS_DEFAULT = 6e4;
7099
+ var SHOWCASE_POP_IN_MS = 420;
7100
+ var SHOWCASE_STEADY_END_MS = 46e3;
7101
+ var SHOWCASE_POP_OUT_MS = 450;
7102
+ var SHOWCASE_POP_OUT_END_MS = SHOWCASE_STEADY_END_MS + SHOWCASE_POP_OUT_MS;
7103
+ function easeOutCubic(t) {
7104
+ var u = 1 - t;
7105
+ return 1 - u * u * u;
7106
+ }
7107
+ function easeInCubic(t) {
7108
+ return t * t * t;
7109
+ }
7110
+ function easeOutBack(t) {
7111
+ var c1 = 1.70158;
7112
+ var c3 = c1 + 1;
7113
+ return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);
7114
+ }
7115
+ function showcaseOpacity(phase) {
7116
+ if (phase < SHOWCASE_POP_IN_MS) return easeOutCubic(phase / SHOWCASE_POP_IN_MS);
7117
+ if (phase >= SHOWCASE_STEADY_END_MS && phase < SHOWCASE_POP_OUT_END_MS) {
7118
+ return 1 - easeInCubic((phase - SHOWCASE_STEADY_END_MS) / SHOWCASE_POP_OUT_MS);
7119
+ }
7120
+ return 1;
7121
+ }
7122
+ function showcaseScale(phase) {
7123
+ if (phase < SHOWCASE_POP_IN_MS) {
7124
+ return 0.78 + 0.22 * easeOutBack(phase / SHOWCASE_POP_IN_MS);
7125
+ }
7126
+ if (phase >= SHOWCASE_STEADY_END_MS && phase < SHOWCASE_POP_OUT_END_MS) {
7127
+ return 1 - 0.14 * easeInCubic((phase - SHOWCASE_STEADY_END_MS) / SHOWCASE_POP_OUT_MS);
7128
+ }
7129
+ return 1;
7130
+ }
7131
+ function useShowcasePhase(enabled, cycleMs) {
7132
+ var _ref = _sliced_to_array((0, import_react.useState)(0), 2), phase = _ref[0], setPhase = _ref[1];
7133
+ (0, import_react.useEffect)(function() {
7134
+ if (!enabled) return;
7135
+ setPhase(Date.now() % cycleMs);
7136
+ var id = window.setInterval(function() {
7137
+ setPhase(Date.now() % cycleMs);
7138
+ }, 48);
7139
+ return function() {
7140
+ return clearInterval(id);
7141
+ };
7142
+ }, [
7143
+ enabled,
7144
+ cycleMs
7145
+ ]);
7146
+ return phase;
7147
+ }
7062
7148
  var OverlayRenderer = function OverlayRenderer(param) {
7063
- var overlays = param.overlays, currentTime = param.currentTime, videoRef = param.videoRef, coordinateSpace = param.coordinateSpace;
7149
+ 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;
7064
7150
  var _ref = _sliced_to_array((0, import_react.useState)(null), 2), dims = _ref[0], setDims = _ref[1];
7065
7151
  var rafRef = (0, import_react.useRef)(null);
7066
7152
  var _ref1 = _sliced_to_array((0, import_react.useState)(/* @__PURE__ */ new Map()), 2), fadeMap = _ref1[0], setFadeMap = _ref1[1];
7067
7153
  var removeTimers = (0, import_react.useRef)(/* @__PURE__ */ new Map());
7154
+ var showcasePhase = useShowcasePhase(showcaseMode, showcaseCycleMs);
7068
7155
  var updateDims = (0, import_react.useCallback)(function() {
7069
7156
  var video = videoRef.current;
7070
7157
  if (video) {
@@ -7096,12 +7183,26 @@ var OverlayRenderer = function OverlayRenderer(param) {
7096
7183
  updateDims
7097
7184
  ]);
7098
7185
  var activeOverlays = (0, import_react.useMemo)(function() {
7186
+ if (showcaseMode) {
7187
+ return overlays.filter(function(o) {
7188
+ return o.visible && showcasePhase < SHOWCASE_POP_OUT_END_MS;
7189
+ });
7190
+ }
7099
7191
  return overlays.filter(function(o) {
7100
7192
  return isOverlayActive(o, currentTime);
7101
7193
  });
7102
7194
  }, [
7103
7195
  overlays,
7104
- currentTime
7196
+ currentTime,
7197
+ showcaseMode,
7198
+ showcasePhase
7199
+ ]);
7200
+ var activeBeatIds = (0, import_react.useMemo)(function() {
7201
+ return new Set(activeOverlays.map(function(o) {
7202
+ return o.id;
7203
+ }));
7204
+ }, [
7205
+ activeOverlays
7105
7206
  ]);
7106
7207
  (0, import_react.useEffect)(function() {
7107
7208
  var activeIds = new Set(activeOverlays.map(function(o) {
@@ -7291,7 +7392,9 @@ var OverlayRenderer = function OverlayRenderer(param) {
7291
7392
  var width = overlay.width * scaleX;
7292
7393
  var height = overlay.height * scaleY;
7293
7394
  var baseOpacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7294
- var opacity = visible ? baseOpacity : 0;
7395
+ var inShowcaseBeat = showcaseMode && activeBeatIds.has(overlay.id);
7396
+ var opacity = inShowcaseBeat ? baseOpacity * showcaseOpacity(showcasePhase) : visible ? baseOpacity : 0;
7397
+ var popScale = inShowcaseBeat ? showcaseScale(showcasePhase) : 1;
7295
7398
  var sz = {
7296
7399
  w: width,
7297
7400
  h: height
@@ -7304,7 +7407,9 @@ var OverlayRenderer = function OverlayRenderer(param) {
7304
7407
  width: "".concat(width, "px"),
7305
7408
  height: "".concat(height, "px"),
7306
7409
  opacity: opacity,
7307
- transition: "opacity ".concat(FADE_DURATION_MS, "ms ease"),
7410
+ transition: inShowcaseBeat ? "none" : "opacity ".concat(FADE_DURATION_MS, "ms ease"),
7411
+ transform: showcaseMode ? "scale(".concat(popScale, ")") : void 0,
7412
+ transformOrigin: showcaseMode ? "center center" : void 0,
7308
7413
  zIndex: overlay.z_index,
7309
7414
  overflow: "hidden"
7310
7415
  },
@@ -7430,7 +7535,7 @@ var PANEL_BASE_RIGHT_OFFSET = 10;
7430
7535
  var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props) {
7431
7536
  var _ref;
7432
7537
  var _aiLiveContext_context;
7433
- 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, [
7538
+ 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, [
7434
7539
  "src",
7435
7540
  "autoplay",
7436
7541
  "muted",
@@ -7459,6 +7564,7 @@ var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props)
7459
7564
  "disableAds",
7460
7565
  "disableFiller",
7461
7566
  "swirlProjectId",
7567
+ "swirlShowcaseDemo",
7462
7568
  "adcisionChannelId",
7463
7569
  "disableOverlays",
7464
7570
  "showAdsControl",
@@ -7495,6 +7601,19 @@ var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props)
7495
7601
  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];
7496
7602
  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];
7497
7603
  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];
7604
+ var displayOverlays = import_react2.default.useMemo(function() {
7605
+ if (!swirlProjectId || !swirlShowcaseDemo) return overlays;
7606
+ if (overlays.some(function(o) {
7607
+ return o.type === "scroller";
7608
+ })) return overlays;
7609
+ return _to_consumable_array(overlays).concat([
7610
+ createDemoStockTickerOverlay(swirlProjectId)
7611
+ ]);
7612
+ }, [
7613
+ overlays,
7614
+ swirlProjectId,
7615
+ swirlShowcaseDemo
7616
+ ]);
7498
7617
  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];
7499
7618
  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];
7500
7619
  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];
@@ -8240,11 +8359,12 @@ var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props)
8240
8359
  }, restVideoAttrs), {
8241
8360
  children: children
8242
8361
  })),
8243
- overlays.length > 0 && !adStatus.showAds && !overlaysDisabled && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(OverlayRenderer, {
8244
- overlays: overlays,
8362
+ displayOverlays.length > 0 && !adStatus.showAds && !overlaysDisabled && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(OverlayRenderer, {
8363
+ overlays: displayOverlays,
8245
8364
  currentTime: currentTime,
8246
8365
  videoRef: videoRef,
8247
- coordinateSpace: overlayCoordSpace
8366
+ coordinateSpace: overlayCoordSpace,
8367
+ showcaseMode: !!swirlShowcaseDemo
8248
8368
  }),
8249
8369
  (isLoading || isBuffering) && !hideLoadingIndicator && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
8250
8370
  className: "sc-loading-indicator",
@@ -9613,6 +9733,7 @@ var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props)
9613
9733
  "poster",
9614
9734
  "children",
9615
9735
  "swirlProjectId",
9736
+ "swirlShowcaseDemo",
9616
9737
  "adcisionChannelId",
9617
9738
  "disableOverlays",
9618
9739
  "showAdsControl",