stormcloud-video-player 0.6.5 → 0.7.0

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
@@ -473,6 +473,9 @@ __export(index_exports, {
473
473
  detectBrowser: function detectBrowser1() {
474
474
  return detectBrowser;
475
475
  },
476
+ fetchProjectOverlays: function fetchProjectOverlays1() {
477
+ return fetchProjectOverlays;
478
+ },
476
479
  getBrowserConfigOverrides: function getBrowserConfigOverrides1() {
477
480
  return getBrowserConfigOverrides;
478
481
  },
@@ -488,6 +491,9 @@ __export(index_exports, {
488
491
  isMediaStream: function isMediaStream1() {
489
492
  return isMediaStream;
490
493
  },
494
+ isOverlayActive: function isOverlayActive1() {
495
+ return isOverlayActive;
496
+ },
491
497
  lazy: function lazy1() {
492
498
  return lazy;
493
499
  },
@@ -509,6 +515,9 @@ __export(index_exports, {
509
515
  randomString: function randomString1() {
510
516
  return randomString;
511
517
  },
518
+ resolveImageUrl: function resolveImageUrl1() {
519
+ return resolveImageUrl;
520
+ },
512
521
  sendHeartbeat: function sendHeartbeat1() {
513
522
  return sendHeartbeat;
514
523
  },
@@ -523,11 +532,14 @@ __export(index_exports, {
523
532
  },
524
533
  supportsWebKitPresentationMode: function supportsWebKitPresentationMode1() {
525
534
  return supportsWebKitPresentationMode;
535
+ },
536
+ timeStringToSeconds: function timeStringToSeconds1() {
537
+ return timeStringToSeconds;
526
538
  }
527
539
  });
528
540
  module.exports = __toCommonJS(index_exports);
529
541
  // src/ui/StormcloudVideoPlayer.tsx
530
- var import_react = __toESM(require("react"), 1);
542
+ var import_react2 = __toESM(require("react"), 1);
531
543
  // src/player/StormcloudVideoPlayer.ts
532
544
  var import_hls2 = __toESM(require("hls.js"), 1);
533
545
  // src/sdk/vastParser.ts
@@ -1124,6 +1136,7 @@ function createVastAdLayer(contentVideo, options) {
1124
1136
  var tornDown = false;
1125
1137
  var trackingFired = createEmptyTrackingState();
1126
1138
  var adStallTimerId;
1139
+ var savedContentVideoStyles;
1127
1140
  var currentAdEventHandlers;
1128
1141
  var preloadSlots = /* @__PURE__ */ new Map();
1129
1142
  function emit(event, payload) {
@@ -1240,7 +1253,7 @@ function createVastAdLayer(contentVideo, options) {
1240
1253
  video.style.top = "0";
1241
1254
  video.style.width = "100%";
1242
1255
  video.style.height = "100%";
1243
- video.style.objectFit = "contain";
1256
+ video.style.objectFit = "cover";
1244
1257
  video.style.backgroundColor = "#000";
1245
1258
  video.playsInline = true;
1246
1259
  video.muted = false;
@@ -1355,12 +1368,31 @@ function createVastAdLayer(contentVideo, options) {
1355
1368
  delete contentVideo.dataset.stormcloudAdPlaying;
1356
1369
  }
1357
1370
  }
1371
+ function applyContentVideoAdCoverStyles() {
1372
+ if (!singleElementMode) return;
1373
+ savedContentVideoStyles = {
1374
+ objectFit: contentVideo.style.objectFit,
1375
+ width: contentVideo.style.width,
1376
+ height: contentVideo.style.height
1377
+ };
1378
+ contentVideo.style.objectFit = "cover";
1379
+ contentVideo.style.width = "100%";
1380
+ contentVideo.style.height = "100%";
1381
+ }
1382
+ function restoreContentVideoStyles() {
1383
+ if (!singleElementMode || !savedContentVideoStyles) return;
1384
+ contentVideo.style.objectFit = savedContentVideoStyles.objectFit;
1385
+ contentVideo.style.width = savedContentVideoStyles.width;
1386
+ contentVideo.style.height = savedContentVideoStyles.height;
1387
+ savedContentVideoStyles = void 0;
1388
+ }
1358
1389
  function handleAdComplete() {
1359
1390
  if (tornDown) return;
1360
1391
  clearAdStallTimer();
1361
1392
  if (debug) console.log("".concat(LOG, " Handling ad completion"));
1362
1393
  adPlaying = false;
1363
1394
  setAdPlayingFlag(false);
1395
+ restoreContentVideoStyles();
1364
1396
  if (adContainerEl) {
1365
1397
  adContainerEl.style.display = "none";
1366
1398
  adContainerEl.style.pointerEvents = "none";
@@ -1375,6 +1407,7 @@ function createVastAdLayer(contentVideo, options) {
1375
1407
  if (debug) console.log("".concat(LOG, " Handling ad error"));
1376
1408
  adPlaying = false;
1377
1409
  setAdPlayingFlag(false);
1410
+ restoreContentVideoStyles();
1378
1411
  if (adContainerEl) {
1379
1412
  adContainerEl.style.display = "none";
1380
1413
  adContainerEl.style.pointerEvents = "none";
@@ -1545,6 +1578,7 @@ function createVastAdLayer(contentVideo, options) {
1545
1578
  ];
1546
1579
  contentVideo.style.visibility = "visible";
1547
1580
  contentVideo.style.opacity = "1";
1581
+ applyContentVideoAdCoverStyles();
1548
1582
  emit("content_pause");
1549
1583
  setupAdEventListeners();
1550
1584
  adVolume2 = originalMutedState ? 1 : originalVolume;
@@ -1783,6 +1817,7 @@ function createVastAdLayer(contentVideo, options) {
1783
1817
  ];
1784
1818
  contentVideo.style.visibility = "visible";
1785
1819
  contentVideo.style.opacity = "1";
1820
+ applyContentVideoAdCoverStyles();
1786
1821
  emit("content_pause");
1787
1822
  setupAdEventListeners();
1788
1823
  adVolume2 = originalMutedState ? 1 : originalVolume;
@@ -1933,6 +1968,7 @@ function createVastAdLayer(contentVideo, options) {
1933
1968
  if (debug) console.log("".concat(LOG, " Stopping ad"));
1934
1969
  adPlaying = false;
1935
1970
  setAdPlayingFlag(false);
1971
+ restoreContentVideoStyles();
1936
1972
  contentVideo.muted = originalMutedState;
1937
1973
  contentVideo.volume = originalMutedState ? 0 : originalVolume;
1938
1974
  contentVideo.style.visibility = "visible";
@@ -1971,6 +2007,7 @@ function createVastAdLayer(contentVideo, options) {
1971
2007
  destroyed = true;
1972
2008
  adPlaying = false;
1973
2009
  setAdPlayingFlag(false);
2010
+ restoreContentVideoStyles();
1974
2011
  contentVideo.muted = originalMutedState;
1975
2012
  contentVideo.volume = originalVolume;
1976
2013
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
@@ -6164,6 +6201,46 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
6164
6201
  return this.isLiveStream;
6165
6202
  }
6166
6203
  },
6204
+ {
6205
+ key: "getMinHlsResolution",
6206
+ value: function getMinHlsResolution() {
6207
+ var _this_hls;
6208
+ var levels = (_this_hls = this.hls) === null || _this_hls === void 0 ? void 0 : _this_hls.levels;
6209
+ if (!levels || levels.length === 0) return null;
6210
+ var min = null;
6211
+ var minPixels = Infinity;
6212
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
6213
+ try {
6214
+ for(var _iterator = levels[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
6215
+ var level = _step.value;
6216
+ if (level.width && level.height) {
6217
+ var pixels = level.width * level.height;
6218
+ if (pixels < minPixels) {
6219
+ minPixels = pixels;
6220
+ min = {
6221
+ width: level.width,
6222
+ height: level.height
6223
+ };
6224
+ }
6225
+ }
6226
+ }
6227
+ } catch (err) {
6228
+ _didIteratorError = true;
6229
+ _iteratorError = err;
6230
+ } finally{
6231
+ try {
6232
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
6233
+ _iterator.return();
6234
+ }
6235
+ } finally{
6236
+ if (_didIteratorError) {
6237
+ throw _iteratorError;
6238
+ }
6239
+ }
6240
+ }
6241
+ return min;
6242
+ }
6243
+ },
6167
6244
  {
6168
6245
  key: "videoElement",
6169
6246
  get: function get() {
@@ -6226,7 +6303,322 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
6226
6303
  }();
6227
6304
  // src/ui/StormcloudVideoPlayer.tsx
6228
6305
  var import_fa = require("react-icons/fa");
6306
+ // src/ui/OverlayRenderer.tsx
6307
+ var import_react = require("react");
6308
+ // src/utils/overlays.ts
6309
+ var OVERLAY_API_BASE = "https://adstorm.co/api-adstorm-dev";
6310
+ function timeStringToSeconds(timeStr) {
6311
+ if (!timeStr) return 0;
6312
+ var parts = timeStr.split(":");
6313
+ if (parts.length >= 3) {
6314
+ var _parts_, _parts_1, _parts_2;
6315
+ var hours = parseInt((_parts_ = parts[0]) !== null && _parts_ !== void 0 ? _parts_ : "0", 10) || 0;
6316
+ var minutes = parseInt((_parts_1 = parts[1]) !== null && _parts_1 !== void 0 ? _parts_1 : "0", 10) || 0;
6317
+ var secStr = (_parts_2 = parts[2]) !== null && _parts_2 !== void 0 ? _parts_2 : "0";
6318
+ var dotIdx = secStr.indexOf(".");
6319
+ var seconds = parseInt(dotIdx >= 0 ? secStr.substring(0, dotIdx) : secStr, 10) || 0;
6320
+ var msFrag = dotIdx >= 0 ? secStr.substring(dotIdx + 1) : "";
6321
+ var ms = msFrag ? parseInt(msFrag.padEnd(3, "0").substring(0, 3), 10) || 0 : 0;
6322
+ return hours * 3600 + minutes * 60 + seconds + ms / 1e3;
6323
+ }
6324
+ if (parts.length === 2) {
6325
+ var _parts_3, _parts_4;
6326
+ var minutes1 = parseInt((_parts_3 = parts[0]) !== null && _parts_3 !== void 0 ? _parts_3 : "0", 10) || 0;
6327
+ var secStr1 = (_parts_4 = parts[1]) !== null && _parts_4 !== void 0 ? _parts_4 : "0";
6328
+ var dotIdx1 = secStr1.indexOf(".");
6329
+ var seconds1 = parseInt(dotIdx1 >= 0 ? secStr1.substring(0, dotIdx1) : secStr1, 10) || 0;
6330
+ var msFrag1 = dotIdx1 >= 0 ? secStr1.substring(dotIdx1 + 1) : "";
6331
+ var ms1 = msFrag1 ? parseInt(msFrag1.padEnd(3, "0").substring(0, 3), 10) || 0 : 0;
6332
+ return minutes1 * 60 + seconds1 + ms1 / 1e3;
6333
+ }
6334
+ var num = parseFloat(timeStr);
6335
+ return isFinite(num) ? Math.max(0, num) : 0;
6336
+ }
6337
+ function isOverlayActive(overlay, currentTime) {
6338
+ if (!overlay.visible) return false;
6339
+ var startSec = timeStringToSeconds(overlay.start_time);
6340
+ var durationSec = timeStringToSeconds(overlay.duration);
6341
+ if (durationSec <= 0) return false;
6342
+ return currentTime >= startSec && currentTime < startSec + durationSec;
6343
+ }
6344
+ function fetchProjectOverlays(_0) {
6345
+ return _async_to_generator(function(projectId) {
6346
+ var apiBaseUrl, response, data;
6347
+ var _arguments = arguments;
6348
+ return _ts_generator(this, function(_state) {
6349
+ switch(_state.label){
6350
+ case 0:
6351
+ apiBaseUrl = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : OVERLAY_API_BASE;
6352
+ return [
6353
+ 4,
6354
+ fetch("".concat(apiBaseUrl, "/adstorm/swirl/projects/").concat(projectId, "/overlays"))
6355
+ ];
6356
+ case 1:
6357
+ response = _state.sent();
6358
+ if (!response.ok) {
6359
+ throw new Error("Failed to fetch overlays: ".concat(response.status, " ").concat(response.statusText));
6360
+ }
6361
+ return [
6362
+ 4,
6363
+ response.json()
6364
+ ];
6365
+ case 2:
6366
+ data = _state.sent();
6367
+ return [
6368
+ 2,
6369
+ Array.isArray(data) ? data : []
6370
+ ];
6371
+ }
6372
+ });
6373
+ }).apply(this, arguments);
6374
+ }
6375
+ function resolveImageUrl(imageUrl) {
6376
+ var apiBaseUrl = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : OVERLAY_API_BASE;
6377
+ if (!imageUrl) return "";
6378
+ if (imageUrl.startsWith("http://") || imageUrl.startsWith("https://")) {
6379
+ return imageUrl;
6380
+ }
6381
+ if (imageUrl.startsWith("/")) {
6382
+ try {
6383
+ var url = new URL(apiBaseUrl);
6384
+ return "".concat(url.origin).concat(imageUrl);
6385
+ } catch (unused) {
6386
+ return imageUrl;
6387
+ }
6388
+ }
6389
+ return "".concat(apiBaseUrl, "/").concat(imageUrl);
6390
+ }
6391
+ // src/ui/OverlayRenderer.tsx
6229
6392
  var import_jsx_runtime = require("react/jsx-runtime");
6393
+ function computeVideoDimensions(video) {
6394
+ var nativeWidth = video.videoWidth;
6395
+ var nativeHeight = video.videoHeight;
6396
+ if (!nativeWidth || !nativeHeight) return null;
6397
+ var displayWidth = video.offsetWidth;
6398
+ var displayHeight = video.offsetHeight;
6399
+ if (!displayWidth || !displayHeight) return null;
6400
+ var videoAspect = nativeWidth / nativeHeight;
6401
+ var displayAspect = displayWidth / displayHeight;
6402
+ var renderWidth;
6403
+ var renderHeight;
6404
+ var offsetX;
6405
+ var offsetY;
6406
+ if (videoAspect > displayAspect) {
6407
+ renderWidth = displayWidth;
6408
+ renderHeight = displayWidth / videoAspect;
6409
+ offsetX = 0;
6410
+ offsetY = (displayHeight - renderHeight) / 2;
6411
+ } else {
6412
+ renderHeight = displayHeight;
6413
+ renderWidth = displayHeight * videoAspect;
6414
+ offsetX = (displayWidth - renderWidth) / 2;
6415
+ offsetY = 0;
6416
+ }
6417
+ return {
6418
+ nativeWidth: nativeWidth,
6419
+ nativeHeight: nativeHeight,
6420
+ displayWidth: renderWidth,
6421
+ displayHeight: renderHeight,
6422
+ offsetX: offsetX,
6423
+ offsetY: offsetY,
6424
+ scaleX: renderWidth / nativeWidth,
6425
+ scaleY: renderHeight / nativeHeight
6426
+ };
6427
+ }
6428
+ function ImageOverlay(param) {
6429
+ var overlay = param.overlay;
6430
+ var src = resolveImageUrl(overlay.image_url || "");
6431
+ if (!src) return null;
6432
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
6433
+ src: src,
6434
+ alt: overlay.name,
6435
+ draggable: false,
6436
+ style: {
6437
+ width: "100%",
6438
+ height: "100%",
6439
+ objectFit: "contain",
6440
+ display: "block",
6441
+ pointerEvents: "none",
6442
+ userSelect: "none"
6443
+ }
6444
+ });
6445
+ }
6446
+ function TextOverlay(param) {
6447
+ var overlay = param.overlay;
6448
+ var text = overlay.content || "";
6449
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6450
+ style: {
6451
+ width: "100%",
6452
+ height: "100%",
6453
+ display: "flex",
6454
+ alignItems: "center",
6455
+ justifyContent: "center",
6456
+ color: "#ffffff",
6457
+ fontSize: "clamp(10px, 1.4vw, 20px)",
6458
+ fontFamily: "Roboto, 'Segoe UI', Arial, sans-serif",
6459
+ fontWeight: 600,
6460
+ textAlign: "center",
6461
+ padding: "4px 8px",
6462
+ boxSizing: "border-box",
6463
+ wordBreak: "break-word",
6464
+ textShadow: "0 1px 4px rgba(0,0,0,0.7)",
6465
+ pointerEvents: "none",
6466
+ userSelect: "none",
6467
+ lineHeight: 1.3
6468
+ },
6469
+ children: text
6470
+ });
6471
+ }
6472
+ function ScrollerOverlay(param) {
6473
+ var overlay = param.overlay;
6474
+ var _ref, _ref1, _ref2, _ref3, _ref4;
6475
+ var cfg = overlay.scroller_config;
6476
+ var text = (cfg === null || cfg === void 0 ? void 0 : cfg.use_custom_text) && cfg.custom_text ? cfg.custom_text : overlay.content || (cfg === null || cfg === void 0 ? void 0 : cfg.custom_text) || "";
6477
+ var scrollSpeed = (_ref = cfg === null || cfg === void 0 ? void 0 : cfg.scroll_speed) !== null && _ref !== void 0 ? _ref : 50;
6478
+ var direction = (_ref1 = cfg === null || cfg === void 0 ? void 0 : cfg.direction) !== null && _ref1 !== void 0 ? _ref1 : "left";
6479
+ var fontSize = (cfg === null || cfg === void 0 ? void 0 : cfg.font_size) ? "".concat(cfg.font_size, "px") : "clamp(10px, 1.2vw, 18px)";
6480
+ var fontFamily = (cfg === null || cfg === void 0 ? void 0 : cfg.font_family) || "Roboto, 'Segoe UI', Arial, sans-serif";
6481
+ var fontWeight = (cfg === null || cfg === void 0 ? void 0 : cfg.font_weight) || "600";
6482
+ var textColor = (cfg === null || cfg === void 0 ? void 0 : cfg.text_color) || "#ffffff";
6483
+ var bgColor = (cfg === null || cfg === void 0 ? void 0 : cfg.background_color) || "transparent";
6484
+ var bgOpacity = (cfg === null || cfg === void 0 ? void 0 : cfg.background_opacity) !== void 0 ? cfg.background_opacity / 100 : 0;
6485
+ var borderColor = (cfg === null || cfg === void 0 ? void 0 : cfg.border_color) || "transparent";
6486
+ var borderWidth = (_ref2 = cfg === null || cfg === void 0 ? void 0 : cfg.border_width) !== null && _ref2 !== void 0 ? _ref2 : 0;
6487
+ var borderRadius = (_ref3 = cfg === null || cfg === void 0 ? void 0 : cfg.border_radius) !== null && _ref3 !== void 0 ? _ref3 : 0;
6488
+ var padding = (_ref4 = cfg === null || cfg === void 0 ? void 0 : cfg.padding) !== null && _ref4 !== void 0 ? _ref4 : 4;
6489
+ var isVertical = direction === "up" || direction === "down";
6490
+ var isReverse = direction === "right" || direction === "down";
6491
+ var durationSec = Math.max(3, 120 - scrollSpeed);
6492
+ var animId = "sc-scroller-".concat(overlay.id);
6493
+ var keyframes = isVertical ? "@keyframes ".concat(animId, " {\n 0% { transform: translateY(").concat(isReverse ? "-100%" : "100%", "); }\n 100% { transform: translateY(").concat(isReverse ? "100%" : "-100%", "); }\n }") : "@keyframes ".concat(animId, " {\n 0% { transform: translateX(").concat(isReverse ? "-100%" : "100%", "); }\n 100% { transform: translateX(").concat(isReverse ? "100%" : "-100%", "); }\n }");
6494
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, {
6495
+ children: [
6496
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", {
6497
+ children: keyframes
6498
+ }),
6499
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6500
+ style: {
6501
+ width: "100%",
6502
+ height: "100%",
6503
+ overflow: "hidden",
6504
+ display: "flex",
6505
+ alignItems: "center",
6506
+ backgroundColor: bgOpacity > 0 ? "rgba(".concat(hexToRgb(bgColor), ", ").concat(bgOpacity, ")") : void 0,
6507
+ border: borderWidth > 0 ? "".concat(borderWidth, "px solid ").concat(borderColor) : void 0,
6508
+ borderRadius: borderRadius > 0 ? "".concat(borderRadius, "px") : void 0,
6509
+ padding: "".concat(padding, "px"),
6510
+ boxSizing: "border-box",
6511
+ pointerEvents: "none"
6512
+ },
6513
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6514
+ style: {
6515
+ whiteSpace: "nowrap",
6516
+ fontSize: fontSize,
6517
+ fontFamily: fontFamily,
6518
+ fontWeight: fontWeight,
6519
+ color: textColor,
6520
+ animation: "".concat(animId, " ").concat(durationSec, "s linear infinite"),
6521
+ textShadow: "0 1px 4px rgba(0,0,0,0.5)",
6522
+ userSelect: "none"
6523
+ },
6524
+ children: text
6525
+ })
6526
+ })
6527
+ ]
6528
+ });
6529
+ }
6530
+ function hexToRgb(hex) {
6531
+ if (!hex || !hex.startsWith("#")) return "0,0,0";
6532
+ var clean = hex.slice(1);
6533
+ var num = parseInt(clean.length === 3 ? clean.replace(/./g, "$&$&") : clean, 16);
6534
+ return "".concat(num >> 16 & 255, ",").concat(num >> 8 & 255, ",").concat(num & 255);
6535
+ }
6536
+ var OverlayRenderer = function OverlayRenderer(param) {
6537
+ var overlays = param.overlays, currentTime = param.currentTime, videoRef = param.videoRef, coordinateSpace = param.coordinateSpace;
6538
+ var _ref = _sliced_to_array((0, import_react.useState)(null), 2), dims = _ref[0], setDims = _ref[1];
6539
+ var rafRef = (0, import_react.useRef)(null);
6540
+ var updateDims = (0, import_react.useCallback)(function() {
6541
+ var video = videoRef.current;
6542
+ if (video) {
6543
+ var computed = computeVideoDimensions(video);
6544
+ setDims(function(prev) {
6545
+ 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) {
6546
+ return prev;
6547
+ }
6548
+ return computed;
6549
+ });
6550
+ }
6551
+ }, [
6552
+ videoRef
6553
+ ]);
6554
+ (0, import_react.useEffect)(function() {
6555
+ updateDims();
6556
+ var interval = setInterval(updateDims, 500);
6557
+ var handleResize = function handleResize() {
6558
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
6559
+ rafRef.current = requestAnimationFrame(updateDims);
6560
+ };
6561
+ window.addEventListener("resize", handleResize);
6562
+ return function() {
6563
+ clearInterval(interval);
6564
+ window.removeEventListener("resize", handleResize);
6565
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
6566
+ };
6567
+ }, [
6568
+ updateDims
6569
+ ]);
6570
+ var activeOverlays = overlays.filter(function(o) {
6571
+ return isOverlayActive(o, currentTime);
6572
+ });
6573
+ if (!dims || activeOverlays.length === 0) return null;
6574
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
6575
+ "aria-hidden": "true",
6576
+ style: {
6577
+ position: "absolute",
6578
+ left: "".concat(dims.offsetX, "px"),
6579
+ top: "".concat(dims.offsetY, "px"),
6580
+ width: "".concat(dims.displayWidth, "px"),
6581
+ height: "".concat(dims.displayHeight, "px"),
6582
+ pointerEvents: "none",
6583
+ overflow: "hidden",
6584
+ zIndex: 8
6585
+ },
6586
+ children: activeOverlays.map(function(overlay) {
6587
+ var scaleX = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.width) ? dims.displayWidth / coordinateSpace.width : dims.scaleX;
6588
+ var scaleY = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.height) ? dims.displayHeight / coordinateSpace.height : dims.scaleY;
6589
+ var left = overlay.x * scaleX;
6590
+ var top = overlay.y * scaleY;
6591
+ var width = overlay.width * scaleX;
6592
+ var height = overlay.height * scaleY;
6593
+ var opacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
6594
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
6595
+ style: {
6596
+ position: "absolute",
6597
+ left: "".concat(left, "px"),
6598
+ top: "".concat(top, "px"),
6599
+ width: "".concat(width, "px"),
6600
+ height: "".concat(height, "px"),
6601
+ opacity: opacity,
6602
+ zIndex: overlay.z_index,
6603
+ overflow: "hidden"
6604
+ },
6605
+ children: [
6606
+ overlay.type === "image" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ImageOverlay, {
6607
+ overlay: overlay
6608
+ }),
6609
+ overlay.type === "text" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TextOverlay, {
6610
+ overlay: overlay
6611
+ }),
6612
+ overlay.type === "scroller" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ScrollerOverlay, {
6613
+ overlay: overlay
6614
+ })
6615
+ ]
6616
+ }, overlay.id);
6617
+ })
6618
+ });
6619
+ };
6620
+ // src/ui/StormcloudVideoPlayer.tsx
6621
+ var import_jsx_runtime2 = require("react/jsx-runtime");
6230
6622
  var CRITICAL_PROPS = [
6231
6623
  "src",
6232
6624
  "allowNativeHls",
@@ -6235,8 +6627,8 @@ var CRITICAL_PROPS = [
6235
6627
  "driftToleranceMs"
6236
6628
  ];
6237
6629
  var CONTROLS_HIDE_DELAY = 3e3;
6238
- var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6239
- 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, restVideoAttrs = _object_without_properties(props, [
6630
+ var StormcloudVideoPlayerComponent = import_react2.default.memo(function(props) {
6631
+ 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, restVideoAttrs = _object_without_properties(props, [
6240
6632
  "src",
6241
6633
  "autoplay",
6242
6634
  "muted",
@@ -6263,35 +6655,38 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6263
6655
  "licenseKey",
6264
6656
  "minSegmentsBeforePlay",
6265
6657
  "disableAds",
6266
- "disableFiller"
6658
+ "disableFiller",
6659
+ "swirlProjectId"
6267
6660
  ]);
6268
- var videoRef = (0, import_react.useRef)(null);
6269
- var playerRef = (0, import_react.useRef)(null);
6270
- var bufferingTimeoutRef = (0, import_react.useRef)(null);
6271
- var controlsTimerRef = (0, import_react.useRef)(null);
6272
- var wrapperRef = (0, import_react.useRef)(null);
6273
- var _import_react_default_useState = _sliced_to_array(import_react.default.useState({
6661
+ var videoRef = (0, import_react2.useRef)(null);
6662
+ var playerRef = (0, import_react2.useRef)(null);
6663
+ var bufferingTimeoutRef = (0, import_react2.useRef)(null);
6664
+ var controlsTimerRef = (0, import_react2.useRef)(null);
6665
+ var wrapperRef = (0, import_react2.useRef)(null);
6666
+ var _import_react2_default_useState = _sliced_to_array(import_react2.default.useState({
6274
6667
  showAds: false,
6275
6668
  currentIndex: 0,
6276
6669
  totalAds: 0
6277
- }), 2), adStatus = _import_react_default_useState[0], setAdStatus = _import_react_default_useState[1];
6278
- var _import_react_default_useState1 = _sliced_to_array(import_react.default.useState(true), 2), shouldShowNativeControls = _import_react_default_useState1[0], setShouldShowNativeControls = _import_react_default_useState1[1];
6279
- var _import_react_default_useState2 = _sliced_to_array(import_react.default.useState(false), 2), isMuted = _import_react_default_useState2[0], setIsMuted = _import_react_default_useState2[1];
6280
- var _import_react_default_useState3 = _sliced_to_array(import_react.default.useState(false), 2), isFullscreen = _import_react_default_useState3[0], setIsFullscreen = _import_react_default_useState3[1];
6281
- var _import_react_default_useState4 = _sliced_to_array(import_react.default.useState(false), 2), isPlaying = _import_react_default_useState4[0], setIsPlaying = _import_react_default_useState4[1];
6282
- var _import_react_default_useState5 = _sliced_to_array(import_react.default.useState(0), 2), currentTime = _import_react_default_useState5[0], setCurrentTime = _import_react_default_useState5[1];
6283
- var _import_react_default_useState6 = _sliced_to_array(import_react.default.useState(0), 2), duration = _import_react_default_useState6[0], setDuration = _import_react_default_useState6[1];
6284
- var _import_react_default_useState7 = _sliced_to_array(import_react.default.useState(1), 2), volume = _import_react_default_useState7[0], setVolume = _import_react_default_useState7[1];
6285
- var _import_react_default_useState8 = _sliced_to_array(import_react.default.useState(1), 2), playbackRate = _import_react_default_useState8[0], setPlaybackRate = _import_react_default_useState8[1];
6286
- var _import_react_default_useState9 = _sliced_to_array(import_react.default.useState(false), 2), showVolumeSlider = _import_react_default_useState9[0], setShowVolumeSlider = _import_react_default_useState9[1];
6287
- var _import_react_default_useState10 = _sliced_to_array(import_react.default.useState(false), 2), showSpeedMenu = _import_react_default_useState10[0], setShowSpeedMenu = _import_react_default_useState10[1];
6288
- var _import_react_default_useState11 = _sliced_to_array(import_react.default.useState(true), 2), isLoading = _import_react_default_useState11[0], setIsLoading = _import_react_default_useState11[1];
6289
- var _import_react_default_useState12 = _sliced_to_array(import_react.default.useState(false), 2), isBuffering = _import_react_default_useState12[0], setIsBuffering = _import_react_default_useState12[1];
6290
- var _import_react_default_useState13 = _sliced_to_array(import_react.default.useState(false), 2), showCenterPlay = _import_react_default_useState13[0], setShowCenterPlay = _import_react_default_useState13[1];
6291
- var _import_react_default_useState14 = _sliced_to_array(import_react.default.useState(false), 2), showLicenseWarning = _import_react_default_useState14[0], setShowLicenseWarning = _import_react_default_useState14[1];
6292
- var _import_react_default_useState15 = _sliced_to_array(import_react.default.useState(true), 2), controlsVisible = _import_react_default_useState15[0], setControlsVisible = _import_react_default_useState15[1];
6293
- var _import_react_default_useState16 = _sliced_to_array(import_react.default.useState(typeof window !== "undefined" ? window.innerWidth : 1920), 2), viewportWidth = _import_react_default_useState16[0], setViewportWidth = _import_react_default_useState16[1];
6294
- var _import_react_default_useState17 = _sliced_to_array(import_react.default.useState(typeof window !== "undefined" ? window.innerHeight > window.innerWidth : false), 2), isPortrait = _import_react_default_useState17[0], setIsPortrait = _import_react_default_useState17[1];
6670
+ }), 2), adStatus = _import_react2_default_useState[0], setAdStatus = _import_react2_default_useState[1];
6671
+ var _import_react2_default_useState1 = _sliced_to_array(import_react2.default.useState(true), 2), shouldShowNativeControls = _import_react2_default_useState1[0], setShouldShowNativeControls = _import_react2_default_useState1[1];
6672
+ var _import_react2_default_useState2 = _sliced_to_array(import_react2.default.useState(false), 2), isMuted = _import_react2_default_useState2[0], setIsMuted = _import_react2_default_useState2[1];
6673
+ var _import_react2_default_useState3 = _sliced_to_array(import_react2.default.useState(false), 2), isFullscreen = _import_react2_default_useState3[0], setIsFullscreen = _import_react2_default_useState3[1];
6674
+ var _import_react2_default_useState4 = _sliced_to_array(import_react2.default.useState(false), 2), isPlaying = _import_react2_default_useState4[0], setIsPlaying = _import_react2_default_useState4[1];
6675
+ var _import_react2_default_useState5 = _sliced_to_array(import_react2.default.useState(0), 2), currentTime = _import_react2_default_useState5[0], setCurrentTime = _import_react2_default_useState5[1];
6676
+ var _import_react2_default_useState6 = _sliced_to_array(import_react2.default.useState(0), 2), duration = _import_react2_default_useState6[0], setDuration = _import_react2_default_useState6[1];
6677
+ var _import_react2_default_useState7 = _sliced_to_array(import_react2.default.useState(1), 2), volume = _import_react2_default_useState7[0], setVolume = _import_react2_default_useState7[1];
6678
+ var _import_react2_default_useState8 = _sliced_to_array(import_react2.default.useState(1), 2), playbackRate = _import_react2_default_useState8[0], setPlaybackRate = _import_react2_default_useState8[1];
6679
+ var _import_react2_default_useState9 = _sliced_to_array(import_react2.default.useState(false), 2), showVolumeSlider = _import_react2_default_useState9[0], setShowVolumeSlider = _import_react2_default_useState9[1];
6680
+ var _import_react2_default_useState10 = _sliced_to_array(import_react2.default.useState(false), 2), showSpeedMenu = _import_react2_default_useState10[0], setShowSpeedMenu = _import_react2_default_useState10[1];
6681
+ var _import_react2_default_useState11 = _sliced_to_array(import_react2.default.useState(true), 2), isLoading = _import_react2_default_useState11[0], setIsLoading = _import_react2_default_useState11[1];
6682
+ var _import_react2_default_useState12 = _sliced_to_array(import_react2.default.useState(false), 2), isBuffering = _import_react2_default_useState12[0], setIsBuffering = _import_react2_default_useState12[1];
6683
+ var _import_react2_default_useState13 = _sliced_to_array(import_react2.default.useState(false), 2), showCenterPlay = _import_react2_default_useState13[0], setShowCenterPlay = _import_react2_default_useState13[1];
6684
+ 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];
6685
+ 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];
6686
+ 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];
6687
+ 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];
6688
+ 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];
6689
+ 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];
6295
6690
  var getResponsiveScale = function getResponsiveScale() {
6296
6691
  if (viewportWidth < 480) return 0.7;
6297
6692
  if (viewportWidth < 768) return 0.8;
@@ -6299,7 +6694,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6299
6694
  return 1;
6300
6695
  };
6301
6696
  var responsiveScale = getResponsiveScale();
6302
- var resetControlsTimer = (0, import_react.useCallback)(function() {
6697
+ var resetControlsTimer = (0, import_react2.useCallback)(function() {
6303
6698
  if (controlsTimerRef.current) {
6304
6699
  clearTimeout(controlsTimerRef.current);
6305
6700
  }
@@ -6376,7 +6771,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6376
6771
  };
6377
6772
  var isHlsStream = (src === null || src === void 0 ? void 0 : src.toLowerCase().includes(".m3u8")) || (src === null || src === void 0 ? void 0 : src.toLowerCase().includes("/hls/"));
6378
6773
  var shouldShowEnhancedControls = showCustomControls && (isHlsStream ? allowNativeHls : true);
6379
- var criticalPropsKey = (0, import_react.useMemo)(function() {
6774
+ var criticalPropsKey = (0, import_react2.useMemo)(function() {
6380
6775
  return CRITICAL_PROPS.map(function(prop) {
6381
6776
  return "".concat(prop, ":").concat(props[prop]);
6382
6777
  }).join("|");
@@ -6387,7 +6782,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6387
6782
  lowLatencyMode,
6388
6783
  driftToleranceMs
6389
6784
  ]);
6390
- (0, import_react.useEffect)(function() {
6785
+ (0, import_react2.useEffect)(function() {
6391
6786
  if (typeof window === "undefined") return;
6392
6787
  var el = videoRef.current;
6393
6788
  if (!el || !src) return;
@@ -6442,7 +6837,50 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6442
6837
  }, [
6443
6838
  criticalPropsKey
6444
6839
  ]);
6445
- (0, import_react.useEffect)(function() {
6840
+ (0, import_react2.useEffect)(function() {
6841
+ if (!swirlProjectId) {
6842
+ setOverlays([]);
6843
+ setOverlayCoordSpace(null);
6844
+ return;
6845
+ }
6846
+ var cancelled = false;
6847
+ fetchProjectOverlays(swirlProjectId).then(function(data) {
6848
+ if (!cancelled) setOverlays(data);
6849
+ }).catch(function(err) {
6850
+ if (!cancelled) {
6851
+ console.warn("[StormcloudVideoPlayer] Failed to fetch overlays:", err);
6852
+ }
6853
+ });
6854
+ return function() {
6855
+ cancelled = true;
6856
+ };
6857
+ }, [
6858
+ swirlProjectId
6859
+ ]);
6860
+ (0, import_react2.useEffect)(function() {
6861
+ if (!swirlProjectId) return;
6862
+ var player = playerRef.current;
6863
+ if (!player) return;
6864
+ var tryResolve = function tryResolve() {
6865
+ var res = player.getMinHlsResolution();
6866
+ if (res) {
6867
+ setOverlayCoordSpace(res);
6868
+ return true;
6869
+ }
6870
+ return false;
6871
+ };
6872
+ if (tryResolve()) return;
6873
+ var interval = setInterval(function() {
6874
+ if (tryResolve()) clearInterval(interval);
6875
+ }, 300);
6876
+ return function() {
6877
+ return clearInterval(interval);
6878
+ };
6879
+ }, [
6880
+ swirlProjectId,
6881
+ criticalPropsKey
6882
+ ]);
6883
+ (0, import_react2.useEffect)(function() {
6446
6884
  if (!playerRef.current) return;
6447
6885
  try {
6448
6886
  if (autoplay !== void 0 && playerRef.current.videoElement) {
@@ -6458,7 +6896,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6458
6896
  autoplay,
6459
6897
  muted
6460
6898
  ]);
6461
- (0, import_react.useEffect)(function() {
6899
+ (0, import_react2.useEffect)(function() {
6462
6900
  if (!playerRef.current) return;
6463
6901
  var checkAdStatus = function checkAdStatus() {
6464
6902
  if (playerRef.current) {
@@ -6488,7 +6926,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6488
6926
  return clearInterval(interval);
6489
6927
  };
6490
6928
  }, []);
6491
- (0, import_react.useEffect)(function() {
6929
+ (0, import_react2.useEffect)(function() {
6492
6930
  if (typeof window === "undefined" || !playerRef.current) return;
6493
6931
  var handleResize = function handleResize() {
6494
6932
  if (playerRef.current && videoRef.current) {
@@ -6504,7 +6942,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6504
6942
  return window.removeEventListener("resize", handleResize);
6505
6943
  };
6506
6944
  }, []);
6507
- (0, import_react.useEffect)(function() {
6945
+ (0, import_react2.useEffect)(function() {
6508
6946
  if (!playerRef.current || !videoRef.current) return;
6509
6947
  var updateStates = function updateStates() {
6510
6948
  if (playerRef.current && videoRef.current) {
@@ -6531,7 +6969,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6531
6969
  document.removeEventListener("fullscreenchange", handleFullscreenChange);
6532
6970
  };
6533
6971
  }, []);
6534
- (0, import_react.useEffect)(function() {
6972
+ (0, import_react2.useEffect)(function() {
6535
6973
  if (!videoRef.current) return;
6536
6974
  var handleCanPlay = function handleCanPlay() {
6537
6975
  setIsLoading(false);
@@ -6603,19 +7041,19 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6603
7041
  }, [
6604
7042
  debugAdTiming
6605
7043
  ]);
6606
- (0, import_react.useEffect)(function() {
7044
+ (0, import_react2.useEffect)(function() {
6607
7045
  return function() {
6608
7046
  if (controlsTimerRef.current) {
6609
7047
  clearTimeout(controlsTimerRef.current);
6610
7048
  }
6611
7049
  };
6612
7050
  }, []);
6613
- var handleWrapperMouseMove = (0, import_react.useCallback)(function() {
7051
+ var handleWrapperMouseMove = (0, import_react2.useCallback)(function() {
6614
7052
  resetControlsTimer();
6615
7053
  }, [
6616
7054
  resetControlsTimer
6617
7055
  ]);
6618
- var handleWrapperMouseLeave = (0, import_react.useCallback)(function() {
7056
+ var handleWrapperMouseLeave = (0, import_react2.useCallback)(function() {
6619
7057
  if (!showVolumeSlider && !showSpeedMenu) {
6620
7058
  setControlsVisible(false);
6621
7059
  }
@@ -6625,12 +7063,12 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6625
7063
  ]);
6626
7064
  var progressPercent = duration > 0 ? currentTime / duration * 100 : 0;
6627
7065
  var VolumeIcon = isMuted || volume === 0 ? import_fa.FaVolumeMute : volume < 0.5 ? import_fa.FaVolumeDown : import_fa.FaVolumeUp;
6628
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, {
7066
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, {
6629
7067
  children: [
6630
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", {
7068
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("style", {
6631
7069
  children: "\n @keyframes sc-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes sc-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n }\n @keyframes sc-fade-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .sc-wrapper:fullscreen,\n .sc-wrapper:has(*:fullscreen) {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n .sc-ctrl-btn {\n background: none;\n border: none;\n color: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n padding: 8px;\n transition: background 0.15s ease, opacity 0.15s ease;\n opacity: 0.9;\n }\n .sc-ctrl-btn:hover {\n opacity: 1;\n background: rgba(255, 255, 255, 0.1);\n }\n .sc-ctrl-btn:active {\n opacity: 0.7;\n }\n .sc-controls-bar {\n transition: opacity 0.35s ease, transform 0.35s ease;\n }\n .sc-progress-track:hover .sc-progress-thumb {\n transform: translate(-50%, -50%) scale(1) !important;\n }\n .sc-loading-hidden .sc-loading-indicator {\n display: none !important;\n }\n "
6632
7070
  }),
6633
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7071
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6634
7072
  ref: wrapperRef,
6635
7073
  className: "sc-wrapper ".concat(wrapperClassName || ""),
6636
7074
  onMouseMove: handleWrapperMouseMove,
@@ -6654,10 +7092,12 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6654
7092
  boxShadow: isFullscreen ? "none" : void 0
6655
7093
  }, wrapperStyle),
6656
7094
  children: [
6657
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("video", _object_spread_props(_object_spread({
7095
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("video", _object_spread_props(_object_spread({
6658
7096
  ref: videoRef,
6659
7097
  className: className,
6660
7098
  style: _object_spread({
7099
+ position: "relative",
7100
+ zIndex: 1,
6661
7101
  display: "block",
6662
7102
  width: "100%",
6663
7103
  height: isFullscreen ? "100%" : "auto",
@@ -6674,7 +7114,13 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6674
7114
  }, restVideoAttrs), {
6675
7115
  children: children
6676
7116
  })),
6677
- (isLoading || isBuffering) && !hideLoadingIndicator && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaSpinner, {
7117
+ overlays.length > 0 && !adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(OverlayRenderer, {
7118
+ overlays: overlays,
7119
+ currentTime: currentTime,
7120
+ videoRef: videoRef,
7121
+ coordinateSpace: overlayCoordSpace
7122
+ }),
7123
+ (isLoading || isBuffering) && !hideLoadingIndicator && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_fa.FaSpinner, {
6678
7124
  className: "sc-loading-indicator",
6679
7125
  size: 40,
6680
7126
  color: "rgba(255, 255, 255, 0.85)",
@@ -6687,7 +7133,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6687
7133
  filter: "drop-shadow(0 2px 8px rgba(0, 0, 0, 0.6))"
6688
7134
  }
6689
7135
  }),
6690
- showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7136
+ showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6691
7137
  style: {
6692
7138
  position: "absolute",
6693
7139
  top: "50%",
@@ -6706,7 +7152,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6706
7152
  margin: "0 16px"
6707
7153
  },
6708
7154
  children: [
6709
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7155
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
6710
7156
  style: {
6711
7157
  fontSize: "18px",
6712
7158
  fontWeight: "700",
@@ -6715,7 +7161,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6715
7161
  },
6716
7162
  children: "License Key Required"
6717
7163
  }),
6718
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7164
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6719
7165
  style: {
6720
7166
  fontSize: "13px",
6721
7167
  lineHeight: "1.6",
@@ -6723,13 +7169,13 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6723
7169
  },
6724
7170
  children: [
6725
7171
  "Please provide a valid license key to use the Stormcloud Video Player.",
6726
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("br", {}),
7172
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("br", {}),
6727
7173
  "Contact your administrator for licensing information."
6728
7174
  ]
6729
7175
  })
6730
7176
  ]
6731
7177
  }),
6732
- showCenterPlay && !isLoading && !isBuffering && !showLicenseWarning && !adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7178
+ showCenterPlay && !isLoading && !isBuffering && !showLicenseWarning && !adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
6733
7179
  onClick: handleCenterPlayClick,
6734
7180
  style: {
6735
7181
  position: "absolute",
@@ -6764,7 +7210,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6764
7210
  el.style.transform = "translate(-50%, -50%) scale(1)";
6765
7211
  },
6766
7212
  title: "Play",
6767
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaPlay, {
7213
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_fa.FaPlay, {
6768
7214
  size: Math.max(22, 28 * responsiveScale),
6769
7215
  color: "white",
6770
7216
  style: {
@@ -6773,7 +7219,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6773
7219
  }
6774
7220
  })
6775
7221
  }),
6776
- adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7222
+ adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6777
7223
  style: {
6778
7224
  position: "absolute",
6779
7225
  top: "".concat(12 * responsiveScale, "px"),
@@ -6785,7 +7231,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6785
7231
  animation: "sc-fade-in 0.3s ease"
6786
7232
  },
6787
7233
  children: [
6788
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7234
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
6789
7235
  style: {
6790
7236
  background: "rgba(234, 179, 8, 0.9)",
6791
7237
  backdropFilter: "blur(12px)",
@@ -6800,7 +7246,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6800
7246
  },
6801
7247
  children: "Ad"
6802
7248
  }),
6803
- adStatus.currentIndex > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7249
+ adStatus.currentIndex > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6804
7250
  style: {
6805
7251
  background: "rgba(0, 0, 0, 0.5)",
6806
7252
  backdropFilter: "blur(12px)",
@@ -6819,7 +7265,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6819
7265
  })
6820
7266
  ]
6821
7267
  }),
6822
- shouldShowEnhancedControls && !showLicenseWarning ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7268
+ shouldShowEnhancedControls && !showLicenseWarning ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6823
7269
  className: "sc-controls-bar",
6824
7270
  style: {
6825
7271
  position: "absolute",
@@ -6834,7 +7280,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6834
7280
  pointerEvents: controlsVisible || adStatus.showAds ? "auto" : "none"
6835
7281
  },
6836
7282
  children: [
6837
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7283
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6838
7284
  className: "sc-progress-track",
6839
7285
  style: {
6840
7286
  width: "100%",
@@ -6854,7 +7300,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6854
7300
  e.currentTarget.style.height = "3px";
6855
7301
  },
6856
7302
  children: [
6857
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7303
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
6858
7304
  style: {
6859
7305
  position: "absolute",
6860
7306
  top: 0,
@@ -6866,7 +7312,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6866
7312
  transition: "width 0.15s linear"
6867
7313
  }
6868
7314
  }),
6869
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7315
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
6870
7316
  className: "sc-progress-thumb",
6871
7317
  style: {
6872
7318
  position: "absolute",
@@ -6883,7 +7329,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6883
7329
  })
6884
7330
  ]
6885
7331
  }),
6886
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7332
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6887
7333
  style: {
6888
7334
  display: "flex",
6889
7335
  alignItems: "center",
@@ -6892,14 +7338,14 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6892
7338
  gap: "".concat(8 * responsiveScale, "px")
6893
7339
  },
6894
7340
  children: [
6895
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7341
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6896
7342
  style: {
6897
7343
  display: "flex",
6898
7344
  alignItems: "center",
6899
7345
  gap: "".concat(8 * responsiveScale, "px")
6900
7346
  },
6901
7347
  children: [
6902
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
7348
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", {
6903
7349
  className: "sc-ctrl-btn",
6904
7350
  onClick: handlePlayPause,
6905
7351
  style: {
@@ -6909,16 +7355,16 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6909
7355
  minHeight: "".concat(36 * responsiveScale, "px")
6910
7356
  },
6911
7357
  title: isPlaying ? "Pause" : "Play",
6912
- children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaPause, {
7358
+ children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_fa.FaPause, {
6913
7359
  size: Math.max(14, 18 * responsiveScale)
6914
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaPlay, {
7360
+ }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_fa.FaPlay, {
6915
7361
  size: Math.max(14, 18 * responsiveScale),
6916
7362
  style: {
6917
7363
  marginLeft: "2px"
6918
7364
  }
6919
7365
  })
6920
7366
  }),
6921
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7367
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6922
7368
  style: {
6923
7369
  display: "flex",
6924
7370
  alignItems: "center"
@@ -6930,7 +7376,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6930
7376
  return setShowVolumeSlider(false);
6931
7377
  },
6932
7378
  children: [
6933
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
7379
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", {
6934
7380
  className: "sc-ctrl-btn",
6935
7381
  onClick: function onClick() {
6936
7382
  if (playerRef.current) {
@@ -6946,11 +7392,11 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6946
7392
  minHeight: "".concat(36 * responsiveScale, "px")
6947
7393
  },
6948
7394
  title: isMuted ? "Unmute" : "Mute",
6949
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(VolumeIcon, {
7395
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(VolumeIcon, {
6950
7396
  size: Math.max(14, 18 * responsiveScale)
6951
7397
  })
6952
7398
  }),
6953
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7399
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
6954
7400
  style: {
6955
7401
  width: showVolumeSlider ? "".concat(62 * responsiveScale, "px") : "0px",
6956
7402
  overflow: "hidden",
@@ -6960,7 +7406,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6960
7406
  paddingLeft: showVolumeSlider ? "2px" : "0",
6961
7407
  paddingRight: showVolumeSlider ? "4px" : "0"
6962
7408
  },
6963
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7409
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
6964
7410
  style: {
6965
7411
  position: "relative",
6966
7412
  width: "".concat(56 * responsiveScale, "px"),
@@ -6990,7 +7436,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6990
7436
  handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));
6991
7437
  },
6992
7438
  children: [
6993
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7439
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
6994
7440
  style: {
6995
7441
  position: "absolute",
6996
7442
  inset: 0,
@@ -6998,7 +7444,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
6998
7444
  borderRadius: "1.5px"
6999
7445
  }
7000
7446
  }),
7001
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7447
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
7002
7448
  style: {
7003
7449
  position: "absolute",
7004
7450
  top: 0,
@@ -7010,7 +7456,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7010
7456
  transition: "width 0.1s ease-out"
7011
7457
  }
7012
7458
  }),
7013
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7459
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
7014
7460
  style: {
7015
7461
  position: "absolute",
7016
7462
  top: "50%",
@@ -7029,7 +7475,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7029
7475
  })
7030
7476
  ]
7031
7477
  }),
7032
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7478
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
7033
7479
  style: {
7034
7480
  fontSize: "".concat(13 * responsiveScale, "px"),
7035
7481
  fontFamily: "Roboto, 'Segoe UI', Arial, sans-serif",
@@ -7042,7 +7488,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7042
7488
  children: [
7043
7489
  formatTime(currentTime),
7044
7490
  " ",
7045
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
7491
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", {
7046
7492
  style: {
7047
7493
  color: "rgba(255,255,255,0.5)"
7048
7494
  },
@@ -7054,20 +7500,20 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7054
7500
  })
7055
7501
  ]
7056
7502
  }),
7057
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7503
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
7058
7504
  style: {
7059
7505
  display: "flex",
7060
7506
  alignItems: "center",
7061
7507
  gap: "".concat(8 * responsiveScale, "px")
7062
7508
  },
7063
7509
  children: [
7064
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7510
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
7065
7511
  style: {
7066
7512
  position: "relative",
7067
7513
  display: viewportWidth < 600 ? "none" : "block"
7068
7514
  },
7069
7515
  children: [
7070
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
7516
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", {
7071
7517
  className: "sc-ctrl-btn",
7072
7518
  onClick: function onClick() {
7073
7519
  setShowSpeedMenu(!showSpeedMenu);
@@ -7087,7 +7533,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7087
7533
  "x"
7088
7534
  ]
7089
7535
  }),
7090
- showSpeedMenu && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7536
+ showSpeedMenu && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
7091
7537
  style: {
7092
7538
  position: "absolute",
7093
7539
  bottom: "100%",
@@ -7113,7 +7559,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7113
7559
  1.75,
7114
7560
  2
7115
7561
  ].map(function(speed) {
7116
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
7562
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", {
7117
7563
  onClick: function onClick() {
7118
7564
  return handlePlaybackRateChange(speed);
7119
7565
  },
@@ -7152,7 +7598,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7152
7598
  })
7153
7599
  ]
7154
7600
  }),
7155
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
7601
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", {
7156
7602
  className: "sc-ctrl-btn",
7157
7603
  onClick: function onClick() {
7158
7604
  if (onFullscreenToggle) {
@@ -7173,9 +7619,9 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7173
7619
  minHeight: "".concat(36 * responsiveScale, "px")
7174
7620
  },
7175
7621
  title: isFullscreen ? "Exit Fullscreen" : "Enter Fullscreen",
7176
- children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaCompress, {
7622
+ children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_fa.FaCompress, {
7177
7623
  size: Math.max(14, 18 * responsiveScale)
7178
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaExpand, {
7624
+ }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_fa.FaExpand, {
7179
7625
  size: Math.max(14, 18 * responsiveScale)
7180
7626
  })
7181
7627
  })
@@ -7184,7 +7630,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7184
7630
  ]
7185
7631
  })
7186
7632
  ]
7187
- }) : showCustomControls && !showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7633
+ }) : showCustomControls && !showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
7188
7634
  className: "sc-controls-bar",
7189
7635
  style: {
7190
7636
  position: "absolute",
@@ -7199,7 +7645,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7199
7645
  pointerEvents: controlsVisible ? "auto" : "none"
7200
7646
  },
7201
7647
  children: [
7202
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7648
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
7203
7649
  style: {
7204
7650
  display: "flex",
7205
7651
  alignItems: "center",
@@ -7214,7 +7660,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7214
7660
  return setShowVolumeSlider(false);
7215
7661
  },
7216
7662
  children: [
7217
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
7663
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", {
7218
7664
  className: "sc-ctrl-btn",
7219
7665
  onClick: function onClick() {
7220
7666
  if (playerRef.current) playerRef.current.toggleMute();
@@ -7228,11 +7674,11 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7228
7674
  minHeight: "".concat(36 * responsiveScale, "px")
7229
7675
  },
7230
7676
  title: isMuted ? "Unmute" : "Mute",
7231
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(VolumeIcon, {
7677
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(VolumeIcon, {
7232
7678
  size: Math.max(14, 18 * responsiveScale)
7233
7679
  })
7234
7680
  }),
7235
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7681
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
7236
7682
  style: {
7237
7683
  width: showVolumeSlider ? "".concat(62 * responsiveScale, "px") : "0px",
7238
7684
  overflow: "hidden",
@@ -7242,7 +7688,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7242
7688
  paddingLeft: showVolumeSlider ? "2px" : "0",
7243
7689
  paddingRight: showVolumeSlider ? "6px" : "0"
7244
7690
  },
7245
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
7691
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", {
7246
7692
  style: {
7247
7693
  position: "relative",
7248
7694
  width: "".concat(56 * responsiveScale, "px"),
@@ -7272,7 +7718,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7272
7718
  handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));
7273
7719
  },
7274
7720
  children: [
7275
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7721
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
7276
7722
  style: {
7277
7723
  position: "absolute",
7278
7724
  inset: 0,
@@ -7280,7 +7726,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7280
7726
  borderRadius: "1.5px"
7281
7727
  }
7282
7728
  }),
7283
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7729
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
7284
7730
  style: {
7285
7731
  position: "absolute",
7286
7732
  top: 0,
@@ -7292,7 +7738,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7292
7738
  transition: "width 0.1s ease-out"
7293
7739
  }
7294
7740
  }),
7295
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7741
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
7296
7742
  style: {
7297
7743
  position: "absolute",
7298
7744
  top: "50%",
@@ -7311,7 +7757,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7311
7757
  })
7312
7758
  ]
7313
7759
  }),
7314
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
7760
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", {
7315
7761
  className: "sc-ctrl-btn",
7316
7762
  onClick: function onClick() {
7317
7763
  if (onFullscreenToggle) {
@@ -7333,15 +7779,15 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7333
7779
  background: "rgba(0, 0, 0, 0.6)"
7334
7780
  },
7335
7781
  title: isFullscreen ? "Exit Fullscreen" : "Enter Fullscreen",
7336
- children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaCompress, {
7782
+ children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_fa.FaCompress, {
7337
7783
  size: Math.max(14, 18 * responsiveScale)
7338
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaExpand, {
7784
+ }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_fa.FaExpand, {
7339
7785
  size: Math.max(14, 18 * responsiveScale)
7340
7786
  })
7341
7787
  })
7342
7788
  ]
7343
7789
  }),
7344
- onControlClick && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
7790
+ onControlClick && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {
7345
7791
  onClick: onControlClick,
7346
7792
  style: {
7347
7793
  position: "absolute",
@@ -7392,7 +7838,8 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7392
7838
  "playsInline",
7393
7839
  "preload",
7394
7840
  "poster",
7395
- "children"
7841
+ "children",
7842
+ "swirlProjectId"
7396
7843
  ];
7397
7844
  var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
7398
7845
  try {
@@ -7447,7 +7894,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7447
7894
  return true;
7448
7895
  });
7449
7896
  // src/StormcloudPlayer.tsx
7450
- var import_react6 = __toESM(require("react"), 1);
7897
+ var import_react7 = __toESM(require("react"), 1);
7451
7898
  // src/props.ts
7452
7899
  var noop = function noop() {};
7453
7900
  var defaultProps = {
@@ -7495,8 +7942,8 @@ var defaultProps = {
7495
7942
  onControlClick: noop
7496
7943
  };
7497
7944
  // src/utils.ts
7498
- var import_react2 = require("react");
7499
- var lazy = import_react2.lazy;
7945
+ var import_react3 = require("react");
7946
+ var lazy = import_react3.lazy;
7500
7947
  var omit = function omit(object, keys) {
7501
7948
  var result = _object_spread({}, object);
7502
7949
  keys.forEach(function(key) {
@@ -7612,9 +8059,9 @@ var canPlay = {
7612
8059
  }
7613
8060
  };
7614
8061
  // src/players/HlsPlayer.tsx
7615
- var import_react3 = require("react");
7616
- var HlsPlayer = /*#__PURE__*/ function(_import_react3_Component) {
7617
- _inherits(HlsPlayer, _import_react3_Component);
8062
+ var import_react4 = require("react");
8063
+ var HlsPlayer = /*#__PURE__*/ function(_import_react4_Component) {
8064
+ _inherits(HlsPlayer, _import_react4_Component);
7618
8065
  function HlsPlayer() {
7619
8066
  _class_call_check(this, HlsPlayer);
7620
8067
  var _this;
@@ -7815,13 +8262,13 @@ var HlsPlayer = /*#__PURE__*/ function(_import_react3_Component) {
7815
8262
  }
7816
8263
  ]);
7817
8264
  return HlsPlayer;
7818
- }(import_react3.Component);
8265
+ }(import_react4.Component);
7819
8266
  HlsPlayer.displayName = "HlsPlayer";
7820
8267
  HlsPlayer.canPlay = canPlay.hls;
7821
8268
  // src/players/FilePlayer.tsx
7822
- var import_react4 = require("react");
7823
- var FilePlayer = /*#__PURE__*/ function(_import_react4_Component) {
7824
- _inherits(FilePlayer, _import_react4_Component);
8269
+ var import_react5 = require("react");
8270
+ var FilePlayer = /*#__PURE__*/ function(_import_react5_Component) {
8271
+ _inherits(FilePlayer, _import_react5_Component);
7825
8272
  function FilePlayer() {
7826
8273
  _class_call_check(this, FilePlayer);
7827
8274
  var _this;
@@ -8095,7 +8542,7 @@ var FilePlayer = /*#__PURE__*/ function(_import_react4_Component) {
8095
8542
  }
8096
8543
  ]);
8097
8544
  return FilePlayer;
8098
- }(import_react4.Component);
8545
+ }(import_react5.Component);
8099
8546
  FilePlayer.displayName = "FilePlayer";
8100
8547
  FilePlayer.canPlay = canPlay.file;
8101
8548
  // src/players/index.ts
@@ -8126,10 +8573,10 @@ var players = [
8126
8573
  ];
8127
8574
  var players_default = players;
8128
8575
  // src/Player.tsx
8129
- var import_react5 = __toESM(require("react"), 1);
8576
+ var import_react6 = __toESM(require("react"), 1);
8130
8577
  var SEEK_ON_PLAY_EXPIRY = 5e3;
8131
- var Player = /*#__PURE__*/ function(_import_react5_Component) {
8132
- _inherits(Player, _import_react5_Component);
8578
+ var Player = /*#__PURE__*/ function(_import_react6_Component) {
8579
+ _inherits(Player, _import_react6_Component);
8133
8580
  function Player() {
8134
8581
  _class_call_check(this, Player);
8135
8582
  var _this;
@@ -8374,7 +8821,7 @@ var Player = /*#__PURE__*/ function(_import_react5_Component) {
8374
8821
  if (!Player2) {
8375
8822
  return null;
8376
8823
  }
8377
- return import_react5.default.createElement(Player2, _object_spread_props(_object_spread({}, this.props), {
8824
+ return import_react6.default.createElement(Player2, _object_spread_props(_object_spread({}, this.props), {
8378
8825
  onMount: this.handlePlayerMount,
8379
8826
  onReady: this.handleReady,
8380
8827
  onPlay: this.handlePlay,
@@ -8387,13 +8834,13 @@ var Player = /*#__PURE__*/ function(_import_react5_Component) {
8387
8834
  }
8388
8835
  ]);
8389
8836
  return Player;
8390
- }(import_react5.Component);
8837
+ }(import_react6.Component);
8391
8838
  Player.displayName = "Player";
8392
8839
  Player.defaultProps = defaultProps;
8393
8840
  // src/StormcloudPlayer.tsx
8394
8841
  var IS_BROWSER2 = typeof window !== "undefined" && window.document;
8395
8842
  var IS_GLOBAL2 = typeof globalThis !== "undefined" && globalThis.window && globalThis.window.document;
8396
- var UniversalSuspense = IS_BROWSER2 || IS_GLOBAL2 ? import_react6.Suspense : function() {
8843
+ var UniversalSuspense = IS_BROWSER2 || IS_GLOBAL2 ? import_react7.Suspense : function() {
8397
8844
  return null;
8398
8845
  };
8399
8846
  var SUPPORTED_PROPS = [
@@ -8442,8 +8889,8 @@ var SUPPORTED_PROPS = [
8442
8889
  var customPlayers = [];
8443
8890
  var createStormcloudPlayer = function createStormcloudPlayer(playerList, fallback) {
8444
8891
  var _a;
8445
- return _a = /*#__PURE__*/ function(_import_react6_Component) {
8446
- _inherits(_a, _import_react6_Component);
8892
+ return _a = /*#__PURE__*/ function(_import_react7_Component) {
8893
+ _inherits(_a, _import_react7_Component);
8447
8894
  function _a() {
8448
8895
  _class_call_check(this, _a);
8449
8896
  var _this;
@@ -8520,7 +8967,7 @@ var createStormcloudPlayer = function createStormcloudPlayer(playerList, fallbac
8520
8967
  if (!src) return null;
8521
8968
  var activePlayer = _this.getActivePlayer(src);
8522
8969
  if (!activePlayer) return null;
8523
- return import_react6.default.createElement(Player, _object_spread_props(_object_spread({}, _this.props), {
8970
+ return import_react7.default.createElement(Player, _object_spread_props(_object_spread({}, _this.props), {
8524
8971
  key: activePlayer.key,
8525
8972
  ref: _this.references.player,
8526
8973
  activePlayer: activePlayer.lazyPlayer || activePlayer,
@@ -8536,20 +8983,20 @@ var createStormcloudPlayer = function createStormcloudPlayer(playerList, fallbac
8536
8983
  var _this_props = this.props, src = _this_props.src, style = _this_props.style, width = _this_props.width, height = _this_props.height, fallbackElement = _this_props.fallback, Wrapper = _this_props.wrapper;
8537
8984
  var attributes = this.getAttributes(src);
8538
8985
  var wrapperRef = typeof Wrapper === "string" ? this.references.wrapper : void 0;
8539
- return import_react6.default.createElement(Wrapper, _object_spread({
8986
+ return import_react7.default.createElement(Wrapper, _object_spread({
8540
8987
  ref: wrapperRef,
8541
8988
  style: _object_spread_props(_object_spread({}, style), {
8542
8989
  width: width,
8543
8990
  height: height
8544
8991
  })
8545
- }, attributes), import_react6.default.createElement(UniversalSuspense, {
8992
+ }, attributes), import_react7.default.createElement(UniversalSuspense, {
8546
8993
  fallback: fallbackElement
8547
8994
  }, this.renderActivePlayer(src)));
8548
8995
  }
8549
8996
  }
8550
8997
  ]);
8551
8998
  return _a;
8552
- }(import_react6.Component), _a.displayName = "StormcloudPlayer", _a.defaultProps = _object_spread_props(_object_spread({}, defaultProps), {
8999
+ }(import_react7.Component), _a.displayName = "StormcloudPlayer", _a.defaultProps = _object_spread_props(_object_spread({}, defaultProps), {
8553
9000
  fallback: null,
8554
9001
  wrapper: "div"
8555
9002
  }), _a.addCustomPlayer = function(player) {
@@ -8624,11 +9071,13 @@ var StormcloudPlayer_default = StormcloudPlayer;
8624
9071
  createVastAdLayer: createVastAdLayer,
8625
9072
  createVastManager: createVastManager,
8626
9073
  detectBrowser: detectBrowser,
9074
+ fetchProjectOverlays: fetchProjectOverlays,
8627
9075
  getBrowserConfigOverrides: getBrowserConfigOverrides,
8628
9076
  getBrowserID: getBrowserID,
8629
9077
  getClientInfo: getClientInfo,
8630
9078
  initializePolyfills: initializePolyfills,
8631
9079
  isMediaStream: isMediaStream,
9080
+ isOverlayActive: isOverlayActive,
8632
9081
  lazy: lazy,
8633
9082
  logBrowserInfo: logBrowserInfo,
8634
9083
  merge: merge,
@@ -8636,10 +9085,12 @@ var StormcloudPlayer_default = StormcloudPlayer;
8636
9085
  parseQuery: parseQuery,
8637
9086
  players: players,
8638
9087
  randomString: randomString,
9088
+ resolveImageUrl: resolveImageUrl,
8639
9089
  sendHeartbeat: sendHeartbeat,
8640
9090
  sendInitialTracking: sendInitialTracking,
8641
9091
  supportsFeature: supportsFeature,
8642
9092
  supportsModernJS: supportsModernJS,
8643
- supportsWebKitPresentationMode: supportsWebKitPresentationMode
9093
+ supportsWebKitPresentationMode: supportsWebKitPresentationMode,
9094
+ timeStringToSeconds: timeStringToSeconds
8644
9095
  });
8645
9096
  //# sourceMappingURL=index.cjs.map