@3dsource/angular-unreal-module 0.0.13 → 0.0.16

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.
@@ -2,23 +2,18 @@ import * as i0 from '@angular/core';
2
2
  import { ChangeDetectionStrategy, Component, InjectionToken, inject, Pipe, Injectable, DestroyRef, signal, ElementRef, input, HostListener, Input, ViewChild, computed, output } from '@angular/core';
3
3
  import { map, filter, catchError, first, skip as skip$1, tap, delay, takeUntil, switchMap as switchMap$1, withLatestFrom, distinctUntilChanged, debounceTime, exhaustMap } from 'rxjs/operators';
4
4
  import { Signal, Logger, clampf, generateUuid, tapLog, Truthy, calculateMedian, smoothTransition, getCanvasCached, getSnapshot, whereNot, lerp, Falsy, HEXtoRGB, RGBtoHSV, inverseLerp, HSVtoRGB, RGBtoHEX, Semaphore, COLOR_CODES, KeyboardNumericCode, InvertedKeyMap, isEmpty, where, fpIsASameAsB, fitIntoRectangle } from '@3dsource/utils';
5
- import { NgClass, NgOptimizedImage, AsyncPipe, JsonPipe, NgIf } from '@angular/common';
6
- import { SourceButtonSize, SourceButtonColorScheme, SourceButtonComponent } from '@source/ui-sdk/source-button';
5
+ import { NgClass, NgOptimizedImage, AsyncPipe, JsonPipe } from '@angular/common';
7
6
  import { toSignal, takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
8
- import { createAction, props, on, createFeature, createSelector, Store } from '@ngrx/store';
9
- import { createImmerReducer } from 'ngrx-immer/store';
7
+ import { SourceButtonComponent, SourceIconButtonComponent, SourceLoadingComponent } from '@3dsource/source-ui-native';
8
+ import { createAction, props, createReducer, on, createFeature, createSelector, Store } from '@ngrx/store';
10
9
  import { scan, timeout, of, switchMap, Observable, fromEvent, skip, share, take, from, timer, Subject, combineLatest, retryWhen, merge, tap as tap$1, interval, startWith, combineLatestWith, takeUntil as takeUntil$1, auditTime, map as map$1, EMPTY, debounceTime as debounceTime$1, BehaviorSubject, first as first$1, distinctUntilChanged as distinctUntilChanged$1, concat } from 'rxjs';
10
+ import { MetaBoxCommand } from '@3dsource/types-unreal';
11
+ import { DialogRef, DIALOG_DATA, Dialog } from '@angular/cdk/dialog';
11
12
  import { DomSanitizer } from '@angular/platform-browser';
12
- import { DialogRef, Dialog } from '@angular/cdk/dialog';
13
- import { SourceRoundButtonComponent } from '@source/ui-sdk/source-round-button';
14
13
  import { HttpClient } from '@angular/common/http';
15
14
  import { Actions, createEffect, ofType } from '@ngrx/effects';
16
15
  import { concatLatestFrom } from '@ngrx/operators';
17
- import mixpanel from 'mixpanel-browser';
18
16
  import { ScrollStrategyOptions } from '@angular/cdk/overlay';
19
- import { SourceModalComponent } from '@source/ui-sdk/source-modal';
20
- import { SourceIconComponent } from '@source/ui-sdk/source-icon';
21
- import { SourceLoadingComponent } from '@source/ui-sdk/source-loading';
22
17
  import * as i1 from '@angular/forms';
23
18
  import { FormsModule } from '@angular/forms';
24
19
 
@@ -75,19 +70,18 @@ function fromUnrealCallBackSignal(command) {
75
70
 
76
71
  class ClickableOverlayComponent {
77
72
  constructor() {
78
- this.SourceButtonSize = SourceButtonSize;
79
- this.SourceButtonColorScheme = SourceButtonColorScheme;
80
73
  this.state = toSignal(fromSignal(UnrealInternalSignalEvents.ClickableOverlay).pipe(map((data) => (typeof data === 'object' ? data : null))));
81
74
  }
82
75
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: ClickableOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
83
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.8", type: ClickableOverlayComponent, isStandalone: true, selector: "app-clickable-overlay", ngImport: i0, template: "@if (state()) {\n <div\n (click)=\"state()?.onOverlayClick()\"\n [ngClass]=\"state()?.className\"\n id=\"videoPlayOverlay\"\n >\n @if (state()?.isActivityDetected) {\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"state()?.message\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [colorScheme]=\"SourceButtonColorScheme.PRIMARY\"\n [isFullWidth]=\"true\"\n [size]=\"SourceButtonSize.LARGE\"\n [data-testid]=\"'continue-session'\"\n >\n Continue\n </src-button>\n </div>\n }\n </div>\n}\n", styles: ["#videoPlayOverlay{position:absolute;z-index:30;top:0;width:100%;height:100%;font-size:1.8em;font-family:var(--inputFont);color:var(--colour4);background-color:#646464b3}.clickableState{display:flex;justify-content:center;align-items:center;cursor:pointer}.textDisplayState{display:flex}.hiddenState{display:none}.resume-box{width:340px;padding:32px 20px 20px;flex-direction:column;align-items:center;border-radius:var(--br-medium, 8px);background:var(--color-bg-default, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box .resume-box__pic{width:72px;height:72px;margin:0 auto 22px;border-radius:48px;background:#ecf0f2;padding:12px;display:flex;align-items:center;justify-content:center}.resume-box .resume-box__pic .text-number{color:var(--colors-text-default, #1f2937);text-align:center;font-family:var(--font-family-sans);font-size:30px;font-style:normal;font-weight:400;line-height:24px}.resume-box__text{margin-bottom:18px}.resume-box__text p{text-align:center;font-family:var(--font-family-sans);font-size:var(--fs-base);font-style:normal;font-weight:400;line-height:24px;color:var(--colors-gray-color-gray-500, #6b7280)}.resume-box__text .resume-box__heading{color:var(--color-text-default, #1f2937);text-align:center;font-family:var(--font-family-serif);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "colorScheme", "size", "customClass", "hasDisclosure", "isFullWidth", "iconPrefix", "iconButton", "icon", "isPressed", "isDisabled", "isLoading", "label", "formID", "srcButtonConfig", "data-testid"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
76
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.8", type: ClickableOverlayComponent, isStandalone: true, selector: "app-clickable-overlay", ngImport: i0, template: "@if (state()) {\n <div\n (click)=\"state()?.onOverlayClick()\"\n [ngClass]=\"state()?.className\"\n id=\"videoPlayOverlay\"\n >\n @if (state()?.isActivityDetected) {\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"state()?.message\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [colorScheme]=\"'primary'\"\n [isFullWidth]=\"true\"\n [size]=\"'large'\"\n [data-testid]=\"'continue-session'\"\n >\n Continue\n </src-button>\n </div>\n }\n </div>\n}\n", styles: ["#videoPlayOverlay{position:absolute;z-index:30;top:0;width:100%;height:100%;font-size:1.8em;font-family:var(--inputFont);color:var(--colour4);background-color:#646464b3}.clickableState{display:flex;justify-content:center;align-items:center;cursor:pointer}.textDisplayState{display:flex}.hiddenState{display:none}.resume-box{width:340px;padding:32px 20px 20px;flex-direction:column;align-items:center;border-radius:var(--br-medium, 8px);background:var(--color-bg-default, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box .resume-box__pic{width:72px;height:72px;margin:0 auto 22px;border-radius:48px;background:#ecf0f2;padding:12px;display:flex;align-items:center;justify-content:center}.resume-box .resume-box__pic .text-number{color:var(--colors-text-default, #1f2937);text-align:center;font-family:var(--font-family-sans);font-size:30px;font-style:normal;font-weight:400;line-height:24px}.resume-box__text{margin-bottom:18px}.resume-box__text p{text-align:center;font-family:var(--font-family-sans);font-size:var(--fs-base);font-style:normal;font-weight:400;line-height:24px;color:var(--colors-gray-color-gray-500, #6b7280)}.resume-box__text .resume-box__heading{color:var(--color-text-default, #1f2937);text-align:center;font-family:var(--font-family-serif);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "colorScheme", "size", "customClass", "hasDisclosure", "isFullWidth", "isPressed", "isDisabled", "isLoading", "iconButton", "icon", "formID", "srcButtonConfig", "data-testid"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
84
77
  }
85
78
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: ClickableOverlayComponent, decorators: [{
86
79
  type: Component,
87
- args: [{ selector: 'app-clickable-overlay', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgClass, SourceButtonComponent], template: "@if (state()) {\n <div\n (click)=\"state()?.onOverlayClick()\"\n [ngClass]=\"state()?.className\"\n id=\"videoPlayOverlay\"\n >\n @if (state()?.isActivityDetected) {\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"state()?.message\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [colorScheme]=\"SourceButtonColorScheme.PRIMARY\"\n [isFullWidth]=\"true\"\n [size]=\"SourceButtonSize.LARGE\"\n [data-testid]=\"'continue-session'\"\n >\n Continue\n </src-button>\n </div>\n }\n </div>\n}\n", styles: ["#videoPlayOverlay{position:absolute;z-index:30;top:0;width:100%;height:100%;font-size:1.8em;font-family:var(--inputFont);color:var(--colour4);background-color:#646464b3}.clickableState{display:flex;justify-content:center;align-items:center;cursor:pointer}.textDisplayState{display:flex}.hiddenState{display:none}.resume-box{width:340px;padding:32px 20px 20px;flex-direction:column;align-items:center;border-radius:var(--br-medium, 8px);background:var(--color-bg-default, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box .resume-box__pic{width:72px;height:72px;margin:0 auto 22px;border-radius:48px;background:#ecf0f2;padding:12px;display:flex;align-items:center;justify-content:center}.resume-box .resume-box__pic .text-number{color:var(--colors-text-default, #1f2937);text-align:center;font-family:var(--font-family-sans);font-size:30px;font-style:normal;font-weight:400;line-height:24px}.resume-box__text{margin-bottom:18px}.resume-box__text p{text-align:center;font-family:var(--font-family-sans);font-size:var(--fs-base);font-style:normal;font-weight:400;line-height:24px;color:var(--colors-gray-color-gray-500, #6b7280)}.resume-box__text .resume-box__heading{color:var(--color-text-default, #1f2937);text-align:center;font-family:var(--font-family-serif);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}\n"] }]
80
+ args: [{ selector: 'app-clickable-overlay', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgClass, SourceButtonComponent], template: "@if (state()) {\n <div\n (click)=\"state()?.onOverlayClick()\"\n [ngClass]=\"state()?.className\"\n id=\"videoPlayOverlay\"\n >\n @if (state()?.isActivityDetected) {\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"state()?.message\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [colorScheme]=\"'primary'\"\n [isFullWidth]=\"true\"\n [size]=\"'large'\"\n [data-testid]=\"'continue-session'\"\n >\n Continue\n </src-button>\n </div>\n }\n </div>\n}\n", styles: ["#videoPlayOverlay{position:absolute;z-index:30;top:0;width:100%;height:100%;font-size:1.8em;font-family:var(--inputFont);color:var(--colour4);background-color:#646464b3}.clickableState{display:flex;justify-content:center;align-items:center;cursor:pointer}.textDisplayState{display:flex}.hiddenState{display:none}.resume-box{width:340px;padding:32px 20px 20px;flex-direction:column;align-items:center;border-radius:var(--br-medium, 8px);background:var(--color-bg-default, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box .resume-box__pic{width:72px;height:72px;margin:0 auto 22px;border-radius:48px;background:#ecf0f2;padding:12px;display:flex;align-items:center;justify-content:center}.resume-box .resume-box__pic .text-number{color:var(--colors-text-default, #1f2937);text-align:center;font-family:var(--font-family-sans);font-size:30px;font-style:normal;font-weight:400;line-height:24px}.resume-box__text{margin-bottom:18px}.resume-box__text p{text-align:center;font-family:var(--font-family-sans);font-size:var(--fs-base);font-style:normal;font-weight:400;line-height:24px;color:var(--colors-gray-color-gray-500, #6b7280)}.resume-box__text .resume-box__heading{color:var(--color-text-default, #1f2937);text-align:center;font-family:var(--font-family-serif);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}\n"] }]
88
81
  }] });
89
82
 
90
83
  const scoped = (templateString) => `[UNREAL] ${templateString[0]}`;
84
+ const trackMixpanelEvent = createAction(scoped `track mixpanel event`, props());
91
85
  const changeLowBandwidth = createAction(scoped `change low bandwidth`, props());
92
86
  const setMaxFps = createAction(scoped `change fps`, props());
93
87
  const destroyRemoteConnections = createAction(scoped `destroyRemoteConnections`, props());
@@ -147,14 +141,6 @@ const DisconnectReason = {
147
141
  dataChannelTimeout: 'dataChannelTimeout',
148
142
  };
149
143
 
150
- const MixPanelEvents = {
151
- pixelstreaming_end: 'pixelstreaming_end',
152
- pixelstreaming_start: 'pixelstreaming_start',
153
- render_request: 'render_request',
154
- custom_click: 'custom_click',
155
- route_change: 'route_change',
156
- };
157
-
158
144
  /*
159
145
  export interface RequestReservation extends InstanceMessageBase {
160
146
  type: 'requestReservation';
@@ -266,11 +252,6 @@ const InputOptions = {
266
252
  fakeMouseWithTouches: false,
267
253
  };
268
254
 
269
- const MIX_PANEL = {
270
- metaBoxTrack: undefined,
271
- streamTrack: undefined,
272
- };
273
-
274
255
  const UnrealStatusMessage = {
275
256
  CONNECTING_TO_SESSION: 'Connecting to session.',
276
257
  STARTING_YOUR_SESSION: 'Starting your session',
@@ -629,566 +610,6 @@ function mapQpToQuality(VideoEncoderQP) {
629
610
  return quality;
630
611
  }
631
612
 
632
- /* eslint-disable */
633
- /**
634
- * This file is auto-generated by the API parser
635
- * Please note that any changes in this file may be overwritten
636
- * Version: 2025-04-22 14:21:41
637
- /*
638
-
639
-
640
-
641
- /**
642
- @description
643
- Type of Asset for all PAKs.
644
- */
645
- var EAssetType;
646
- (function (EAssetType) {
647
- EAssetType["none"] = "none";
648
- EAssetType["product"] = "product";
649
- EAssetType["material"] = "material";
650
- EAssetType["environment"] = "environment";
651
- EAssetType["level"] = "level";
652
- EAssetType["camera"] = "camera";
653
- EAssetType["level_sequence"] = "level_sequence";
654
- EAssetType["screenshot"] = "screenshot";
655
- EAssetType["light"] = "light";
656
- })(EAssetType || (EAssetType = {}));
657
- /**
658
- @description
659
- Dimension type.
660
- */
661
- var EDimensionType;
662
- (function (EDimensionType) {
663
- EDimensionType["none"] = "none";
664
- EDimensionType["millimeter"] = "millimeter";
665
- EDimensionType["centimeter"] = "centimeter";
666
- EDimensionType["meter"] = "meter";
667
- EDimensionType["kilometer"] = "kilometer";
668
- EDimensionType["inch"] = "inch";
669
- EDimensionType["duim"] = "duim";
670
- EDimensionType["yard"] = "yard";
671
- EDimensionType["miles"] = "miles";
672
- })(EDimensionType || (EDimensionType = {}));
673
- /**
674
- @description
675
- SequenceLoopBehavior.
676
- */
677
- var ESequenceLoopBehavior;
678
- (function (ESequenceLoopBehavior) {
679
- ESequenceLoopBehavior["none"] = "none";
680
- ESequenceLoopBehavior["loop"] = "loop";
681
- ESequenceLoopBehavior["pingPong"] = "pingPong";
682
- ESequenceLoopBehavior["loopSection"] = "loopSection";
683
- ESequenceLoopBehavior["pingPongSection"] = "pingPongSection";
684
- })(ESequenceLoopBehavior || (ESequenceLoopBehavior = {}));
685
- /**
686
- @description
687
- Items types that can be placed in scene.
688
- */
689
- var ESceneItemType;
690
- (function (ESceneItemType) {
691
- ESceneItemType["products"] = "products";
692
- ESceneItemType["lights"] = "lights";
693
- ESceneItemType["pawn"] = "pawn";
694
- })(ESceneItemType || (ESceneItemType = {}));
695
- /**
696
- @description
697
- Measure axis position.
698
- */
699
- var EMeasureAxisZPosition;
700
- (function (EMeasureAxisZPosition) {
701
- EMeasureAxisZPosition["front"] = "front";
702
- EMeasureAxisZPosition["left"] = "left";
703
- EMeasureAxisZPosition["right"] = "right";
704
- EMeasureAxisZPosition["leftRight"] = "leftRight";
705
- EMeasureAxisZPosition["back"] = "back";
706
- })(EMeasureAxisZPosition || (EMeasureAxisZPosition = {}));
707
- /**
708
- @description
709
- Measure axis position.
710
- */
711
- var EPaddingUnit;
712
- (function (EPaddingUnit) {
713
- EPaddingUnit["pixel"] = "pixel";
714
- EPaddingUnit["cm"] = "cm";
715
- })(EPaddingUnit || (EPaddingUnit = {}));
716
- /**
717
- @description
718
- Curve type.
719
- */
720
- var ECurve;
721
- (function (ECurve) {
722
- ECurve["linear"] = "linear";
723
- ECurve["inSine"] = "inSine";
724
- ECurve["outSine"] = "outSine";
725
- ECurve["inOutSine"] = "inOutSine";
726
- ECurve["inQuad"] = "inQuad";
727
- ECurve["outQuad"] = "outQuad";
728
- ECurve["inOutQuad"] = "inOutQuad";
729
- ECurve["inCubic"] = "inCubic";
730
- ECurve["outCubic"] = "outCubic";
731
- ECurve["inOutCubic"] = "inOutCubic";
732
- ECurve["inQuart"] = "inQuart";
733
- ECurve["outQuart"] = "outQuart";
734
- ECurve["inOutQuart"] = "inOutQuart";
735
- ECurve["inQuint"] = "inQuint";
736
- ECurve["outQuint"] = "outQuint";
737
- ECurve["inOutQuint"] = "inOutQuint";
738
- ECurve["inExpo"] = "inExpo";
739
- ECurve["outExpo"] = "outExpo";
740
- ECurve["inOutExpo"] = "inOutExpo";
741
- ECurve["inCirc"] = "inCirc";
742
- ECurve["outCirc"] = "outCirc";
743
- ECurve["inOutCirc"] = "inOutCirc";
744
- ECurve["inBack"] = "inBack";
745
- ECurve["outBack"] = "outBack";
746
- ECurve["inOutBack"] = "inOutBack";
747
- ECurve["inElastic"] = "inElastic";
748
- ECurve["outElastic"] = "outElastic";
749
- ECurve["inOutElastic"] = "inOutElastic";
750
- ECurve["inBounce"] = "inBounce";
751
- ECurve["outBounce"] = "outBounce";
752
- ECurve["inOutBounce"] = "inOutBounce";
753
- })(ECurve || (ECurve = {}));
754
- /**
755
- @description
756
- Fit options.
757
- */
758
- var EFitMethod;
759
- (function (EFitMethod) {
760
- EFitMethod["none"] = "none";
761
- EFitMethod["byLocation"] = "byLocation";
762
- EFitMethod["byRotation"] = "byRotation";
763
- EFitMethod["top"] = "top";
764
- EFitMethod["bottom"] = "bottom";
765
- EFitMethod["front"] = "front";
766
- EFitMethod["back"] = "back";
767
- EFitMethod["right"] = "right";
768
- EFitMethod["left"] = "left";
769
- })(EFitMethod || (EFitMethod = {}));
770
- /**
771
- @description
772
- Movement allowance along specified axis.
773
- */
774
- var EMovementAllowance;
775
- (function (EMovementAllowance) {
776
- EMovementAllowance["none"] = "none";
777
- EMovementAllowance["planeYZ"] = "planeYZ";
778
- EMovementAllowance["planeXY"] = "planeXY";
779
- EMovementAllowance["planeXZ"] = "planeXZ";
780
- EMovementAllowance["axisX"] = "axisX";
781
- EMovementAllowance["axisY"] = "axisY";
782
- EMovementAllowance["axisZ"] = "axisZ";
783
- })(EMovementAllowance || (EMovementAllowance = {}));
784
- /**
785
- @description
786
- Alignment options.
787
- */
788
- var EAlignment;
789
- (function (EAlignment) {
790
- EAlignment["byBottomSide"] = "byBottomSide";
791
- EAlignment["byTopSide"] = "byTopSide";
792
- EAlignment["byFrontSide"] = "byFrontSide";
793
- EAlignment["byBackSide"] = "byBackSide";
794
- EAlignment["byRightSide"] = "byRightSide";
795
- EAlignment["byLeftSide"] = "byLeftSide";
796
- })(EAlignment || (EAlignment = {}));
797
- /**
798
- @description
799
- Gizmo type.
800
- */
801
- var EGizmoType;
802
- (function (EGizmoType) {
803
- EGizmoType["translation"] = "translation";
804
- EGizmoType["rotation"] = "rotation";
805
- EGizmoType["scale"] = "scale";
806
- EGizmoType["none"] = "none";
807
- })(EGizmoType || (EGizmoType = {}));
808
- /**
809
- @description
810
- Pawn camera control mode.
811
- */
812
- var EControlMode;
813
- (function (EControlMode) {
814
- EControlMode["none"] = "none";
815
- EControlMode["select"] = "select";
816
- EControlMode["orbit"] = "orbit";
817
- EControlMode["pan"] = "pan";
818
- EControlMode["dolly"] = "dolly";
819
- })(EControlMode || (EControlMode = {}));
820
- /**
821
- @description
822
- Pawn movement mode.
823
- */
824
- var EPawnMovementMode;
825
- (function (EPawnMovementMode) {
826
- EPawnMovementMode["none"] = "none";
827
- EPawnMovementMode["around"] = "around";
828
- EPawnMovementMode["aroundBlocking"] = "aroundBlocking";
829
- EPawnMovementMode["walk"] = "walk";
830
- EPawnMovementMode["aroundObstacles"] = "aroundObstacles";
831
- EPawnMovementMode["productsControl"] = "productsControl";
832
- })(EPawnMovementMode || (EPawnMovementMode = {}));
833
- /**
834
- @description
835
- Light mode.
836
- */
837
- var ELightMode;
838
- (function (ELightMode) {
839
- ELightMode["NONE"] = "NONE";
840
- ELightMode["RECT"] = "RECT";
841
- ELightMode["PANEL"] = "PANEL";
842
- })(ELightMode || (ELightMode = {}));
843
- /**
844
- @description
845
- Rectangle light type.
846
- */
847
- var ERectLightType;
848
- (function (ERectLightType) {
849
- ERectLightType["rect"] = "rect";
850
- ERectLightType["circ"] = "circ";
851
- ERectLightType["hexa"] = "hexa";
852
- })(ERectLightType || (ERectLightType = {}));
853
- /**
854
- @deprecated
855
- Don't need anymore.
856
-
857
- All deprecated properties marked as optional. Use with care!
858
-
859
- @description
860
- App type.
861
- */
862
- var EAppType;
863
- (function (EAppType) {
864
- EAppType["none"] = "none";
865
- EAppType["platform"] = "platform";
866
- EAppType["metabox"] = "metabox";
867
- EAppType["vps"] = "vps";
868
- EAppType["abg"] = "abg";
869
- EAppType["htmx"] = "htmx";
870
- EAppType["proampac"] = "proampac";
871
- })(EAppType || (EAppType = {}));
872
- /**
873
- @description
874
- DLSS mode.
875
- */
876
- var EDlssMode;
877
- (function (EDlssMode) {
878
- EDlssMode["Off"] = "Off";
879
- EDlssMode["Auto"] = "Auto";
880
- EDlssMode["DLAA"] = "DLAA";
881
- EDlssMode["UltraQuality"] = "UltraQuality";
882
- EDlssMode["Quality"] = "Quality";
883
- EDlssMode["Balanced"] = "Balanced";
884
- EDlssMode["Performance"] = "Performance";
885
- })(EDlssMode || (EDlssMode = {}));
886
- var MetaBoxCommand;
887
- (function (MetaBoxCommand) {
888
- /**
889
- @deprecated
890
- No need
891
- */
892
- MetaBoxCommand["FLoadPaksInMemoryCommand"] = "loadPaksInMemory";
893
- MetaBoxCommand["FSetDlssModeCommand"] = "setDlssMode";
894
- MetaBoxCommand["FLoadProductCommand"] = "loadProduct";
895
- /**
896
- @deprecated
897
- Use {@link FLoadProductCommand}
898
- */
899
- MetaBoxCommand["FSelectProductCommand"] = "selectProduct";
900
- /**
901
- @deprecated
902
- Use {@link FUnLoadProductByObjectNameCommand}
903
- */
904
- MetaBoxCommand["FUnLoadProductCommand"] = "unLoadProduct";
905
- /**
906
- @deprecated
907
- Use {@link FUnLoadProductCommand}
908
- */
909
- MetaBoxCommand["FRemoveProductCommand"] = "removeProduct";
910
- MetaBoxCommand["FUnLoadProductByObjectNameCommand"] = "unLoadProductByObjectName";
911
- /**
912
- @deprecated
913
- Use {@link FUnLoadProductByObjectNameCommand}
914
- */
915
- MetaBoxCommand["FRemoveProductInSceneCommand"] = "removeProductInScene";
916
- MetaBoxCommand["FUnLoadAllProductsCommand"] = "unLoadAllProducts";
917
- /**
918
- @deprecated
919
- Use {@link FUnLoadAllProductsCommand}
920
- */
921
- MetaBoxCommand["FRemoveAllProductsCommand"] = "removeAllProducts";
922
- MetaBoxCommand["FSetFlyingMeshCommand"] = "setFlyingMesh";
923
- MetaBoxCommand["FLoadLevelCommand"] = "loadLevel";
924
- MetaBoxCommand["FUnLoadLevelCommand"] = "unLoadLevel";
925
- /**
926
- @deprecated
927
- Use {@link FUnLoadLevelCommand}
928
- */
929
- MetaBoxCommand["FHideLevelCommand"] = "hideLevel";
930
- MetaBoxCommand["FUnLoadAllLevelsCommand"] = "unLoadAllLevels";
931
- /**
932
- @deprecated
933
- Use {@link FUnLoadAllLevelsCommand}
934
- */
935
- MetaBoxCommand["FHideAllLevelsCommand"] = "hideAllLevels";
936
- MetaBoxCommand["FSetMaterialCommand"] = "setMaterial";
937
- MetaBoxCommand["FSetFlyingMaterialCommand"] = "setFlyingMaterial";
938
- MetaBoxCommand["FPlayAnimationCommand"] = "playAnimation";
939
- MetaBoxCommand["FLoadButtonCommand"] = "loadButton";
940
- MetaBoxCommand["FUnLoadButtonByObjectNameCommand"] = "unLoadButtonByObjectName";
941
- MetaBoxCommand["FUnLoadAllButtonsCommand"] = "unLoadAllButtons";
942
- MetaBoxCommand["FSetButtonScaleCommand"] = "setButtonScale";
943
- MetaBoxCommand["FRequestUnwrapImageCommand"] = "requestUnwrapImage";
944
- MetaBoxCommand["FLoadMeasureCommand"] = "loadMeasure";
945
- MetaBoxCommand["FUnLoadMeasureByObjectNameCommand"] = "unLoadMeasureByObjectName";
946
- MetaBoxCommand["FUnLoadAllMeasuresCommand"] = "unLoadAllMeasures";
947
- MetaBoxCommand["FGetAssetsInPakCommand"] = "getAssetsInPak";
948
- MetaBoxCommand["FChangeGizmoTypeCommand"] = "changeGizmoType";
949
- MetaBoxCommand["FSetSelectionSettingsCommand"] = "setSelectionSettings";
950
- MetaBoxCommand["FDragCommand"] = "drag";
951
- MetaBoxCommand["FDropCommand"] = "drop";
952
- /**
953
- @deprecated
954
- Use {@link FFitToObjectsCommand}
955
- */
956
- MetaBoxCommand["FFitCommand"] = "fit";
957
- MetaBoxCommand["FFitToObjectsCommand"] = "fitToObjects";
958
- MetaBoxCommand["FFitToObjectsByBSphereCommand"] = "fitToObjectsByBSphere";
959
- MetaBoxCommand["FFitToObjectsByBBoxCommand"] = "fitToObjectsByBBox";
960
- /**
961
- @deprecated
962
- Use {@link FSelectProductByObjectNameCommand}
963
- */
964
- MetaBoxCommand["FSelectProductInSceneCommand"] = "selectProductInScene";
965
- MetaBoxCommand["FSelectProductByObjectNameCommand"] = "selectProductByObjectName";
966
- MetaBoxCommand["FUnselectAllProductsCommand"] = "unselectAllProducts";
967
- MetaBoxCommand["FMoveSelectedCommand"] = "moveSelected";
968
- MetaBoxCommand["FMoveProductByObjectNameCommand"] = "moveProductByObjectName";
969
- MetaBoxCommand["FSetProductsLocationCommand"] = "setProductsLocation";
970
- MetaBoxCommand["FAlignProductsToPlaneCommand"] = "alignProductsToPlane";
971
- MetaBoxCommand["FRotateSelectedCommand"] = "rotateSelected";
972
- MetaBoxCommand["FRotateObjectNameCommand"] = "rotateObjectName";
973
- MetaBoxCommand["FRotateActorByTagCommand"] = "rotateActorByTag";
974
- /**
975
- @deprecated
976
- Use {@link FUnloadSelectedProductCommand}
977
- */
978
- MetaBoxCommand["FRemoveFocusedCommand"] = "removeFocused";
979
- MetaBoxCommand["FUnloadSelectedProductCommand"] = "unloadSelectedProduct";
980
- MetaBoxCommand["FAttachActorCommand"] = "attachActor";
981
- MetaBoxCommand["FDetachActorCommand"] = "detachActor";
982
- MetaBoxCommand["FDetachAllActorsCommand"] = "detachAllActors";
983
- MetaBoxCommand["FMoveAttachedActorsInSocketCommand"] = "moveAttachedActorsInSocket";
984
- MetaBoxCommand["FEnableTeleportCommand"] = "enableTeleport";
985
- MetaBoxCommand["FSetPawnMovementModeCommand"] = "setPawnMovementMode";
986
- MetaBoxCommand["FSnapAxisCommand"] = "snapAxis";
987
- MetaBoxCommand["FClickSnapCommand"] = "clickSnap";
988
- MetaBoxCommand["FPawnTransformControlCommand"] = "pawnTransformControl";
989
- MetaBoxCommand["FFlyingProductCommand"] = "flyingProduct";
990
- MetaBoxCommand["FFreezeFrameCommand"] = "freezeFrame";
991
- /**
992
- @deprecated
993
- Use {@link FControlSensitivityCommand}
994
- */
995
- MetaBoxCommand["FMouseSensitivityCommand"] = "mouseSensitivity";
996
- MetaBoxCommand["FControlSensitivityCommand"] = "controlSensitivity";
997
- MetaBoxCommand["FEnableComposureCommand"] = "enableComposure";
998
- MetaBoxCommand["FEnableCursorCommand"] = "enableCursor";
999
- MetaBoxCommand["FEnableControlsCommand"] = "enableControls";
1000
- MetaBoxCommand["FEnableSelectionByCursorCommand"] = "enableSelectionByCursor";
1001
- MetaBoxCommand["FEnableRotationByCursorCommand"] = "enableRotationByCursor";
1002
- MetaBoxCommand["FEnableZoomByCursorCommand"] = "enableZoomByCursor";
1003
- MetaBoxCommand["FEnableInteractByCursorCommand"] = "enableInteractByCursor";
1004
- MetaBoxCommand["FEnablePanByCursorCommand"] = "enablePanByCursor";
1005
- MetaBoxCommand["FEnableControlsByCursorCommand"] = "enableControlsByCursor";
1006
- MetaBoxCommand["FSetControlCameraModeCommand"] = "setControlCameraMode";
1007
- MetaBoxCommand["FSetCameraHeightCommand"] = "setCameraHeight";
1008
- MetaBoxCommand["FAddCameraHeightCommand"] = "addCameraHeight";
1009
- /**
1010
- @deprecated
1011
- Use {@link FAddCameraHeightCommand}
1012
- */
1013
- MetaBoxCommand["FMoveCameraCommand"] = "moveCamera";
1014
- MetaBoxCommand["FCameraBoxCommand"] = "cameraBox";
1015
- /**
1016
- @deprecated
1017
- Use {@link FClampPanToProductsCommand}
1018
- */
1019
- MetaBoxCommand["FClampPanToProductCommand"] = "clampPanToProduct";
1020
- MetaBoxCommand["FClampPanToProductsCommand"] = "clampPanToProducts";
1021
- MetaBoxCommand["FSetCameraControlClampsCommand"] = "setCameraControlClamps";
1022
- MetaBoxCommand["FResetControlClampsCommand"] = "resetControlClamps";
1023
- MetaBoxCommand["FCameraSettingsCommand"] = "cameraSettings";
1024
- /**
1025
- @deprecated
1026
- Use {@link FCameraSettingsCommand}
1027
- */
1028
- MetaBoxCommand["FChangeFovCommand"] = "changeFov";
1029
- MetaBoxCommand["FApplyCameraPresetCommand"] = "applyCameraPreset";
1030
- MetaBoxCommand["FSetCameraTransformCommand"] = "setCameraTransform";
1031
- MetaBoxCommand["FRequestCameraPresetCommand"] = "requestCameraPreset";
1032
- MetaBoxCommand["FCameraRecenterCommand"] = "cameraRecenter";
1033
- MetaBoxCommand["FResetZoomCommand"] = "resetZoom";
1034
- /**
1035
- @deprecated
1036
- Use {@link FResetZoomCommand}
1037
- */
1038
- MetaBoxCommand["FResetMinZoomCommand"] = "resetMinZoom";
1039
- MetaBoxCommand["FApplyZoomCommand"] = "applyZoom";
1040
- /**
1041
- @deprecated
1042
- Use {@link FApplyZoomCommand}
1043
- */
1044
- MetaBoxCommand["FZoomCommand"] = "zoom";
1045
- MetaBoxCommand["FAddPanelLightCommand"] = "addPanelLight";
1046
- MetaBoxCommand["FUpdatePanelLightCommand"] = "updatePanelLight";
1047
- MetaBoxCommand["FAddRectLightCommand"] = "addRectLight";
1048
- MetaBoxCommand["FUpdateRectLightCommand"] = "updateRectLight";
1049
- MetaBoxCommand["FRemoveLightCommand"] = "removeLight";
1050
- MetaBoxCommand["FSetHdrCommand"] = "setHdr";
1051
- MetaBoxCommand["FWeatherCommand"] = "weather";
1052
- /**
1053
- @deprecated
1054
- Use {@link FWeatherCommand}
1055
- */
1056
- MetaBoxCommand["FEnableUDSCommand"] = "enableUDS";
1057
- /**
1058
- @deprecated
1059
- Use {@link FWeatherCommand}
1060
- */
1061
- MetaBoxCommand["FTimeUDSCommand"] = "timeUDS";
1062
- /**
1063
- @deprecated
1064
- Use {@link FWeatherCommand}
1065
- */
1066
- MetaBoxCommand["FSetSunOrientationCommand"] = "setSunOrientation";
1067
- MetaBoxCommand["FEnableLightModeCommand"] = "enableLightMode";
1068
- MetaBoxCommand["FSetSettingsSequenceCommand"] = "setSettingsSequence";
1069
- MetaBoxCommand["FInitSequenceCommand"] = "initSequence";
1070
- MetaBoxCommand["FInitSequenceByObjectNameCommand"] = "initSequenceByObjectName";
1071
- MetaBoxCommand["FPlaySequenceCommand"] = "playSequence";
1072
- MetaBoxCommand["FJumpToSequenceCommand"] = "jumpToSequence";
1073
- MetaBoxCommand["FDragSequenceCommand"] = "dragSequence";
1074
- MetaBoxCommand["FPauseSequenceCommand"] = "pauseSequence";
1075
- MetaBoxCommand["FStopSequenceCommand"] = "stopSequence";
1076
- /**
1077
- @deprecated
1078
- Use {@link FPlaySequenceCommand}
1079
- */
1080
- MetaBoxCommand["FResumeSequenceCommand"] = "resumeSequence";
1081
- /**
1082
- @deprecated
1083
- Use {@link FInitSequenceCommand}, {@link FPlaySequenceCommand}
1084
- */
1085
- MetaBoxCommand["FStartSequenceCommand"] = "startSequence";
1086
- /**
1087
- @deprecated
1088
- Use {@link FTakeRenderCommand}
1089
- */
1090
- MetaBoxCommand["FTakeScreenshotCommand"] = "takeScreenshot";
1091
- MetaBoxCommand["FTakeRenderCommand"] = "takeRender";
1092
- /**
1093
- @deprecated
1094
- Use {@link FTakeLayeredRenderCommand}
1095
- */
1096
- MetaBoxCommand["FTakeLayeredScreenshotCommand"] = "takeLayeredScreenshot";
1097
- MetaBoxCommand["FTakeLayeredRenderCommand"] = "takeLayeredRender";
1098
- /**
1099
- @deprecated
1100
- Use {@link FTakeSpinnerRenderCommand}
1101
- */
1102
- MetaBoxCommand["FTake360ScreenshotCommand"] = "take360Screenshot";
1103
- /**
1104
- @deprecated
1105
- Use {@link FTakeSpinnerRenderCommand}
1106
- */
1107
- MetaBoxCommand["FTake360RenderCommand"] = "take360Render";
1108
- MetaBoxCommand["FTakeSpinnerRenderCommand"] = "takeSpinnerRender";
1109
- /**
1110
- @deprecated
1111
- Use {@link FTakeSpinnerRenderPreviewCommand}
1112
- */
1113
- MetaBoxCommand["FTake360PreviewCommand"] = "take360Preview";
1114
- MetaBoxCommand["FTakeSpinnerRenderPreviewCommand"] = "takeSpinnerRenderPreview";
1115
- /**
1116
- @deprecated
1117
- Use {@link FEnableSpinnerModeCommand}
1118
- */
1119
- MetaBoxCommand["F360EnableCommand"] = "360Enable";
1120
- /**
1121
- @deprecated
1122
- Use {@link FEnableSpinnerModeCommand}
1123
- */
1124
- MetaBoxCommand["F360DisableCommand"] = "360Disable";
1125
- MetaBoxCommand["FEnableSpinnerModeCommand"] = "enableSpinnerMode";
1126
- MetaBoxCommand["F360VerticalRotateCommand"] = "360VerticalRotate";
1127
- MetaBoxCommand["FUnDoCommand"] = "unDo";
1128
- MetaBoxCommand["FReDoCommand"] = "reDo";
1129
- MetaBoxCommand["FRequestSceneStateCommand"] = "requestSceneState";
1130
- MetaBoxCommand["FEnableSceneStateCallbackCommand"] = "enableSceneStateCallback";
1131
- /**
1132
- @deprecated
1133
- Use {@link FRequestSceneStateCommand}
1134
- */
1135
- MetaBoxCommand["FSaveSceneStateCommand"] = "saveSceneState";
1136
- MetaBoxCommand["FLoadSceneStateCommand"] = "loadSceneState";
1137
- MetaBoxCommand["FStartUndoRedoChainCommand"] = "startUndoRedoChain";
1138
- MetaBoxCommand["FAddUndoRedoChainCommand"] = "addUndoRedoChain";
1139
- /**
1140
- @deprecated
1141
- Don't need anymore.
1142
- */
1143
- MetaBoxCommand["FAppInitCommand"] = "appInit";
1144
- MetaBoxCommand["FDebugModeCommand"] = "debugMode";
1145
- MetaBoxCommand["FChangeResolutionCommand"] = "changeResolution";
1146
- MetaBoxCommand["FExecuteConsoleCommandCommand"] = "executeConsoleCommand";
1147
- MetaBoxCommand["FPingCommand"] = "ping";
1148
- MetaBoxCommand["FRestartComposeCommand"] = "restartCompose";
1149
- MetaBoxCommand["FResetSceneCommand"] = "resetScene";
1150
- MetaBoxCommand["FDatasmithToPakCommand"] = "datasmithToPak";
1151
- MetaBoxCommand["FMorphToPakCommand"] = "morphToPak";
1152
- MetaBoxCommand["FLoopBackCommand"] = "loopBack";
1153
- MetaBoxCommand["FTestCommand"] = "test";
1154
- })(MetaBoxCommand || (MetaBoxCommand = {}));
1155
- /**
1156
- * List of deprecated commands.
1157
- */
1158
- const DeprecatedCommands = [
1159
- MetaBoxCommand.FLoadPaksInMemoryCommand,
1160
- MetaBoxCommand.FSelectProductCommand,
1161
- MetaBoxCommand.FUnLoadProductCommand,
1162
- MetaBoxCommand.FRemoveProductCommand,
1163
- MetaBoxCommand.FRemoveProductInSceneCommand,
1164
- MetaBoxCommand.FRemoveAllProductsCommand,
1165
- MetaBoxCommand.FHideLevelCommand,
1166
- MetaBoxCommand.FHideAllLevelsCommand,
1167
- MetaBoxCommand.FFitCommand,
1168
- MetaBoxCommand.FSelectProductInSceneCommand,
1169
- MetaBoxCommand.FRemoveFocusedCommand,
1170
- MetaBoxCommand.FMouseSensitivityCommand,
1171
- MetaBoxCommand.FMoveCameraCommand,
1172
- MetaBoxCommand.FClampPanToProductCommand,
1173
- MetaBoxCommand.FChangeFovCommand,
1174
- MetaBoxCommand.FResetMinZoomCommand,
1175
- MetaBoxCommand.FZoomCommand,
1176
- MetaBoxCommand.FEnableUDSCommand,
1177
- MetaBoxCommand.FTimeUDSCommand,
1178
- MetaBoxCommand.FSetSunOrientationCommand,
1179
- MetaBoxCommand.FResumeSequenceCommand,
1180
- MetaBoxCommand.FStartSequenceCommand,
1181
- MetaBoxCommand.FTakeScreenshotCommand,
1182
- MetaBoxCommand.FTakeLayeredScreenshotCommand,
1183
- MetaBoxCommand.FTake360ScreenshotCommand,
1184
- MetaBoxCommand.FTake360RenderCommand,
1185
- MetaBoxCommand.FTake360PreviewCommand,
1186
- MetaBoxCommand.F360EnableCommand,
1187
- MetaBoxCommand.F360DisableCommand,
1188
- MetaBoxCommand.FSaveSceneStateCommand,
1189
- MetaBoxCommand.FAppInitCommand,
1190
- ];
1191
-
1192
613
  const getResetControlClampsCommand = () => ({
1193
614
  command: MetaBoxCommand.FResetControlClampsCommand,
1194
615
  });
@@ -1654,126 +1075,189 @@ const initialState = {
1654
1075
  imageIntroSrc: null,
1655
1076
  imageLoadingSrc: 'assets/images/avif/configurator_bg.avif',
1656
1077
  };
1657
- const unrealReducer = createImmerReducer(initialState, on(changeLowBandwidth, (state, { lowBandwidth, stats }) => {
1658
- state.lowBandwidth = lowBandwidth;
1659
- if (!lowBandwidth) {
1660
- state.lowBandwidthStats = undefined;
1661
- return state;
1662
- }
1663
- state.lowBandwidthStats = stats;
1664
- return state;
1078
+ const unrealReducer = createReducer(initialState, on(changeLowBandwidth, (state, { lowBandwidth, stats }) => {
1079
+ return {
1080
+ ...state,
1081
+ lowBandwidth: lowBandwidth,
1082
+ lowBandwidthStats: lowBandwidth ? stats : undefined,
1083
+ };
1665
1084
  }), on(changeStatusMainVideoOnScene, (state, { isVideoPlaying }) => {
1666
- state.isVideoPlaying = isVideoPlaying;
1667
- return state;
1085
+ return {
1086
+ ...state,
1087
+ isVideoPlaying: isVideoPlaying,
1088
+ };
1668
1089
  }), on(setAwsInstance, (state, awsInstance) => {
1669
- state.awsInstance = awsInstance;
1670
- return state;
1090
+ return {
1091
+ ...state,
1092
+ awsInstance: awsInstance,
1093
+ };
1671
1094
  }), on(setViewportReady, (state, { value }) => {
1672
- state.viewportReady = value;
1673
- if (value) {
1674
- state.statusMessage = null;
1675
- state.errorMessage = null;
1676
- }
1677
- return state;
1095
+ return {
1096
+ ...state,
1097
+ viewportReady: value,
1098
+ statusMessage: value ? null : state.statusMessage,
1099
+ errorMessage: value ? null : state.errorMessage,
1100
+ };
1678
1101
  }), on(updateCirrusInfo, (state, { ssInfo, ssData }) => {
1679
- state.ssInfo = ssInfo; // For back compatibility
1680
- state.ssData = ssData; //Contains all the data from the ssInfo as object
1681
- return state;
1102
+ return {
1103
+ ...state,
1104
+ ssInfo: ssInfo, // For back compatibility
1105
+ ssData: ssData, // Contains all the data from the ssInfo as object
1106
+ };
1682
1107
  }), on(changeStreamResolutionSuccessAction, (state, { width, height }) => {
1683
- state.streamResolution.width = width;
1684
- state.streamResolution.height = height;
1685
- return state;
1108
+ return {
1109
+ ...state,
1110
+ streamResolution: {
1111
+ width: width,
1112
+ height: height,
1113
+ },
1114
+ };
1686
1115
  }), on(setFreezeFrame, (state, freezeFrame) => {
1687
- if (freezeFrame.progress === 0 ||
1688
- freezeFrame.progress === 1 ||
1689
- freezeFrame.progress === null) {
1690
- state.freezeFrame.dataUrl = freezeFrame.dataUrl;
1691
- }
1692
- state.freezeFrame.progress = freezeFrame.progress || null;
1693
- return state;
1116
+ return {
1117
+ ...state,
1118
+ freezeFrame: {
1119
+ dataUrl: freezeFrame.progress === 0 ||
1120
+ freezeFrame.progress === 1 ||
1121
+ freezeFrame.progress === null
1122
+ ? freezeFrame.dataUrl
1123
+ : state.freezeFrame.dataUrl,
1124
+ progress: freezeFrame.progress || null,
1125
+ },
1126
+ };
1694
1127
  }), on(setErrorMessage, (state, errorMessage) => {
1695
1128
  if (state.dataChannelConnected) {
1696
1129
  return state;
1697
1130
  }
1698
- state.errorMessage = errorMessage;
1699
- state.statusMessage = null;
1700
- return state;
1131
+ return {
1132
+ ...state,
1133
+ errorMessage: errorMessage,
1134
+ statusMessage: null,
1135
+ };
1701
1136
  }), on(setFreezeFrameFromVideo, (state, freezeFrameFromVideo) => {
1702
- state.freezeFrameFromVideo.dataUrl = freezeFrameFromVideo.dataUrl;
1703
- state.freezeFrameFromVideo.progress = freezeFrameFromVideo.progress || null;
1704
- return state;
1137
+ return {
1138
+ ...state,
1139
+ freezeFrameFromVideo: {
1140
+ dataUrl: freezeFrameFromVideo.dataUrl,
1141
+ progress: freezeFrameFromVideo.progress || null,
1142
+ },
1143
+ };
1705
1144
  }), on(setStatusMessage, (state, { message }) => {
1706
- state.statusMessage = message;
1707
- return state;
1145
+ return {
1146
+ ...state,
1147
+ statusMessage: message,
1148
+ };
1708
1149
  }), on(setEstablishingConnection, (state, { value }) => {
1709
- state.establishingConnection = value;
1710
- return state;
1150
+ return {
1151
+ ...state,
1152
+ establishingConnection: value,
1153
+ };
1711
1154
  }), on(setStatusPercentSignallingServer, (state, { percent }) => {
1712
- state.statusPercentSignallingServer = percent;
1713
- return state;
1155
+ return {
1156
+ ...state,
1157
+ statusPercentSignallingServer: percent,
1158
+ };
1714
1159
  }), on(setDataChannelConnected, (state, { value }) => {
1715
- state.dataChannelConnected = value;
1716
- if (value) {
1717
- state.wasInitialized = true;
1718
- }
1719
- return state;
1160
+ return {
1161
+ ...state,
1162
+ dataChannelConnected: value,
1163
+ wasInitialized: value ? true : state.wasInitialized,
1164
+ };
1720
1165
  }), on(setConfig, (state, { config }) => {
1721
- state.streamConfig = { ...state.streamConfig, ...config };
1722
- return state;
1166
+ return {
1167
+ ...state,
1168
+ streamConfig: { ...state.streamConfig, ...config },
1169
+ };
1723
1170
  }), on(resetConfig, (state) => {
1724
- state.streamConfig = initialState.streamConfig;
1725
- return state;
1171
+ return {
1172
+ ...state,
1173
+ streamConfig: initialState.streamConfig,
1174
+ };
1726
1175
  }), on(resetWarnTimeout, (state) => {
1727
- state.streamConfig.warnTimeout = DEFAULT_WARN_TIMEOUT;
1728
- return state;
1176
+ return {
1177
+ ...state,
1178
+ streamConfig: {
1179
+ ...state.streamConfig,
1180
+ warnTimeout: DEFAULT_WARN_TIMEOUT,
1181
+ },
1182
+ };
1729
1183
  }), on(setCirrusConnected, (state) => {
1730
- state.cirrusConnected = true;
1731
- return state;
1184
+ return {
1185
+ ...state,
1186
+ cirrusConnected: true,
1187
+ };
1732
1188
  }), on(setCirrusDisconnected, (state) => {
1733
- state.cirrusConnected = false;
1734
- return state;
1189
+ return {
1190
+ ...state,
1191
+ cirrusConnected: false,
1192
+ };
1735
1193
  }), on(initSignalling, (state) => {
1736
- state.disconnectReason = DisconnectReason.none;
1737
- return state;
1194
+ return {
1195
+ ...state,
1196
+ disconnectReason: DisconnectReason.none,
1197
+ };
1738
1198
  }), on(setSignalingName, (state, { instanceName }) => {
1739
- state.awsInstance = { ...state.awsInstance, instanceName };
1740
- return state;
1199
+ return {
1200
+ ...state,
1201
+ awsInstance: { ...state.awsInstance, instanceName },
1202
+ };
1741
1203
  }), on(setLoopBackCommandIsCompleted, (state) => {
1742
- state.isFirstSuccessLoad = true;
1743
- return state;
1204
+ return {
1205
+ ...state,
1206
+ isFirstSuccessLoad: true,
1207
+ };
1744
1208
  }), on(setUnrealVersion, (state, { version }) => {
1745
- state.unrealVersion = version;
1746
- return state;
1209
+ return {
1210
+ ...state,
1211
+ unrealVersion: version,
1212
+ };
1747
1213
  }), on(setStreamClientCompanyId, (state, { id }) => {
1748
- state.streamClientCompanyId = id;
1749
- return state;
1214
+ return {
1215
+ ...state,
1216
+ streamClientCompanyId: id,
1217
+ };
1750
1218
  }), on(setStreamViewId, (state, { id }) => {
1751
- state.streamViewId = id;
1752
- return state;
1219
+ return {
1220
+ ...state,
1221
+ streamViewId: id,
1222
+ };
1753
1223
  }), on(setIntroImageSrc, (state, { src }) => {
1754
- state.imageIntroSrc = src;
1755
- return state;
1224
+ return {
1225
+ ...state,
1226
+ imageIntroSrc: src,
1227
+ };
1756
1228
  }), on(setLoadingImageSrc, (state, { src }) => {
1757
- state.imageLoadingSrc = src;
1758
- return state;
1229
+ return {
1230
+ ...state,
1231
+ imageLoadingSrc: src,
1232
+ };
1759
1233
  }), on(setIntroVideoSrc, (state, { src }) => {
1760
- state.videoIntroSrc = src;
1761
- return state;
1234
+ return {
1235
+ ...state,
1236
+ videoIntroSrc: src,
1237
+ };
1762
1238
  }), on(resetIntroSrc, (state) => {
1763
- state.imageIntroSrc = '';
1764
- state.videoIntroSrc = '';
1765
- return state;
1239
+ return {
1240
+ ...state,
1241
+ imageIntroSrc: '',
1242
+ videoIntroSrc: '',
1243
+ };
1766
1244
  }), on(commandStarted, (state, { id, command }) => {
1767
- state.loaderCommands.totalCommandsStarted =
1768
- state.loaderCommands.totalCommandsStarted + 1;
1769
- state.loaderCommands.commandsInProgress = [
1770
- ...state.loaderCommands.commandsInProgress,
1771
- { id, command, timeStamp: new Date().getTime() },
1772
- ];
1773
- return state;
1245
+ return {
1246
+ ...state,
1247
+ loaderCommands: {
1248
+ ...state.loaderCommands,
1249
+ totalCommandsStarted: state.loaderCommands.totalCommandsStarted + 1,
1250
+ commandsInProgress: [
1251
+ ...state.loaderCommands.commandsInProgress,
1252
+ { id, command, timeStamp: new Date().getTime() },
1253
+ ],
1254
+ },
1255
+ };
1774
1256
  }), on(commandCompleted, (state, { id }) => {
1775
- state.loaderCommands = removeExileCommands(state.loaderCommands, id);
1776
- return state;
1257
+ return {
1258
+ ...state,
1259
+ loaderCommands: removeExileCommands(state.loaderCommands, id),
1260
+ };
1777
1261
  }), on(resetUnrealState, (state) => {
1778
1262
  return {
1779
1263
  ...initialState,
@@ -1904,11 +1388,11 @@ class LowBandwidthModalComponent {
1904
1388
  this.dialogRef.close(value || false);
1905
1389
  }
1906
1390
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: LowBandwidthModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1907
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.8", type: LowBandwidthModalComponent, isStandalone: true, selector: "app-low-bandwidth-modal", ngImport: i0, template: "<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n <src-round-button\n (onClick)=\"close()\"\n [icon]=\"'close_small'\"\n [data-testid]=\"'close'\"\n class=\"src-modal__close\"\n />\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n colorScheme=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n", styles: [".src-modal--lbm{width:360px}.src-modal--lbm .src-modal__body{font-size:14px;line-height:24px}.src-modal--lbm .src-modal__buttons{display:flex;gap:8px}\n"], dependencies: [{ kind: "pipe", type: SafePipe, name: "safe" }, { kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "colorScheme", "size", "customClass", "hasDisclosure", "isFullWidth", "iconPrefix", "iconButton", "icon", "isPressed", "isDisabled", "isLoading", "label", "formID", "srcButtonConfig", "data-testid"], outputs: ["onClick", "onSubmit"] }, { kind: "component", type: SourceRoundButtonComponent, selector: "src-round-button", inputs: ["type", "size", "counter", "icon", "isDisabled", "data-testid"], outputs: ["onClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1391
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.8", type: LowBandwidthModalComponent, isStandalone: true, selector: "app-low-bandwidth-modal", ngImport: i0, template: "<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n colorScheme=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n", styles: [".src-modal--lbm{width:360px}.src-modal--lbm .src-modal__body{font-size:14px;line-height:24px}.src-modal--lbm .src-modal__buttons{display:flex;gap:8px}\n"], dependencies: [{ kind: "pipe", type: SafePipe, name: "safe" }, { kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "colorScheme", "size", "customClass", "hasDisclosure", "isFullWidth", "isPressed", "isDisabled", "isLoading", "iconButton", "icon", "formID", "srcButtonConfig", "data-testid"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1908
1392
  }
1909
1393
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: LowBandwidthModalComponent, decorators: [{
1910
1394
  type: Component,
1911
- args: [{ selector: 'app-low-bandwidth-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SafePipe, SourceButtonComponent, SourceRoundButtonComponent], template: "<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n <src-round-button\n (onClick)=\"close()\"\n [icon]=\"'close_small'\"\n [data-testid]=\"'close'\"\n class=\"src-modal__close\"\n />\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n colorScheme=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n", styles: [".src-modal--lbm{width:360px}.src-modal--lbm .src-modal__body{font-size:14px;line-height:24px}.src-modal--lbm .src-modal__buttons{display:flex;gap:8px}\n"] }]
1395
+ args: [{ selector: 'app-low-bandwidth-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceIconButtonComponent, SafePipe, SourceButtonComponent], template: "<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n colorScheme=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n", styles: [".src-modal--lbm{width:360px}.src-modal--lbm .src-modal__body{font-size:14px;line-height:24px}.src-modal--lbm .src-modal__buttons{display:flex;gap:8px}\n"] }]
1912
1396
  }] });
1913
1397
 
1914
1398
  class SubService {
@@ -2007,8 +1491,6 @@ class AfkRestartScreenLockerComponent {
2007
1491
  this.imageLoadingSrc = toSignal(this.store.select(unrealFeature.selectImageLoadingSrc));
2008
1492
  this.streamConfig = toSignal(this.store.select(selectStreamConfig));
2009
1493
  this.isSecondStart = signal(!!(this.streamConfig()?.autoStart && location.href.match(/^https/gi)));
2010
- this.SourceButtonSize = SourceButtonSize;
2011
- this.SourceButtonColorScheme = SourceButtonColorScheme;
2012
1494
  this.playCallBack = null;
2013
1495
  }
2014
1496
  ngOnInit() {
@@ -2036,11 +1518,11 @@ class AfkRestartScreenLockerComponent {
2036
1518
  this.playCallBack = null;
2037
1519
  }
2038
1520
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: AfkRestartScreenLockerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2039
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.8", type: AfkRestartScreenLockerComponent, isStandalone: true, selector: "app-afk-restart-screen-locker", ngImport: i0, template: "@if (!isViewportReady()) {\n <div class=\"preload\">\n <div class=\"back\">\n <img\n [ngSrc]=\"imageLoadingSrc()!\"\n fill\n loading=\"lazy\"\n alt=\"image loading src\"\n />\n </div>\n\n @if (showReconnectPopup()) {\n <div class=\"stream-message-wrapper\">\n <div class=\"resume-box\">\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [size]=\"SourceButtonSize.LARGE\"\n [colorScheme]=\"SourceButtonColorScheme.PRIMARY\"\n [label]=\"isSecondStart() ? 'Resume' : 'Start'\"\n [data-testid]=\"'connect-button'\"\n class=\"connect-button\"\n >\n </src-button>\n </div>\n </div>\n }\n </div>\n}\n", styles: [".preload{position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.preload .back{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%}.preload .back img{width:100%;height:100%;object-fit:cover}.preload .stream-message-wrapper{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:3;display:flex;align-items:center;justify-content:center}.resume-box{position:absolute;top:80%;left:50%;transform:translate(-50%,-50%);flex-direction:column;align-items:center;border-radius:var(--br-medium, 8px);background:var(--color-bg-default, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box__text{margin-bottom:18px}.resume-box__text p{color:var(--color-gray-500, #6b7280);text-align:center;font-family:var(--font-family-sans);font-size:var(--fs-base);font-style:normal;font-weight:400;line-height:24px}.resume-box__text .resume-box__heading{color:var(--color-text-default, #1f2937);text-align:center;font-family:var(--font-family-serif);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}.preload .message-loader{position:absolute;bottom:20px;left:50%;display:block;margin:auto;transform:translate(-50%)}.preload .message-loader>p{margin:0;line-height:1;transition:all ease .35s}.preload .message-loader>p span{font-size:10px;transition:all ease .35s}@media (min-width: 1900px){.preload .message-loader{bottom:40px}}\n"], dependencies: [{ kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "colorScheme", "size", "customClass", "hasDisclosure", "isFullWidth", "iconPrefix", "iconButton", "icon", "isPressed", "isDisabled", "isLoading", "label", "formID", "srcButtonConfig", "data-testid"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1521
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.8", type: AfkRestartScreenLockerComponent, isStandalone: true, selector: "app-afk-restart-screen-locker", ngImport: i0, template: "@if (!isViewportReady()) {\n <div class=\"preload\">\n <div class=\"back\">\n <img\n [ngSrc]=\"imageLoadingSrc()!\"\n fill\n loading=\"lazy\"\n alt=\"image loading src\"\n />\n </div>\n\n @if (showReconnectPopup()) {\n <div class=\"stream-message-wrapper\">\n <div class=\"resume-box\">\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [size]=\"'large'\"\n [colorScheme]=\"'primary'\"\n [data-testid]=\"'connect-button'\"\n class=\"connect-button\"\n >\n {{ isSecondStart() ? 'Resume' : 'Start' }}\n </src-button>\n </div>\n </div>\n }\n </div>\n}\n", styles: [".preload{position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.preload .back{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%}.preload .back img{width:100%;height:100%;object-fit:cover}.preload .stream-message-wrapper{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:3;display:flex;align-items:center;justify-content:center}.resume-box{position:absolute;top:80%;left:50%;transform:translate(-50%,-50%);flex-direction:column;align-items:center;border-radius:var(--br-medium, 8px);background:var(--color-bg-default, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box__text{margin-bottom:18px}.resume-box__text p{color:var(--color-gray-500, #6b7280);text-align:center;font-family:var(--font-family-sans);font-size:var(--fs-base);font-style:normal;font-weight:400;line-height:24px}.resume-box__text .resume-box__heading{color:var(--color-text-default, #1f2937);text-align:center;font-family:var(--font-family-serif);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}.preload .message-loader{position:absolute;bottom:20px;left:50%;display:block;margin:auto;transform:translate(-50%)}.preload .message-loader>p{margin:0;line-height:1;transition:all ease .35s}.preload .message-loader>p span{font-size:10px;transition:all ease .35s}@media (min-width: 1900px){.preload .message-loader{bottom:40px}}\n"], dependencies: [{ kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "colorScheme", "size", "customClass", "hasDisclosure", "isFullWidth", "isPressed", "isDisabled", "isLoading", "iconButton", "icon", "formID", "srcButtonConfig", "data-testid"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2040
1522
  }
2041
1523
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: AfkRestartScreenLockerComponent, decorators: [{
2042
1524
  type: Component,
2043
- args: [{ selector: 'app-afk-restart-screen-locker', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgOptimizedImage, SourceButtonComponent], template: "@if (!isViewportReady()) {\n <div class=\"preload\">\n <div class=\"back\">\n <img\n [ngSrc]=\"imageLoadingSrc()!\"\n fill\n loading=\"lazy\"\n alt=\"image loading src\"\n />\n </div>\n\n @if (showReconnectPopup()) {\n <div class=\"stream-message-wrapper\">\n <div class=\"resume-box\">\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [size]=\"SourceButtonSize.LARGE\"\n [colorScheme]=\"SourceButtonColorScheme.PRIMARY\"\n [label]=\"isSecondStart() ? 'Resume' : 'Start'\"\n [data-testid]=\"'connect-button'\"\n class=\"connect-button\"\n >\n </src-button>\n </div>\n </div>\n }\n </div>\n}\n", styles: [".preload{position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.preload .back{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%}.preload .back img{width:100%;height:100%;object-fit:cover}.preload .stream-message-wrapper{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:3;display:flex;align-items:center;justify-content:center}.resume-box{position:absolute;top:80%;left:50%;transform:translate(-50%,-50%);flex-direction:column;align-items:center;border-radius:var(--br-medium, 8px);background:var(--color-bg-default, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box__text{margin-bottom:18px}.resume-box__text p{color:var(--color-gray-500, #6b7280);text-align:center;font-family:var(--font-family-sans);font-size:var(--fs-base);font-style:normal;font-weight:400;line-height:24px}.resume-box__text .resume-box__heading{color:var(--color-text-default, #1f2937);text-align:center;font-family:var(--font-family-serif);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}.preload .message-loader{position:absolute;bottom:20px;left:50%;display:block;margin:auto;transform:translate(-50%)}.preload .message-loader>p{margin:0;line-height:1;transition:all ease .35s}.preload .message-loader>p span{font-size:10px;transition:all ease .35s}@media (min-width: 1900px){.preload .message-loader{bottom:40px}}\n"] }]
1525
+ args: [{ selector: 'app-afk-restart-screen-locker', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgOptimizedImage, SourceButtonComponent, SourceButtonComponent], template: "@if (!isViewportReady()) {\n <div class=\"preload\">\n <div class=\"back\">\n <img\n [ngSrc]=\"imageLoadingSrc()!\"\n fill\n loading=\"lazy\"\n alt=\"image loading src\"\n />\n </div>\n\n @if (showReconnectPopup()) {\n <div class=\"stream-message-wrapper\">\n <div class=\"resume-box\">\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [size]=\"'large'\"\n [colorScheme]=\"'primary'\"\n [data-testid]=\"'connect-button'\"\n class=\"connect-button\"\n >\n {{ isSecondStart() ? 'Resume' : 'Start' }}\n </src-button>\n </div>\n </div>\n }\n </div>\n}\n", styles: [".preload{position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.preload .back{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%}.preload .back img{width:100%;height:100%;object-fit:cover}.preload .stream-message-wrapper{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:3;display:flex;align-items:center;justify-content:center}.resume-box{position:absolute;top:80%;left:50%;transform:translate(-50%,-50%);flex-direction:column;align-items:center;border-radius:var(--br-medium, 8px);background:var(--color-bg-default, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box__text{margin-bottom:18px}.resume-box__text p{color:var(--color-gray-500, #6b7280);text-align:center;font-family:var(--font-family-sans);font-size:var(--fs-base);font-style:normal;font-weight:400;line-height:24px}.resume-box__text .resume-box__heading{color:var(--color-text-default, #1f2937);text-align:center;font-family:var(--font-family-serif);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}.preload .message-loader{position:absolute;bottom:20px;left:50%;display:block;margin:auto;transform:translate(-50%)}.preload .message-loader>p{margin:0;line-height:1;transition:all ease .35s}.preload .message-loader>p span{font-size:10px;transition:all ease .35s}@media (min-width: 1900px){.preload .message-loader{bottom:40px}}\n"] }]
2044
1526
  }] });
2045
1527
 
2046
1528
  class StatGraphComponent {
@@ -4029,38 +3511,9 @@ class InputService extends SubService {
4029
3511
  }
4030
3512
  }
4031
3513
 
4032
- class MixPanelService {
4033
- #unrealConfig = inject(UNREAL_CONFIG);
4034
- init() {
4035
- MIX_PANEL.metaBoxTrack = mixpanel.init(this.#unrealConfig.mixpanelToken, {
4036
- ignore_dnt: true,
4037
- }, 'metaBoxTrack');
4038
- MIX_PANEL.streamTrack = mixpanel.init(this.#unrealConfig.mixpanelStreamToken, {
4039
- ignore_dnt: true,
4040
- }, 'streamTrack');
4041
- this.trackMetabox('Metabox started');
4042
- this.trackStream('Metabox started');
4043
- }
4044
- trackMetabox(event, data) {
4045
- MIX_PANEL.metaBoxTrack.track(event, data);
4046
- }
4047
- trackStream(event, data) {
4048
- MIX_PANEL.streamTrack.track(event, data);
4049
- }
4050
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: MixPanelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4051
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: MixPanelService, providedIn: 'root' }); }
4052
- }
4053
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: MixPanelService, decorators: [{
4054
- type: Injectable,
4055
- args: [{
4056
- providedIn: 'root',
4057
- }]
4058
- }] });
4059
-
4060
3514
  class StreamStatusTelemetryService {
4061
3515
  #store = inject(Store);
4062
3516
  #videoStatGenerator = inject(VideoStreamStatusService);
4063
- #mixPanelService = inject(MixPanelService);
4064
3517
  constructor() {
4065
3518
  this.initTelemetry();
4066
3519
  }
@@ -4089,7 +3542,7 @@ class StreamStatusTelemetryService {
4089
3542
  .subscribe((data) => this.trackEventToMixPanel(data));
4090
3543
  }
4091
3544
  trackEventToMixPanel(data) {
4092
- this.#mixPanelService.trackStream('streamStatus', data);
3545
+ this.#store.dispatch(trackMixpanelEvent({ event: 'streamStatus', data }));
4093
3546
  }
4094
3547
  init() {
4095
3548
  // do nothing, just to not forget to initialize Service
@@ -4101,6 +3554,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
4101
3554
  type: Injectable
4102
3555
  }], ctorParameters: () => [] });
4103
3556
 
3557
+ class UnrealErrorModalComponent {
3558
+ constructor() {
3559
+ this.dialogRef = inject(DialogRef);
3560
+ this.dialogData = inject(DIALOG_DATA);
3561
+ }
3562
+ close() {
3563
+ this.dialogRef.close();
3564
+ }
3565
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: UnrealErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3566
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.8", type: UnrealErrorModalComponent, isStandalone: true, selector: "app-unreal-error-modal", ngImport: i0, template: "<div class=\"src-modal src-modal--small\">\n <div class=\"src-modal__header\">\n <div\n class=\"src-modal__title\"\n [attr.data-testid]=\"'unreal-error-header-title'\"\n >\n Warning\n </div>\n </div>\n <div class=\"src-modal__body\">\n <div>{{ dialogData.content }}</div>\n </div>\n <div class=\"src-modal__footer\">\n <src-button [colorScheme]=\"'secondary'\" (onClick)=\"close()\">\n Ok\n </src-button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "colorScheme", "size", "customClass", "hasDisclosure", "isFullWidth", "isPressed", "isDisabled", "isLoading", "iconButton", "icon", "formID", "srcButtonConfig", "data-testid"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3567
+ }
3568
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: UnrealErrorModalComponent, decorators: [{
3569
+ type: Component,
3570
+ args: [{ selector: 'app-unreal-error-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent], template: "<div class=\"src-modal src-modal--small\">\n <div class=\"src-modal__header\">\n <div\n class=\"src-modal__title\"\n [attr.data-testid]=\"'unreal-error-header-title'\"\n >\n Warning\n </div>\n </div>\n <div class=\"src-modal__body\">\n <div>{{ dialogData.content }}</div>\n </div>\n <div class=\"src-modal__footer\">\n <src-button [colorScheme]=\"'secondary'\" (onClick)=\"close()\">\n Ok\n </src-button>\n </div>\n</div>\n" }]
3571
+ }] });
3572
+
4104
3573
  class UnrealEffects {
4105
3574
  constructor() {
4106
3575
  this.dialog = inject(Dialog);
@@ -4212,25 +3681,9 @@ class UnrealEffects {
4212
3681
  return this.actions$.pipe(ofType(destroyRemoteConnections), filter(({ disconnectReason }) => disconnectReason === DisconnectReason.dataChannelTimeout), switchMap(() => this.actions$.pipe(ofType(resetUnrealState), first())), map$1(() => initSignalling()));
4213
3682
  });
4214
3683
  this.showUnrealError$ = createEffect(() => {
4215
- return this.actions$.pipe(ofType(showUnrealErrorMessage), map$1(({ code }) => getRtcErrorMessage(code)), distinctUntilChanged(), filter(Truthy), switchMap((content) => this.dialog.open(SourceModalComponent, {
3684
+ return this.actions$.pipe(ofType(showUnrealErrorMessage), map$1(({ code }) => getRtcErrorMessage(code)), distinctUntilChanged(), filter(Truthy), switchMap((content) => this.dialog.open(UnrealErrorModalComponent, {
4216
3685
  scrollStrategy: this.scrollStrategy,
4217
- data: {
4218
- size: 'small',
4219
- backButton: false,
4220
- closeButton: true,
4221
- headerTitle: 'Warning',
4222
- content,
4223
- testID: 'unreal-error',
4224
- footerButtons: [
4225
- {
4226
- srcButtonConfig: {
4227
- colorScheme: 'secondary',
4228
- },
4229
- label: 'Ok',
4230
- action: () => false,
4231
- },
4232
- ],
4233
- },
3686
+ data: { content },
4234
3687
  }).closed), map$1(() => showUnrealErrorMessage({ code: null })));
4235
3688
  });
4236
3689
  this.initAppBySetDataChannelConnected$ = createEffect(() => {
@@ -4698,17 +4151,11 @@ class VideoStatsComponent {
4698
4151
  }));
4699
4152
  }
4700
4153
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: VideoStatsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4701
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.8", type: VideoStatsComponent, isStandalone: true, selector: "app-video-stats", ngImport: i0, template: "@if (videoStatus()) {\n @if (viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">\n <src-icon [name]=\"'settings'\" />\n </button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [dataTick]=\"fpsTick()\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"videoQP()\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgFPS (higher is better)\"\n [dataTick]=\"fpsAvgTick()\"\n color=\"#00aa00\"\n />\n </li>-->\n <li>\n <app-stat-graph\n [dataTick]=\"bitrateTick()\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgBitrate\"\n [dataTick]=\"bitrateAverageTick()\"\n color=\"#D50007\"\n />\n </li>-->\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [dataTick]=\"graph.stat | async\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n }\n}\n", styles: [".settings-container{position:absolute;top:65px;left:10px;z-index:1000}.gear-button{left:0;position:absolute;background:none;border:none;cursor:pointer;font-size:24px}.gear-button>*{color:#fff;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}#aggregatedStats{border-radius:4px;margin-top:25px;left:20px;z-index:31;max-width:400px;padding:10px;background-color:#fff3;border:1px solid grey}#aggregatedStats>*{color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}#aggregatedStats:empty{display:none}#aggregatedStats button{position:absolute;right:5px;top:5px}#aggregatedStats.min{display:none}#aggregatedStats .forNerds{width:100%}#aggregatedStats .forNerds li{list-style-type:none;height:60px}#aggregatedStats .forNerds li app-stat-graph{display:block;width:100%;height:100%}#aggregatedStats .stat{cursor:pointer}#aggregatedStats .stat span{font-weight:700}#aggregatedStats .graph{cursor:pointer}#aggregatedStats .static{pointer-events:all}.ssInfo{position:absolute;top:0;left:50%;transform:translate(-50%);color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000;text-align:center;width:80%;pointer-events:none}\n"], dependencies: [{ kind: "component", type: StatGraphComponent, selector: "app-stat-graph", inputs: ["color", "tickStep", "label", "dataTick"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "component", type: SourceIconComponent, selector: "src-icon", inputs: ["colorProperty", "width", "height", "presentation", "name"] }, { kind: "pipe", type: SafePipe, name: "safe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4154
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.8", type: VideoStatsComponent, isStandalone: true, selector: "app-video-stats", ngImport: i0, template: "@if (videoStatus()) {\n @if (viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Video Stats</button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [dataTick]=\"fpsTick()\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"videoQP()\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgFPS (higher is better)\"\n [dataTick]=\"fpsAvgTick()\"\n color=\"#00aa00\"\n />\n </li>-->\n <li>\n <app-stat-graph\n [dataTick]=\"bitrateTick()\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgBitrate\"\n [dataTick]=\"bitrateAverageTick()\"\n color=\"#D50007\"\n />\n </li>-->\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [dataTick]=\"graph.stat | async\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n }\n}\n", styles: [".settings-container{position:absolute;top:65px;left:10px;z-index:1000}.gear-button{left:0;position:absolute;background:none;cursor:pointer;font-size:20px;font-weight:500;border:1px solid;border-radius:9px;background:#0162cc;color:#fff;padding:7px}.gear-button>*{color:#fff;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}#aggregatedStats{border-radius:4px;margin-top:25px;left:20px;z-index:31;max-width:400px;padding:10px;background-color:#fff3;border:1px solid grey}#aggregatedStats>*{color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}#aggregatedStats:empty{display:none}#aggregatedStats button{position:absolute;right:5px;top:5px}#aggregatedStats.min{display:none}#aggregatedStats .forNerds{width:100%}#aggregatedStats .forNerds li{list-style-type:none;height:60px}#aggregatedStats .forNerds li app-stat-graph{display:block;width:100%;height:100%}#aggregatedStats .stat{cursor:pointer}#aggregatedStats .stat span{font-weight:700}#aggregatedStats .graph{cursor:pointer}#aggregatedStats .static{pointer-events:all}.ssInfo{position:absolute;top:0;left:50%;transform:translate(-50%);color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000;text-align:center;width:80%;pointer-events:none}\n"], dependencies: [{ kind: "component", type: StatGraphComponent, selector: "app-stat-graph", inputs: ["color", "tickStep", "label", "dataTick"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "pipe", type: SafePipe, name: "safe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4702
4155
  }
4703
4156
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: VideoStatsComponent, decorators: [{
4704
4157
  type: Component,
4705
- args: [{ selector: 'app-video-stats', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
4706
- StatGraphComponent,
4707
- AsyncPipe,
4708
- JsonPipe,
4709
- SourceIconComponent,
4710
- SafePipe,
4711
- ], template: "@if (videoStatus()) {\n @if (viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">\n <src-icon [name]=\"'settings'\" />\n </button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [dataTick]=\"fpsTick()\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"videoQP()\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgFPS (higher is better)\"\n [dataTick]=\"fpsAvgTick()\"\n color=\"#00aa00\"\n />\n </li>-->\n <li>\n <app-stat-graph\n [dataTick]=\"bitrateTick()\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgBitrate\"\n [dataTick]=\"bitrateAverageTick()\"\n color=\"#D50007\"\n />\n </li>-->\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [dataTick]=\"graph.stat | async\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n }\n}\n", styles: [".settings-container{position:absolute;top:65px;left:10px;z-index:1000}.gear-button{left:0;position:absolute;background:none;border:none;cursor:pointer;font-size:24px}.gear-button>*{color:#fff;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}#aggregatedStats{border-radius:4px;margin-top:25px;left:20px;z-index:31;max-width:400px;padding:10px;background-color:#fff3;border:1px solid grey}#aggregatedStats>*{color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}#aggregatedStats:empty{display:none}#aggregatedStats button{position:absolute;right:5px;top:5px}#aggregatedStats.min{display:none}#aggregatedStats .forNerds{width:100%}#aggregatedStats .forNerds li{list-style-type:none;height:60px}#aggregatedStats .forNerds li app-stat-graph{display:block;width:100%;height:100%}#aggregatedStats .stat{cursor:pointer}#aggregatedStats .stat span{font-weight:700}#aggregatedStats .graph{cursor:pointer}#aggregatedStats .static{pointer-events:all}.ssInfo{position:absolute;top:0;left:50%;transform:translate(-50%);color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000;text-align:center;width:80%;pointer-events:none}\n"] }]
4158
+ args: [{ selector: 'app-video-stats', changeDetection: ChangeDetectionStrategy.OnPush, imports: [StatGraphComponent, AsyncPipe, JsonPipe, SafePipe], template: "@if (videoStatus()) {\n @if (viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Video Stats</button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [dataTick]=\"fpsTick()\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"videoQP()\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgFPS (higher is better)\"\n [dataTick]=\"fpsAvgTick()\"\n color=\"#00aa00\"\n />\n </li>-->\n <li>\n <app-stat-graph\n [dataTick]=\"bitrateTick()\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgBitrate\"\n [dataTick]=\"bitrateAverageTick()\"\n color=\"#D50007\"\n />\n </li>-->\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [dataTick]=\"graph.stat | async\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n }\n}\n", styles: [".settings-container{position:absolute;top:65px;left:10px;z-index:1000}.gear-button{left:0;position:absolute;background:none;cursor:pointer;font-size:20px;font-weight:500;border:1px solid;border-radius:9px;background:#0162cc;color:#fff;padding:7px}.gear-button>*{color:#fff;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}#aggregatedStats{border-radius:4px;margin-top:25px;left:20px;z-index:31;max-width:400px;padding:10px;background-color:#fff3;border:1px solid grey}#aggregatedStats>*{color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}#aggregatedStats:empty{display:none}#aggregatedStats button{position:absolute;right:5px;top:5px}#aggregatedStats.min{display:none}#aggregatedStats .forNerds{width:100%}#aggregatedStats .forNerds li{list-style-type:none;height:60px}#aggregatedStats .forNerds li app-stat-graph{display:block;width:100%;height:100%}#aggregatedStats .stat{cursor:pointer}#aggregatedStats .stat span{font-weight:700}#aggregatedStats .graph{cursor:pointer}#aggregatedStats .static{pointer-events:all}.ssInfo{position:absolute;top:0;left:50%;transform:translate(-50%);color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000;text-align:center;width:80%;pointer-events:none}\n"] }]
4712
4159
  }], ctorParameters: () => [] });
4713
4160
 
4714
4161
  class UnrealStatusComponent {
@@ -5066,11 +4513,11 @@ class WebrtcErrorModalComponent {
5066
4513
  });
5067
4514
  }
5068
4515
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: WebrtcErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5069
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.8", type: WebrtcErrorModalComponent, isStandalone: true, selector: "app-webrtc-error-modal", ngImport: i0, template: "<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n <src-round-button\n (onClick)=\"close()\"\n [icon]=\"'close'\"\n [data-testid]=\"'close'\"\n class=\"src-modal__close\"\n >\n </src-round-button>\n </header>\n <section class=\"src-modal__body\">\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n colorScheme=\"primary\"\n >Ok</src-button\n >\n </footer>\n</div>\n", styles: [".src-modal{--modalBodyPadding: 20px 8px 20px 20px;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) auto}.src-modal ::ng-deep .ng-scroll-content{--_scrollbar-content-width: initial;--_viewport-padding-right: 12px}.src-modal__body{width:100%}.src-modal__body p{color:var(--color-text-default, #1f2937);font-size:14px;font-style:normal;font-weight:400;line-height:24px;margin-top:0}.src-modal__body a{word-wrap:break-word;white-space:normal}\n"], dependencies: [{ kind: "component", type: SourceRoundButtonComponent, selector: "src-round-button", inputs: ["type", "size", "counter", "icon", "isDisabled", "data-testid"], outputs: ["onClick"] }, { kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "colorScheme", "size", "customClass", "hasDisclosure", "isFullWidth", "iconPrefix", "iconButton", "icon", "isPressed", "isDisabled", "isLoading", "label", "formID", "srcButtonConfig", "data-testid"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4516
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.8", type: WebrtcErrorModalComponent, isStandalone: true, selector: "app-webrtc-error-modal", ngImport: i0, template: "<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n </header>\n <section class=\"src-modal__body\">\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n [colorScheme]=\"'primary'\"\n >\n Ok\n </src-button>\n </footer>\n</div>\n", styles: [".src-modal{--modalBodyPadding: 20px 8px 20px 20px;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) auto}.src-modal ::ng-deep .ng-scroll-content{--_scrollbar-content-width: initial;--_viewport-padding-right: 12px}.src-modal__body{width:100%}.src-modal__body p{color:var(--color-text-default, #1f2937);font-size:14px;font-style:normal;font-weight:400;line-height:24px;margin-top:0}.src-modal__body a{word-wrap:break-word;white-space:normal}\n"], dependencies: [{ kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "colorScheme", "size", "customClass", "hasDisclosure", "isFullWidth", "isPressed", "isDisabled", "isLoading", "iconButton", "icon", "formID", "srcButtonConfig", "data-testid"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5070
4517
  }
5071
4518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: WebrtcErrorModalComponent, decorators: [{
5072
4519
  type: Component,
5073
- args: [{ selector: 'app-webrtc-error-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceRoundButtonComponent, SourceButtonComponent], template: "<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n <src-round-button\n (onClick)=\"close()\"\n [icon]=\"'close'\"\n [data-testid]=\"'close'\"\n class=\"src-modal__close\"\n >\n </src-round-button>\n </header>\n <section class=\"src-modal__body\">\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n colorScheme=\"primary\"\n >Ok</src-button\n >\n </footer>\n</div>\n", styles: [".src-modal{--modalBodyPadding: 20px 8px 20px 20px;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) auto}.src-modal ::ng-deep .ng-scroll-content{--_scrollbar-content-width: initial;--_viewport-padding-right: 12px}.src-modal__body{width:100%}.src-modal__body p{color:var(--color-text-default, #1f2937);font-size:14px;font-style:normal;font-weight:400;line-height:24px;margin-top:0}.src-modal__body a{word-wrap:break-word;white-space:normal}\n"] }]
4520
+ args: [{ selector: 'app-webrtc-error-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent, SourceButtonComponent], template: "<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n </header>\n <section class=\"src-modal__body\">\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n [colorScheme]=\"'primary'\"\n >\n Ok\n </src-button>\n </footer>\n</div>\n", styles: [".src-modal{--modalBodyPadding: 20px 8px 20px 20px;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) auto}.src-modal ::ng-deep .ng-scroll-content{--_scrollbar-content-width: initial;--_viewport-padding-right: 12px}.src-modal__body{width:100%}.src-modal__body p{color:var(--color-text-default, #1f2937);font-size:14px;font-style:normal;font-weight:400;line-height:24px;margin-top:0}.src-modal__body a{word-wrap:break-word;white-space:normal}\n"] }]
5074
4521
  }] });
5075
4522
 
5076
4523
  class FilterSettingsComponent {
@@ -5113,11 +4560,11 @@ class FilterSettingsComponent {
5113
4560
  });
5114
4561
  }
5115
4562
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: FilterSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5116
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.8", type: FilterSettingsComponent, isStandalone: true, selector: "app-filter-settings", ngImport: i0, template: "<!-- filter-settings.component.html -->\n<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">\n <src-icon [name]=\"'settings'\" />\n </button>\n\n <div *ngIf=\"settings.panelOpen\" class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n</div>\n", styles: [".settings-container{position:absolute;top:50px;right:10px;z-index:1000}.gear-button{right:0;position:absolute;cursor:pointer;font-size:20px}.gear-button>*{color:#e6f419;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}.settings-panel{font-size:13px;background:#fff;border:1px solid #ccc;padding:15px;margin-top:25px;border-radius:4px;box-shadow:0 2px 8px #0003}.settings-panel h3{margin-top:0}.settings-panel form{display:flex;flex-direction:column}.settings-panel label{margin-bottom:10px;display:flex;flex-direction:column}.settings-panel input{padding:4px;margin-top:4px;border:1px solid #ccc;border-radius:2px}.apply-button-container{position:absolute;bottom:15px;right:15px}.apply-button-container button{padding:6px 12px;border:none;background-color:#1976d2;color:#fff;border-radius:4px;cursor:pointer;margin:2px}.apply-button-container button:hover{background-color:#1565c0}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: SourceIconComponent, selector: "src-icon", inputs: ["colorProperty", "width", "height", "presentation", "name"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4563
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.8", type: FilterSettingsComponent, isStandalone: true, selector: "app-filter-settings", ngImport: i0, template: "<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">LBM</button>\n @if (settings.panelOpen) {\n <div class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n }\n</div>\n", styles: [".settings-container{position:absolute;top:50px;right:10px;z-index:1000}.gear-button{right:0;position:absolute;cursor:pointer;font-size:20px;left:0;background:none;font-weight:500;border:1px solid;border-radius:9px;background:#0162cc;color:#fff;padding:7px}.gear-button>*{color:#e6f419;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}.settings-panel{font-size:13px;background:#fff;border:1px solid #ccc;padding:15px;margin-top:25px;border-radius:4px;box-shadow:0 2px 8px #0003}.settings-panel h3{margin-top:0}.settings-panel form{display:flex;flex-direction:column}.settings-panel label{margin-bottom:10px;display:flex;flex-direction:column}.settings-panel input{padding:4px;margin-top:4px;border:1px solid #ccc;border-radius:2px}.apply-button-container{position:absolute;bottom:15px;right:15px}.apply-button-container button{padding:6px 12px;border:none;background-color:#1976d2;color:#fff;border-radius:4px;cursor:pointer;margin:2px}.apply-button-container button:hover{background-color:#1565c0}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5117
4564
  }
5118
4565
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: FilterSettingsComponent, decorators: [{
5119
4566
  type: Component,
5120
- args: [{ selector: 'app-filter-settings', imports: [FormsModule, NgIf, SourceIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- filter-settings.component.html -->\n<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">\n <src-icon [name]=\"'settings'\" />\n </button>\n\n <div *ngIf=\"settings.panelOpen\" class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n</div>\n", styles: [".settings-container{position:absolute;top:50px;right:10px;z-index:1000}.gear-button{right:0;position:absolute;cursor:pointer;font-size:20px}.gear-button>*{color:#e6f419;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}.settings-panel{font-size:13px;background:#fff;border:1px solid #ccc;padding:15px;margin-top:25px;border-radius:4px;box-shadow:0 2px 8px #0003}.settings-panel h3{margin-top:0}.settings-panel form{display:flex;flex-direction:column}.settings-panel label{margin-bottom:10px;display:flex;flex-direction:column}.settings-panel input{padding:4px;margin-top:4px;border:1px solid #ccc;border-radius:2px}.apply-button-container{position:absolute;bottom:15px;right:15px}.apply-button-container button{padding:6px 12px;border:none;background-color:#1976d2;color:#fff;border-radius:4px;cursor:pointer;margin:2px}.apply-button-container button:hover{background-color:#1565c0}\n"] }]
4567
+ args: [{ selector: 'app-filter-settings', imports: [FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">LBM</button>\n @if (settings.panelOpen) {\n <div class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n }\n</div>\n", styles: [".settings-container{position:absolute;top:50px;right:10px;z-index:1000}.gear-button{right:0;position:absolute;cursor:pointer;font-size:20px;left:0;background:none;font-weight:500;border:1px solid;border-radius:9px;background:#0162cc;color:#fff;padding:7px}.gear-button>*{color:#e6f419;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}.settings-panel{font-size:13px;background:#fff;border:1px solid #ccc;padding:15px;margin-top:25px;border-radius:4px;box-shadow:0 2px 8px #0003}.settings-panel h3{margin-top:0}.settings-panel form{display:flex;flex-direction:column}.settings-panel label{margin-bottom:10px;display:flex;flex-direction:column}.settings-panel input{padding:4px;margin-top:4px;border:1px solid #ccc;border-radius:2px}.apply-button-container{position:absolute;bottom:15px;right:15px}.apply-button-container button{padding:6px 12px;border:none;background-color:#1976d2;color:#fff;border-radius:4px;cursor:pointer;margin:2px}.apply-button-container button:hover{background-color:#1565c0}\n"] }]
5121
4568
  }] });
5122
4569
 
5123
4570
  class LowBandwidthDetectorComponent {
@@ -5232,5 +4679,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
5232
4679
  * Generated bundle index. Do not edit.
5233
4680
  */
5234
4681
 
5235
- export { AFKService, AfkRestartScreenLockerComponent, AggregatorService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, ClickableOverlayComponent, CommandTelemetryService, ConfigHandler, ConsoleExtensionsService, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_TIMEOUT_PERIOD, DEFAULT_WARN_TIMEOUT, DataFlowMonitor, DevModeService, DisconnectReason, EControlSchemeType, EMessageType, EToClientMessageType, FULL_HD_HEIGHT, FULL_HD_WIDTH, FilterSettingsComponent, FreezeFrameComponent, FreezeFrameService, IceCandidateHandler, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, KalmanFilter1D, LatencyTimings, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MIX_PANEL, MixPanelEvents, MixPanelService, MouseButton, MouseButtonsMask, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, PingHandler, PlayerCountHandler, RegionsPingService, ResetTelemetry, SAME_SIZE_THRESHOLD, SSInfoHandler, STREAMING_VIDEO_ID, SafePipe, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryService, SubService, TelemetryStart, TelemetryStop, UNREAL_CONFIG, UnrealCommunicatorService, UnrealEffects, UnrealInternalSignalEvents, UnrealSceneComponent, UnrealStatusMessage, VideoLockerComponent, VideoRecorder, VideoService, VideoStatsComponent, VideoStreamStatusService, WSCloseCode_NORMAL_AFK_TIMEOUT, WSCloseCode_NORMAL_CIRRUS_CLOSED, WSCloseCode_NORMAL_CLOSURE, WSCloseCode_NORMAL_MANUAL_DISCONNECT, WSCloseCodes, WS_OPEN_STATE, WS_TIMEOUT, WebRtcPlayerService, WebrtcErrorModalComponent, alignProductsToPlaneCommand, changeLowBandwidth, changeStatusMainVideoOnScene, changeStreamResolutionAction, changeStreamResolutionSuccessAction, clampAndKeepMaxPercents, clampPanToProductsCommand, commandCompleted, commandStarted, decodeData, destroyConnectionsAndResetState, destroyRemoteConnections, dispatchResize, filteredLogs, floatToSmoothPercents, forceResizeUnrealVideo, fromResizeObserver, fromSignal, fromUnrealCallBackSignal, getActiveUrl, getApplyCameraPresetCommand, getApplyZoomCommand, getCameraBoxCommand, getCameraRecenterCommand, getCameraSettingsCommand, getChangeGizmoTypeCommand, getChangeResolutionCommand, getClickSnapCommand, getControlSensitivityCommand, getDebugModeCommand, getDragCommand, getDragSequenceCommand, getDropCommand, getEnableComposureCommand, getEnableControlsCommand, getEnableSpinnerModeCommand, getEnableTeleportCommand, getExecuteConsoleCommand, getFitToObjectsCommand, getFreezeFrameCommand, getImageFromVideoStream, getInitSequenceByObjectNameCommand, getJumpToSequenceCommand, getLoadLevelCommand, getLoadProductCommand, getLoadSceneStateCommand, getLoopBackCommand, getMoveSelectedCommand, getPauseSequenceCommand, getPlaySequenceCommand, getRequestCameraPresetCommand, getResetControlClampsCommand, getRotateSelectedCommand, getRtcErrorMessage, getSelectProductByObjectNameCommand, getSetCameraControlClampsCommand, getSetControlCameraModeCommand, getSetFpsCommand, getSetMaterialCommand, getSetPawnMovementModeCommand, getSetSettingsSequenceCommand, getStopSequenceCommand, getTakeRenderCommand, getTakeSpinnerRenderCommand, getTakeSpinnerRenderPreviewCommand, getUnLoadAllProductsCommand, getUnLoadProductByObjectNameCommand, getUnselectAllProductsCommand, getWeatherCommand, initSignalling, initialState, mapQpToQuality, observeCommandResponse, removeExileCommands, resetAfk, resetAfkAction, resetConfig, resetIntroSrc, resetUnrealState, resetUnrealStateAction, resetWarnTimeout, selectCommandProgress, selectCommandsInProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsFreezeFrameLoading, selectIsVideoPlayingAndDataChannelConnected, selectLastCommandInProgress, selectLoaderCommands, selectMatchUrls, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectWarnTimeout, selectWsUrl, sendSignal, setAwsInstance, setCirrusConnected, setCirrusDisconnected, setConfig, setDataChannelConnected, setErrorMessage, setEstablishingConnection, setFreezeFrame, setFreezeFrameFromVideo, setIntroImageSrc, setIntroVideoSrc, setLoadingImageSrc, setLoopBackCommandIsCompleted, setMaxFps, setProductsLocationCommand, setSignalingName, setStatusMessage, setStatusPercentSignallingServer, setStreamClientCompanyId, setStreamViewId, setUnrealVersion, setViewportReady, showUnrealErrorMessage, unLoadAllLevelsCommand, unrealFeature, unrealReducer, updateCirrusInfo };
4682
+ export { AFKService, AfkRestartScreenLockerComponent, AggregatorService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, ClickableOverlayComponent, CommandTelemetryService, ConfigHandler, ConsoleExtensionsService, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_TIMEOUT_PERIOD, DEFAULT_WARN_TIMEOUT, DataFlowMonitor, DevModeService, DisconnectReason, EControlSchemeType, EMessageType, EToClientMessageType, FULL_HD_HEIGHT, FULL_HD_WIDTH, FilterSettingsComponent, FreezeFrameComponent, FreezeFrameService, IceCandidateHandler, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, KalmanFilter1D, LatencyTimings, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MouseButton, MouseButtonsMask, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, PingHandler, PlayerCountHandler, RegionsPingService, ResetTelemetry, SAME_SIZE_THRESHOLD, SSInfoHandler, STREAMING_VIDEO_ID, SafePipe, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryService, SubService, TelemetryStart, TelemetryStop, UNREAL_CONFIG, UnrealCommunicatorService, UnrealEffects, UnrealInternalSignalEvents, UnrealSceneComponent, UnrealStatusMessage, VideoLockerComponent, VideoRecorder, VideoService, VideoStatsComponent, VideoStreamStatusService, WSCloseCode_NORMAL_AFK_TIMEOUT, WSCloseCode_NORMAL_CIRRUS_CLOSED, WSCloseCode_NORMAL_CLOSURE, WSCloseCode_NORMAL_MANUAL_DISCONNECT, WSCloseCodes, WS_OPEN_STATE, WS_TIMEOUT, WebRtcPlayerService, WebrtcErrorModalComponent, alignProductsToPlaneCommand, changeLowBandwidth, changeStatusMainVideoOnScene, changeStreamResolutionAction, changeStreamResolutionSuccessAction, clampAndKeepMaxPercents, clampPanToProductsCommand, commandCompleted, commandStarted, decodeData, destroyConnectionsAndResetState, destroyRemoteConnections, dispatchResize, filteredLogs, floatToSmoothPercents, forceResizeUnrealVideo, fromResizeObserver, fromSignal, fromUnrealCallBackSignal, getActiveUrl, getApplyCameraPresetCommand, getApplyZoomCommand, getCameraBoxCommand, getCameraRecenterCommand, getCameraSettingsCommand, getChangeGizmoTypeCommand, getChangeResolutionCommand, getClickSnapCommand, getControlSensitivityCommand, getDebugModeCommand, getDragCommand, getDragSequenceCommand, getDropCommand, getEnableComposureCommand, getEnableControlsCommand, getEnableSpinnerModeCommand, getEnableTeleportCommand, getExecuteConsoleCommand, getFitToObjectsCommand, getFreezeFrameCommand, getImageFromVideoStream, getInitSequenceByObjectNameCommand, getJumpToSequenceCommand, getLoadLevelCommand, getLoadProductCommand, getLoadSceneStateCommand, getLoopBackCommand, getMoveSelectedCommand, getPauseSequenceCommand, getPlaySequenceCommand, getRequestCameraPresetCommand, getResetControlClampsCommand, getRotateSelectedCommand, getRtcErrorMessage, getSelectProductByObjectNameCommand, getSetCameraControlClampsCommand, getSetControlCameraModeCommand, getSetFpsCommand, getSetMaterialCommand, getSetPawnMovementModeCommand, getSetSettingsSequenceCommand, getStopSequenceCommand, getTakeRenderCommand, getTakeSpinnerRenderCommand, getTakeSpinnerRenderPreviewCommand, getUnLoadAllProductsCommand, getUnLoadProductByObjectNameCommand, getUnselectAllProductsCommand, getWeatherCommand, initSignalling, initialState, mapQpToQuality, observeCommandResponse, removeExileCommands, resetAfk, resetAfkAction, resetConfig, resetIntroSrc, resetUnrealState, resetUnrealStateAction, resetWarnTimeout, selectCommandProgress, selectCommandsInProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsFreezeFrameLoading, selectIsVideoPlayingAndDataChannelConnected, selectLastCommandInProgress, selectLoaderCommands, selectMatchUrls, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectWarnTimeout, selectWsUrl, sendSignal, setAwsInstance, setCirrusConnected, setCirrusDisconnected, setConfig, setDataChannelConnected, setErrorMessage, setEstablishingConnection, setFreezeFrame, setFreezeFrameFromVideo, setIntroImageSrc, setIntroVideoSrc, setLoadingImageSrc, setLoopBackCommandIsCompleted, setMaxFps, setProductsLocationCommand, setSignalingName, setStatusMessage, setStatusPercentSignallingServer, setStreamClientCompanyId, setStreamViewId, setUnrealVersion, setViewportReady, showUnrealErrorMessage, trackMixpanelEvent, unLoadAllLevelsCommand, unrealFeature, unrealReducer, updateCirrusInfo };
5236
4683
  //# sourceMappingURL=3dsource-angular-unreal-module.mjs.map