@arcware-cloud/pixelstreaming-websdk 1.3.11 → 1.3.13

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/index.cjs.js CHANGED
@@ -23357,6 +23357,7 @@ const zod_1 = __webpack_require__(8754);
23357
23357
  const lib_pixelstreamingfrontend_ue5_5_1 = __webpack_require__(693);
23358
23358
  const Session_1 = __webpack_require__(2469);
23359
23359
  const ArcwareSettingsSchema_1 = __webpack_require__(5602);
23360
+ const whiteLabelling_1 = __webpack_require__(3545);
23360
23361
  /** Default arcware signalling endpoint. */
23361
23362
  exports.DefaultUrl = `wss://signalling-client.ragnarok.arcware.cloud`;
23362
23363
  // The below Logger overrides can likely be removed as PSInfra 5.5 logger supports setting log verbosity
@@ -23399,7 +23400,7 @@ class ArcwareConfig extends lib_pixelstreamingfrontend_ue5_5_1.Config {
23399
23400
  };
23400
23401
  }
23401
23402
  constructor(config) {
23402
- var _a, _b;
23403
+ var _a, _b, _c;
23403
23404
  const dfToken = new URL(window.location.href).search
23404
23405
  .slice(1)
23405
23406
  .split("&")
@@ -23420,7 +23421,7 @@ class ArcwareConfig extends lib_pixelstreamingfrontend_ue5_5_1.Config {
23420
23421
  if (!config.initialSettings.ss)
23421
23422
  config.initialSettings.ss = exports.DefaultUrl;
23422
23423
  super(config);
23423
- this.VERSION = "1.3.11";
23424
+ this.VERSION = "1.3.13";
23424
23425
  this.settings = settings;
23425
23426
  this.session = new Session_1.Session();
23426
23427
  this._initialSettings = config.initialSettings;
@@ -23429,6 +23430,16 @@ class ArcwareConfig extends lib_pixelstreamingfrontend_ue5_5_1.Config {
23429
23430
  // IMPORTANT NOTE: The feature BrowserSendOffer is no longer supported in PSInfra 5.5.
23430
23431
  // The offer is now expected to come from UE. Ensure that your signalling server supports this behaviour.
23431
23432
  //this.setFlagEnabled(Flags.BrowserSendOffer, true);
23433
+ if (this.useUrlParams) {
23434
+ // Get the query string from URL
23435
+ const qs = new URLSearchParams(window.location.search);
23436
+ // Retrieve image loading from there
23437
+ const wlParsed = this.useUrlParams ? (0, whiteLabelling_1.readWhiteLabelFromQuery)(qs) : undefined; // respect useUrlParams
23438
+ if (wlParsed) {
23439
+ this.settings.whiteLabelling = Object.assign(Object.assign({}, ((_c = this.settings.whiteLabelling) !== null && _c !== void 0 ? _c : {})), wlParsed);
23440
+ }
23441
+ this.settings.infoButton = qs.has("i") || qs.has("info");
23442
+ }
23432
23443
  }
23433
23444
  /** Setup connection string. */
23434
23445
  get urlFlags() {
@@ -23536,7 +23547,14 @@ function ArcwareInit({ shareId, projectId }, configuration, forceRefresh = false
23536
23547
  useUrlParams: (configuration === null || configuration === void 0 ? void 0 : configuration.useUrlParams) === true,
23537
23548
  initialSettings: Object.assign({ ss: ArcwareConfig_1.DefaultUrl, AutoConnect: false, StartVideoMuted: true, AutoPlayVideo: true, KeyboardInput: true, MouseInput: true, GamepadInput: true, TouchInput: true, XRControllerInput: true, UseMic: true, SuppressBrowserKeys: true, FakeMouseWithTouches: false, ForceMonoAudio: false, HoveringMouse: true }, configuration === null || configuration === void 0 ? void 0 : configuration.initialSettings),
23538
23549
  settings: Object.assign({ shareId,
23539
- projectId, fullscreenButton: true, audioButton: true, stopButton: false, infoButton: false, micButton: false, settingsButton: false, connectionStrengthIcon: false, connectionIdentifierLoggingDisabled: undefined, errorHandler: undefined, loveLetterHandler: undefined, loveLetterLogging: undefined, queueHandler: undefined, sessionIdHandler: undefined, startHeight: undefined, startWidth: undefined, orientationZoom: undefined }, configuration === null || configuration === void 0 ? void 0 : configuration.settings)
23550
+ projectId, fullscreenButton: true, audioButton: true, stopButton: false, infoButton: false, micButton: false, settingsButton: false, connectionStrengthIcon: false, connectionIdentifierLoggingDisabled: undefined, errorHandler: undefined, loveLetterHandler: undefined, loveLetterLogging: undefined, queueHandler: undefined, sessionIdHandler: undefined, startHeight: undefined, startWidth: undefined, orientationZoom: undefined, whiteLabelling: {
23551
+ splashScreenUrl: undefined,
23552
+ loadingIconFadeMs: undefined,
23553
+ loadingIconUrl: undefined,
23554
+ splashScreenMode: undefined,
23555
+ splashScreenPosition: undefined,
23556
+ splashScreenBgColor: undefined
23557
+ } }, configuration === null || configuration === void 0 ? void 0 : configuration.settings)
23540
23558
  });
23541
23559
  const PixelStreaming = new ArcwarePixelStreaming_1.ArcwarePixelStreaming(Config);
23542
23560
  const Application = new ArcwareApplication_1.ArcwareApplication({ stream: PixelStreaming });
@@ -23885,6 +23903,7 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
23885
23903
  });
23886
23904
  }
23887
23905
  }
23906
+ this.applyBrandingFromSettings();
23888
23907
  this.handleMouseLock();
23889
23908
  this.injectCustomUI();
23890
23909
  }
@@ -24129,23 +24148,15 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
24129
24148
  limitedHeight = maxHeight;
24130
24149
  limitedWidth = maxHeight * aspectRatio;
24131
24150
  }
24132
- // width: clientWidth * Math.max(window.devicePixelRatio, 1) - for retina device, 1 is min upscale factor
24133
- const newRes = (0, common_1.capScale)({
24134
- width: browserWidth * Math.max(window.devicePixelRatio, 1.25),
24135
- height: browserHeight * Math.max(window.devicePixelRatio, 1.25),
24136
- }, {
24137
- width: maxWidth,
24138
- height: maxHeight,
24139
- });
24140
24151
  // Zoom level for orientation change if provided
24141
24152
  if (orientationZoom) {
24142
- if (newRes.width < newRes.height) {
24143
- if (orientationZoom.hasOwnProperty('portrait'))
24153
+ if (browserWidth < browserHeight) {
24154
+ if (orientationZoom.hasOwnProperty("portrait"))
24144
24155
  (_a = this === null || this === void 0 ? void 0 : this.webRtcController) === null || _a === void 0 ? void 0 : _a.emitUIInteraction({
24145
24156
  zoom: orientationZoom.portrait
24146
24157
  });
24147
24158
  }
24148
- else if (orientationZoom.hasOwnProperty('landscape')) {
24159
+ else if (orientationZoom.hasOwnProperty("landscape")) {
24149
24160
  (_b = this === null || this === void 0 ? void 0 : this.webRtcController) === null || _b === void 0 ? void 0 : _b.emitUIInteraction({
24150
24161
  zoom: orientationZoom.landscape
24151
24162
  });
@@ -24215,26 +24226,27 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
24215
24226
  initLoveLettersContainer() {
24216
24227
  var _a;
24217
24228
  const logoLoader = new ArcwareLogoLoader_1.ArcwareLogoLoader();
24229
+ this.logoLoader = logoLoader;
24218
24230
  if (!this.loveLettersContainer) {
24219
- const loveLettersContainer = document === null || document === void 0 ? void 0 : document.createElement("div");
24220
- const { videoPlayer } = this === null || this === void 0 ? void 0 : this.webRtcController;
24231
+ const loveLettersContainer = document.createElement("div");
24232
+ this.loveLettersContainer = loveLettersContainer; // keep the ref
24233
+ const { videoPlayer } = this.webRtcController;
24221
24234
  const videoElementParent = videoPlayer.getVideoParentElement();
24222
- (_a = loveLettersContainer === null || loveLettersContainer === void 0 ? void 0 : loveLettersContainer.classList) === null || _a === void 0 ? void 0 : _a.add("love-letters-box-root");
24223
- videoElementParent === null || videoElementParent === void 0 ? void 0 : videoElementParent.appendChild(loveLettersContainer);
24224
- const lettersBlock = document === null || document === void 0 ? void 0 : document.createElement("div");
24235
+ loveLettersContainer.classList.add("love-letters-box-root");
24236
+ videoElementParent.appendChild(loveLettersContainer);
24237
+ const lettersBlock = document.createElement("div");
24225
24238
  lettersBlock.id = "letters-block";
24226
- const lettersWrapper = document === null || document === void 0 ? void 0 : document.createElement("div");
24239
+ const lettersWrapper = document.createElement("div");
24227
24240
  lettersWrapper.id = "letters-wrapper";
24228
- if (loveLettersContainer) {
24229
- lettersBlock === null || lettersBlock === void 0 ? void 0 : lettersBlock.appendChild(logoLoader === null || logoLoader === void 0 ? void 0 : logoLoader.arcwareLogoLoader);
24230
- loveLettersContainer === null || loveLettersContainer === void 0 ? void 0 : loveLettersContainer.appendChild(lettersBlock);
24231
- lettersBlock === null || lettersBlock === void 0 ? void 0 : lettersBlock.appendChild(lettersWrapper);
24232
- }
24233
- lettersBlock.innerHTML = "";
24234
- if (lettersBlock) {
24235
- lettersBlock === null || lettersBlock === void 0 ? void 0 : lettersBlock.appendChild(logoLoader === null || logoLoader === void 0 ? void 0 : logoLoader.arcwareLogoLoader);
24236
- lettersBlock === null || lettersBlock === void 0 ? void 0 : lettersBlock.appendChild(lettersWrapper);
24237
- }
24241
+ // append your existing loader root (with SVG) into the lettersBlock
24242
+ const loaderRoot = logoLoader.arcwareLogoLoader; // your existing getter
24243
+ lettersBlock.appendChild(loaderRoot);
24244
+ // ensure the loader knows its host
24245
+ (_a = logoLoader.setHostElement) === null || _a === void 0 ? void 0 : _a.call(logoLoader, loaderRoot);
24246
+ loveLettersContainer.appendChild(lettersBlock);
24247
+ lettersBlock.appendChild(lettersWrapper);
24248
+ // apply current (local) settings immediately
24249
+ this.applyBrandingFromSettings();
24238
24250
  }
24239
24251
  }
24240
24252
  pushLetter(letter) {
@@ -24340,8 +24352,7 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
24340
24352
  }
24341
24353
  }
24342
24354
  injectCustomUI() {
24343
- (0, common_1.waitForElement)('#stream-ui')
24344
- .then(el => {
24355
+ (0, common_1.waitForElement)("#stream-ui").then((el) => {
24345
24356
  var _a;
24346
24357
  const videoElementParent = (_a = this === null || this === void 0 ? void 0 : this.videoElementParent) === null || _a === void 0 ? void 0 : _a.parentElement;
24347
24358
  if (videoElementParent) {
@@ -24349,6 +24360,61 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
24349
24360
  }
24350
24361
  });
24351
24362
  }
24363
+ applyBrandingFromSettings() {
24364
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
24365
+ const cfg = ((_b = (_a = this === null || this === void 0 ? void 0 : this.config) === null || _a === void 0 ? void 0 : _a.settings.whiteLabelling) !== null && _b !== void 0 ? _b : {});
24366
+ // Loader image + fade
24367
+ try {
24368
+ if (this.logoLoader) {
24369
+ (_d = (_c = this.logoLoader).setImage) === null || _d === void 0 ? void 0 : _d.call(_c, cfg.loadingIconUrl);
24370
+ (_f = (_e = this.logoLoader).setFade) === null || _f === void 0 ? void 0 : _f.call(_e, cfg.loadingIconFadeMs);
24371
+ }
24372
+ }
24373
+ catch (_p) { }
24374
+ // Splash on loveLettersContainer (preferred), fallback to player parent
24375
+ try {
24376
+ const el = (_m = (_g = this.loveLettersContainer) !== null && _g !== void 0 ? _g : (_l = (_k = (_j = (_h = this.webRtcController) === null || _h === void 0 ? void 0 : _h.videoPlayer) === null || _j === void 0 ? void 0 : _j.getVideoParentElement) === null || _k === void 0 ? void 0 : _k.call(_j)) === null || _l === void 0 ? void 0 : _l.parentElement) !== null && _m !== void 0 ? _m : null;
24377
+ if (!el)
24378
+ return;
24379
+ // Clear previous inline choices
24380
+ const s = el.style;
24381
+ s.removeProperty("background-image");
24382
+ s.removeProperty("background-size");
24383
+ s.removeProperty("background-repeat");
24384
+ s.removeProperty("background-position");
24385
+ s.removeProperty("background-color");
24386
+ el.classList.remove("aw-splash");
24387
+ if (cfg.splashScreenUrl) {
24388
+ el.classList.add("aw-splash"); // keeps your global defaults
24389
+ // Compute mode (default to 'contain' if not provided)
24390
+ const mode = ((_o = cfg.splashScreenMode) !== null && _o !== void 0 ? _o : "contain");
24391
+ // Apply sizing/repeat per mode
24392
+ switch (mode) {
24393
+ case "contain":
24394
+ s.backgroundSize = "contain";
24395
+ s.backgroundRepeat = "no-repeat";
24396
+ break;
24397
+ case "cover":
24398
+ s.backgroundSize = "cover";
24399
+ s.backgroundRepeat = "no-repeat";
24400
+ break;
24401
+ case "stretch":
24402
+ s.backgroundSize = "100% 100%";
24403
+ s.backgroundRepeat = "no-repeat";
24404
+ break;
24405
+ case "repeat":
24406
+ s.backgroundSize = "auto"; // keep intrinsic px
24407
+ s.backgroundRepeat = "repeat";
24408
+ break;
24409
+ }
24410
+ // Position & color (optional)
24411
+ s.backgroundPosition = cfg.splashScreenPosition || "center center";
24412
+ s.backgroundColor = cfg.splashScreenBgColor || "var(--color0)";
24413
+ s.backgroundImage = `url("${cfg.splashScreenUrl}")`;
24414
+ }
24415
+ }
24416
+ catch (_q) { }
24417
+ }
24352
24418
  }
24353
24419
  exports.ArcwarePixelStreaming = ArcwarePixelStreaming;
24354
24420
 
@@ -24413,10 +24479,15 @@ exports.ArcwareSettingsSchema = zod_1.z.object({
24413
24479
  /** Height with which instance should be started */
24414
24480
  startHeight: zod_1.z.number().optional(),
24415
24481
  /** Zoom functionality */
24416
- orientationZoom: zod_1.z.object({
24482
+ orientationZoom: zod_1.z
24483
+ .object({
24417
24484
  landscape: zod_1.z.number(),
24418
- portrait: zod_1.z.number(),
24419
- }).strict().optional()
24485
+ portrait: zod_1.z.number()
24486
+ })
24487
+ .strict()
24488
+ .optional(),
24489
+ /** Loader customization */
24490
+ whiteLabelling: shared_pixelstreaming_websdk_1.ZWhiteLabel.optional()
24420
24491
  });
24421
24492
 
24422
24493
 
@@ -25214,7 +25285,7 @@ exports.DiagnosticsCollector = DiagnosticsCollector;
25214
25285
 
25215
25286
 
25216
25287
  Object.defineProperty(exports, "__esModule", ({ value: true }));
25217
- exports.capScale = exports.waitForElement = exports.normalizeType = exports.randomHash = exports.extFromMime = exports.sanitizeFilename = exports.truncateByBytes = exports.parseUnknownToObject = void 0;
25288
+ exports.waitForElement = exports.normalizeType = exports.randomHash = exports.extFromMime = exports.sanitizeFilename = exports.truncateByBytes = exports.parseUnknownToObject = void 0;
25218
25289
  /** Conservative normalizer: accepts object, strict JSON string, or JSON-ish like {foo: "bar"} */
25219
25290
  function parseUnknownToObject(input, opts = { allowJsonish: true }) {
25220
25291
  if (input && typeof input === "object")
@@ -25333,27 +25404,47 @@ function waitForElement(selector, { root = document, timeout = 3000 } = {}) {
25333
25404
  });
25334
25405
  }
25335
25406
  exports.waitForElement = waitForElement;
25336
- function capScale(size, max) {
25337
- const result = { width: 0, height: 0 };
25338
- /* result.width = size.width > max.width ? max.width : size.width;
25339
- result.height = size.height > max.height ? max.height : size.height; */
25340
- result.width = Math.floor(size.width);
25341
- result.height = Math.floor(size.height);
25342
- if (result.height > max.height) {
25343
- const heightScale = max.height / result.height;
25344
- result.height = max.height;
25345
- result.width *= heightScale;
25346
- }
25347
- if (result.width > max.width) {
25348
- const heightScale = max.width / result.width;
25349
- result.width = max.width;
25350
- result.height *= heightScale;
25351
- }
25352
- result.width = (result.width % 2) + result.width;
25353
- result.height = (result.height % 2) + result.height;
25354
- return result;
25407
+
25408
+
25409
+ /***/ }),
25410
+
25411
+ /***/ 3545:
25412
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
25413
+
25414
+
25415
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
25416
+ exports.readWhiteLabelFromQuery = void 0;
25417
+ const shared_pixelstreaming_websdk_1 = __webpack_require__(7910);
25418
+ function decodeBase64OrBase64Url(raw) {
25419
+ const normalized = raw.replace(/-/g, "+").replace(/_/g, "/");
25420
+ const padded = normalized + "===".slice((normalized.length + 3) % 4);
25421
+ if (typeof atob === "function")
25422
+ return atob(padded);
25423
+ // @ts-ignore (Node fallback if this runs server-side)
25424
+ return Buffer.from(padded, "base64").toString("utf-8");
25425
+ }
25426
+ /** Parse ?wl=... (or ?whitelabel=...) → validated partial settings */
25427
+ function readWhiteLabelFromQuery(qs) {
25428
+ var _a;
25429
+ try {
25430
+ const raw = (_a = qs.get("wl")) !== null && _a !== void 0 ? _a : qs.get("whitelabel");
25431
+ if (!raw)
25432
+ return undefined;
25433
+ const jsonStr = decodeBase64OrBase64Url(raw);
25434
+ const obj = JSON.parse(jsonStr);
25435
+ const parsed = shared_pixelstreaming_websdk_1.ZWhiteLabel.safeParse(obj);
25436
+ if (!parsed.success) {
25437
+ //console.warn("[ArcwareConfig] Invalid wl payload:", parsed.error?.flatten?.());
25438
+ return undefined;
25439
+ }
25440
+ return parsed.data;
25441
+ }
25442
+ catch (e) {
25443
+ //console.warn("[ArcwareConfig] Failed to parse wl payload:", e);
25444
+ return undefined;
25445
+ }
25355
25446
  }
25356
- exports.capScale = capScale;
25447
+ exports.readWhiteLabelFromQuery = readWhiteLabelFromQuery;
25357
25448
 
25358
25449
 
25359
25450
  /***/ }),
@@ -25396,16 +25487,27 @@ exports.ArcwareStyles = {
25396
25487
  "--color11": "rgba(65,0,139,1) !important",
25397
25488
  "--color12": "#222224 !important",
25398
25489
  "--color13": "#f0f0f2 !important",
25399
- "--colorBoxShadow": "rgba(0, 0, 0, 0.20) !important",
25490
+ "--colorBoxShadow": "rgba(0, 0, 0, 0.20) !important"
25400
25491
  },
25492
+ ".aw-splash": {
25493
+ backgroundRepeat: "no-repeat",
25494
+ backgroundPosition: "center center",
25495
+ backgroundSize: "contain",
25496
+ backgroundColor: "var(--color0)"
25497
+ },
25498
+ "@keyframes aw-loader-fade": {
25499
+ from: { opacity: 0.25 },
25500
+ to: { opacity: 1 }
25501
+ },
25502
+ /* ---------- /NEW ---------- */
25401
25503
  "#playerUI *": {
25402
- fontFamily: "system-ui",
25504
+ fontFamily: "system-ui"
25403
25505
  },
25404
25506
  "#shared-stream-container": {
25405
- boxSizing: "border-box",
25507
+ boxSizing: "border-box"
25406
25508
  },
25407
25509
  "#shared-stream-container::-webkit-scrollbar": {
25408
- width: "10px",
25510
+ width: "10px"
25409
25511
  },
25410
25512
  "#shared-stream-container::-webkit-scrollbar-track": {
25411
25513
  background: "var(--color13)",
@@ -25414,10 +25516,10 @@ exports.ArcwareStyles = {
25414
25516
  borderTop: "20px solid var(--color0)",
25415
25517
  borderRight: "5px solid var(--color0)",
25416
25518
  borderBottom: "20px solid var(--color0)",
25417
- borderLeft: "5px solid var(--color0)",
25519
+ borderLeft: "5px solid var(--color0)"
25418
25520
  },
25419
25521
  "#shared-stream-container::-webkit-scrollbar-track-piece": {
25420
- background: "transparent",
25522
+ background: "transparent"
25421
25523
  },
25422
25524
  "#shared-stream-container::-webkit-scrollbar-thumb": {
25423
25525
  background: "var(--color13)",
@@ -25425,11 +25527,11 @@ exports.ArcwareStyles = {
25425
25527
  borderRight: "2px solid var(--color0)",
25426
25528
  borderLeft: "2px solid var(--color0)",
25427
25529
  transition: "all ease-in-out 0.3s",
25428
- borderRadius: "7px",
25530
+ borderRadius: "7px"
25429
25531
  },
25430
25532
  "#shared-stream-container::-webkit-scrollbar-thumb:hover": {
25431
25533
  transition: "all ease-in-out 0.3s",
25432
- background: "var(--color3)",
25534
+ background: "var(--color3)"
25433
25535
  },
25434
25536
  "#playerUI, #videoElementParent": {
25435
25537
  position: "absolute",
@@ -25443,13 +25545,13 @@ exports.ArcwareStyles = {
25443
25545
  left: 0,
25444
25546
  margin: "auto",
25445
25547
  boxSizing: "border-box",
25446
- pointerEvents: "all",
25548
+ pointerEvents: "all"
25447
25549
  },
25448
25550
  "#streamingVideo": {
25449
25551
  maxWidth: "100%",
25450
25552
  maxHeight: "100%",
25451
25553
  boxSizing: "border-box",
25452
- background: "#18181A",
25554
+ background: "#18181A"
25453
25555
  },
25454
25556
  "#uiFeatures #controls": {
25455
25557
  top: "auto",
@@ -25457,13 +25559,13 @@ exports.ArcwareStyles = {
25457
25559
  bottom: "10px",
25458
25560
  right: "20px",
25459
25561
  display: "flex",
25460
- flexDirection: "column-reverse",
25562
+ flexDirection: "column-reverse"
25461
25563
  },
25462
25564
  "#uiFeatures #connection": {
25463
25565
  bottom: "5px",
25464
25566
  left: "10px",
25465
25567
  width: "2.5rem",
25466
- heihgt: "2.5rem",
25568
+ heihgt: "2.5rem"
25467
25569
  },
25468
25570
  "#uiFeatures button": {
25469
25571
  backgroundColor: "var(--color12)",
@@ -25480,23 +25582,23 @@ exports.ArcwareStyles = {
25480
25582
  alignItems: "center",
25481
25583
  boxShadow: "0px 0px 24px 0px var(--colorBoxShadow)",
25482
25584
  borderRadius: "3px",
25483
- outline: "none",
25585
+ outline: "none"
25484
25586
  },
25485
25587
  "#uiFeatures button:hover, #uiFeatures button:active": {
25486
25588
  padding: "0 !important",
25487
- border: "none",
25589
+ border: "none"
25488
25590
  },
25489
25591
  "#uiFeatures button #audioIconMuted, #uiFeatures button #audioIconUnmuted, #uiFeatures button #micIconMuted, #uiFeatures button #micIconUnmuted": {
25490
25592
  width: "31px",
25491
- height: "28px",
25593
+ height: "28px"
25492
25594
  },
25493
25595
  "#uiFeatures button #maximizeIcon, #uiFeatures button #minimizeIcon": {
25494
25596
  width: "25px",
25495
- height: "25px",
25597
+ height: "25px"
25496
25598
  },
25497
25599
  "#stopIcon, #playIcon": {
25498
25600
  width: "30px",
25499
- height: "30px",
25601
+ height: "30px"
25500
25602
  },
25501
25603
  "#uiFeatures button .tooltiptext": {
25502
25604
  right: "125%",
@@ -25505,35 +25607,35 @@ exports.ArcwareStyles = {
25505
25607
  borderRadius: "3px",
25506
25608
  backgroundColor: "var(--color12)",
25507
25609
  width: "95px",
25508
- visibility: "hidden!important",
25610
+ visibility: "hidden!important"
25509
25611
  },
25510
25612
  "@media (hover: hover) and (pointer: fine)": {
25511
25613
  "#uiFeatures button:hover .tooltiptext": {
25512
- visibility: "visible!important",
25513
- },
25614
+ visibility: "visible!important"
25615
+ }
25514
25616
  },
25515
25617
  "#controls>*": {
25516
25618
  marginBottom: "0.5rem",
25517
25619
  display: "block",
25518
25620
  lineHeight: "1.75rem",
25519
25621
  padding: "0.5rem",
25520
- backgroundColor: "var(--color12)",
25622
+ backgroundColor: "var(--color12)"
25521
25623
  },
25522
25624
  "#uiFeatures #settingsIcon, #uiFeatures #statsIcon": {
25523
25625
  width: "27px",
25524
- height: "27px",
25626
+ height: "27px"
25525
25627
  },
25526
25628
  ".svgIcon": {
25527
- fill: "var(--color13)",
25629
+ fill: "var(--color13)"
25528
25630
  },
25529
25631
  "#uiFeatures button:hover .svgIcon, #uiFeatures button:active .svgIcon": {
25530
- fill: "var(--color12)",
25632
+ fill: "var(--color12)"
25531
25633
  },
25532
25634
  ".tgl-switch .tgl-slider, .tgl-flat:checked+.tgl-slider": {
25533
- border: "3px solid transparent",
25635
+ border: "3px solid transparent"
25534
25636
  },
25535
25637
  ".tgl-switch .tgl-slider": {
25536
- background: "none",
25638
+ background: "none"
25537
25639
  },
25538
25640
  ".tgl-switch .tgl-slider::before": {
25539
25641
  content: "''",
@@ -25547,18 +25649,18 @@ exports.ArcwareStyles = {
25547
25649
  top: "0",
25548
25650
  bottom: "0",
25549
25651
  left: "0",
25550
- right: "0",
25652
+ right: "0"
25551
25653
  },
25552
25654
  ".tgl-switch .tgl-slider::after": {
25553
25655
  height: "13px",
25554
25656
  width: "13px",
25555
25657
  borderRadius: "50%",
25556
25658
  top: "-2px",
25557
- left: "-1%",
25659
+ left: "-1%"
25558
25660
  },
25559
25661
  ".tgl-flat:checked+.tgl-slider:after": {
25560
25662
  left: "62%",
25561
- background: "var(--color3)",
25663
+ background: "var(--color3)"
25562
25664
  },
25563
25665
  ".form-control": {
25564
25666
  backgroundColor: "transparent",
@@ -25567,7 +25669,7 @@ exports.ArcwareStyles = {
25567
25669
  color: "var(--color13)",
25568
25670
  textAlign: "left",
25569
25671
  fontFamily: "inherit",
25570
- padding: "5px 15px ",
25672
+ padding: "5px 15px "
25571
25673
  },
25572
25674
  ".btn-flat": {
25573
25675
  background: "var(--color3)",
@@ -25577,31 +25679,62 @@ exports.ArcwareStyles = {
25577
25679
  cursor: "pointer",
25578
25680
  borderRadius: "4px",
25579
25681
  textTransform: "uppercase",
25580
- minWidth: "175px",
25682
+ minWidth: "175px"
25581
25683
  },
25582
25684
  ".btn-flat:disabled": {
25583
25685
  background: "var(--color7)",
25584
25686
  borderColor: "var(--color3)",
25585
25687
  color: "var(--color3)",
25586
- cursor: "default",
25688
+ cursor: "default"
25587
25689
  },
25588
25690
  ".btn-flat:focus": {
25589
- outline: "none",
25691
+ outline: "none"
25590
25692
  },
25591
25693
  ".arcware-logo-loader": {
25592
25694
  position: "relative",
25593
- display: "block",
25695
+ display: "flex",
25696
+ alignItems: "center",
25697
+ justifyContent: "center",
25594
25698
  width: "12.5%",
25595
25699
  height: "12.5%",
25700
+ margin: "0 auto",
25701
+ boxSizing: "border-box"
25702
+ },
25703
+ // image rendering + centering inside the box
25704
+ ".arcware-logo-loader img": {
25705
+ maxWidth: "40%",
25706
+ maxHeight: "40%",
25707
+ objectFit: "contain",
25708
+ objectPosition: "center center",
25709
+ display: "block",
25710
+ margin: 0,
25711
+ verticalAlign: "middle"
25712
+ },
25713
+ // fade stays the same
25714
+ ".arcware-logo-loader.pulse img": {
25715
+ animation: "aw-loader-fade var(--aw-fade,1200ms) ease-in-out infinite alternate"
25716
+ },
25717
+ ".arcware-logo-loader.aw-custom-loader": {
25718
+ width: "auto !important",
25719
+ height: "auto !important"
25720
+ },
25721
+ ".arcware-logo-loader.aw-custom-loader img": {
25722
+ display: "block",
25723
+ width: "auto",
25724
+ height: "auto",
25725
+ maxWidth: "80%",
25726
+ maxHeight: "80%",
25727
+ objectFit: "contain",
25728
+ margin: "0 auto" // ensure horizontal centering inside the loader
25596
25729
  },
25597
25730
  "#playOverlay img#playButton": {
25598
- width: "5%",
25731
+ width: "5%"
25599
25732
  },
25600
25733
  "#disconnectOverlay, #errorOverlay": {
25601
25734
  textTransform: "initial",
25602
25735
  textAlign: "center",
25603
25736
  fontSize: "20px",
25604
- lineHeight: 2.5,
25737
+ lineHeight: 2.5
25605
25738
  },
25606
25739
  "#disconnectOverlay .clickableState": {
25607
25740
  textTransform: "initial",
@@ -25611,13 +25744,13 @@ exports.ArcwareStyles = {
25611
25744
  fontSize: "18px",
25612
25745
  border: "1px solid #DAF693",
25613
25746
  margin: "25px auto 0",
25614
- width: "180px",
25747
+ width: "180px"
25615
25748
  },
25616
25749
  "#afkOverlay": {
25617
25750
  background: "none",
25618
25751
  transition: "all ease-in-out 0.5s",
25619
25752
  opacity: 1,
25620
- pointerEvents: "initial",
25753
+ pointerEvents: "initial"
25621
25754
  },
25622
25755
  "#afkOverlayInner": {
25623
25756
  textTransform: "initial",
@@ -25626,18 +25759,18 @@ exports.ArcwareStyles = {
25626
25759
  fontSize: "18px",
25627
25760
  width: "360px",
25628
25761
  textAlign: "center",
25629
- lineHeight: 2.5,
25762
+ lineHeight: 2.5
25630
25763
  },
25631
25764
  "#afkOverlayInner center::first-line": {
25632
25765
  textTransform: "uppercase",
25633
25766
  color: "#FF8461",
25634
25767
  fontWeight: "bold",
25635
- fontSize: "24px",
25768
+ fontSize: "24px"
25636
25769
  },
25637
25770
  "#afkOverlayInner #afkCountDownNumber": {
25638
25771
  color: "#DAF693",
25639
25772
  fontSize: "26px",
25640
- lineHeight: "22px",
25773
+ lineHeight: "22px"
25641
25774
  },
25642
25775
  "#afkOverlayInner center .retry-button": {
25643
25776
  textTransform: "initial",
@@ -25647,7 +25780,7 @@ exports.ArcwareStyles = {
25647
25780
  fontSize: "18px",
25648
25781
  border: "1px solid #DAF693",
25649
25782
  margin: "25px auto 0",
25650
- width: "180px",
25783
+ width: "180px"
25651
25784
  },
25652
25785
  "#connectOverlay #connectButton": {
25653
25786
  textTransform: "initial",
@@ -25657,33 +25790,33 @@ exports.ArcwareStyles = {
25657
25790
  fontSize: "18px",
25658
25791
  border: "1px solid #DAF693",
25659
25792
  margin: "25px auto 0",
25660
- width: "180px",
25793
+ width: "180px"
25661
25794
  },
25662
25795
  "#connectOverlay .connection-text": {
25663
25796
  textTransform: "initial",
25664
25797
  textAlign: "center",
25665
- margin: "25px auto 0",
25798
+ margin: "25px auto 0"
25666
25799
  },
25667
25800
  "#connectOverlay .connection-text .title": {
25668
25801
  color: "#ffffff",
25669
25802
  fontSize: "18px",
25670
- margin: "5px 0",
25803
+ margin: "5px 0"
25671
25804
  },
25672
25805
  "#connectOverlay .connection-text .subtitle": {
25673
25806
  color: "#ffffff",
25674
25807
  opacity: 0.5,
25675
25808
  fontSize: "12px",
25676
- margin: "10px 0",
25809
+ margin: "10px 0"
25677
25810
  },
25678
25811
  "#infoOverlay.hiddenState": {
25679
- display: "none",
25812
+ display: "none"
25680
25813
  },
25681
25814
  "#disconnectOverlay, #playOverlay, #errorOverlay, #microphoneOverlay, #connectOverlay": {
25682
25815
  background: "#18181A",
25683
25816
  display: "flex",
25684
25817
  transition: "all ease-in-out 0.5s",
25685
25818
  opacity: 1,
25686
- pointerEvents: "initial",
25819
+ pointerEvents: "initial"
25687
25820
  },
25688
25821
  "#microphoneOverlay": {
25689
25822
  textTransform: "initial",
@@ -25702,51 +25835,51 @@ exports.ArcwareStyles = {
25702
25835
  justifyContent: "center",
25703
25836
  alignItems: "center",
25704
25837
  flexDirection: "column",
25705
- zIndex: 99999,
25838
+ zIndex: 99999
25706
25839
  },
25707
25840
  "#microphoneOverlay .title": {
25708
25841
  fontSize: "24px",
25709
25842
  position: "relative",
25710
25843
  marginBottom: "20px",
25711
- color: "#F0F0F2",
25844
+ color: "#F0F0F2"
25712
25845
  },
25713
25846
  "#microphoneOverlay .title:after": {
25714
25847
  content: "''",
25715
25848
  display: "inline-block",
25716
25849
  animation: "dotty steps(1,end) 1s infinite",
25717
- position: "absolute",
25850
+ position: "absolute"
25718
25851
  },
25719
25852
  "#microphoneOverlay p": {
25720
25853
  margin: 0,
25721
- color: "#858588",
25854
+ color: "#858588"
25722
25855
  },
25723
25856
  "#microphoneOverlay svg": {
25724
25857
  height: "65px",
25725
25858
  marginBottom: "15px",
25726
- marginTop: "-5px",
25859
+ marginTop: "-5px"
25727
25860
  },
25728
25861
  "#microphoneOverlay .svgIcon": {
25729
- fill: "#DAF693",
25862
+ fill: "#DAF693"
25730
25863
  },
25731
25864
  "#disconnectOverlay.hiddenState, #playOverlay.hiddenState, #errorOverlay.hiddenState, #afkOverlay.hiddenState, #microphoneOverlay.hiddenState": {
25732
25865
  opacity: 0,
25733
- pointerEvents: "none",
25866
+ pointerEvents: "none"
25734
25867
  },
25735
25868
  "#disconnectOverlay.mic-overlay-is-visible, #errorOverlay.mic-overlay-is-visible, #infoOverlay.mic-overlay-is-visible": {
25736
25869
  opacity: 0,
25737
- pointerEvents: "none",
25870
+ pointerEvents: "none"
25738
25871
  },
25739
25872
  "#infoOverlay.hiddenState, #connectOverlay.hiddenState": {
25740
- display: "none",
25873
+ display: "none"
25741
25874
  },
25742
25875
  "#connectOverlay": {
25743
25876
  display: "flex",
25744
25877
  flexDirection: "column-reverse",
25745
25878
  alignItems: "center",
25746
- justifyContent: "center",
25879
+ justifyContent: "center"
25747
25880
  },
25748
25881
  "#infoOverlay": {
25749
- display: "none",
25882
+ display: "none"
25750
25883
  },
25751
25884
  ".love-letters-box-root": {
25752
25885
  display: "flex",
@@ -25758,11 +25891,11 @@ exports.ArcwareStyles = {
25758
25891
  alignItems: "center",
25759
25892
  flexDirection: "column",
25760
25893
  background: "#18181A",
25761
- zIndex: 1,
25894
+ zIndex: 1
25762
25895
  },
25763
25896
  ".love-letters-box-root.fade-out": {
25764
25897
  opacity: 0,
25765
- transition: "opacity 0.5s",
25898
+ transition: "opacity 0.5s"
25766
25899
  },
25767
25900
  "#letters-block": {
25768
25901
  position: "absolute",
@@ -25779,7 +25912,7 @@ exports.ArcwareStyles = {
25779
25912
  alignItems: "center",
25780
25913
  fontSize: "16px",
25781
25914
  textTransform: "initial",
25782
- textAlign: "center",
25915
+ textAlign: "center"
25783
25916
  },
25784
25917
  "#letters-wrapper": {
25785
25918
  height: "77px",
@@ -25790,62 +25923,88 @@ exports.ArcwareStyles = {
25790
25923
  alignItems: "center",
25791
25924
  justifyContent: "flex-end",
25792
25925
  marginTop: "10px",
25793
- paddingBottom: "2px",
25926
+ paddingBottom: "2px"
25794
25927
  },
25795
25928
  "#letters-wrapper p": {
25796
25929
  textAlign: "center",
25797
25930
  lineHeight: 1.25,
25798
- fontSize: "16px",
25931
+ fontSize: "16px"
25799
25932
  },
25800
25933
  ".letter-animation:nth-last-of-type(1)::after": {
25801
25934
  display: "inline-block",
25802
25935
  animation: "dotty steps(1,end) 1s infinite",
25803
25936
  content: "''",
25804
- position: "absolute",
25937
+ position: "absolute"
25805
25938
  },
25806
25939
  ".letter-animation": {
25807
25940
  transition: "all 0.5s ease-in-out",
25808
25941
  transformOrigin: "bottom",
25809
- margin: "0 auto",
25942
+ margin: "0 auto"
25810
25943
  },
25811
25944
  ".letter-animation-enter": {
25812
- animation: "fadeInUp 0.75s ease-out",
25945
+ animation: "fadeInUp 0.75s ease-out"
25813
25946
  },
25814
25947
  ".letter-animation-exit": {
25815
25948
  opacity: 0,
25816
25949
  scale: 0.9,
25817
25950
  transition: "all ease-in-out 1s",
25818
- margin: 0,
25951
+ margin: 0
25819
25952
  },
25820
25953
  "@keyframes dotty": {
25821
25954
  "0%": { content: "''" },
25822
25955
  "25%": { content: "'.'" },
25823
25956
  "50%": { content: "'..'" },
25824
25957
  "75%": { content: "'...'" },
25825
- "100%": { content: "''" },
25958
+ "100%": { content: "''" }
25826
25959
  },
25827
25960
  "@keyframes fadeInUp": {
25828
25961
  from: {
25829
25962
  opacity: 0,
25830
25963
  transform: " translateY(5px)",
25831
- scale: 0.9,
25964
+ scale: 0.9
25832
25965
  },
25833
25966
  to: {
25834
25967
  opacity: 1,
25835
25968
  transform: "translateY(0)",
25836
- scale: 1,
25837
- },
25969
+ scale: 1
25970
+ }
25838
25971
  },
25839
25972
  ".hidden": {
25840
25973
  display: "none",
25841
- opacity: 0,
25974
+ opacity: 0
25842
25975
  },
25843
25976
  ".visible": {
25844
25977
  display: "block",
25845
25978
  opacity: 1,
25846
- transition: "opacity 1s ease-out",
25979
+ transition: "opacity 1s ease-out"
25847
25980
  },
25848
- },
25981
+ // Make the host a flex centering box
25982
+ ".love-letters-box-root .arcware-logo-loader": {
25983
+ display: "flex",
25984
+ alignItems: "center",
25985
+ justifyContent: "center"
25986
+ },
25987
+ // When a custom image is active, ignore the legacy 12.5% box
25988
+ ".love-letters-box-root .arcware-logo-loader.aw-custom-loader": {
25989
+ width: "auto !important",
25990
+ height: "auto !important"
25991
+ },
25992
+ // Size & center the <img> itself (independent of host size)
25993
+ ".love-letters-box-root .arcware-logo-loader.aw-custom-loader img": {
25994
+ display: "block",
25995
+ margin: "0 auto",
25996
+ width: "min(40vmin, 40vw)",
25997
+ height: "auto",
25998
+ objectFit: "contain",
25999
+ objectPosition: "center center"
26000
+ },
26001
+ // (optional) If you prefer the old “percentage of container” behavior:
26002
+ ".love-letters-box-root .arcware-logo-loader.aw-custom-loader img.alt-40pct": {
26003
+ width: "40%",
26004
+ maxWidth: "100%",
26005
+ height: "auto"
26006
+ }
26007
+ }
25849
26008
  };
25850
26009
 
25851
26010
 
@@ -25867,6 +26026,56 @@ class ArcwareLogoLoader {
25867
26026
  arcwareLogoLoader.innerHTML = this.getSvg();
25868
26027
  return arcwareLogoLoader;
25869
26028
  }
26029
+ /** Call this once after you create the wrapper/root that contains the SVG */
26030
+ setHostElement(el) {
26031
+ this._hostEl = el;
26032
+ }
26033
+ /** Swap the loader image at runtime; pass undefined to go back to SVG */
26034
+ setImage(url) {
26035
+ var _a, _b;
26036
+ if (!this._hostEl)
26037
+ return;
26038
+ // lazily create <img> once
26039
+ if (!this._imgEl) {
26040
+ const img = document.createElement("img");
26041
+ img.alt = "Loading";
26042
+ img.style.display = "none"; // hidden until we set a URL
26043
+ this._hostEl.appendChild(img);
26044
+ this._imgEl = img;
26045
+ }
26046
+ if (url && url.trim()) {
26047
+ (_a = this._hostEl) === null || _a === void 0 ? void 0 : _a.classList.add("aw-custom-loader");
26048
+ if (this._imgEl.src !== url)
26049
+ this._imgEl.src = url;
26050
+ // show <img>, hide SVG
26051
+ this._imgEl.style.display = "";
26052
+ const svg = this._hostEl.querySelector("svg");
26053
+ if (svg)
26054
+ svg.style.display = "none";
26055
+ }
26056
+ else {
26057
+ // no url → fall back to SVG
26058
+ (_b = this._hostEl) === null || _b === void 0 ? void 0 : _b.classList.remove("aw-custom-loader");
26059
+ this._imgEl.style.display = "none";
26060
+ const svg = this._hostEl.querySelector("svg");
26061
+ if (svg)
26062
+ svg.style.display = "";
26063
+ }
26064
+ }
26065
+ /** Enable/disable pulsing fade in ms; 0 disables */
26066
+ setFade(ms) {
26067
+ if (!this._hostEl)
26068
+ return;
26069
+ const n = Number(ms) || 0;
26070
+ if (n > 0) {
26071
+ this._hostEl.style.setProperty("--aw-fade", `${n}ms`);
26072
+ this._hostEl.classList.add("pulse"); // uses #aw-loader.pulse styles you added
26073
+ }
26074
+ else {
26075
+ this._hostEl.classList.remove("pulse");
26076
+ this._hostEl.style.removeProperty("--aw-fade");
26077
+ }
26078
+ }
25870
26079
  getSvg() {
25871
26080
  return `
25872
26081
  <svg width="42" height="80" viewBox="0 0 42 80" xmlns="http://www.w3.org/2000/svg">
@@ -26937,6 +27146,40 @@ exports.Send = {
26937
27146
  };
26938
27147
 
26939
27148
 
27149
+ /***/ }),
27150
+
27151
+ /***/ 6750:
27152
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
27153
+
27154
+
27155
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
27156
+ exports.ZWhiteLabel = void 0;
27157
+ const zod_1 = __webpack_require__(8754);
27158
+ /** Absolute HTTPS URL (no http) */
27159
+ const AbsoluteHttpsUrl = zod_1.z
27160
+ .string()
27161
+ .url()
27162
+ .refine((u) => u.startsWith("https://"), { message: "URL must use https://" });
27163
+ /** Relative path (no scheme like http:, data:, javascript:, etc.) */
27164
+ const RelativePath = zod_1.z
27165
+ .string()
27166
+ .min(1)
27167
+ .refine((s) => !/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(s), { message: "Expected a relative path without a URL scheme" });
27168
+ /** Image URL can be absolute (https) or relative (e.g. /assets/logo.png, ./img.png) */
27169
+ const ImageUrl = zod_1.z.union([AbsoluteHttpsUrl, RelativePath]);
27170
+ /** Strict allowlist for white-label brand fields coming from the URL */
27171
+ exports.ZWhiteLabel = zod_1.z
27172
+ .object({
27173
+ loadingIconUrl: ImageUrl.optional(),
27174
+ loadingIconFadeMs: zod_1.z.number().int().positive().optional(),
27175
+ splashScreenUrl: ImageUrl.optional(),
27176
+ splashScreenMode: zod_1.z.enum(["contain", "cover", "stretch", "repeat"]).optional(),
27177
+ splashScreenPosition: zod_1.z.string().optional(),
27178
+ splashScreenBgColor: zod_1.z.string().optional()
27179
+ })
27180
+ .strict();
27181
+
27182
+
26940
27183
  /***/ }),
26941
27184
 
26942
27185
  /***/ 318:
@@ -26944,8 +27187,10 @@ exports.Send = {
26944
27187
 
26945
27188
 
26946
27189
  Object.defineProperty(exports, "__esModule", ({ value: true }));
26947
- exports.Messages = void 0;
27190
+ exports.ZWhiteLabel = exports.Messages = void 0;
26948
27191
  exports.Messages = __webpack_require__(5387);
27192
+ var ZWhiteLabel_1 = __webpack_require__(6750);
27193
+ Object.defineProperty(exports, "ZWhiteLabel", ({ enumerable: true, get: function () { return ZWhiteLabel_1.ZWhiteLabel; } }));
26949
27194
 
26950
27195
 
26951
27196
  /***/ }),