@arcware-cloud/pixelstreaming-websdk 1.3.12 → 1.3.15

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
@@ -23353,10 +23353,13 @@ exports.ArcwareApplication = ArcwareApplication;
23353
23353
 
23354
23354
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23355
23355
  exports.ArcwareConfig = exports.DefaultUrl = void 0;
23356
+ const tslib_1 = __webpack_require__(655);
23356
23357
  const zod_1 = __webpack_require__(8754);
23357
23358
  const lib_pixelstreamingfrontend_ue5_5_1 = __webpack_require__(693);
23358
23359
  const Session_1 = __webpack_require__(2469);
23359
23360
  const ArcwareSettingsSchema_1 = __webpack_require__(5602);
23361
+ const whiteLabelling_1 = __webpack_require__(3545);
23362
+ const ZWhiteLabel_1 = __webpack_require__(467);
23360
23363
  /** Default arcware signalling endpoint. */
23361
23364
  exports.DefaultUrl = `wss://signalling-client.ragnarok.arcware.cloud`;
23362
23365
  // The below Logger overrides can likely be removed as PSInfra 5.5 logger supports setting log verbosity
@@ -23399,7 +23402,7 @@ class ArcwareConfig extends lib_pixelstreamingfrontend_ue5_5_1.Config {
23399
23402
  };
23400
23403
  }
23401
23404
  constructor(config) {
23402
- var _a, _b;
23405
+ var _a, _b, _c;
23403
23406
  const dfToken = new URL(window.location.href).search
23404
23407
  .slice(1)
23405
23408
  .split("&")
@@ -23420,7 +23423,7 @@ class ArcwareConfig extends lib_pixelstreamingfrontend_ue5_5_1.Config {
23420
23423
  if (!config.initialSettings.ss)
23421
23424
  config.initialSettings.ss = exports.DefaultUrl;
23422
23425
  super(config);
23423
- this.VERSION = "1.3.12";
23426
+ this.VERSION = "1.3.15";
23424
23427
  this.settings = settings;
23425
23428
  this.session = new Session_1.Session();
23426
23429
  this._initialSettings = config.initialSettings;
@@ -23429,6 +23432,72 @@ class ArcwareConfig extends lib_pixelstreamingfrontend_ue5_5_1.Config {
23429
23432
  // IMPORTANT NOTE: The feature BrowserSendOffer is no longer supported in PSInfra 5.5.
23430
23433
  // The offer is now expected to come from UE. Ensure that your signalling server supports this behaviour.
23431
23434
  //this.setFlagEnabled(Flags.BrowserSendOffer, true);
23435
+ if (this.useUrlParams) {
23436
+ // Get the query string from URL
23437
+ const qs = new URLSearchParams(window.location.search);
23438
+ if (qs.has("wl") && qs.get("wl") !== "") {
23439
+ // Retrieve image loading from there
23440
+ const wlParsed = this.useUrlParams ? (0, whiteLabelling_1.readWhiteLabelFromQuery)(qs) : undefined; // respect useUrlParams
23441
+ if (wlParsed) {
23442
+ this.settings.whiteLabelling = Object.assign(Object.assign({}, ((_c = this.settings.whiteLabelling) !== null && _c !== void 0 ? _c : {})), wlParsed);
23443
+ }
23444
+ }
23445
+ this.settings.infoButton = qs.has("i") || qs.has("info");
23446
+ }
23447
+ }
23448
+ static getWhiteLabelling(ShareId, URL = "https://signalling-client.arcware.cloud/whiteLabel/") {
23449
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
23450
+ const qs = new URLSearchParams(window.location.search);
23451
+ if (qs.has("wl") && qs.get("wl") === "") {
23452
+ // Build final URL safely (trim trailing slashes, encode ShareId)
23453
+ const base = URL.replace(/\/+$/, "");
23454
+ const requestUrl = `${base}/${encodeURIComponent(ShareId)}`;
23455
+ const controller = new AbortController();
23456
+ const timeoutId = setTimeout(() => controller.abort(), 1000);
23457
+ try {
23458
+ const res = yield fetch(requestUrl, {
23459
+ method: "GET",
23460
+ signal: controller.signal,
23461
+ headers: { Accept: "application/json, text/plain" },
23462
+ credentials: "omit"
23463
+ });
23464
+ if (!res.ok) {
23465
+ // Non-2xx: treat as “no white label”
23466
+ return undefined;
23467
+ }
23468
+ // We read as text first to detect empty-string payloads
23469
+ const text = yield res.text();
23470
+ if (!text || text.trim() === "") {
23471
+ return undefined;
23472
+ }
23473
+ // If there is content, try to parse JSON
23474
+ let json;
23475
+ try {
23476
+ json = JSON.parse(text);
23477
+ }
23478
+ catch (_a) {
23479
+ // Not valid JSON → ignore
23480
+ return undefined;
23481
+ }
23482
+ // Validate against the allowlisted schema
23483
+ const parsed = ZWhiteLabel_1.ZWhiteLabel.safeParse(json);
23484
+ if (!parsed.success) {
23485
+ // Optionally log parsed.error for diagnostics
23486
+ return undefined;
23487
+ }
23488
+ return parsed.data;
23489
+ }
23490
+ catch (err) {
23491
+ // Abort or network error → treat as “no white label”
23492
+ // if (err?.name !== "AbortError") console.warn("getWhiteLabelling failed", err);
23493
+ return undefined;
23494
+ }
23495
+ finally {
23496
+ clearTimeout(timeoutId);
23497
+ }
23498
+ }
23499
+ return undefined;
23500
+ });
23432
23501
  }
23433
23502
  /** Setup connection string. */
23434
23503
  get urlFlags() {
@@ -23536,7 +23605,14 @@ function ArcwareInit({ shareId, projectId }, configuration, forceRefresh = false
23536
23605
  useUrlParams: (configuration === null || configuration === void 0 ? void 0 : configuration.useUrlParams) === true,
23537
23606
  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
23607
  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)
23608
+ 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: {
23609
+ splashScreenUrl: undefined,
23610
+ loadingIconFadeMs: undefined,
23611
+ loadingIconUrl: undefined,
23612
+ splashScreenMode: undefined,
23613
+ splashScreenPosition: undefined,
23614
+ splashScreenBgColor: undefined
23615
+ } }, configuration === null || configuration === void 0 ? void 0 : configuration.settings)
23540
23616
  });
23541
23617
  const PixelStreaming = new ArcwarePixelStreaming_1.ArcwarePixelStreaming(Config);
23542
23618
  const Application = new ArcwareApplication_1.ArcwareApplication({ stream: PixelStreaming });
@@ -23885,6 +23961,7 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
23885
23961
  });
23886
23962
  }
23887
23963
  }
23964
+ this.applyBrandingFromSettings();
23888
23965
  this.handleMouseLock();
23889
23966
  this.injectCustomUI();
23890
23967
  }
@@ -24132,12 +24209,12 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
24132
24209
  // Zoom level for orientation change if provided
24133
24210
  if (orientationZoom) {
24134
24211
  if (browserWidth < browserHeight) {
24135
- if (orientationZoom.hasOwnProperty('portrait'))
24212
+ if (orientationZoom.hasOwnProperty("portrait"))
24136
24213
  (_a = this === null || this === void 0 ? void 0 : this.webRtcController) === null || _a === void 0 ? void 0 : _a.emitUIInteraction({
24137
24214
  zoom: orientationZoom.portrait
24138
24215
  });
24139
24216
  }
24140
- else if (orientationZoom.hasOwnProperty('landscape')) {
24217
+ else if (orientationZoom.hasOwnProperty("landscape")) {
24141
24218
  (_b = this === null || this === void 0 ? void 0 : this.webRtcController) === null || _b === void 0 ? void 0 : _b.emitUIInteraction({
24142
24219
  zoom: orientationZoom.landscape
24143
24220
  });
@@ -24207,26 +24284,27 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
24207
24284
  initLoveLettersContainer() {
24208
24285
  var _a;
24209
24286
  const logoLoader = new ArcwareLogoLoader_1.ArcwareLogoLoader();
24287
+ this.logoLoader = logoLoader;
24210
24288
  if (!this.loveLettersContainer) {
24211
- const loveLettersContainer = document === null || document === void 0 ? void 0 : document.createElement("div");
24212
- const { videoPlayer } = this === null || this === void 0 ? void 0 : this.webRtcController;
24289
+ const loveLettersContainer = document.createElement("div");
24290
+ this.loveLettersContainer = loveLettersContainer; // keep the ref
24291
+ const { videoPlayer } = this.webRtcController;
24213
24292
  const videoElementParent = videoPlayer.getVideoParentElement();
24214
- (_a = loveLettersContainer === null || loveLettersContainer === void 0 ? void 0 : loveLettersContainer.classList) === null || _a === void 0 ? void 0 : _a.add("love-letters-box-root");
24215
- videoElementParent === null || videoElementParent === void 0 ? void 0 : videoElementParent.appendChild(loveLettersContainer);
24216
- const lettersBlock = document === null || document === void 0 ? void 0 : document.createElement("div");
24293
+ loveLettersContainer.classList.add("love-letters-box-root");
24294
+ videoElementParent.appendChild(loveLettersContainer);
24295
+ const lettersBlock = document.createElement("div");
24217
24296
  lettersBlock.id = "letters-block";
24218
- const lettersWrapper = document === null || document === void 0 ? void 0 : document.createElement("div");
24297
+ const lettersWrapper = document.createElement("div");
24219
24298
  lettersWrapper.id = "letters-wrapper";
24220
- if (loveLettersContainer) {
24221
- lettersBlock === null || lettersBlock === void 0 ? void 0 : lettersBlock.appendChild(logoLoader === null || logoLoader === void 0 ? void 0 : logoLoader.arcwareLogoLoader);
24222
- loveLettersContainer === null || loveLettersContainer === void 0 ? void 0 : loveLettersContainer.appendChild(lettersBlock);
24223
- lettersBlock === null || lettersBlock === void 0 ? void 0 : lettersBlock.appendChild(lettersWrapper);
24224
- }
24225
- lettersBlock.innerHTML = "";
24226
- if (lettersBlock) {
24227
- lettersBlock === null || lettersBlock === void 0 ? void 0 : lettersBlock.appendChild(logoLoader === null || logoLoader === void 0 ? void 0 : logoLoader.arcwareLogoLoader);
24228
- lettersBlock === null || lettersBlock === void 0 ? void 0 : lettersBlock.appendChild(lettersWrapper);
24229
- }
24299
+ // append your existing loader root (with SVG) into the lettersBlock
24300
+ const loaderRoot = logoLoader.arcwareLogoLoader; // your existing getter
24301
+ lettersBlock.appendChild(loaderRoot);
24302
+ // ensure the loader knows its host
24303
+ (_a = logoLoader.setHostElement) === null || _a === void 0 ? void 0 : _a.call(logoLoader, loaderRoot);
24304
+ loveLettersContainer.appendChild(lettersBlock);
24305
+ lettersBlock.appendChild(lettersWrapper);
24306
+ // apply current (local) settings immediately
24307
+ this.applyBrandingFromSettings();
24230
24308
  }
24231
24309
  }
24232
24310
  pushLetter(letter) {
@@ -24332,8 +24410,7 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
24332
24410
  }
24333
24411
  }
24334
24412
  injectCustomUI() {
24335
- (0, common_1.waitForElement)('#stream-ui')
24336
- .then(el => {
24413
+ (0, common_1.waitForElement)("#stream-ui").then((el) => {
24337
24414
  var _a;
24338
24415
  const videoElementParent = (_a = this === null || this === void 0 ? void 0 : this.videoElementParent) === null || _a === void 0 ? void 0 : _a.parentElement;
24339
24416
  if (videoElementParent) {
@@ -24341,6 +24418,80 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
24341
24418
  }
24342
24419
  });
24343
24420
  }
24421
+ applyBrandingFromSettings() {
24422
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
24423
+ 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 : {});
24424
+ // Loader image + fade
24425
+ try {
24426
+ if (this.logoLoader) {
24427
+ (_d = (_c = this.logoLoader).setImage) === null || _d === void 0 ? void 0 : _d.call(_c, cfg.loadingIconUrl);
24428
+ (_f = (_e = this.logoLoader).setFade) === null || _f === void 0 ? void 0 : _f.call(_e, cfg.loadingIconFadeMs);
24429
+ }
24430
+ }
24431
+ catch (_q) { }
24432
+ // Pick splash host: loveLettersContainer (preferred) or player parent
24433
+ try {
24434
+ 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;
24435
+ if (!el)
24436
+ return;
24437
+ const s = el.style;
24438
+ // Nuke previous inline styles (longhands only; never touch 'background' shorthand here)
24439
+ s.removeProperty("background-image");
24440
+ s.removeProperty("background-size");
24441
+ s.removeProperty("background-repeat");
24442
+ s.removeProperty("background-position");
24443
+ s.removeProperty("background-color");
24444
+ // Also clear any earlier 'background' inline shorthand that might have been set elsewhere
24445
+ // (we set to 'initial' first, then re-apply longhands)
24446
+ s.setProperty("background", "initial");
24447
+ el.classList.remove("aw-splash");
24448
+ // If neither color nor image is provided, nothing to do
24449
+ const haveColor = !!cfg.splashScreenBgColor;
24450
+ const haveImage = !!cfg.splashScreenUrl;
24451
+ if (!haveColor && !haveImage)
24452
+ return;
24453
+ // Always ensure our class is present when we brand
24454
+ el.classList.add("aw-splash");
24455
+ // Apply color with !important so external 'background: ... !important' can't wipe it
24456
+ const bgColor = (_o = cfg.splashScreenBgColor) !== null && _o !== void 0 ? _o : "var(--color0)";
24457
+ s.setProperty("background-color", bgColor, "important");
24458
+ if (haveImage) {
24459
+ // Mode → size/repeat mapping
24460
+ const mode = ((_p = cfg.splashScreenMode) !== null && _p !== void 0 ? _p : "contain");
24461
+ switch (mode) {
24462
+ case "contain":
24463
+ s.backgroundSize = "contain";
24464
+ s.backgroundRepeat = "no-repeat";
24465
+ break;
24466
+ case "cover":
24467
+ s.backgroundSize = "cover";
24468
+ s.backgroundRepeat = "no-repeat";
24469
+ break;
24470
+ case "stretch":
24471
+ s.backgroundSize = "100% 100%";
24472
+ s.backgroundRepeat = "no-repeat";
24473
+ break;
24474
+ case "repeat":
24475
+ s.backgroundSize = "auto"; // intrinsic
24476
+ s.backgroundRepeat = "repeat";
24477
+ break;
24478
+ }
24479
+ // Position
24480
+ s.backgroundPosition = cfg.splashScreenPosition || "center center";
24481
+ // Image last (longhand so it won't reset color)
24482
+ // Use quotes to be safe with URLs containing parentheses/spaces
24483
+ s.backgroundImage = `url("${cfg.splashScreenUrl}")`;
24484
+ }
24485
+ else {
24486
+ // No image → ensure any previous image is cleared
24487
+ s.backgroundImage = "none";
24488
+ s.backgroundRepeat = "no-repeat";
24489
+ s.backgroundPosition = "center center";
24490
+ s.backgroundSize = "auto";
24491
+ }
24492
+ }
24493
+ catch (_r) { }
24494
+ }
24344
24495
  }
24345
24496
  exports.ArcwarePixelStreaming = ArcwarePixelStreaming;
24346
24497
 
@@ -24355,6 +24506,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
24355
24506
  exports.ArcwareSettingsSchema = void 0;
24356
24507
  const zod_1 = __webpack_require__(8754);
24357
24508
  const shared_pixelstreaming_websdk_1 = __webpack_require__(7910);
24509
+ const ZWhiteLabel_1 = __webpack_require__(467);
24358
24510
  /** Arcware Settings. */
24359
24511
  exports.ArcwareSettingsSchema = zod_1.z.object({
24360
24512
  /** Overwrites the Session-Tool and uses the provided session instead. */
@@ -24405,10 +24557,15 @@ exports.ArcwareSettingsSchema = zod_1.z.object({
24405
24557
  /** Height with which instance should be started */
24406
24558
  startHeight: zod_1.z.number().optional(),
24407
24559
  /** Zoom functionality */
24408
- orientationZoom: zod_1.z.object({
24560
+ orientationZoom: zod_1.z
24561
+ .object({
24409
24562
  landscape: zod_1.z.number(),
24410
- portrait: zod_1.z.number(),
24411
- }).strict().optional()
24563
+ portrait: zod_1.z.number()
24564
+ })
24565
+ .strict()
24566
+ .optional(),
24567
+ /** Loader customization */
24568
+ whiteLabelling: ZWhiteLabel_1.ZWhiteLabel.optional()
24412
24569
  });
24413
24570
 
24414
24571
 
@@ -25199,6 +25356,40 @@ class DiagnosticsCollector {
25199
25356
  exports.DiagnosticsCollector = DiagnosticsCollector;
25200
25357
 
25201
25358
 
25359
+ /***/ }),
25360
+
25361
+ /***/ 467:
25362
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
25363
+
25364
+
25365
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
25366
+ exports.ZWhiteLabel = void 0;
25367
+ const zod_1 = __webpack_require__(8754);
25368
+ /** Absolute HTTPS URL (no http) */
25369
+ const AbsoluteHttpsUrl = zod_1.z
25370
+ .string()
25371
+ .url()
25372
+ .refine((u) => u.startsWith("https://"), { message: "URL must use https://" });
25373
+ /** Relative path (no scheme like http:, data:, javascript:, etc.) */
25374
+ const RelativePath = zod_1.z
25375
+ .string()
25376
+ .min(1)
25377
+ .refine((s) => !/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(s), { message: "Expected a relative path without a URL scheme" });
25378
+ /** Image URL can be absolute (https) or relative (e.g. /assets/logo.png, ./img.png) */
25379
+ const ImageUrl = zod_1.z.union([AbsoluteHttpsUrl, RelativePath]);
25380
+ /** Strict allowlist for white-label brand fields coming from the URL */
25381
+ exports.ZWhiteLabel = zod_1.z
25382
+ .object({
25383
+ loadingIconUrl: ImageUrl.optional(),
25384
+ loadingIconFadeMs: zod_1.z.number().int().positive().optional(),
25385
+ splashScreenUrl: ImageUrl.optional(),
25386
+ splashScreenMode: zod_1.z.enum(["contain", "cover", "stretch", "repeat"]).optional(),
25387
+ splashScreenPosition: zod_1.z.string().optional(),
25388
+ splashScreenBgColor: zod_1.z.string().optional()
25389
+ })
25390
+ .strict();
25391
+
25392
+
25202
25393
  /***/ }),
25203
25394
 
25204
25395
  /***/ 2483:
@@ -25327,6 +25518,46 @@ function waitForElement(selector, { root = document, timeout = 3000 } = {}) {
25327
25518
  exports.waitForElement = waitForElement;
25328
25519
 
25329
25520
 
25521
+ /***/ }),
25522
+
25523
+ /***/ 3545:
25524
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
25525
+
25526
+
25527
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
25528
+ exports.readWhiteLabelFromQuery = void 0;
25529
+ const ZWhiteLabel_1 = __webpack_require__(467);
25530
+ function decodeBase64OrBase64Url(raw) {
25531
+ const normalized = raw.replace(/-/g, "+").replace(/_/g, "/");
25532
+ const padded = normalized + "===".slice((normalized.length + 3) % 4);
25533
+ if (typeof atob === "function")
25534
+ return atob(padded);
25535
+ // @ts-ignore (Node fallback if this runs server-side)
25536
+ return Buffer.from(padded, "base64").toString("utf-8");
25537
+ }
25538
+ /** Parse ?wl=... (or ?whitelabel=...) → validated partial settings */
25539
+ function readWhiteLabelFromQuery(qs) {
25540
+ try {
25541
+ const raw = qs.get("wl");
25542
+ if (!raw)
25543
+ return undefined;
25544
+ const jsonStr = decodeBase64OrBase64Url(raw);
25545
+ const obj = JSON.parse(jsonStr);
25546
+ const parsed = ZWhiteLabel_1.ZWhiteLabel.safeParse(obj);
25547
+ if (!parsed.success) {
25548
+ //console.warn("[ArcwareConfig] Invalid wl payload:", parsed.error?.flatten?.());
25549
+ return undefined;
25550
+ }
25551
+ return parsed.data;
25552
+ }
25553
+ catch (e) {
25554
+ //console.warn("[ArcwareConfig] Failed to parse wl payload:", e);
25555
+ return undefined;
25556
+ }
25557
+ }
25558
+ exports.readWhiteLabelFromQuery = readWhiteLabelFromQuery;
25559
+
25560
+
25330
25561
  /***/ }),
25331
25562
 
25332
25563
  /***/ 9399:
@@ -25367,16 +25598,27 @@ exports.ArcwareStyles = {
25367
25598
  "--color11": "rgba(65,0,139,1) !important",
25368
25599
  "--color12": "#222224 !important",
25369
25600
  "--color13": "#f0f0f2 !important",
25370
- "--colorBoxShadow": "rgba(0, 0, 0, 0.20) !important",
25601
+ "--colorBoxShadow": "rgba(0, 0, 0, 0.20) !important"
25602
+ },
25603
+ ".aw-splash": {
25604
+ backgroundRepeat: "no-repeat",
25605
+ backgroundPosition: "center center",
25606
+ backgroundSize: "contain",
25607
+ backgroundColor: "var(--color0)"
25608
+ },
25609
+ "@keyframes aw-loader-fade": {
25610
+ from: { opacity: 0.25 },
25611
+ to: { opacity: 1 }
25371
25612
  },
25613
+ /* ---------- /NEW ---------- */
25372
25614
  "#playerUI *": {
25373
- fontFamily: "system-ui",
25615
+ fontFamily: "system-ui"
25374
25616
  },
25375
25617
  "#shared-stream-container": {
25376
- boxSizing: "border-box",
25618
+ boxSizing: "border-box"
25377
25619
  },
25378
25620
  "#shared-stream-container::-webkit-scrollbar": {
25379
- width: "10px",
25621
+ width: "10px"
25380
25622
  },
25381
25623
  "#shared-stream-container::-webkit-scrollbar-track": {
25382
25624
  background: "var(--color13)",
@@ -25385,10 +25627,10 @@ exports.ArcwareStyles = {
25385
25627
  borderTop: "20px solid var(--color0)",
25386
25628
  borderRight: "5px solid var(--color0)",
25387
25629
  borderBottom: "20px solid var(--color0)",
25388
- borderLeft: "5px solid var(--color0)",
25630
+ borderLeft: "5px solid var(--color0)"
25389
25631
  },
25390
25632
  "#shared-stream-container::-webkit-scrollbar-track-piece": {
25391
- background: "transparent",
25633
+ background: "transparent"
25392
25634
  },
25393
25635
  "#shared-stream-container::-webkit-scrollbar-thumb": {
25394
25636
  background: "var(--color13)",
@@ -25396,11 +25638,11 @@ exports.ArcwareStyles = {
25396
25638
  borderRight: "2px solid var(--color0)",
25397
25639
  borderLeft: "2px solid var(--color0)",
25398
25640
  transition: "all ease-in-out 0.3s",
25399
- borderRadius: "7px",
25641
+ borderRadius: "7px"
25400
25642
  },
25401
25643
  "#shared-stream-container::-webkit-scrollbar-thumb:hover": {
25402
25644
  transition: "all ease-in-out 0.3s",
25403
- background: "var(--color3)",
25645
+ background: "var(--color3)"
25404
25646
  },
25405
25647
  "#playerUI, #videoElementParent": {
25406
25648
  position: "absolute",
@@ -25414,13 +25656,13 @@ exports.ArcwareStyles = {
25414
25656
  left: 0,
25415
25657
  margin: "auto",
25416
25658
  boxSizing: "border-box",
25417
- pointerEvents: "all",
25659
+ pointerEvents: "all"
25418
25660
  },
25419
25661
  "#streamingVideo": {
25420
25662
  maxWidth: "100%",
25421
25663
  maxHeight: "100%",
25422
25664
  boxSizing: "border-box",
25423
- background: "#18181A",
25665
+ background: "#18181A"
25424
25666
  },
25425
25667
  "#uiFeatures #controls": {
25426
25668
  top: "auto",
@@ -25428,13 +25670,13 @@ exports.ArcwareStyles = {
25428
25670
  bottom: "10px",
25429
25671
  right: "20px",
25430
25672
  display: "flex",
25431
- flexDirection: "column-reverse",
25673
+ flexDirection: "column-reverse"
25432
25674
  },
25433
25675
  "#uiFeatures #connection": {
25434
25676
  bottom: "5px",
25435
25677
  left: "10px",
25436
25678
  width: "2.5rem",
25437
- heihgt: "2.5rem",
25679
+ heihgt: "2.5rem"
25438
25680
  },
25439
25681
  "#uiFeatures button": {
25440
25682
  backgroundColor: "var(--color12)",
@@ -25451,23 +25693,23 @@ exports.ArcwareStyles = {
25451
25693
  alignItems: "center",
25452
25694
  boxShadow: "0px 0px 24px 0px var(--colorBoxShadow)",
25453
25695
  borderRadius: "3px",
25454
- outline: "none",
25696
+ outline: "none"
25455
25697
  },
25456
25698
  "#uiFeatures button:hover, #uiFeatures button:active": {
25457
25699
  padding: "0 !important",
25458
- border: "none",
25700
+ border: "none"
25459
25701
  },
25460
25702
  "#uiFeatures button #audioIconMuted, #uiFeatures button #audioIconUnmuted, #uiFeatures button #micIconMuted, #uiFeatures button #micIconUnmuted": {
25461
25703
  width: "31px",
25462
- height: "28px",
25704
+ height: "28px"
25463
25705
  },
25464
25706
  "#uiFeatures button #maximizeIcon, #uiFeatures button #minimizeIcon": {
25465
25707
  width: "25px",
25466
- height: "25px",
25708
+ height: "25px"
25467
25709
  },
25468
25710
  "#stopIcon, #playIcon": {
25469
25711
  width: "30px",
25470
- height: "30px",
25712
+ height: "30px"
25471
25713
  },
25472
25714
  "#uiFeatures button .tooltiptext": {
25473
25715
  right: "125%",
@@ -25476,35 +25718,35 @@ exports.ArcwareStyles = {
25476
25718
  borderRadius: "3px",
25477
25719
  backgroundColor: "var(--color12)",
25478
25720
  width: "95px",
25479
- visibility: "hidden!important",
25721
+ visibility: "hidden!important"
25480
25722
  },
25481
25723
  "@media (hover: hover) and (pointer: fine)": {
25482
25724
  "#uiFeatures button:hover .tooltiptext": {
25483
- visibility: "visible!important",
25484
- },
25725
+ visibility: "visible!important"
25726
+ }
25485
25727
  },
25486
25728
  "#controls>*": {
25487
25729
  marginBottom: "0.5rem",
25488
25730
  display: "block",
25489
25731
  lineHeight: "1.75rem",
25490
25732
  padding: "0.5rem",
25491
- backgroundColor: "var(--color12)",
25733
+ backgroundColor: "var(--color12)"
25492
25734
  },
25493
25735
  "#uiFeatures #settingsIcon, #uiFeatures #statsIcon": {
25494
25736
  width: "27px",
25495
- height: "27px",
25737
+ height: "27px"
25496
25738
  },
25497
25739
  ".svgIcon": {
25498
- fill: "var(--color13)",
25740
+ fill: "var(--color13)"
25499
25741
  },
25500
25742
  "#uiFeatures button:hover .svgIcon, #uiFeatures button:active .svgIcon": {
25501
- fill: "var(--color12)",
25743
+ fill: "var(--color12)"
25502
25744
  },
25503
25745
  ".tgl-switch .tgl-slider, .tgl-flat:checked+.tgl-slider": {
25504
- border: "3px solid transparent",
25746
+ border: "3px solid transparent"
25505
25747
  },
25506
25748
  ".tgl-switch .tgl-slider": {
25507
- background: "none",
25749
+ background: "none"
25508
25750
  },
25509
25751
  ".tgl-switch .tgl-slider::before": {
25510
25752
  content: "''",
@@ -25518,18 +25760,18 @@ exports.ArcwareStyles = {
25518
25760
  top: "0",
25519
25761
  bottom: "0",
25520
25762
  left: "0",
25521
- right: "0",
25763
+ right: "0"
25522
25764
  },
25523
25765
  ".tgl-switch .tgl-slider::after": {
25524
25766
  height: "13px",
25525
25767
  width: "13px",
25526
25768
  borderRadius: "50%",
25527
25769
  top: "-2px",
25528
- left: "-1%",
25770
+ left: "-1%"
25529
25771
  },
25530
25772
  ".tgl-flat:checked+.tgl-slider:after": {
25531
25773
  left: "62%",
25532
- background: "var(--color3)",
25774
+ background: "var(--color3)"
25533
25775
  },
25534
25776
  ".form-control": {
25535
25777
  backgroundColor: "transparent",
@@ -25538,7 +25780,7 @@ exports.ArcwareStyles = {
25538
25780
  color: "var(--color13)",
25539
25781
  textAlign: "left",
25540
25782
  fontFamily: "inherit",
25541
- padding: "5px 15px ",
25783
+ padding: "5px 15px "
25542
25784
  },
25543
25785
  ".btn-flat": {
25544
25786
  background: "var(--color3)",
@@ -25548,31 +25790,62 @@ exports.ArcwareStyles = {
25548
25790
  cursor: "pointer",
25549
25791
  borderRadius: "4px",
25550
25792
  textTransform: "uppercase",
25551
- minWidth: "175px",
25793
+ minWidth: "175px"
25552
25794
  },
25553
25795
  ".btn-flat:disabled": {
25554
25796
  background: "var(--color7)",
25555
25797
  borderColor: "var(--color3)",
25556
25798
  color: "var(--color3)",
25557
- cursor: "default",
25799
+ cursor: "default"
25558
25800
  },
25559
25801
  ".btn-flat:focus": {
25560
- outline: "none",
25802
+ outline: "none"
25561
25803
  },
25562
25804
  ".arcware-logo-loader": {
25563
25805
  position: "relative",
25564
- display: "block",
25806
+ display: "flex",
25807
+ alignItems: "center",
25808
+ justifyContent: "center",
25565
25809
  width: "12.5%",
25566
25810
  height: "12.5%",
25811
+ margin: "0 auto",
25812
+ boxSizing: "border-box"
25813
+ },
25814
+ // image rendering + centering inside the box
25815
+ ".arcware-logo-loader img": {
25816
+ maxWidth: "40%",
25817
+ maxHeight: "40%",
25818
+ objectFit: "contain",
25819
+ objectPosition: "center center",
25820
+ display: "block",
25821
+ margin: 0,
25822
+ verticalAlign: "middle"
25823
+ },
25824
+ // fade stays the same
25825
+ ".arcware-logo-loader.pulse img": {
25826
+ animation: "aw-loader-fade var(--aw-fade,1200ms) ease-in-out infinite alternate"
25827
+ },
25828
+ ".arcware-logo-loader.aw-custom-loader": {
25829
+ width: "auto !important",
25830
+ height: "auto !important"
25831
+ },
25832
+ ".arcware-logo-loader.aw-custom-loader img": {
25833
+ display: "block",
25834
+ width: "auto",
25835
+ height: "auto",
25836
+ maxWidth: "80%",
25837
+ maxHeight: "80%",
25838
+ objectFit: "contain",
25839
+ margin: "0 auto" // ensure horizontal centering inside the loader
25567
25840
  },
25568
25841
  "#playOverlay img#playButton": {
25569
- width: "5%",
25842
+ width: "5%"
25570
25843
  },
25571
25844
  "#disconnectOverlay, #errorOverlay": {
25572
25845
  textTransform: "initial",
25573
25846
  textAlign: "center",
25574
25847
  fontSize: "20px",
25575
- lineHeight: 2.5,
25848
+ lineHeight: 2.5
25576
25849
  },
25577
25850
  "#disconnectOverlay .clickableState": {
25578
25851
  textTransform: "initial",
@@ -25582,13 +25855,13 @@ exports.ArcwareStyles = {
25582
25855
  fontSize: "18px",
25583
25856
  border: "1px solid #DAF693",
25584
25857
  margin: "25px auto 0",
25585
- width: "180px",
25858
+ width: "180px"
25586
25859
  },
25587
25860
  "#afkOverlay": {
25588
25861
  background: "none",
25589
25862
  transition: "all ease-in-out 0.5s",
25590
25863
  opacity: 1,
25591
- pointerEvents: "initial",
25864
+ pointerEvents: "initial"
25592
25865
  },
25593
25866
  "#afkOverlayInner": {
25594
25867
  textTransform: "initial",
@@ -25597,18 +25870,18 @@ exports.ArcwareStyles = {
25597
25870
  fontSize: "18px",
25598
25871
  width: "360px",
25599
25872
  textAlign: "center",
25600
- lineHeight: 2.5,
25873
+ lineHeight: 2.5
25601
25874
  },
25602
25875
  "#afkOverlayInner center::first-line": {
25603
25876
  textTransform: "uppercase",
25604
25877
  color: "#FF8461",
25605
25878
  fontWeight: "bold",
25606
- fontSize: "24px",
25879
+ fontSize: "24px"
25607
25880
  },
25608
25881
  "#afkOverlayInner #afkCountDownNumber": {
25609
25882
  color: "#DAF693",
25610
25883
  fontSize: "26px",
25611
- lineHeight: "22px",
25884
+ lineHeight: "22px"
25612
25885
  },
25613
25886
  "#afkOverlayInner center .retry-button": {
25614
25887
  textTransform: "initial",
@@ -25618,7 +25891,7 @@ exports.ArcwareStyles = {
25618
25891
  fontSize: "18px",
25619
25892
  border: "1px solid #DAF693",
25620
25893
  margin: "25px auto 0",
25621
- width: "180px",
25894
+ width: "180px"
25622
25895
  },
25623
25896
  "#connectOverlay #connectButton": {
25624
25897
  textTransform: "initial",
@@ -25628,33 +25901,33 @@ exports.ArcwareStyles = {
25628
25901
  fontSize: "18px",
25629
25902
  border: "1px solid #DAF693",
25630
25903
  margin: "25px auto 0",
25631
- width: "180px",
25904
+ width: "180px"
25632
25905
  },
25633
25906
  "#connectOverlay .connection-text": {
25634
25907
  textTransform: "initial",
25635
25908
  textAlign: "center",
25636
- margin: "25px auto 0",
25909
+ margin: "25px auto 0"
25637
25910
  },
25638
25911
  "#connectOverlay .connection-text .title": {
25639
25912
  color: "#ffffff",
25640
25913
  fontSize: "18px",
25641
- margin: "5px 0",
25914
+ margin: "5px 0"
25642
25915
  },
25643
25916
  "#connectOverlay .connection-text .subtitle": {
25644
25917
  color: "#ffffff",
25645
25918
  opacity: 0.5,
25646
25919
  fontSize: "12px",
25647
- margin: "10px 0",
25920
+ margin: "10px 0"
25648
25921
  },
25649
25922
  "#infoOverlay.hiddenState": {
25650
- display: "none",
25923
+ display: "none"
25651
25924
  },
25652
25925
  "#disconnectOverlay, #playOverlay, #errorOverlay, #microphoneOverlay, #connectOverlay": {
25653
25926
  background: "#18181A",
25654
25927
  display: "flex",
25655
25928
  transition: "all ease-in-out 0.5s",
25656
25929
  opacity: 1,
25657
- pointerEvents: "initial",
25930
+ pointerEvents: "initial"
25658
25931
  },
25659
25932
  "#microphoneOverlay": {
25660
25933
  textTransform: "initial",
@@ -25673,51 +25946,51 @@ exports.ArcwareStyles = {
25673
25946
  justifyContent: "center",
25674
25947
  alignItems: "center",
25675
25948
  flexDirection: "column",
25676
- zIndex: 99999,
25949
+ zIndex: 99999
25677
25950
  },
25678
25951
  "#microphoneOverlay .title": {
25679
25952
  fontSize: "24px",
25680
25953
  position: "relative",
25681
25954
  marginBottom: "20px",
25682
- color: "#F0F0F2",
25955
+ color: "#F0F0F2"
25683
25956
  },
25684
25957
  "#microphoneOverlay .title:after": {
25685
25958
  content: "''",
25686
25959
  display: "inline-block",
25687
25960
  animation: "dotty steps(1,end) 1s infinite",
25688
- position: "absolute",
25961
+ position: "absolute"
25689
25962
  },
25690
25963
  "#microphoneOverlay p": {
25691
25964
  margin: 0,
25692
- color: "#858588",
25965
+ color: "#858588"
25693
25966
  },
25694
25967
  "#microphoneOverlay svg": {
25695
25968
  height: "65px",
25696
25969
  marginBottom: "15px",
25697
- marginTop: "-5px",
25970
+ marginTop: "-5px"
25698
25971
  },
25699
25972
  "#microphoneOverlay .svgIcon": {
25700
- fill: "#DAF693",
25973
+ fill: "#DAF693"
25701
25974
  },
25702
25975
  "#disconnectOverlay.hiddenState, #playOverlay.hiddenState, #errorOverlay.hiddenState, #afkOverlay.hiddenState, #microphoneOverlay.hiddenState": {
25703
25976
  opacity: 0,
25704
- pointerEvents: "none",
25977
+ pointerEvents: "none"
25705
25978
  },
25706
25979
  "#disconnectOverlay.mic-overlay-is-visible, #errorOverlay.mic-overlay-is-visible, #infoOverlay.mic-overlay-is-visible": {
25707
25980
  opacity: 0,
25708
- pointerEvents: "none",
25981
+ pointerEvents: "none"
25709
25982
  },
25710
25983
  "#infoOverlay.hiddenState, #connectOverlay.hiddenState": {
25711
- display: "none",
25984
+ display: "none"
25712
25985
  },
25713
25986
  "#connectOverlay": {
25714
25987
  display: "flex",
25715
25988
  flexDirection: "column-reverse",
25716
25989
  alignItems: "center",
25717
- justifyContent: "center",
25990
+ justifyContent: "center"
25718
25991
  },
25719
25992
  "#infoOverlay": {
25720
- display: "none",
25993
+ display: "none"
25721
25994
  },
25722
25995
  ".love-letters-box-root": {
25723
25996
  display: "flex",
@@ -25729,11 +26002,11 @@ exports.ArcwareStyles = {
25729
26002
  alignItems: "center",
25730
26003
  flexDirection: "column",
25731
26004
  background: "#18181A",
25732
- zIndex: 1,
26005
+ zIndex: 1
25733
26006
  },
25734
26007
  ".love-letters-box-root.fade-out": {
25735
26008
  opacity: 0,
25736
- transition: "opacity 0.5s",
26009
+ transition: "opacity 0.5s"
25737
26010
  },
25738
26011
  "#letters-block": {
25739
26012
  position: "absolute",
@@ -25750,7 +26023,7 @@ exports.ArcwareStyles = {
25750
26023
  alignItems: "center",
25751
26024
  fontSize: "16px",
25752
26025
  textTransform: "initial",
25753
- textAlign: "center",
26026
+ textAlign: "center"
25754
26027
  },
25755
26028
  "#letters-wrapper": {
25756
26029
  height: "77px",
@@ -25761,62 +26034,88 @@ exports.ArcwareStyles = {
25761
26034
  alignItems: "center",
25762
26035
  justifyContent: "flex-end",
25763
26036
  marginTop: "10px",
25764
- paddingBottom: "2px",
26037
+ paddingBottom: "2px"
25765
26038
  },
25766
26039
  "#letters-wrapper p": {
25767
26040
  textAlign: "center",
25768
26041
  lineHeight: 1.25,
25769
- fontSize: "16px",
26042
+ fontSize: "16px"
25770
26043
  },
25771
26044
  ".letter-animation:nth-last-of-type(1)::after": {
25772
26045
  display: "inline-block",
25773
26046
  animation: "dotty steps(1,end) 1s infinite",
25774
26047
  content: "''",
25775
- position: "absolute",
26048
+ position: "absolute"
25776
26049
  },
25777
26050
  ".letter-animation": {
25778
26051
  transition: "all 0.5s ease-in-out",
25779
26052
  transformOrigin: "bottom",
25780
- margin: "0 auto",
26053
+ margin: "0 auto"
25781
26054
  },
25782
26055
  ".letter-animation-enter": {
25783
- animation: "fadeInUp 0.75s ease-out",
26056
+ animation: "fadeInUp 0.75s ease-out"
25784
26057
  },
25785
26058
  ".letter-animation-exit": {
25786
26059
  opacity: 0,
25787
26060
  scale: 0.9,
25788
26061
  transition: "all ease-in-out 1s",
25789
- margin: 0,
26062
+ margin: 0
25790
26063
  },
25791
26064
  "@keyframes dotty": {
25792
26065
  "0%": { content: "''" },
25793
26066
  "25%": { content: "'.'" },
25794
26067
  "50%": { content: "'..'" },
25795
26068
  "75%": { content: "'...'" },
25796
- "100%": { content: "''" },
26069
+ "100%": { content: "''" }
25797
26070
  },
25798
26071
  "@keyframes fadeInUp": {
25799
26072
  from: {
25800
26073
  opacity: 0,
25801
26074
  transform: " translateY(5px)",
25802
- scale: 0.9,
26075
+ scale: 0.9
25803
26076
  },
25804
26077
  to: {
25805
26078
  opacity: 1,
25806
26079
  transform: "translateY(0)",
25807
- scale: 1,
25808
- },
26080
+ scale: 1
26081
+ }
25809
26082
  },
25810
26083
  ".hidden": {
25811
26084
  display: "none",
25812
- opacity: 0,
26085
+ opacity: 0
25813
26086
  },
25814
26087
  ".visible": {
25815
26088
  display: "block",
25816
26089
  opacity: 1,
25817
- transition: "opacity 1s ease-out",
26090
+ transition: "opacity 1s ease-out"
25818
26091
  },
25819
- },
26092
+ // Make the host a flex centering box
26093
+ ".love-letters-box-root .arcware-logo-loader": {
26094
+ display: "flex",
26095
+ alignItems: "center",
26096
+ justifyContent: "center"
26097
+ },
26098
+ // When a custom image is active, ignore the legacy 12.5% box
26099
+ ".love-letters-box-root .arcware-logo-loader.aw-custom-loader": {
26100
+ width: "auto !important",
26101
+ height: "auto !important"
26102
+ },
26103
+ // Size & center the <img> itself (independent of host size)
26104
+ ".love-letters-box-root .arcware-logo-loader.aw-custom-loader img": {
26105
+ display: "block",
26106
+ margin: "0 auto",
26107
+ width: "min(40vmin, 40vw)",
26108
+ height: "auto",
26109
+ objectFit: "contain",
26110
+ objectPosition: "center center"
26111
+ },
26112
+ // (optional) If you prefer the old “percentage of container” behavior:
26113
+ ".love-letters-box-root .arcware-logo-loader.aw-custom-loader img.alt-40pct": {
26114
+ width: "40%",
26115
+ maxWidth: "100%",
26116
+ height: "auto"
26117
+ }
26118
+ }
25820
26119
  };
25821
26120
 
25822
26121
 
@@ -25838,6 +26137,56 @@ class ArcwareLogoLoader {
25838
26137
  arcwareLogoLoader.innerHTML = this.getSvg();
25839
26138
  return arcwareLogoLoader;
25840
26139
  }
26140
+ /** Call this once after you create the wrapper/root that contains the SVG */
26141
+ setHostElement(el) {
26142
+ this._hostEl = el;
26143
+ }
26144
+ /** Swap the loader image at runtime; pass undefined to go back to SVG */
26145
+ setImage(url) {
26146
+ var _a, _b;
26147
+ if (!this._hostEl)
26148
+ return;
26149
+ // lazily create <img> once
26150
+ if (!this._imgEl) {
26151
+ const img = document.createElement("img");
26152
+ img.alt = "Loading";
26153
+ img.style.display = "none"; // hidden until we set a URL
26154
+ this._hostEl.appendChild(img);
26155
+ this._imgEl = img;
26156
+ }
26157
+ if (url && url.trim()) {
26158
+ (_a = this._hostEl) === null || _a === void 0 ? void 0 : _a.classList.add("aw-custom-loader");
26159
+ if (this._imgEl.src !== url)
26160
+ this._imgEl.src = url;
26161
+ // show <img>, hide SVG
26162
+ this._imgEl.style.display = "";
26163
+ const svg = this._hostEl.querySelector("svg");
26164
+ if (svg)
26165
+ svg.style.display = "none";
26166
+ }
26167
+ else {
26168
+ // no url → fall back to SVG
26169
+ (_b = this._hostEl) === null || _b === void 0 ? void 0 : _b.classList.remove("aw-custom-loader");
26170
+ this._imgEl.style.display = "none";
26171
+ const svg = this._hostEl.querySelector("svg");
26172
+ if (svg)
26173
+ svg.style.display = "";
26174
+ }
26175
+ }
26176
+ /** Enable/disable pulsing fade in ms; 0 disables */
26177
+ setFade(ms) {
26178
+ if (!this._hostEl)
26179
+ return;
26180
+ const n = Number(ms) || 0;
26181
+ if (n > 0) {
26182
+ this._hostEl.style.setProperty("--aw-fade", `${n}ms`);
26183
+ this._hostEl.classList.add("pulse"); // uses #aw-loader.pulse styles you added
26184
+ }
26185
+ else {
26186
+ this._hostEl.classList.remove("pulse");
26187
+ this._hostEl.style.removeProperty("--aw-fade");
26188
+ }
26189
+ }
25841
26190
  getSvg() {
25842
26191
  return `
25843
26192
  <svg width="42" height="80" viewBox="0 0 42 80" xmlns="http://www.w3.org/2000/svg">